From f6248ebf0d79880af97260227e56f5e7b1e0b3d7 Mon Sep 17 00:00:00 2001 From: Eren Terzioglu Date: Wed, 26 Jan 2022 10:32:40 +0300 Subject: [PATCH 001/665] esp/vfs: VFS semihosting interface support --- components/vfs/openocd_semihosting.h | 233 ++++++++++++++++++--- components/vfs/vfs_semihost.c | 293 ++++++++++++++++++++++++++- 2 files changed, 491 insertions(+), 35 deletions(-) diff --git a/components/vfs/openocd_semihosting.h b/components/vfs/openocd_semihosting.h index 32dfeb75a9..bcf5c1eca6 100644 --- a/components/vfs/openocd_semihosting.h +++ b/components/vfs/openocd_semihosting.h @@ -31,27 +31,27 @@ extern "C" { * these are not supported in ESP-IDF yet. */ -#define SEMIHOSTING_SYS_CLOCK 0x10 -#define SEMIHOSTING_SYS_CLOSE 0x02 -#define SEMIHOSTING_SYS_ERRNO 0x13 -#define SEMIHOSTING_SYS_EXIT 0x18 -#define SEMIHOSTING_SYS_EXIT_EXTENDED 0x20 -#define SEMIHOSTING_SYS_FLEN 0x0C -#define SEMIHOSTING_SYS_GET_CMDLINE 0x15 -#define SEMIHOSTING_SYS_HEAPINFO 0x16 -#define SEMIHOSTING_SYS_ISERROR 0x08 -#define SEMIHOSTING_SYS_ISTTY 0x09 -#define SEMIHOSTING_SYS_OPEN 0x01 -#define SEMIHOSTING_SYS_READ 0x06 -#define SEMIHOSTING_SYS_READC 0x07 -#define SEMIHOSTING_SYS_REMOVE 0x0E -#define SEMIHOSTING_SYS_RENAME 0x0F -#define SEMIHOSTING_SYS_SEEK 0x0A -#define SEMIHOSTING_SYS_SYSTEM 0x12 -#define SEMIHOSTING_SYS_TIME 0x11 -#define SEMIHOSTING_SYS_WRITE 0x05 -#define SEMIHOSTING_SYS_WRITEC 0x03 -#define SEMIHOSTING_SYS_WRITE0 0x04 +#define SEMIHOSTING_SYS_OPEN 0x01 +#define SEMIHOSTING_SYS_CLOSE 0x02 +#define SEMIHOSTING_SYS_WRITEC 0x03 +#define SEMIHOSTING_SYS_WRITE0 0x04 +#define SEMIHOSTING_SYS_WRITE 0x05 +#define SEMIHOSTING_SYS_READ 0x06 +#define SEMIHOSTING_SYS_READC 0x07 +#define SEMIHOSTING_SYS_ISERROR 0x08 +#define SEMIHOSTING_SYS_ISTTY 0x09 +#define SEMIHOSTING_SYS_SEEK 0x0A +#define SEMIHOSTING_SYS_FLEN 0x0C +#define SEMIHOSTING_SYS_REMOVE 0x0E +#define SEMIHOSTING_SYS_RENAME 0x0F +#define SEMIHOSTING_SYS_CLOCK 0x10 +#define SEMIHOSTING_SYS_TIME 0x11 +#define SEMIHOSTING_SYS_SYSTEM 0x12 +#define SEMIHOSTING_SYS_ERRNO 0x13 +#define SEMIHOSTING_SYS_GET_CMDLINE 0x15 +#define SEMIHOSTING_SYS_HEAPINFO 0x16 +#define SEMIHOSTING_SYS_EXIT 0x18 +#define SEMIHOSTING_SYS_EXIT_EXTENDED 0x20 /* This call is an Espressif OpenOCD extension to send the version * information to the host. This lets the host support different IDF versions, @@ -114,7 +114,7 @@ static inline long semihosting_call(long id, long *data, int *out_errno) long ret = semihosting_call_noerrno(id, data); if (ret < 0) { const int semihosting_sys_errno = SEMIHOSTING_SYS_ERRNO; - *out_errno = (int) semihosting_call_noerrno(semihosting_sys_errno, NULL); + *out_errno = (int)semihosting_call_noerrno(semihosting_sys_errno, NULL); } return ret; } @@ -124,7 +124,7 @@ static inline int semihosting_open(const char *path, int open_mode, int mode) int host_errno = 0; long args[] = {(long) path, open_mode, strlen(path), 0}; (void) mode; // unused in OpenOCD - int result = (int) semihosting_call(SEMIHOSTING_SYS_OPEN, args, &host_errno); + int result = (int)semihosting_call(SEMIHOSTING_SYS_OPEN, args, &host_errno); if (result < 0) { errno = host_errno; } @@ -135,7 +135,7 @@ static inline ssize_t semihosting_write(int fd, const void *data, size_t size) { int host_errno = 0; long args[] = {fd, (long) data, size, 0}; - ssize_t ret = (ssize_t) semihosting_call(SEMIHOSTING_SYS_WRITE, args, &host_errno); + ssize_t ret = (ssize_t)semihosting_call(SEMIHOSTING_SYS_WRITE, args, &host_errno); if (ret < 0) { errno = host_errno; return ret; @@ -150,7 +150,7 @@ static inline ssize_t semihosting_read(int fd, void *data, size_t size) { int host_errno = 0; long args[] = {fd, (long) data, size, 0}; - ssize_t ret = (ssize_t) semihosting_call(SEMIHOSTING_SYS_READ, args, &host_errno); + ssize_t ret = (ssize_t)semihosting_call(SEMIHOSTING_SYS_READ, args, &host_errno); if (ret < 0) { errno = host_errno; return ret; @@ -165,7 +165,7 @@ static inline int semihosting_close(int fd) { int host_errno = 0; long args[] = {fd, 0, 0, 0}; - int ret = (int) semihosting_call(SEMIHOSTING_SYS_CLOSE, args, &host_errno); + int ret = (int)semihosting_call(SEMIHOSTING_SYS_CLOSE, args, &host_errno); if (ret < 0) { errno = host_errno; } @@ -176,7 +176,7 @@ static inline off_t semihosting_seek(int fd, off_t offset, int mode) { int host_errno = 0; long args[] = {fd, offset, mode, 0}; - off_t ret = (off_t) semihosting_call(ESP_SEMIHOSTING_SYS_SEEK, args, &host_errno); + off_t ret = (off_t)semihosting_call(ESP_SEMIHOSTING_SYS_SEEK, args, &host_errno); if (ret == -1) { errno = host_errno; } @@ -190,11 +190,188 @@ static inline int semihosting_ver_info(void) int version; } ver_info = { SEMIHOSTING_DRV_VERSION }; long args[] = {(long) &ver_info, sizeof(ver_info), 0, 0}; - int ret = (int) semihosting_call(ESP_SEMIHOSTING_SYS_DRV_INFO, args, &host_errno); + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_DRV_INFO, args, &host_errno); (void) host_errno; /* errno not set by this call */ return ret; } +static inline int semihosting_fstat(int fd, struct stat *restrict statbuf) +{ + int host_errno = 0; + long args[] = {fd, (int)statbuf, 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_FSTAT, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_fsync(int fd) +{ + int host_errno = 0; + long args[] = {fd, 0, 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_FSYNC, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +#ifdef CONFIG_VFS_SUPPORT_DIR +static inline int semihosting_mkdir(const char *host_path, mode_t mode) +{ + int host_errno = 0; + long args[] = {(long)host_path, mode, strlen(host_path), 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_MKDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_rmdir(const char *host_path) +{ + int host_errno = 0; + long args[] = {(long)host_path, strlen(host_path), 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_RMDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_access(const char *host_path, int mode) +{ + int host_errno = 0; + long args[] = {(long)host_path, strlen(host_path), mode, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_ACCESS, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_truncate(const char *host_path, off_t truncate_length) +{ + int host_errno = 0; + long args[] = {(long)host_path, strlen(host_path), truncate_length, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_TRUNCATE, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_utime(const char *host_path, const struct utimbuf *times) +{ + int host_errno = 0; + long args[] = {(long)host_path, strlen(host_path), times->actime, times->modtime}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_UTIME, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_stat(const char *host_path, struct stat *restrict statbuf) +{ + int host_errno = 0; + long args[] = {(long)host_path, strlen(host_path), (int)statbuf, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_STAT, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_rename(const char *old_path, const char *new_path) +{ + int host_errno = 0; + long args[] = {(long)old_path, strlen(old_path), (long)new_path, strlen(new_path)}; + int ret = (int)semihosting_call(SEMIHOSTING_SYS_RENAME, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_link(const char *path1, const char *path2) +{ + int host_errno = 0; + long args[] = {(long)path1, strlen(path1), (long)path2, strlen(path2)}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_LINK, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_unlink(const char *path) +{ + int host_errno = 0; + long args[] = {(long)path, strlen(path), 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_UNLINK, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_opendir(const char *path, long offset) +{ + int host_errno = 0; + long args[] = {(long)path, strlen(path), offset, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_OPENDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_readdir(int struct_dirent_ptr, long offset) +{ + int host_errno = 0; + long args[] = {struct_dirent_ptr, offset, 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_READDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline int semihosting_closedir(long id) +{ + int host_errno = 0; + long args[] = {id, 0, 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_CLOSEDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +static inline long semihosting_telldir(long id) +{ + int host_errno = 0; + long args[] = {id, 0, 0, 0}; + long ret = semihosting_call(ESP_SEMIHOSTING_SYS_TELLDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} +static inline int semihosting_seekdir(long id, long offset) +{ + int host_errno = 0; + long args[] = {id, offset, 0, 0}; + int ret = (int)semihosting_call(ESP_SEMIHOSTING_SYS_SEEKDIR, args, &host_errno); + if (ret < 0) { + errno = host_errno; + } + return ret; +} + +#endif #ifdef __cplusplus } #endif diff --git a/components/vfs/vfs_semihost.c b/components/vfs/vfs_semihost.c index 94161e5e50..9c3aa6bd69 100644 --- a/components/vfs/vfs_semihost.c +++ b/components/vfs/vfs_semihost.c @@ -19,8 +19,17 @@ #define CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS 1 #endif +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + const static char *TAG = "esp_semihost"; +typedef struct { + char path[256]; /*!< VFS DIR stream path */ + struct dirent e; /*!< Last open dirent */ + long id; /*!< DIR* unique id */ +} vfs_semihost_dir_t; /* Additional open flags */ @@ -98,24 +107,20 @@ static esp_err_t vfs_semihost_drvinfo(vfs_semihost_ctx_t *ctx) static int vfs_semihost_open(void* ctx, const char* path, int flags, int mode) { - int ret_fd = -1; - FAIL_IF_NO_DEBUGGER(); if (path == NULL) { errno = ENOENT; - return ret_fd; + return -1; } ESP_LOGV(TAG, "%s: '%s 0x%x 0x%x'", __func__, path, flags, mode); - int o_mode = get_o_mode(flags); if (o_mode == -1) { /* if wrong flags - error */ errno = EINVAL; - } else { - ret_fd = semihosting_open(path, o_mode, mode); + return -1; } - return ret_fd; + return semihosting_open(path, o_mode, mode); } static ssize_t vfs_semihost_write(void* ctx, int fd, const void * data, size_t size) @@ -159,6 +164,261 @@ static off_t vfs_semihost_lseek(void* ctx, int fd, off_t offset, int mode) return semihosting_seek(fd, offset, mode); } +static int vfs_semihost_fstat(void* ctx, int fd, struct stat *restrict statbuf) +{ + FAIL_IF_NO_DEBUGGER(); + + if (statbuf == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '0x%x'", __func__, fd); + return semihosting_fstat(fd, statbuf); +} + +static int vfs_semihost_fsync(void* ctx, int fd) +{ + FAIL_IF_NO_DEBUGGER(); + + ESP_LOGV(TAG, "%s: '0x%x'", __func__, fd); + return semihosting_fsync(fd); +} + +#ifdef CONFIG_VFS_SUPPORT_DIR +static int vfs_semihost_mkdir(void* ctx, const char* path, mode_t mode) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s 0x%x'", __func__, path, mode); + return semihosting_mkdir(path, mode); +} + +static int vfs_semihost_rmdir(void* ctx, const char* path) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s'", __func__, path); + return semihosting_rmdir(path); +} + +static int vfs_semihost_access(void* ctx, const char* path, int mode) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s 0x%x'", __func__, path, mode); + return semihosting_access(path, mode); +} + +static int vfs_semihost_truncate(void* ctx, const char* path, off_t length) +{ + FAIL_IF_NO_DEBUGGER(); + + if (length < 0) { + errno = EINVAL; + return -1; + } + + if (path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s after %ld bytes'", __func__, path, length); + return semihosting_truncate(path, length); +} + +static int vfs_semihost_utime(void* ctx, const char* path, const struct utimbuf *times) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path == NULL || times == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s'", __func__, path); + return semihosting_utime(path, times); +} + +static int vfs_semihost_stat(void* ctx, const char *restrict path, struct stat *restrict statbuf) +{ + FAIL_IF_NO_DEBUGGER(); + + if (statbuf == NULL || path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s'", __func__, path); + return semihosting_stat(path, statbuf); +} + +static int vfs_semihost_rename(void* ctx, const char *restrict old_name, const char *restrict new_name) +{ + FAIL_IF_NO_DEBUGGER(); + + if (old_name == NULL || new_name == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s -> %s'", __func__, old_name, new_name); + return semihosting_rename(old_name, new_name); +} + +static int vfs_semihost_link(void* ctx, const char *restrict path1, const char *restrict path2) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path1 == NULL || path2 == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s <-> %s'", __func__, path1, path2); + return semihosting_link(path1, path2); +} + +static int vfs_semihost_unlink(void* ctx, const char *restrict path) +{ + FAIL_IF_NO_DEBUGGER(); + + if (path == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: '%s'", __func__, path); + return semihosting_unlink(path); +} + +static DIR* vfs_semihost_opendir(void* ctx, const char *restrict path) +{ + if (!cpu_hal_is_debugger_attached()) { + return NULL; + } + + if (path == NULL) { + errno = ENOENT; + return NULL; + } + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t*)calloc(1, sizeof(vfs_semihost_dir_t)); + if (semihost_dirp == NULL) { + ESP_LOGE("Error", "Error on vfs_semihost_dir_t creation"); + errno = ENOMEM; + return NULL; + } + + strncpy(semihost_dirp->path, path, MIN(strlen(path), sizeof(semihost_dirp->path) - 1)); + ESP_LOGV(TAG, "%s: '%s'", __func__, path); + int ret_fd = semihosting_opendir(path, (int)&semihost_dirp->id); + if (ret_fd < 0) { + free(semihost_dirp); + return NULL; + } + return (DIR *)semihost_dirp; +} + +static int vfs_semihost_closedir(void* ctx, DIR* dirp) +{ + FAIL_IF_NO_DEBUGGER(); + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t*)dirp; + if (semihost_dirp == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: %s %ld", __func__, semihost_dirp->path, semihost_dirp->id); + int ret_fd = semihosting_closedir(semihost_dirp->id); + free(semihost_dirp); + return ret_fd; +} + +static long vfs_semihost_telldir(void* ctx, DIR* dirp) +{ + FAIL_IF_NO_DEBUGGER(); + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t*)dirp; + if (semihost_dirp == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: %s %ld", __func__, semihost_dirp->path, semihost_dirp->id); + return semihosting_telldir(semihost_dirp->id); +} + +static int vfs_semihost_readdir_r(void* ctx, DIR* dirp, struct dirent* entry, struct dirent** out_dirent) +{ + FAIL_IF_NO_DEBUGGER(); + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t *)dirp; + if (semihost_dirp == NULL || entry == NULL || out_dirent == NULL) { + errno = ENOENT; + return -1; + } + + ESP_LOGV(TAG, "%s: %s %ld", __func__, semihost_dirp->path, semihost_dirp->id); + int ret_fd = semihosting_readdir((int)entry, semihost_dirp->id); + if (ret_fd < 0) { + if (errno == 0) { /* end of directory */ + *out_dirent = NULL; + return 0; + } + return errno; + } + *out_dirent = entry; + return 0; +} + +static struct dirent* vfs_semihost_readdir(void* ctx, DIR* dirp) +{ + if (!cpu_hal_is_debugger_attached()) { + return NULL; + } + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t *)dirp; + struct dirent *dir_ptr; + ESP_LOGV(TAG, "%s: %s %ld", __func__, semihost_dirp->path, semihost_dirp->id); + int ret = vfs_semihost_readdir_r(ctx, (DIR*)semihost_dirp, &semihost_dirp->e, &dir_ptr); + if (ret != 0) { + errno = ret; + return NULL; + } + return dir_ptr; +} + +static void vfs_semihost_seekdir(void* ctx, DIR* pdir, long offset) +{ + if (!cpu_hal_is_debugger_attached()) { + return; + } + + vfs_semihost_dir_t *semihost_dirp = (vfs_semihost_dir_t *) pdir; + if (semihost_dirp != NULL) { + ESP_LOGV(TAG, "%s: %s %ld '%ld' bytes", __func__, semihost_dirp->path, semihost_dirp->id, offset); + semihosting_seekdir(semihost_dirp->id, offset); + } +} +#endif esp_err_t esp_vfs_semihost_register(const char* base_path) { assert(base_path); @@ -170,6 +430,25 @@ esp_err_t esp_vfs_semihost_register(const char* base_path) .close_p = &vfs_semihost_close, .read_p = &vfs_semihost_read, .lseek_p = &vfs_semihost_lseek, + .fsync_p = &vfs_semihost_fsync, + .fstat_p = &vfs_semihost_fstat, +#ifdef CONFIG_VFS_SUPPORT_DIR + .mkdir_p = &vfs_semihost_mkdir, + .rmdir_p = &vfs_semihost_rmdir, + .access_p = &vfs_semihost_access, + .truncate_p = &vfs_semihost_truncate, + .utime_p = &vfs_semihost_utime, + .stat_p = &vfs_semihost_stat, + .rename_p = &vfs_semihost_rename, + .link_p = &vfs_semihost_link, + .unlink_p = &vfs_semihost_unlink, + .opendir_p = &vfs_semihost_opendir, + .closedir_p = &vfs_semihost_closedir, + .telldir_p = &vfs_semihost_telldir, + .readdir_p = &vfs_semihost_readdir, + .readdir_r_p = &vfs_semihost_readdir_r, + .seekdir_p = &vfs_semihost_seekdir, +#endif }; ESP_LOGD(TAG, "Register semihosting driver '%s'", base_path); if (!cpu_hal_is_debugger_attached()) { From 8290ee4296185123592619f04cb791ea4bf82ffe Mon Sep 17 00:00:00 2001 From: nathannaveen <42319948+nathannaveen@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:58:46 +0000 Subject: [PATCH 002/665] chore: Set permissions for GitHub actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: nathannaveen <42319948+nathannaveen@users.noreply.github.com> --- .github/workflows/pre_commit_check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pre_commit_check.yml b/.github/workflows/pre_commit_check.yml index 177d10a573..a193112a0f 100644 --- a/.github/workflows/pre_commit_check.yml +++ b/.github/workflows/pre_commit_check.yml @@ -4,6 +4,9 @@ on: pull_request: types: [opened, reopened, synchronize] +permissions: + contents: read + jobs: pre_commit_check: runs-on: ubuntu-latest From 5d80b1295f32e51ec314696d8fcfadf7b503e515 Mon Sep 17 00:00:00 2001 From: Anton Maklakov Date: Tue, 26 Jul 2022 02:51:21 +0000 Subject: [PATCH 003/665] tools: update toolchain version to 'esp-2022r1-11.2.0' Closes https://github.com/espressif/esp-idf/issues/6113 --- tools/toolchain_versions.mk | 6 +- tools/tools.json | 224 ++++++++++++++++++------------------ 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/tools/toolchain_versions.mk b/tools/toolchain_versions.mk index 779475fc8b..ac6175da22 100644 --- a/tools/toolchain_versions.mk +++ b/tools/toolchain_versions.mk @@ -1,6 +1,6 @@ -SUPPORTED_TOOLCHAIN_COMMIT_DESC = esp-2022r1-RC1 +SUPPORTED_TOOLCHAIN_COMMIT_DESC = esp-2022r1 SUPPORTED_TOOLCHAIN_GCC_VERSIONS = 11.2.0 -CURRENT_TOOLCHAIN_COMMIT_DESC = esp-2022r1-RC1 -CURRENT_TOOLCHAIN_COMMIT_DESC_SHORT = esp-2022r1-RC1 +CURRENT_TOOLCHAIN_COMMIT_DESC = esp-2022r1 +CURRENT_TOOLCHAIN_COMMIT_DESC_SHORT = esp-2022r1 CURRENT_TOOLCHAIN_GCC_VERSION = 11.2.0 diff --git a/tools/tools.json b/tools/tools.json index 84db807837..92e4cca3cf 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -173,51 +173,51 @@ "versions": [ { "linux-amd64": { - "sha256": "5da31dfe66ee97c0e940d81e7fac3fc604bb4cbf75294a29e6d5384ae08102dc", - "size": 63661064, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz" + "sha256": "698d8407e18275d18feb7d1afdb68800b97904fbe39080422fb8609afa49df30", + "size": 64781328, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" }, "linux-arm64": { - "sha256": "1c1fadb50ecfd120b714e6ba094dca3f5a6ee511492dc45fe51f2cd2ed70fd61", - "size": 57730788, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-linux-arm64.tar.xz" + "sha256": "48ed01abff1e89e6fe1c3ebe4e00df6a0a67e53ae24979970464a4a3b64aa622", + "size": 60675980, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-arm64.tar.xz" }, "linux-armel": { - "sha256": "c588a0e760ed81be075a4e7d107e06a6842641c55a9ffd31b13ed258fd32cc7f", - "size": 59114212, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-linux-armel.tar.xz" + "sha256": "0e6131a9ab4e3da0a153ee75097012823ccf21f90c69368c3bf53c8a086736f8", + "size": 59117264, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-armel.tar.xz" }, "linux-armhf": { - "sha256": "b61488cef94f3ef96863669c8fc54730ac512d5a9cb185affe9ae2f7e2de0cd2", - "size": 57097648, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-linux-armhf.tar.xz" + "sha256": "74173665e228d8b1c988de0d743607a2f661e2bd24619c246e25dba7a01f46bd", + "size": 57942128, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-armhf.tar.xz" }, "linux-i686": { - "sha256": "05b96a8c369f595698cbe37419c22b32242323d82d61995fa4c86f4398e9bd2c", - "size": 66238704, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-linux-i686.tar.xz" + "sha256": "d06511bb18057d72b555d6c5b62b0686f19e9f8c7d7eae218b712eed0907dbb2", + "size": 65914276, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-i686.tar.xz" }, "macos": { - "sha256": "8e64d517b08f9e2e98f28f425dea7ae4023fb3b923ebe4e93b701bda2a022740", - "size": 65781412, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "1c9d873c56469e3abec1e4214b7200d36804a605d4f0991e539b1577415409bf", + "size": 68189688, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-macos.tar.xz" }, "macos-arm64": { - "sha256": "8e64d517b08f9e2e98f28f425dea7ae4023fb3b923ebe4e93b701bda2a022740", - "size": 65781412, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "297249b0dc5307fd496c4d85d960b69824996c0c450a8c92f8414a5fd32a7c3b", + "size": 58460768, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-macos-arm64.tar.xz" }, - "name": "esp-2022r1-RC1-11.2.0", + "name": "esp-2022r1-11.2.0", "status": "recommended", "win32": { - "sha256": "af0a1c38135d5bb28303b8d131cc395ce3c68b675e6a5a5f2fbfb9448125575e", - "size": 129791755, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-win32.zip" + "sha256": "858ee049d6d8de730ed3e30285c4adc1a9cdfe077b591ed0b6f2bfa5e3564f53", + "size": 129786756, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-win32.zip" }, "win64": { - "sha256": "809d9833b3c183f25b231ff6478de600a633345dd4dbe0ad1cb008cd26ffc730", - "size": 133937875, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-RC1-win64.zip" + "sha256": "f469aff6a71113e3a145466d814184339e02248b158357766970646f5d2a3da7", + "size": 133936844, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-win64.zip" } } ] @@ -247,51 +247,51 @@ "versions": [ { "linux-amd64": { - "sha256": "5ddd838f94870aa0a94242895c8dde4da620e8ba3500ca6cec1799ff9ea74ba6", - "size": 51391900, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz" + "sha256": "56e5913b6662b8eec7d6b46780e668bc7e7cebef239e326a74f764c92a3cc841", + "size": 51546516, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" }, "linux-arm64": { - "sha256": "a5c0274b852fc7264b7ee86add55a6f9f1696db78a6eac3cef30c139ffaa3567", - "size": 46583544, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-linux-arm64.tar.xz" + "sha256": "2f0ccc9d40279d6407ed9547250fb0434f16060faa94460c52b74614a38a1e21", + "size": 46338036, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-arm64.tar.xz" }, "linux-armel": { - "sha256": "4b2dff672af2601dd2ec1ee5be775fc44fcdc8aaa7093231653d939992e1256f", - "size": 43592340, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-linux-armel.tar.xz" + "sha256": "f71974c4aaf3f637f6adaa28bbbdf3a911db3385e0ab1544844513ec65185cc5", + "size": 43326084, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-armel.tar.xz" }, "linux-armhf": { - "sha256": "eb84b3cac471c197de251ee65737b6f095b2ec216f67086bff7b3fbb5d405433", - "size": 45879964, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-linux-armhf.tar.xz" + "sha256": "73e3be22c993f1112fcb1f7631d82552a6b759f82f12cfb78e669c7303d92b25", + "size": 44856580, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-armhf.tar.xz" }, "linux-i686": { - "sha256": "5f69ad8c781c1db35da4347467a94921fa9b9781c4e112570fae384ac3113e69", - "size": 53635828, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-linux-i686.tar.xz" + "sha256": "504efe97ce24561537bd442494b1046fc8fb9cc43a1c06ef1afa4652b7517201", + "size": 53807024, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-i686.tar.xz" }, "macos": { - "sha256": "77dfcd053503fcc03b0aa8ba4df685d9322d0a6c8f475b715aef9be91e98e92a", - "size": 53023284, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "f53da9423490001727c5b6c3b8e1602b887783f0ed68e5defbb3c7712ada9631", + "size": 53568496, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-macos.tar.xz" }, "macos-arm64": { - "sha256": "77dfcd053503fcc03b0aa8ba4df685d9322d0a6c8f475b715aef9be91e98e92a", - "size": 53023284, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "3592e0fbdb2ca438c7360d93fd62ef0e05ead2fc8144eff344bbe1971d333287", + "size": 44218948, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-macos-arm64.tar.xz" }, - "name": "esp-2022r1-RC1-11.2.0", + "name": "esp-2022r1-11.2.0", "status": "recommended", "win32": { - "sha256": "d98355285baf4cb405de399e1335714b05facbfa79b0469edb0d7eefaeabe5d9", - "size": 94982978, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-win32.zip" + "sha256": "96b873210438713a84ea6e39e591cdbbeef453cb431d8392ac3fa2e68a48bc97", + "size": 94981372, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-win32.zip" }, "win64": { - "sha256": "10b69180ad21779f490cbbb08ef3bbcfa993b365e5d75d5e75c87cca251c2635", - "size": 99075649, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-RC1-win64.zip" + "sha256": "9ab0387e08047916bbf7ff0d2eb974c710bcf2e042cb04037b4dd93c9186f676", + "size": 99074758, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-win64.zip" } } ] @@ -321,51 +321,51 @@ "versions": [ { "linux-amd64": { - "sha256": "117a47a535c9c96a36ac0c8b0574143e670cf12df353939819e2e0c94a30d23f", - "size": 51692156, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz" + "sha256": "5058b2e724166c34ca09ec2d5377350252de8bce5039b06c00352f9a8151f76e", + "size": 51899328, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" }, "linux-arm64": { - "sha256": "eef51bd9917b311aebd13b2b560617fb9d4bc900b502d984248bec0be16f3593", - "size": 45438876, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-linux-arm64.tar.xz" + "sha256": "d2c6fb98a5018139a9f5af6eb808e968f1381a5b34547a185f4dec142b0fa44e", + "size": 45458872, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-arm64.tar.xz" }, "linux-armel": { - "sha256": "6475f629e08b9fe90e29cbe0fc1688ff2a325e5aff255d72ff0ddcaeb48e7c45", - "size": 43905524, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-linux-armel.tar.xz" + "sha256": "9944e67d95a5de9875670c5cd5cb0bb282ebac235a38b5fd6d53069813fead9e", + "size": 44532116, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-armel.tar.xz" }, "linux-armhf": { - "sha256": "2fce387e79d154221a06f9d14b5d190e8afc82cbe92d9bcb70fe616c8440ba19", - "size": 44730884, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-linux-armhf.tar.xz" + "sha256": "c0a8836dd709605f8d68ea1fd6e8ae79b3fa76274bfffdd8e79eeadc8f1f3ce1", + "size": 44840304, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-armhf.tar.xz" }, "linux-i686": { - "sha256": "028879201a08d63ec34b31f602cd797956d61a85673ca1a22c3a7fcd669dc7fc", - "size": 53850872, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-linux-i686.tar.xz" + "sha256": "0feccf884e36b6e93c27c793729199b18df22a409557b16c90b2883a6748e041", + "size": 53956012, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-i686.tar.xz" }, "macos": { - "sha256": "6755cfd65e26745bd26d1b8990f7c9e8a85cd4b055dc25c27215630ac2d37b1d", - "size": 53839732, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "2b46730adc6afd8115e0be9365050a87f9523617e5e58ee35cb85ff1ddf2756c", + "size": 54256036, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-macos.tar.xz" }, "macos-arm64": { - "sha256": "6755cfd65e26745bd26d1b8990f7c9e8a85cd4b055dc25c27215630ac2d37b1d", - "size": 53839732, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "bb449ac62b9917638b35234c98ce03ddf1cac75c2d80fbd67c46ecec08369838", + "size": 44835256, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-macos-arm64.tar.xz" }, - "name": "esp-2022r1-RC1-11.2.0", + "name": "esp-2022r1-11.2.0", "status": "recommended", "win32": { - "sha256": "9e94507bca64b622d8dad8b8c32e4c533af65c8424ea3950641bb89d80fca7dc", - "size": 95246498, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-win32.zip" + "sha256": "0c9ec6d296b66523e3990b195b6597dfc4030f2335bf904b614f990ad6dabbde", + "size": 95241895, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-win32.zip" }, "win64": { - "sha256": "cdfb5aaa27b533c50d6cc8215fa8dba204fad3a68e1d1daf71b446d1faf594bc", - "size": 99497106, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-RC1-win64.zip" + "sha256": "7213a0bf22607e9c70febaabef37822c2ae5e071ac53d6467e6031b02bb0b2bf", + "size": 99495535, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-win64.zip" } } ] @@ -449,51 +449,51 @@ "versions": [ { "linux-amd64": { - "sha256": "504766020be61413031650d32e642d6e69f1205b2cc1691b8fa7e004d2f33322", - "size": 95539052, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz" + "sha256": "52710f804df4a033a2b621cc16cfa21023b42052819a51e35a2a164140bbf665", + "size": 110107900, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" }, "linux-arm64": { - "sha256": "85dab0b6d57fccc85366757bf6b2162da967ed6d80d9734de695b4c48fbd1f94", - "size": 90927264, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-arm64.tar.xz" + "sha256": "812a18f2ecdc3f72c1d098c4e8baa968841099ce9d9ecf95baea85ff71e11013", + "size": 104279292, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-arm64.tar.xz" }, "linux-armel": { - "sha256": "8e361785fcde89ce28934cb86ab95bda37a2d95beec37e9800c2a55b94592b35", - "size": 89429648, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-armel.tar.xz" + "sha256": "bc6e3ff8323d1f8b137374788b5615152281aab9e7561c55ab1504145677b6c7", + "size": 102802824, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-armel.tar.xz" }, "linux-armhf": { - "sha256": "c81a38675c5f323037dd981cc05f7abcc2119d0d55a28fd7c9d117b68087e0c5", - "size": 90271420, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-armhf.tar.xz" + "sha256": "63f85a089fcd06939ed5e7e72ee5cdca590aa470075e409c0a4c59ef1cab3a7b", + "size": 102657540, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-armhf.tar.xz" }, "linux-i686": { - "sha256": "6595de9ebb2b3f86edd2173042a2700e0296bc4a56a6296b4b7b83f1d3dbe474", - "size": 99164996, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-i686.tar.xz" + "sha256": "39d7295c30a23b5ea91baf61c207718ce86d4b1589014b030e121300370f696d", + "size": 111505972, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-i686.tar.xz" }, "macos": { - "sha256": "4497a479557e3d5dd6ad6fb8a5085c6c36717121db01dfe0faf3a8b27b37d339", - "size": 100787176, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "d3a6f42b02a5f1485ba3fa92b8a9d9f307f643420e22b3765e88bbe4570aee01", + "size": 112060920, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-macos.tar.xz" }, "macos-arm64": { - "sha256": "4497a479557e3d5dd6ad6fb8a5085c6c36717121db01dfe0faf3a8b27b37d339", - "size": 100787176, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-macos.tar.xz" + "sha256": "23d9a715d932a3af57fd7393b0789f88d0f70fedaf5b803deb9ab81dee271bd6", + "size": 101254152, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-macos-arm64.tar.xz" }, - "name": "esp-2022r1-RC1-11.2.0", + "name": "esp-2022r1-11.2.0", "status": "recommended", "win32": { - "sha256": "d6435639f9058c409a4185d4c14a29b09dfca7d6934c59a85d18d4cf75877a63", - "size": 232598665, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-win32.zip" + "sha256": "3e677ef068d7f154d33b0d3788b5f985c5066d110028eac44e0f76b3bda4429b", + "size": 268053767, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-win32.zip" }, "win64": { - "sha256": "c6c4d624333dcb93bd65fb19b5c44b4b1daab4642a890d853b2ae89938d37b79", - "size": 235685997, - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-win64.zip" + "sha256": "324a5c679fef75313766cc48d3433c48bf23985a11b5070c5d19144538c6357b", + "size": 271158759, + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-win64.zip" } } ] From 42a22f149af61fd04c8fa8ae1f09cd63b93fbca2 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Thu, 2 Jun 2022 11:44:56 +0400 Subject: [PATCH 004/665] docs: add debugging freertos objects --- .../jtag-debugging/debugging-examples.rst | 33 ++++++++++++++++--- docs/en/api-guides/jtag-debugging/index.rst | 5 +++ .../jtag-debugging/tips-and-quirks.rst | 2 ++ .../jtag-debugging/debugging-examples.rst | 4 --- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/docs/en/api-guides/jtag-debugging/debugging-examples.rst b/docs/en/api-guides/jtag-debugging/debugging-examples.rst index 73f7e1e2d7..3390b20a6f 100644 --- a/docs/en/api-guides/jtag-debugging/debugging-examples.rst +++ b/docs/en/api-guides/jtag-debugging/debugging-examples.rst @@ -245,6 +245,7 @@ Examples in this section 5. :ref:`jtag-debugging-examples-command-line-05` 6. :ref:`jtag-debugging-examples-command-line-06` 7. :ref:`jtag-debugging-examples-command-line-07` +8. :ref:`jtag-debugging-examples-command-line-08` .. _jtag-debugging-examples-command-line-01: @@ -445,10 +446,6 @@ To check it delete all breakpoints and enter ``c`` to resume application. Then e In particular case above, the application has been halted in line 52 of code in file ``freertos_hooks.c``. Now you can resume it again by enter ``c`` or do some debugging as discussed below. -.. note:: - - In MSYS2 shell Ctrl+C does not halt the target but exists debugger. To resolve this issue consider debugging with :ref:`jtag-debugging-examples-eclipse` or check a workaround under http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt. - .. _jtag-debugging-examples-command-line-04: @@ -627,6 +624,34 @@ If current value of ``i`` is less than ``2`` and program is resumed, it will bli (gdb) +.. _jtag-debugging-examples-command-line-08: + +Debugging FreeRTOS Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This part might be interesting when you are debugging FreeRTOS tasks interactions. +Users that need to use the FreeRTOS task interactions can use the GDB ``freertos`` command. The ``freertos`` command is not native to GDB and comes from the `freertos-gdb `_ Python extension module. The ``freertos`` command contains a series of sub-commands as demonstrated in the code snippet:: + + (gdb) freertos + "freertos" must be followed by the name of a subcommand. + List of freertos subcommands: + + freertos queue -- Generate a print out of the current queues info. + freertos semaphore -- Generate a print out of the current semaphores info. + freertos task -- Generate a print out of the current tasks and their states. + freertos timer -- Generate a print out of the current timers info. + +For a more detailed description of this extension, please refer to https://pypi.org/project/freertos-gdb. + +.. note:: + + The freertos-gdb Python module is included as a Python package requirement by ESP-IDF, thus should be automatically installed (see :ref:`get-started-set-up-tools` for more details). + + The FreeRTOS extension automatically loads in case GDB is executed with command via ``idf.py gdb``. Otherwise, the module could be enabled via the ``python import freertos_gdb`` command inside GDB. + + Users only need to have Python 3.6 (or above) that contains a Python shared library. + + Obtaining help on commands ^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/en/api-guides/jtag-debugging/index.rst b/docs/en/api-guides/jtag-debugging/index.rst index 48a6dc01a8..a2187d7dfb 100644 --- a/docs/en/api-guides/jtag-debugging/index.rst +++ b/docs/en/api-guides/jtag-debugging/index.rst @@ -249,6 +249,11 @@ This section is intended for users not familiar with GDB. It presents example de Similar debugging actions are provided using GDB from :ref:`jtag-debugging-examples-command-line`. +.. note:: + + :ref:`jtag-debugging-examples-command-line-08` is currently only available for command line debugging. + + Before proceeding to examples, set up your {IDF_TARGET_NAME} target and load it with :example:`get-started/blink`. diff --git a/docs/en/api-guides/jtag-debugging/tips-and-quirks.rst b/docs/en/api-guides/jtag-debugging/tips-and-quirks.rst index f881965fb5..edffe00a88 100644 --- a/docs/en/api-guides/jtag-debugging/tips-and-quirks.rst +++ b/docs/en/api-guides/jtag-debugging/tips-and-quirks.rst @@ -71,6 +71,8 @@ FreeRTOS support OpenOCD has explicit support for the ESP-IDF FreeRTOS. GDB can see FreeRTOS tasks as threads. Viewing them all can be done using the GDB ``i threads`` command, changing to a certain task is done with ``thread n``, with ``n`` being the number of the thread. FreeRTOS detection can be disabled in target's configuration. For more details see :ref:`jtag-debugging-tip-openocd-configure-target`. +GDB has a Python extension for FreeRTOS support. ESP-IDF automatically loads this module into GDB with the ``idf.py gdb`` command when the system requirements are met. See more details in :ref:`jtag-debugging-examples-command-line-08`. + .. only:: esp32 .. _jtag-debugging-tip-code-flash-voltage: diff --git a/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst b/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst index 5dd9c6b3b6..7832db9a61 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst @@ -445,10 +445,6 @@ 在上图所示的情况下,应用程序已经在 ``freertos_hooks.c`` 文件的第 52 行暂停运行,现在您可以通过输入 ``c`` 再次将其恢复运行或者进行如下所述的一些调试工作。 -.. note:: - - 在 MSYS2 的 shell 中输入 Ctrl+C 并不会暂停目标的运行,而是会退出调试器。解决这个问题的方法可以通过 :ref:`使用 Eclipse 来调试 ` 或者参考 http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt 里的解决方案。 - .. _jtag-debugging-examples-command-line-04: From 966d18e4fd222c0ea0384a364d6a0347d88f753b Mon Sep 17 00:00:00 2001 From: daiziyan Date: Tue, 5 Jul 2022 16:17:29 +0800 Subject: [PATCH 005/665] docs: add CN translation for debugging-examples --- .../jtag-debugging/debugging-examples.rst | 29 +++++++++++++++++++ .../zh_CN/api-guides/jtag-debugging/index.rst | 5 ++++ .../jtag-debugging/tips-and-quirks.rst | 22 +++++++------- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst b/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst index 7832db9a61..3a6fb757a7 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/debugging-examples.rst @@ -245,6 +245,7 @@ 5. :ref:`jtag-debugging-examples-command-line-05` 6. :ref:`jtag-debugging-examples-command-line-06` 7. :ref:`jtag-debugging-examples-command-line-07` +8. :ref:`jtag-debugging-examples-command-line-08` .. _jtag-debugging-examples-command-line-01: @@ -623,6 +624,34 @@ (gdb) +.. _jtag-debugging-examples-command-line-08: + +调试 FreeRTOS 对象 +^^^^^^^^^^^^^^^^^^ + +该部分内容或许可以帮助您调试 FreeRTOS 任务交互。 +需要调试 FreeRTOS 任务交互的用户可使用 GDB 命令 ``freertos``。该命令并非 GDB 原生命令,而是来自于 Python 扩展模块 `freertos-gdb `_,其包含一系列子命令:: + + (gdb) freertos + "freertos" 后面必须紧随子命令的名称 + freertos 子命令如下: + + freertos queue -- 打印当前队列信息 + freertos semaphore -- 打印当前信号量信息 + freertos task -- 打印当前任务及其状态 + freertos timer -- 打印当前定时器信息 + +点击 https://pypi.org/project/freertos-gdb 链接了解此扩展模块的详细信息。 + +.. note:: + + ESP-IDF 在安装 Pyhton 包时会自动安装 freertos-gdb Python 模块,详情请参考 :ref:`get-started-set-up-tools`。 + + 如果使用 ``idf.py gdb`` 命令运行 GDB,FreeRTOS 扩展会自动加载。也可以使用 GDB 内部命令 ``python import freertos_gdb`` 使能该模块。 + + 请保证使用 Python 3.6 及以上版本,该版本具有 Python 共享库。 + + 获得命令的帮助信息 ^^^^^^^^^^^^^^^^^^ diff --git a/docs/zh_CN/api-guides/jtag-debugging/index.rst b/docs/zh_CN/api-guides/jtag-debugging/index.rst index 63ad61fa74..f353c3b206 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/index.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/index.rst @@ -249,6 +249,11 @@ OpenOCD 安装完成后就可以配置 {IDF_TARGET_NAME} 目标(即带 JTAG 此外还会提供在 :ref:`在命令行终端进行调试 ` 下使用 GDB 调试的案例。 +.. note:: + + :ref:`jtag-debugging-examples-command-line-08` 目前仅适用于命令行调试。 + + 在演示之前,请完成 {IDF_TARGET_NAME} 目标板设置并加载 :example:`get-started/blink` 至 {IDF_TARGET_NAME} 中。 diff --git a/docs/zh_CN/api-guides/jtag-debugging/tips-and-quirks.rst b/docs/zh_CN/api-guides/jtag-debugging/tips-and-quirks.rst index d4fdff2907..23e7c600e2 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/tips-and-quirks.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/tips-and-quirks.rst @@ -69,7 +69,9 @@ ESP-IDF 有一些针对 OpenOCD 调试功能的选项可以在编译时进行设 支持 FreeRTOS ^^^^^^^^^^^^^^^^ -OpenOCD 完全支持 ESP-IDF 自带的 FreeRTOS 操作系统,GDB 会将 FreeRTOS 中的任务当做线程。使用 GDB 命令 ``i threads`` 可以查看所有的线程,使用命令 ``thread n`` 可以切换到某个具体任务的堆栈,其中 ``n`` 是线程的编号。检测 FreeRTOS 的功能可以在配置目标时被禁用。更多详细信息,请参阅 :ref:`jtag-debugging-tip-openocd-configure-target`. +OpenOCD 完全支持 ESP-IDF 自带的 FreeRTOS 操作系统,GDB 会将 FreeRTOS 中的任务当做线程。使用 GDB 命令 ``i threads`` 可以查看所有的线程,使用命令 ``thread n`` 可以切换到某个具体任务的堆栈,其中 ``n`` 是线程的编号。检测 FreeRTOS 的功能可以在配置目标时被禁用。更多详细信息,请参阅 :ref:`jtag-debugging-tip-openocd-configure-target`。 + +GDB 具有 FreeRTOS 支持的 Python 扩展模块。在系统要求满足的情况下,通过 ``idf.py gdb`` 命令,ESP-IDF 会将该模块自动加载到 GDB 中。详细信息请参考 :ref:`jtag-debugging-examples-command-line-08`。 .. only:: esp32 @@ -78,7 +80,7 @@ OpenOCD 完全支持 ESP-IDF 自带的 FreeRTOS 操作系统,GDB 会将 FreeRT 在 OpenOCD 的配置文件中设置 SPI 闪存的工作电压 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ESP32 的 MTDI 引脚是用于 JTAG 通信的四个引脚之一,同时也是 ESP32 的 bootstrapping 引脚。上电时,ESP32 会在 MTDI 引脚上采样二进制电平,据此来设置内部的稳压器,用于给外部的 SPI 闪存芯片供电。如果上电时 MTDI 引脚上的二进制电平为低电平,则稳压器会被设置为 3.3 V;如果 MTDI 引脚为高电平,则稳压器会被设置为 1.8 V。MTDI 引脚通常需要一个上拉电阻或者直接使能内部的弱下拉电阻(详见 `ESP32 系列芯片技术规格书 `_ ),具体取决于所使用的 SPI 芯片的类型。但是一旦连接上 JTAG 后,原来用于实现 bootstrapping 功能的上拉或者下拉电阻都会被覆盖掉。 + ESP32 的 MTDI 管脚是用于 JTAG 通信的四个管脚之一,同时也是 ESP32 的 bootstrapping 管脚。上电时,ESP32 会在 MTDI 管脚上采样二进制电平,据此来设置内部的稳压器,用于给外部的 SPI 闪存芯片供电。如果上电时 MTDI 管脚上的二进制电平为低电平,则稳压器会被设置为 3.3 V;如果 MTDI 管脚为高电平,则稳压器会被设置为 1.8 V。MTDI 管脚通常需要一个上拉电阻或者直接使能内部的弱下拉电阻(详见 `ESP32 系列芯片技术规格书 `_ ),具体取决于所使用的 SPI 芯片的类型。但是一旦连接上 JTAG 后,原来用于实现 bootstrapping 功能的上拉或者下拉电阻都会被覆盖掉。 为了解决这个问题,OpenOCD 的板级配置文件(例如 ESP-WROVER-KIT 开发板的 ``board\esp32-wrover-kit-3.3v.cfg``)提供了 ``ESP32_FLASH_VOLTAGE`` 参数来设置 ``TDO`` 信号线在空闲状态下的二进制电平,这样就可以减少由于闪存电压不正确而导致的应用程序启动不良的几率。 @@ -172,7 +174,7 @@ TCL 语言中为变量赋值的语法是: * - ``ESP_RTOS`` - 设置成 ``none`` 可以关闭 OpenOCD 对 RTOS 的支持,这样的话,你将无法在 GDB 中查看到线程列表。这个功能在调试 FreeRTOS 本身的时候会很有用,可以单步调试调度器的代码。 * - ``ESP_FLASH_SIZE`` - - 设置成 ``0`` 可以关闭对 Flash 断点的支持。 + - 设置成 ``0`` 可以关闭对 flash 断点的支持。 * - ``ESP_SEMIHOST_BASEDIR`` - 设置 semihosting 在主机端的默认目录。 @@ -190,16 +192,16 @@ TCL 语言中为变量赋值的语法是: .. _jtag-debugging-tip-jtag-pins-reconfigured: -不要将 JTAG 引脚用于其他功能 +不要将 JTAG 管脚用于其他功能 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -如果除了 {IDF_TARGET_NAME} 模组和 JTAG 适配器之外的其他硬件也连接到了 JTAG 引脚,那么 JTAG 的操作可能会受到干扰。{IDF_TARGET_NAME} JTAG 使用以下引脚: +如果除了 {IDF_TARGET_NAME} 模组和 JTAG 适配器之外的其他硬件也连接到了 JTAG 管脚,那么 JTAG 的操作可能会受到干扰。{IDF_TARGET_NAME} JTAG 使用以下管脚: .. include:: {IDF_TARGET_PATH_NAME}.inc :start-after: jtag-pins :end-before: --- -如果用户应用程序更改了 JTAG 引脚的配置,JTAG 通信可能会失败。如果 OpenOCD 正确初始化(检测到两个 Tensilica 内核),但在程序运行期间失去了同步并报出大量 DTR/DIR 错误,则应用程序可能将 JTAG 引脚重新配置为其他功能或者用户忘记将 Vtar 连接到 JTAG 适配器。 +如果用户应用程序更改了 JTAG 管脚的配置,JTAG 通信可能会失败。如果 OpenOCD 正确初始化(检测到两个 Tensilica 内核),但在程序运行期间失去了同步并报出大量 DTR/DIR 错误,则应用程序可能将 JTAG 管脚重新配置为其他功能或者用户忘记将 Vtar 连接到 JTAG 适配器。 .. highlight:: none @@ -221,16 +223,16 @@ JTAG 与闪存加密和安全引导 Kconfig 配置项 :ref:`CONFIG_SECURE_BOOT_ALLOW_JTAG` 可以改变这个默认行为,使得用户即使开启了安全引导或者闪存加密,仍会保留 JTAG 的功能。 -然而,因为设置 :ref:`软件断点 ` 的需要,OpenOCD 会尝试自动读写 Flash 中的内容,这会带来两个问题: +然而,因为设置 :ref:`软件断点 ` 的需要,OpenOCD 会尝试自动读写 flash 中的内容,这会带来两个问题: -- 软件断点和闪存加密是不兼容的,目前 OpenOCD 尚不支持对 Flash 中的内容进行加密和解密。 +- 软件断点和闪存加密是不兼容的,目前 OpenOCD 尚不支持对 flash 中的内容进行加密和解密。 - 如果开启了安全引导功能,设置软件断点会改变被签名的程序的摘要,从而使得签名失效。这也意味着,如果设置了软件断点,系统会在下次重启时的签名验证阶段失败,导致无法启动。 关闭 JTAG 的软件断点功能,可以在启动 OpenOCD 时在命令行额外加一项配置参数 ``-c 'set ESP_FLASH_SIZE 0'``,请参考 :ref:`jtag-debugging-tip-openocd-config-vars`。 .. note:: - 同样地,当启用该选项,并且调试过程中打了软件断点,之后引导程序将无法校验通过应用程序的签名。 + 同样地,当启用该选项,并且在调试过程中设置了软件断点,引导程序将无法校验通过应用程序的签名。 .. only:: esp32 @@ -255,7 +257,7 @@ Kconfig 配置项 :ref:`CONFIG_SECURE_BOOT_ALLOW_JTAG` 可以改变这个默认 c. 用于调试的操作系统的详细信息。 d. 操作系统是在本地计算机运行还是在虚拟机上运行? -2. 创建一个能够演示问题的简单示例工程,描述复现该问题的步骤。且这个调试示例不能受到 Wi-Fi 协议栈引入的非确定性行为的影响,因而再次遇到同样问题时,更容易复现。 +2. 创建一个能够演示问题的简单示例工程,描述复现该问题的步骤。且这个调试示例不能受到 Wi-Fi 协议栈引入的非确定性行为的影响,这样再次遇到同样问题时,更容易复现。 .. highlight:: bash From cd70631f135d150289267b969216cbb772800707 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 2 Aug 2022 20:41:43 +0200 Subject: [PATCH 006/665] newlib: add test for st_blksize and FILE buffer size Inspired by https://github.com/joltwallet/esp_littlefs/pull/91/files#r935872478 --- .../newlib/test_apps/main/CMakeLists.txt | 3 +- components/newlib/test_apps/main/test_file.c | 94 +++++++++++++++++++ .../newlib/test_apps/main/test_newlib_main.c | 1 + 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 components/newlib/test_apps/main/test_file.c diff --git a/components/newlib/test_apps/main/CMakeLists.txt b/components/newlib/test_apps/main/CMakeLists.txt index 76686cf622..b54d173420 100644 --- a/components/newlib/test_apps/main/CMakeLists.txt +++ b/components/newlib/test_apps/main/CMakeLists.txt @@ -2,5 +2,6 @@ idf_component_register(SRCS "test_newlib_main.c" "test_stdatomic.c" "test_misc.c" + "test_file.c" REQUIRES test_utils - PRIV_REQUIRES unity) + PRIV_REQUIRES unity vfs) diff --git a/components/newlib/test_apps/main/test_file.c b/components/newlib/test_apps/main/test_file.c new file mode 100644 index 0000000000..e25df6b11a --- /dev/null +++ b/components/newlib/test_apps/main/test_file.c @@ -0,0 +1,94 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include +#include +#include +#include +#include "esp_vfs.h" +#include "unity.h" +#include "unity_fixture.h" + +TEST_GROUP(file); + +TEST_SETUP(file) +{ +} + +TEST_TEAR_DOWN(file) +{ +} + +/* This test checks that st_blksize value set in struct stat correctly affects the + * FILE structure: + * - _blksize field should be equal to st_blksize + * - buffer size should be equal to st_blksize if it is nonzero, and __BUFSIZ__ otherwise. + * This is more of an integration test since some of the functions responsible for this are + * in ROM, and have been built without HAVE_BLKSIZE feature for the ESP32 chip. + */ + +typedef struct { + unsigned blksize; +} blksize_test_ctx_t; + +static int blksize_test_open(void* ctx, const char * path, int flags, int mode) +{ + return 1; +} + +static int blksize_test_fstat(void* ctx, int fd, struct stat * st) +{ + blksize_test_ctx_t* test_ctx = (blksize_test_ctx_t*) ctx; + memset(st, 0, sizeof(*st)); + st->st_mode = S_IFREG; + st->st_blksize = test_ctx->blksize; + return 0; +} + +static ssize_t blksize_test_write(void* ctx, int fd, const void * data, size_t size) +{ + return size; +} + +TEST(file, blksize) +{ + FILE* f; + blksize_test_ctx_t ctx = {}; + const char c = 42; + const esp_vfs_t desc = { + .flags = ESP_VFS_FLAG_CONTEXT_PTR, + .open_p = blksize_test_open, + .fstat_p = blksize_test_fstat, + .write_p = blksize_test_write, + }; + + TEST_ESP_OK(esp_vfs_register("/test", &desc, &ctx)); + + /* test with zero st_blksize (=not set) */ + ctx.blksize = 0; + f = fopen("/test/path", "w"); + TEST_ASSERT_NOT_NULL(f); + fwrite(&c, 1, 1, f); + TEST_ASSERT_EQUAL(0, f->_blksize); + TEST_ASSERT_EQUAL(__BUFSIZ__, __fbufsize(f)); + fclose(f); + + /* test with non-zero st_blksize */ + ctx.blksize = 4096; + f = fopen("/test/path", "w"); + TEST_ASSERT_NOT_NULL(f); + fwrite(&c, 1, 1, f); + TEST_ASSERT_EQUAL(ctx.blksize, f->_blksize); + TEST_ASSERT_EQUAL(ctx.blksize, __fbufsize(f)); + fclose(f); + + TEST_ESP_OK(esp_vfs_unregister("/test")); +} + +TEST_GROUP_RUNNER(file) +{ + RUN_TEST_CASE(file, blksize) +} diff --git a/components/newlib/test_apps/main/test_newlib_main.c b/components/newlib/test_apps/main/test_newlib_main.c index 00de90fa06..a18a88d85a 100644 --- a/components/newlib/test_apps/main/test_newlib_main.c +++ b/components/newlib/test_apps/main/test_newlib_main.c @@ -10,6 +10,7 @@ static void run_all_tests(void) { RUN_TEST_GROUP(stdatomic); RUN_TEST_GROUP(misc); + RUN_TEST_GROUP(file); } void app_main(void) From 34ff721c92f5a2948a82d72d40af2a40a9f532b0 Mon Sep 17 00:00:00 2001 From: tgotic Date: Wed, 3 Aug 2022 14:31:32 +0200 Subject: [PATCH 007/665] [gpio] calloc in critical section Remove calloc out of critical section. In critical section, assign allocated memory to gpio_isr_func. Free resources if gpio_isr_register() fails. --- components/driver/gpio/gpio.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/components/driver/gpio/gpio.c b/components/driver/gpio/gpio.c index 0abbbeb5e0..8221b7f194 100644 --- a/components/driver/gpio/gpio.c +++ b/components/driver/gpio/gpio.c @@ -447,14 +447,17 @@ static void IRAM_ATTR gpio_intr_service(void *arg) esp_err_t gpio_install_isr_service(int intr_alloc_flags) { GPIO_CHECK(gpio_context.gpio_isr_func == NULL, "GPIO isr service already installed", ESP_ERR_INVALID_STATE); - esp_err_t ret; - portENTER_CRITICAL(&gpio_context.gpio_spinlock); - gpio_context.gpio_isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t)); - portEXIT_CRITICAL(&gpio_context.gpio_spinlock); - if (gpio_context.gpio_isr_func == NULL) { - ret = ESP_ERR_NO_MEM; - } else { + esp_err_t ret = ESP_ERR_NO_MEM; + gpio_isr_func_t *isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t)); + if (isr_func) { + portENTER_CRITICAL(&gpio_context.gpio_spinlock); + gpio_context.gpio_isr_func = isr_func; + portEXIT_CRITICAL(&gpio_context.gpio_spinlock); ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle); + if (ret != ESP_OK) { + // registering failed, free allocated resources + gpio_uninstall_isr_service(); + } } return ret; From 346cba9c57056aa379e41a38ac229b6c8bcf3bde Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Mon, 13 Jun 2022 21:42:28 +0800 Subject: [PATCH 008/665] efuse example: Adds CI tests for ESP32-C2 --- .gitlab/ci/target-test.yml | 6 + examples/system/.build-test-rules.yml | 4 - examples/system/efuse/README.md | 4 +- examples/system/efuse/example_test.py | 118 +++++++++++------- examples/system/efuse/main/efuse_main.c | 14 +++ .../sdkconfig.ci.virt_sb_v2_and_fe.esp32 | 21 ++++ .../sdkconfig.ci.virt_sb_v2_and_fe.esp32c2 | 17 +++ ...=> sdkconfig.ci.virt_sb_v2_and_fe.esp32c3} | 5 +- .../sdkconfig.ci.virt_sb_v2_and_fe.esp32s2 | 17 +++ .../sdkconfig.ci.virt_secure_boot_v2.esp32 | 20 +++ .../sdkconfig.ci.virt_secure_boot_v2.esp32c2 | 16 +++ ... sdkconfig.ci.virt_secure_boot_v2.esp32c3} | 5 +- .../sdkconfig.ci.virt_secure_boot_v2.esp32s2 | 16 +++ ...secure_boot_signing_key_ecdsa_nistp256.pem | 5 + 14 files changed, 214 insertions(+), 54 deletions(-) create mode 100644 examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32 create mode 100644 examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c2 rename examples/system/efuse/{sdkconfig.ci.virt_sb_v2_and_fe => sdkconfig.ci.virt_sb_v2_and_fe.esp32c3} (85%) create mode 100644 examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32s2 create mode 100644 examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32 create mode 100644 examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c2 rename examples/system/efuse/{sdkconfig.ci.virt_secure_boot_v2 => sdkconfig.ci.virt_secure_boot_v2.esp32c3} (85%) create mode 100644 examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32s2 create mode 100644 examples/system/efuse/test/secure_boot_signing_key_ecdsa_nistp256.pem diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index c4c3591d48..6ca24aa1d1 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -613,6 +613,12 @@ example_test_C3_GENERIC: - ESP32C3 - Example_GENERIC +example_test_C2_GENERIC: + extends: .example_test_esp32c2_template + tags: + - ESP32C2 + - Example_GENERIC + example_test_ESP32_SDSPI: extends: .example_test_esp32_template tags: diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index 7cfcddac8d..6235efcdea 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -43,10 +43,6 @@ examples/system/deep_sleep: reason: target esp32c2 is not supported yet examples/system/efuse: - disable: - - if: IDF_TARGET == "esp32c2" - temporary: true - reason: target esp32c2 is not supported yet disable_test: - if: IDF_TARGET == "esp32s3" temporary: true diff --git a/examples/system/efuse/README.md b/examples/system/efuse/README.md index 14e9e36e3d..23a722c6d7 100644 --- a/examples/system/efuse/README.md +++ b/examples/system/efuse/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | # eFuse Example diff --git a/examples/system/efuse/example_test.py b/examples/system/efuse/example_test.py index 868b2266f2..af5afa9e62 100644 --- a/examples/system/efuse/example_test.py +++ b/examples/system/efuse/example_test.py @@ -27,7 +27,7 @@ def erase_field_on_emul_efuse(dut, pos_of_bits): # type: (ttfw_idf.TinyFW.Env, dut.write_flash(flash_files) -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32c3', 'esp32c2']) def test_examples_efuse(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None dut = env.get_dut('efuse', 'examples/system/efuse') dut.start_app() @@ -54,7 +54,7 @@ def test_examples_efuse(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None timeout=30) -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_flash_enc(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_flash_enc') # check and log bin size @@ -79,7 +79,10 @@ def test_examples_efuse_with_virt_flash_enc(env, _): # type: (ttfw_idf.TinyFW.E dut.expect('Disable JTAG...') dut.expect('Disable ROM BASIC interpreter fallback...') else: - dut.expect('Writing EFUSE_BLK_KEY0 with purpose 4') + if dut.TARGET == 'esp32c2': + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 1') + else: + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 4') dut.expect('Not disabling UART bootloader encryption') dut.expect('Disable UART bootloader cache...') dut.expect('Disable JTAG...') @@ -138,7 +141,7 @@ def test_examples_efuse_with_virt_flash_enc_aes_256(env, _): # type: (ttfw_idf. dut.expect('example: Done') -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_flash_enc_pre_loaded(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_flash_enc') @@ -161,6 +164,9 @@ def test_examples_efuse_with_virt_flash_enc_pre_loaded(env, _): # type: (ttfw_i FLASH_CRYPT_CNT = 20 # Resets eFuse, which enables Flash encryption feature erase_field_on_emul_efuse(dut, [FLASH_CRYPT_CNT]) + elif dut.TARGET == 'esp32c2': + FLASH_CRYPT_CNT = 39 + erase_field_on_emul_efuse(dut, [FLASH_CRYPT_CNT]) else: # offset of this eFuse is taken from components/efuse/{target}/esp_efuse_table.csv print(' - Flash emul_efuse with pre-loaded efuses (SPI_BOOT_CRYPT_CNT 1 -> 0)') @@ -201,7 +207,7 @@ def test_examples_efuse_with_virt_flash_enc_pre_loaded(env, _): # type: (ttfw_i dut.expect('example: Done') -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32', 'esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_flash_enc_release(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_flash_enc_release') # check and log bin size @@ -226,7 +232,10 @@ def test_examples_efuse_with_virt_flash_enc_release(env, _): # type: (ttfw_idf. dut.expect('Disable JTAG...') dut.expect('Disable ROM BASIC interpreter fallback...') else: - dut.expect('Writing EFUSE_BLK_KEY0 with purpose 4') + if dut.TARGET == 'esp32c2': + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 1') + else: + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 4') dut.expect('Disable UART bootloader encryption') dut.expect('Disable UART bootloader cache...') dut.expect('Disable JTAG...') @@ -347,7 +356,7 @@ def test_examples_efuse_with_virt_secure_boot_v1_pre_loaded(env, _): # type: (t @ttfw_idf.idf_example_test(env_tag='Example_EthKitV12', target=['esp32']) def test_examples_efuse_with_virt_secure_boot_v2(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None # only for ESP32 ECO3 - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2.' + env.default_dut_cls.TARGET) # check and log bin size binary_file = os.path.join(dut.app.binary_path, 'bootloader', 'bootloader.bin') bin_size = os.path.getsize(binary_file) @@ -408,7 +417,7 @@ def test_examples_efuse_with_virt_secure_boot_v2(env, _): # type: (ttfw_idf.Tin @ttfw_idf.idf_example_test(env_tag='Example_EthKitV12', target=['esp32']) def test_examples_efuse_with_virt_secure_boot_v2_pre_loaded(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None # only for ESP32 ECO3 - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2.' + env.default_dut_cls.TARGET) print(' - Erase flash') dut.erase_flash() @@ -469,9 +478,9 @@ def test_examples_efuse_with_virt_secure_boot_v2_pre_loaded(env, _): # type: (t dut.expect('example: Done') -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_secure_boot_v2_esp32xx(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2.' + env.default_dut_cls.TARGET) # check and log bin size binary_file = os.path.join(dut.app.binary_path, 'bootloader', 'bootloader.bin') bin_size = os.path.getsize(binary_file) @@ -489,24 +498,29 @@ def test_examples_efuse_with_virt_secure_boot_v2_esp32xx(env, _): # type: (ttfw dut.expect('Verifying image signature...') dut.expect('secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + signed_scheme = 'ECDSA' if dut.TARGET == 'esp32c2' else 'RSA-PSS' + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: enabling secure boot v2...') dut.expect('Verifying image signature...') dut.expect('secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: Secure boot digests absent, generating..') dut.expect('secure_boot_v2: Digests successfully calculated, 1 valid signatures') dut.expect('secure_boot_v2: 1 signature block(s) found appended to the bootloader') - dut.expect('Writing EFUSE_BLK_KEY0 with purpose 9') + if dut.TARGET == 'esp32c2': + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 3') + else: + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 9') dut.expect('secure_boot_v2: Digests successfully calculated, 1 valid signatures') dut.expect('secure_boot_v2: 1 signature block(s) found appended to the app') dut.expect('secure_boot_v2: Application key(0) matches with bootloader key(0)') - dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') - dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') + if dut.TARGET != 'esp32c2': + dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') + dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') dut.expect('secure_boot_v2: blowing secure boot efuse...') dut.expect('UART ROM Download mode kept enabled - SECURITY COMPROMISED') dut.expect('Disable hardware & software JTAG...') @@ -520,7 +534,7 @@ def test_examples_efuse_with_virt_secure_boot_v2_esp32xx(env, _): # type: (ttfw dut.reset() dut.expect('Loading virtual efuse blocks from flash') dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: enabling secure boot v2...') dut.expect('secure_boot_v2: secure boot v2 is already enabled, continuing..') @@ -528,9 +542,9 @@ def test_examples_efuse_with_virt_secure_boot_v2_esp32xx(env, _): # type: (ttfw dut.expect('example: Done') -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_secure_boot_v2_esp32xx_pre_loaded(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_secure_boot_v2.' + env.default_dut_cls.TARGET) print(' - Erase flash') dut.erase_flash() @@ -546,28 +560,34 @@ def test_examples_efuse_with_virt_secure_boot_v2_esp32xx_pre_loaded(env, _): # print(' - Flash emul_efuse with pre-loaded efuses (SECURE_BOOT_EN 1 -> 0, SECURE_BOOT_KEY_REVOKE[0..2] -> 0)') # offsets of eFuses are taken from components/efuse/{target}/esp_efuse_table.csv - SECURE_BOOT_EN = 116 - SECURE_BOOT_KEY_REVOKE0 = 85 - SECURE_BOOT_KEY_REVOKE1 = 86 - SECURE_BOOT_KEY_REVOKE2 = 87 - # Resets eFuse, which enables Secure boot feature - # Resets eFuses, which control digest slots - erase_field_on_emul_efuse(dut, [SECURE_BOOT_EN, SECURE_BOOT_KEY_REVOKE0, SECURE_BOOT_KEY_REVOKE1, SECURE_BOOT_KEY_REVOKE2]) + if dut.TARGET == 'esp32c2': + SECURE_BOOT_EN = 53 + erase_field_on_emul_efuse(dut, [SECURE_BOOT_EN]) + else: + SECURE_BOOT_EN = 116 + SECURE_BOOT_KEY_REVOKE0 = 85 + SECURE_BOOT_KEY_REVOKE1 = 86 + SECURE_BOOT_KEY_REVOKE2 = 87 + # Resets eFuse, which enables Secure boot feature + # Resets eFuses, which control digest slots + erase_field_on_emul_efuse(dut, [SECURE_BOOT_EN, SECURE_BOOT_KEY_REVOKE0, SECURE_BOOT_KEY_REVOKE1, SECURE_BOOT_KEY_REVOKE2]) print(' - Start app (flash partition_table and app)') dut.start_app() dut.expect('Loading virtual efuse blocks from flash') dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + signed_scheme = 'ECDSA' if dut.TARGET == 'esp32c2' else 'RSA-PSS' + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: Secure boot digests already present') dut.expect('secure_boot_v2: Using pre-loaded public key digest in eFuse') dut.expect('secure_boot_v2: Digests successfully calculated, 1 valid signatures') dut.expect('secure_boot_v2: 1 signature block(s) found appended to the app') dut.expect('secure_boot_v2: Application key(0) matches with bootloader key(0)') - dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') - dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') + if dut.TARGET != 'esp32c2': + dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') + dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') dut.expect('secure_boot_v2: blowing secure boot efuse...') dut.expect('UART ROM Download mode kept enabled - SECURITY COMPROMISED') @@ -582,7 +602,7 @@ def test_examples_efuse_with_virt_secure_boot_v2_esp32xx_pre_loaded(env, _): # dut.reset() dut.expect('Loading virtual efuse blocks from flash') dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: enabling secure boot v2...') dut.expect('secure_boot_v2: secure boot v2 is already enabled, continuing..') @@ -654,7 +674,7 @@ def test_examples_efuse_with_virt_sb_v1_and_fe(env, _): # type: (ttfw_idf.TinyF @ttfw_idf.idf_example_test(env_tag='Example_EthKitV12', target=['esp32']) def test_examples_efuse_with_virt_sb_v2_and_fe(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None # only for ESP32 ECO3 - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_sb_v2_and_fe') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_sb_v2_and_fe.' + env.default_dut_cls.TARGET) # check and log bin size binary_file = os.path.join(dut.app.binary_path, 'bootloader', 'bootloader.bin') bin_size = os.path.getsize(binary_file) @@ -730,9 +750,9 @@ def test_examples_efuse_with_virt_sb_v2_and_fe(env, _): # type: (ttfw_idf.TinyF dut.expect('example: Done') -@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3']) +@ttfw_idf.idf_example_test(env_tag='Example_GENERIC', target=['esp32s2', 'esp32c3', 'esp32c2']) def test_examples_efuse_with_virt_sb_v2_and_fe_esp32xx(env, _): # type: (ttfw_idf.TinyFW.Env, None) -> None - dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_sb_v2_and_fe') + dut = env.get_dut('efuse', 'examples/system/efuse', app_config_name='virt_sb_v2_and_fe.' + env.default_dut_cls.TARGET) # check and log bin size binary_file = os.path.join(dut.app.binary_path, 'bootloader', 'bootloader.bin') bin_size = os.path.getsize(binary_file) @@ -750,51 +770,65 @@ def test_examples_efuse_with_virt_sb_v2_and_fe_esp32xx(env, _): # type: (ttfw_i dut.expect('Verifying image signature...') dut.expect('secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + signed_scheme = 'ECDSA' if dut.TARGET == 'esp32c2' else 'RSA-PSS' + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: enabling secure boot v2...') dut.expect('Verifying image signature...') dut.expect('secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: Secure boot digests absent, generating..') dut.expect('secure_boot_v2: Digests successfully calculated, 1 valid signatures') dut.expect('secure_boot_v2: 1 signature block(s) found appended to the bootloader') - dut.expect('Writing EFUSE_BLK_KEY0 with purpose 9') + if dut.TARGET == 'esp32c2': + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 3') + else: + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 9') dut.expect('secure_boot_v2: Digests successfully calculated, 1 valid signatures') dut.expect('secure_boot_v2: 1 signature block(s) found appended to the app') dut.expect('secure_boot_v2: Application key(0) matches with bootloader key(0)') - dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') - dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') + if dut.TARGET != 'esp32c2': + dut.expect('secure_boot_v2: Revoking empty key digest slot (1)...') + dut.expect('secure_boot_v2: Revoking empty key digest slot (2)...') dut.expect('secure_boot_v2: blowing secure boot efuse...') dut.expect('UART ROM Download mode kept enabled - SECURITY COMPROMISED') dut.expect('Disable hardware & software JTAG...') - dut.expect('secure_boot_v2: Secure boot permanently enabled') + + if dut.TARGET != 'esp32c2': + dut.expect('secure_boot_v2: Secure boot permanently enabled') dut.expect('Checking flash encryption...') dut.expect('flash_encrypt: Generating new flash encryption key...') - dut.expect('Writing EFUSE_BLK_KEY1 with purpose 4') + if dut.TARGET == 'esp32c2': + dut.expect('Writing EFUSE_BLK_KEY0 with purpose 2') + else: + dut.expect('Writing EFUSE_BLK_KEY1 with purpose 4') + dut.expect('Not disabling UART bootloader encryption') dut.expect('Disable UART bootloader cache...') dut.expect('Disable JTAG...') + if dut.TARGET == 'esp32c2': + dut.expect('boot: Secure boot permanently enabled') + dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('flash_encrypt: bootloader encrypted successfully') dut.expect('flash_encrypt: partition table encrypted and loaded successfully') dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('flash_encrypt: Flash encryption completed', timeout=90) dut.expect('Resetting with flash encryption enabled...') dut.expect('Loading virtual efuse blocks from flash') dut.expect('Verifying image signature...') - dut.expect('secure_boot_v2: Verifying with RSA-PSS...') + dut.expect('secure_boot_v2: Verifying with %s...' % signed_scheme) dut.expect('secure_boot_v2: Signature verified successfully!') dut.expect('secure_boot_v2: enabling secure boot v2...') dut.expect('secure_boot_v2: secure boot v2 is already enabled, continuing..') diff --git a/examples/system/efuse/main/efuse_main.c b/examples/system/efuse/main/efuse_main.c index 1a5c290f07..8c24a407d9 100644 --- a/examples/system/efuse/main/efuse_main.c +++ b/examples/system/efuse/main/efuse_main.c @@ -15,6 +15,10 @@ #include "esp_efuse.h" #include "esp_efuse_table.h" #include "esp_efuse_custom_table.h" +#if CONFIG_IDF_TARGET_ESP32C2 +#include "esp_secure_boot.h" +#include "esp_flash_encrypt.h" +#endif #include "sdkconfig.h" static const char* TAG = "example"; @@ -138,6 +142,16 @@ void app_main(void) read_efuse_fields(&device_desc); ESP_LOGW(TAG, "This example does not burn any efuse in reality only virtually"); + +#if CONFIG_IDF_TARGET_ESP32C2 + if (esp_secure_boot_enabled() || esp_flash_encryption_enabled()) { + ESP_LOGW(TAG, "BLOCK3 is used for secure boot or/and flash encryption"); + ESP_LOGW(TAG, "eFuses from the custom eFuse table can not be used as they are placed in BLOCK3"); + ESP_LOGI(TAG, "Done"); + return; + } +#endif + #ifdef CONFIG_EFUSE_VIRTUAL ESP_LOGW(TAG, "Write operations in efuse fields are performed virtually"); if (device_desc.device_role == 0) { diff --git a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32 b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32 new file mode 100644 index 0000000000..4abf5fcc95 --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32 @@ -0,0 +1,21 @@ +# FLASH_ENCRYPTION & SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32" + +# ESP32 supports SECURE_BOOT_V2 only in ECO3 +CONFIG_ESP32_REV_MIN_3=y +CONFIG_ESP32_REV_MIN=3 + +CONFIG_PARTITION_TABLE_OFFSET=0xD000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key.pem" + +CONFIG_SECURE_FLASH_ENC_ENABLED=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c2 b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c2 new file mode 100644 index 0000000000..2be2ad7ea4 --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c2 @@ -0,0 +1,17 @@ +# FLASH_ENCRYPTION & SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32c2" + +CONFIG_PARTITION_TABLE_OFFSET=0xD000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key_ecdsa_nistp256.pem" + +CONFIG_SECURE_FLASH_ENC_ENABLED=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c3 similarity index 85% rename from examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe rename to examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c3 index 1f7b03c551..04c2764dfd 100644 --- a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe +++ b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32c3 @@ -1,8 +1,7 @@ # FLASH_ENCRYPTION & SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH -# ESP32 supports SECURE_BOOT_V2 only in ECO3 -CONFIG_ESP32_REV_MIN_3=y -CONFIG_ESP32_REV_MIN=3 +CONFIG_IDF_TARGET="esp32c3" + # ESP32C3 supports SECURE_BOOT_V2 only in ECO3 CONFIG_ESP32C3_REV_MIN_3=y CONFIG_ESP32C3_REV_MIN=3 diff --git a/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32s2 b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32s2 new file mode 100644 index 0000000000..1ba66bfa5a --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_sb_v2_and_fe.esp32s2 @@ -0,0 +1,17 @@ +# FLASH_ENCRYPTION & SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32s2" + +CONFIG_PARTITION_TABLE_OFFSET=0xD000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key.pem" + +CONFIG_SECURE_FLASH_ENC_ENABLED=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32 b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32 new file mode 100644 index 0000000000..da26487548 --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32 @@ -0,0 +1,20 @@ +# SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32" + +# ESP32 supports SECURE_BOOT_V2 only in ECO3 +CONFIG_ESP32_REV_MIN_3=y +CONFIG_ESP32_REV_MIN=3 + +CONFIG_PARTITION_TABLE_OFFSET=0xC000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key.pem" +CONFIG_SECURE_INSECURE_ALLOW_DL_MODE=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c2 b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c2 new file mode 100644 index 0000000000..6d8478ce4c --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c2 @@ -0,0 +1,16 @@ +# SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32c2" + +CONFIG_PARTITION_TABLE_OFFSET=0xC000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key_ecdsa_nistp256.pem" +CONFIG_SECURE_INSECURE_ALLOW_DL_MODE=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2 b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c3 similarity index 85% rename from examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2 rename to examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c3 index 1f31177a3b..35dc608a61 100644 --- a/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2 +++ b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32c3 @@ -1,8 +1,7 @@ # SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH -# ESP32 supports SECURE_BOOT_V2 only in ECO3 -CONFIG_ESP32_REV_MIN_3=y -CONFIG_ESP32_REV_MIN=3 +CONFIG_IDF_TARGET="esp32c3" + # ESP32C3 supports SECURE_BOOT_V2 only in ECO3 CONFIG_ESP32C3_REV_MIN_3=y CONFIG_ESP32C3_REV_MIN=3 diff --git a/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32s2 b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32s2 new file mode 100644 index 0000000000..53b1cbcdd6 --- /dev/null +++ b/examples/system/efuse/sdkconfig.ci.virt_secure_boot_v2.esp32s2 @@ -0,0 +1,16 @@ +# SECURE_BOOT_V2 with EFUSE_VIRTUAL_KEEP_IN_FLASH + +CONFIG_IDF_TARGET="esp32s2" + +CONFIG_PARTITION_TABLE_OFFSET=0xC000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="test/partitions_efuse_emul.csv" + +CONFIG_SECURE_BOOT=y +CONFIG_SECURE_BOOT_V2_ENABLED=y +CONFIG_SECURE_BOOT_SIGNING_KEY="test/secure_boot_signing_key.pem" +CONFIG_SECURE_INSECURE_ALLOW_DL_MODE=y + +# IMPORTANT: ONLY VIRTUAL eFuse MODE! +CONFIG_EFUSE_VIRTUAL=y +CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH=y diff --git a/examples/system/efuse/test/secure_boot_signing_key_ecdsa_nistp256.pem b/examples/system/efuse/test/secure_boot_signing_key_ecdsa_nistp256.pem new file mode 100644 index 0000000000..b885d6c6bc --- /dev/null +++ b/examples/system/efuse/test/secure_boot_signing_key_ecdsa_nistp256.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIKbc9BxtbY3xeDA9J5PCCsPIk7pcTDylSQEzH2qXYcNCoAoGCCqGSM49 +AwEHoUQDQgAEU9yRNPfLJd3+ZsvdjWMqQgGmmccAnwBtb+IJz8KkbbXys38S7D+z +5MLc+VY2AwGXNUyd0myLInojX2SKUOsOfw== +-----END EC PRIVATE KEY----- From 480253d659876af83155d56273f566a1d8c5083b Mon Sep 17 00:00:00 2001 From: tgotic Date: Thu, 4 Aug 2022 16:41:18 +0200 Subject: [PATCH 009/665] Move xSemaphoreGive out of configASSERT xSemaphoreGive won't be executed in configASSERT and semaphore will stay locked if NDEBUG (idf v5) or CONFIG_FREERTOS_ASSERT_DISABLE (idf v3, v4) are defined. --- components/esp_ringbuf/ringbuf.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/esp_ringbuf/ringbuf.c b/components/esp_ringbuf/ringbuf.c index 62184c085d..d32996dc0a 100644 --- a/components/esp_ringbuf/ringbuf.c +++ b/components/esp_ringbuf/ringbuf.c @@ -1358,7 +1358,8 @@ BaseType_t xRingbufferAddToQueueSetRead(RingbufHandle_t xRingbuffer, QueueSetHan xReturn = xQueueAddToSet(rbGET_RX_SEM_HANDLE(pxRingbuffer), xQueueSet); if (xHoldSemaphore == pdTRUE) { //Return semaphore if temporarily held - configASSERT(xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)) == pdTRUE); + xHoldSemaphore = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); + configASSERT(xHoldSemaphore == pdTRUE); } portEXIT_CRITICAL(&pxRingbuffer->mux); return xReturn; @@ -1384,7 +1385,8 @@ BaseType_t xRingbufferRemoveFromQueueSetRead(RingbufHandle_t xRingbuffer, QueueS xReturn = xQueueRemoveFromSet(rbGET_RX_SEM_HANDLE(pxRingbuffer), xQueueSet); if (xHoldSemaphore == pdTRUE) { //Return semaphore if temporarily held - configASSERT(xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)) == pdTRUE); + xHoldSemaphore = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); + configASSERT(xHoldSemaphore == pdTRUE); } portEXIT_CRITICAL(&pxRingbuffer->mux); return xReturn; From 6e8ebdb6b7589540bef70617ce812dd3b0d55ae3 Mon Sep 17 00:00:00 2001 From: songruojing Date: Thu, 4 Aug 2022 17:38:54 +0800 Subject: [PATCH 010/665] gpio: fix potential race condition inside gpio_install_isr_service --- components/driver/gpio/gpio.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/components/driver/gpio/gpio.c b/components/driver/gpio/gpio.c index 8221b7f194..2c95fce523 100644 --- a/components/driver/gpio/gpio.c +++ b/components/driver/gpio/gpio.c @@ -451,12 +451,19 @@ esp_err_t gpio_install_isr_service(int intr_alloc_flags) gpio_isr_func_t *isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t)); if (isr_func) { portENTER_CRITICAL(&gpio_context.gpio_spinlock); - gpio_context.gpio_isr_func = isr_func; - portEXIT_CRITICAL(&gpio_context.gpio_spinlock); - ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle); - if (ret != ESP_OK) { - // registering failed, free allocated resources - gpio_uninstall_isr_service(); + if (gpio_context.gpio_isr_func == NULL) { + gpio_context.gpio_isr_func = isr_func; + portEXIT_CRITICAL(&gpio_context.gpio_spinlock); + ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle); + if (ret != ESP_OK) { + // registering failed, uninstall isr service + gpio_uninstall_isr_service(); + } + } else { + // isr service already installed, free allocated resource + portEXIT_CRITICAL(&gpio_context.gpio_spinlock); + ret = ESP_ERR_INVALID_STATE; + free(isr_func); } } From 4837ba9b84aa00ff230e729f15728b93d327b352 Mon Sep 17 00:00:00 2001 From: tgotic Date: Fri, 5 Aug 2022 10:19:47 +0200 Subject: [PATCH 011/665] rename xHoldSemaphore to result --- components/esp_ringbuf/ringbuf.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/components/esp_ringbuf/ringbuf.c b/components/esp_ringbuf/ringbuf.c index d32996dc0a..d3151e32b4 100644 --- a/components/esp_ringbuf/ringbuf.c +++ b/components/esp_ringbuf/ringbuf.c @@ -1354,12 +1354,12 @@ BaseType_t xRingbufferAddToQueueSetRead(RingbufHandle_t xRingbuffer, QueueSetHan BaseType_t xReturn; portENTER_CRITICAL(&pxRingbuffer->mux); //Cannot add semaphore to queue set if semaphore is not empty. Temporarily hold semaphore - BaseType_t xHoldSemaphore = xSemaphoreTake(rbGET_RX_SEM_HANDLE(pxRingbuffer), 0); + BaseType_t result = xSemaphoreTake(rbGET_RX_SEM_HANDLE(pxRingbuffer), 0); xReturn = xQueueAddToSet(rbGET_RX_SEM_HANDLE(pxRingbuffer), xQueueSet); - if (xHoldSemaphore == pdTRUE) { + if (result == pdTRUE) { //Return semaphore if temporarily held - xHoldSemaphore = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); - configASSERT(xHoldSemaphore == pdTRUE); + result = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); + configASSERT(result == pdTRUE); } portEXIT_CRITICAL(&pxRingbuffer->mux); return xReturn; @@ -1381,12 +1381,12 @@ BaseType_t xRingbufferRemoveFromQueueSetRead(RingbufHandle_t xRingbuffer, QueueS BaseType_t xReturn; portENTER_CRITICAL(&pxRingbuffer->mux); //Cannot remove semaphore from queue set if semaphore is not empty. Temporarily hold semaphore - BaseType_t xHoldSemaphore = xSemaphoreTake(rbGET_RX_SEM_HANDLE(pxRingbuffer), 0); + BaseType_t result = xSemaphoreTake(rbGET_RX_SEM_HANDLE(pxRingbuffer), 0); xReturn = xQueueRemoveFromSet(rbGET_RX_SEM_HANDLE(pxRingbuffer), xQueueSet); - if (xHoldSemaphore == pdTRUE) { + if (result == pdTRUE) { //Return semaphore if temporarily held - xHoldSemaphore = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); - configASSERT(xHoldSemaphore == pdTRUE); + result = xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer)); + configASSERT(result == pdTRUE); } portEXIT_CRITICAL(&pxRingbuffer->mux); return xReturn; From ffed60cc93db8149ca7c08a1170d2a976a617a0a Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 3 Aug 2022 13:59:44 +0800 Subject: [PATCH 012/665] ulp-riscv: added lock API to provide mutual exclusion when sharing variables between the main CPU and the ULP. --- components/ulp/CMakeLists.txt | 4 +- components/ulp/cmake/CMakeLists.txt | 4 +- .../test_apps/ulp_riscv/main/CMakeLists.txt | 1 + .../test_apps/ulp_riscv/main/test_ulp_riscv.c | 45 ++++++++++++------- .../test_apps/ulp_riscv/main/ulp/test_main.c | 36 ++++++++------- .../ulp_riscv/main/ulp/ulp_test_shared.h | 24 ++++++++++ .../ulp/ulp_riscv/include/ulp_riscv_lock.h | 38 ++++++++++++++++ .../shared/include/ulp_riscv_lock_shared.h | 35 +++++++++++++++ .../include/ulp_riscv_lock_ulp_core.h | 39 ++++++++++++++++ .../ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c | 21 +++++++++ components/ulp/ulp_riscv/ulp_riscv_lock.c | 27 +++++++++++ docs/doxygen/Doxyfile_esp32s2 | 2 + docs/doxygen/Doxyfile_esp32s3 | 2 + docs/en/api-reference/system/ulp-risc-v.rst | 15 ++++++- 14 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 components/ulp/test_apps/ulp_riscv/main/ulp/ulp_test_shared.h create mode 100644 components/ulp/ulp_riscv/include/ulp_riscv_lock.h create mode 100644 components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h create mode 100644 components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_lock_ulp_core.h create mode 100644 components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c create mode 100644 components/ulp/ulp_riscv/ulp_riscv_lock.c diff --git a/components/ulp/CMakeLists.txt b/components/ulp/CMakeLists.txt index ebbab38890..3e5c1f71e1 100644 --- a/components/ulp/CMakeLists.txt +++ b/components/ulp/CMakeLists.txt @@ -24,10 +24,12 @@ if(CONFIG_SOC_ULP_SUPPORTED OR CONFIG_SOC_RISCV_COPROC_SUPPORTED) elseif(CONFIG_ULP_COPROC_TYPE_RISCV) list(APPEND srcs "ulp_riscv/ulp_riscv.c" + "ulp_riscv/ulp_riscv_lock.c" "ulp_riscv/ulp_riscv_adc.c") list(APPEND includes - ulp_riscv/include) + ulp_riscv/include + ulp_riscv/shared/include) endif() endif() diff --git a/components/ulp/cmake/CMakeLists.txt b/components/ulp/cmake/CMakeLists.txt index 028dfdeb98..db665973fe 100644 --- a/components/ulp/cmake/CMakeLists.txt +++ b/components/ulp/cmake/CMakeLists.txt @@ -75,6 +75,7 @@ if(ULP_COCPU_IS_RISCV) list(APPEND ULP_S_SOURCES "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/start.S" "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_adc.c" + "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c" "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_uart.c" "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c" "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_utils.c") @@ -100,7 +101,8 @@ if(ULP_COCPU_IS_RISCV) list(APPEND EXTRA_LINKER_ARGS "-Wl,--gc-sections") list(APPEND EXTRA_LINKER_ARGS "-Wl,-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"") #Makes the csr utillies for riscv visible: - target_include_directories(${ULP_APP_NAME} PRIVATE "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/include") + target_include_directories(${ULP_APP_NAME} PRIVATE "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/include" + "${IDF_PATH}/components/ulp/ulp_riscv/shared/include") target_link_libraries(${ULP_APP_NAME} "-T \"${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.periperals.ld\"") target_compile_definitions(${ULP_APP_NAME} PRIVATE IS_ULP_COCPU) diff --git a/components/ulp/test_apps/ulp_riscv/main/CMakeLists.txt b/components/ulp/test_apps/ulp_riscv/main/CMakeLists.txt index 3535f63068..3e153055b5 100644 --- a/components/ulp/test_apps/ulp_riscv/main/CMakeLists.txt +++ b/components/ulp/test_apps/ulp_riscv/main/CMakeLists.txt @@ -2,6 +2,7 @@ set(app_sources "test_app_main.c" "test_ulp_riscv.c") set(ulp_sources "ulp/test_main.c") idf_component_register(SRCS ${app_sources} + INCLUDE_DIRS "ulp" REQUIRES ulp unity WHOLE_ARCHIVE) diff --git a/components/ulp/test_apps/ulp_riscv/main/test_ulp_riscv.c b/components/ulp/test_apps/ulp_riscv/main/test_ulp_riscv.c index 16c0211444..4f49eb7596 100644 --- a/components/ulp/test_apps/ulp_riscv/main/test_ulp_riscv.c +++ b/components/ulp/test_apps/ulp_riscv/main/test_ulp_riscv.c @@ -12,27 +12,14 @@ #include "soc/sens_reg.h" #include "soc/rtc_periph.h" #include "ulp_riscv.h" +#include "ulp_riscv_lock.h" #include "ulp_test_app.h" +#include "ulp_test_shared.h" #include "unity.h" #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" -typedef enum{ - RISCV_READ_WRITE_TEST = 1, - RISCV_DEEP_SLEEP_WAKEUP_TEST, - RISCV_LIGHT_SLEEP_WAKEUP_TEST, - RISCV_STOP_TEST, - RISCV_NO_COMMAND, -} riscv_test_commands_t; - -typedef enum { - RISCV_COMMAND_OK = 1, - RISCV_COMMAND_NOK, - RISCV_COMMAND_INVALID, -} riscv_test_command_reply_t; - -#define XOR_MASK 0xDEADBEEF #define ULP_WAKEUP_PERIOD 1000000 // 1 second extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_test_app_bin_start"); @@ -212,3 +199,31 @@ TEST_CASE("ULP-RISC-V is able to wakeup main CPU from deep sleep", "[ulp][reset= esp_deep_sleep_start(); UNITY_TEST_FAIL(__LINE__, "Should not get here!"); } + +TEST_CASE("ULP-RISC-V mutex", "[ulp]") +{ + /* Load ULP RISC-V firmware and start the ULP RISC-V Coprocessor */ + load_and_start_ulp_firmware(); + + /* Setup test data */ + ulp_riscv_incrementer = 0; + ulp_main_cpu_reply = RISCV_NO_COMMAND; + ulp_main_cpu_command = RISCV_MUTEX_TEST; + + ulp_riscv_lock_t *lock = (ulp_riscv_lock_t*)&ulp_lock; + + for (int i = 0; i < MUTEX_TEST_ITERATIONS; i++) { + ulp_riscv_lock_acquire(lock); + ulp_riscv_incrementer++; + ulp_riscv_lock_release(lock); + } + + while(ulp_main_cpu_reply != RISCV_COMMAND_OK) { + // Wait for ULP to finish + } + + /* If the variable is protected there should be no race conditions + results should be the sum of increments made by ULP and by main CPU + */ + TEST_ASSERT_EQUAL(2*MUTEX_TEST_ITERATIONS, ulp_riscv_incrementer); +} diff --git a/components/ulp/test_apps/ulp_riscv/main/ulp/test_main.c b/components/ulp/test_apps/ulp_riscv/main/ulp/test_main.c index 16a432571c..1a531cfac2 100644 --- a/components/ulp/test_apps/ulp_riscv/main/ulp/test_main.c +++ b/components/ulp/test_apps/ulp_riscv/main/ulp/test_main.c @@ -9,22 +9,9 @@ #include #include "ulp_riscv_utils.h" #include "ulp_riscv_gpio.h" +#include "ulp_riscv_lock_ulp_core.h" +#include "ulp_test_shared.h" -typedef enum{ - RISCV_READ_WRITE_TEST = 1, - RISCV_DEEP_SLEEP_WAKEUP_TEST, - RISCV_LIGHT_SLEEP_WAKEUP_TEST, - RISCV_STOP_TEST, - RISCV_NO_COMMAND, -} riscv_test_commands_t; - -typedef enum { - RISCV_COMMAND_OK = 1, - RISCV_COMMAND_NOK, - RISCV_COMMAND_INVALID, -} riscv_test_command_reply_t; - -#define XOR_MASK 0xDEADBEEF volatile riscv_test_commands_t main_cpu_command = RISCV_NO_COMMAND; volatile riscv_test_command_reply_t main_cpu_reply = RISCV_COMMAND_INVALID; @@ -33,6 +20,9 @@ volatile uint32_t riscv_test_data_in = 0; volatile uint32_t riscv_test_data_out = 0; volatile uint32_t riscv_counter = 0; +volatile uint32_t riscv_incrementer = 0; +ulp_riscv_lock_t lock; + void handle_commands(riscv_test_commands_t cmd) { riscv_counter++; @@ -87,6 +77,21 @@ void handle_commands(riscv_test_commands_t cmd) break; + case RISCV_MUTEX_TEST: + /* Echo the command ID back to the main CPU */ + command_resp = RISCV_MUTEX_TEST; + + for (int i = 0; i < MUTEX_TEST_ITERATIONS; i++) { + ulp_riscv_lock_acquire(&lock); + riscv_incrementer++; + ulp_riscv_lock_release(&lock); + } + /* Set the command reply status */ + main_cpu_reply = RISCV_COMMAND_OK; + main_cpu_command = RISCV_NO_COMMAND; + + break; + case RISCV_NO_COMMAND: main_cpu_reply = RISCV_COMMAND_OK; break; @@ -99,6 +104,7 @@ void handle_commands(riscv_test_commands_t cmd) int main (void) { + while (1) { handle_commands(main_cpu_command); break; diff --git a/components/ulp/test_apps/ulp_riscv/main/ulp/ulp_test_shared.h b/components/ulp/test_apps/ulp_riscv/main/ulp/ulp_test_shared.h new file mode 100644 index 0000000000..c12f828ad5 --- /dev/null +++ b/components/ulp/test_apps/ulp_riscv/main/ulp/ulp_test_shared.h @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#pragma once + +#define MUTEX_TEST_ITERATIONS 100000 +#define XOR_MASK 0xDEADBEEF + +typedef enum{ + RISCV_READ_WRITE_TEST = 1, + RISCV_DEEP_SLEEP_WAKEUP_TEST, + RISCV_LIGHT_SLEEP_WAKEUP_TEST, + RISCV_STOP_TEST, + RISCV_MUTEX_TEST, + RISCV_NO_COMMAND, +} riscv_test_commands_t; + +typedef enum { + RISCV_COMMAND_OK = 1, + RISCV_COMMAND_NOK, + RISCV_COMMAND_INVALID, +} riscv_test_command_reply_t; diff --git a/components/ulp/ulp_riscv/include/ulp_riscv_lock.h b/components/ulp/ulp_riscv/include/ulp_riscv_lock.h new file mode 100644 index 0000000000..597e3ed463 --- /dev/null +++ b/components/ulp/ulp_riscv/include/ulp_riscv_lock.h @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ulp_riscv_lock_shared.h" + +/** + * @brief Locks are based on the Peterson's algorithm, https://en.wikipedia.org/wiki/Peterson%27s_algorithm + * + */ + +/** + * @brief Acquire the lock, preventing the ULP from taking until released. Spins until lock is acquired. + * + * @note The lock is only designed for being used by a single thread on the main CPU, + * it is not safe to try to acquire it from multiple threads. + * + * @param lock Pointer to lock struct, shared with ULP + */ +void ulp_riscv_lock_acquire(ulp_riscv_lock_t *lock); + +/** + * @brief Release the lock + * + * @param lock Pointer to lock struct, shared with ULP + */ +void ulp_riscv_lock_release(ulp_riscv_lock_t *lock); + +#ifdef __cplusplus +} +#endif diff --git a/components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h b/components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h new file mode 100644 index 0000000000..67c12dac8c --- /dev/null +++ b/components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Enum representing which processor is allowed to enter the critical section + * + */ +typedef enum { + ULP_RISCV_LOCK_TURN_ULP, /*!< ULP's turn to enter the critical section */ + ULP_RISCV_LOCK_TURN_MAIN_CPU, /*!< Main CPU's turn to enter the critical section */ +} ulp_riscv_lock_turn_t; + +/** + * @brief Structure representing a lock shared between ULP and main CPU + * + */ +typedef struct { + volatile bool critical_section_flag_ulp; /*!< ULP wants to enter the critical sections */ + volatile bool critical_section_flag_main_cpu; /*!< Main CPU wants to enter the critical sections */ + volatile ulp_riscv_lock_turn_t turn; /*!< Which CPU is allowed to enter the critical section */ +} ulp_riscv_lock_t; + +#ifdef __cplusplus +} +#endif diff --git a/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_lock_ulp_core.h b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_lock_ulp_core.h new file mode 100644 index 0000000000..4f403058a1 --- /dev/null +++ b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_lock_ulp_core.h @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "ulp_riscv_lock_shared.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @brief Locks are based on the Peterson's algorithm, https://en.wikipedia.org/wiki/Peterson%27s_algorithm + * + */ + +/** + * @brief Acquire the lock, preventing the main CPU from taking until released. Spins until lock is acquired. + * + * @note The lock is only designed for being used by a single thread on the ULP, + * it is not safe to try to acquire it from multiple threads. + * + * @param lock Pointer to lock struct, shared with main CPU + */ +void ulp_riscv_lock_acquire(ulp_riscv_lock_t *lock); + +/** + * @brief Release the lock + * + * @param lock Pointer to lock struct, shared with main CPU + */ +void ulp_riscv_lock_release(ulp_riscv_lock_t *lock); + +#ifdef __cplusplus +} +#endif diff --git a/components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c new file mode 100644 index 0000000000..d6f3b95dbd --- /dev/null +++ b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_lock.c @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "ulp_riscv_lock.h" +#include "ulp_riscv_lock_shared.h" + +void ulp_riscv_lock_acquire(ulp_riscv_lock_t *lock) +{ + lock->critical_section_flag_ulp = true; + lock->turn = ULP_RISCV_LOCK_TURN_MAIN_CPU; + + while (lock->critical_section_flag_main_cpu && (lock->turn == ULP_RISCV_LOCK_TURN_MAIN_CPU)) { + } +} + +void ulp_riscv_lock_release(ulp_riscv_lock_t *lock) +{ + lock->critical_section_flag_ulp = false; +} diff --git a/components/ulp/ulp_riscv/ulp_riscv_lock.c b/components/ulp/ulp_riscv/ulp_riscv_lock.c new file mode 100644 index 0000000000..cab59a8d0e --- /dev/null +++ b/components/ulp/ulp_riscv/ulp_riscv_lock.c @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "ulp_riscv_lock.h" +#include "ulp_riscv_lock_shared.h" + +#include + +void ulp_riscv_lock_acquire(ulp_riscv_lock_t *lock) +{ + assert(lock); + + lock->critical_section_flag_main_cpu = true; + lock->turn = ULP_RISCV_LOCK_TURN_ULP; + + while (lock->critical_section_flag_ulp && (lock->turn == ULP_RISCV_LOCK_TURN_ULP)) { + } +} + +void ulp_riscv_lock_release(ulp_riscv_lock_t *lock) +{ + assert(lock); + + lock->critical_section_flag_main_cpu = false; +} diff --git a/docs/doxygen/Doxyfile_esp32s2 b/docs/doxygen/Doxyfile_esp32s2 index f74884ca20..0aa2a6e963 100644 --- a/docs/doxygen/Doxyfile_esp32s2 +++ b/docs/doxygen/Doxyfile_esp32s2 @@ -25,6 +25,8 @@ INPUT += \ $(PROJECT_PATH)/components/touch_element/include/touch_element/touch_slider.h \ $(PROJECT_PATH)/components/ulp/ulp_common/include/$(IDF_TARGET)/ulp_common_defs.h \ $(PROJECT_PATH)/components/ulp/ulp_fsm/include/$(IDF_TARGET)/ulp.h \ + $(PROJECT_PATH)/components/ulp/ulp_riscv/include/ulp_riscv_lock.h \ + $(PROJECT_PATH)/components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_helpers.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_host.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_types_ch9.h \ diff --git a/docs/doxygen/Doxyfile_esp32s3 b/docs/doxygen/Doxyfile_esp32s3 index 4c247aaffa..1f6738be6d 100644 --- a/docs/doxygen/Doxyfile_esp32s3 +++ b/docs/doxygen/Doxyfile_esp32s3 @@ -31,6 +31,8 @@ INPUT += \ $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ $(PROJECT_PATH)/components/ulp/ulp_common/include/$(IDF_TARGET)/ulp_common_defs.h \ $(PROJECT_PATH)/components/ulp/ulp_fsm/include/$(IDF_TARGET)/ulp.h \ + $(PROJECT_PATH)/components/ulp/ulp_riscv/include/ulp_riscv_lock.h \ + $(PROJECT_PATH)/components/ulp/ulp_riscv/shared/include/ulp_riscv_lock_shared.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_helpers.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_host.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_types_ch9.h \ diff --git a/docs/en/api-reference/system/ulp-risc-v.rst b/docs/en/api-reference/system/ulp-risc-v.rst index a3088a0954..11b444be07 100644 --- a/docs/en/api-reference/system/ulp-risc-v.rst +++ b/docs/en/api-reference/system/ulp-risc-v.rst @@ -98,6 +98,18 @@ To access the ULP RISC-V program variables from the main program, the generated ulp_measurement_count = 64; } +Mutual Exclusion +^^^^^^^^^^^^^^^^ + +If mutual exclusion is needed when accessing a variable shared between the main program and ULP then this can be achieved by using the ULP RISC-V lock API: + + * :cpp:func:`ulp_riscv_lock_acquire` + * :cpp:func:`ulp_riscv_lock_release` + +The ULP does not have any hardware instructions to facilitate mutual exclusion so the lock API achieves this through a software algorithm (`Peterson's algorithm `_). + +The locks are intended to only be called from a single thread in the main program, and will not provide mutual exclusion if used simultaneously from multiple threads. + Starting the ULP RISC-V Program ------------------------------- @@ -151,7 +163,6 @@ Keeping this in mind, here are some ways that may help you debug you ULP RISC-V * Trap signal: the ULP RISC-V has a hardware trap that will trigger under certain conditions, e.g. illegal instruction. This will cause the main CPU to be woken up with the wake-up cause :cpp:enumerator:`ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG`. - Application Examples -------------------- @@ -163,3 +174,5 @@ API Reference ------------- .. include-build-file:: inc/ulp_riscv.inc +.. include-build-file:: inc/ulp_riscv_lock_shared.inc +.. include-build-file:: inc/ulp_riscv_lock.inc From 18e19ba3ec1de0a831e58f4e8b58ee2dc691bb89 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 8 Aug 2022 13:29:17 +0800 Subject: [PATCH 013/665] ci: fix base_mac_address test failure for S2 chips Some esp32s2 chips was burned with one MAC address by mistake. The MAC address code contains a special case for these chips, update MR to handle this special case. --- .../pytest_base_mac_address.py | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/examples/system/base_mac_address/pytest_base_mac_address.py b/examples/system/base_mac_address/pytest_base_mac_address.py index ee3dcb7381..a5ec6f03c4 100644 --- a/examples/system/base_mac_address/pytest_base_mac_address.py +++ b/examples/system/base_mac_address/pytest_base_mac_address.py @@ -12,16 +12,30 @@ def test_base_mac_address(dut: Dut) -> None: hex_r = r', '.join((r'0x([0-9a-f]{1,2})',) * 6) mac_m = dut.expect(r'BASE_MAC: Using "' + hex_r + r'" as base MAC address', timeout=5).groups() - def get_expected_mac_string(increment: int) -> str: + def get_expected_mac_string(increment: int, target: str) -> str: ''' Return the string representation of the MAC address mac_m with the last octet incremented. mac_m is an array of strings in hexa-decimal format without the '0x' prefix. ''' + # as a result of some esp32s2 chips burned with one MAC address by mistake, + # there are some MAC address are reserved for this bug fix. + # related mistake MAC address is 0x7cdfa1003000~0x7cdfa1005fff, + # reserved MAC address is 0x7cdfa1020000~0x7cdfa1022fff (MAC address + 0x1d000). + if target == 'esp32s2' and increment == 1: + hex_string = ''.join([m.decode('utf8').rjust(2, '0') for m in mac_m]) + mac_bytes = int(hex_string, 16) + + if mac_bytes >= int('7cdfa1003000', 16) and mac_bytes <= int('7cdfa1005fff', 16): + mac_bytes += int('1d000', 16) + hex_string = f'{mac_bytes:x}' + # Format the new string to match the expected output from the app (includes stripping leading zeroes) + return ', '.join('0x{}'.format(hex_string[i:i + 2].lstrip('0')) for i in range(0, len(hex_string), 2)) + return ', '.join(['0x{}'.format(m.decode('utf8')) for m in mac_m[:-1]] + [hex(int(mac_m[-1], 16) + increment)]) - dut.expect_exact('WIFI_STA MAC: ' + get_expected_mac_string(0), timeout=2) - dut.expect_exact('SoftAP MAC: ' + get_expected_mac_string(1)) + dut.expect_exact('WIFI_STA MAC: ' + get_expected_mac_string(0, dut.target), timeout=2) + dut.expect_exact('SoftAP MAC: ' + get_expected_mac_string(1, dut.target)) if dut.target != 'esp32s2': - dut.expect_exact('BT MAC: ' + get_expected_mac_string(2)) - dut.expect_exact('Ethernet MAC: ' + get_expected_mac_string(3)) + dut.expect_exact('BT MAC: ' + get_expected_mac_string(2, dut.target)) + dut.expect_exact('Ethernet MAC: ' + get_expected_mac_string(3, dut.target)) From f2bca9e71ea4f9bda1daba814cf482da6a8bc94e Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 8 Aug 2022 14:06:59 +0800 Subject: [PATCH 014/665] ci: re-enable running S3 tests by default --- .gitlab/ci/dependencies/dependencies.yml | 60 ------------------------ .gitlab/ci/rules.yml | 23 +++++++-- 2 files changed, 19 insertions(+), 64 deletions(-) diff --git a/.gitlab/ci/dependencies/dependencies.yml b/.gitlab/ci/dependencies/dependencies.yml index 15adcae2d4..9488e093f7 100644 --- a/.gitlab/ci/dependencies/dependencies.yml +++ b/.gitlab/ci/dependencies/dependencies.yml @@ -77,45 +77,6 @@ build:integration_test: included_in: - build:target_test -# ------------- -# Special Cases -# ------------- -"build:{0}-esp32s3": - matrix: - - *target_test - labels: - - build - - "{0}" - - target_test - patterns: - - build_components - - build_system - - build_target_test - - "{0}" - - "build-{0}" - included_in: - - "build:{0}" - - build:target_test - -"build:component_ut-esp32s3": - matrix: - - *target_test - labels: - - build - - component_ut - - unit_test - - target_test - patterns: - - build_components - - build_system - - build_target_test - - component_ut - - unit_test - - build-component_ut - - build-unit_test - included_in: - - "build:{0}" - - build:target_test #################### # Target Test Jobs # @@ -214,27 +175,6 @@ build:integration_test: - "build:component_ut-esp32c2" - build:target_test -# due to the lack of runners, s3 tests will only be triggered by label -"test:{0}-esp32s3": - matrix: - - *target_test - labels: - - "{0}_esp32s3" - included_in: - - "build:{0}" - - "build:{0}-esp32s3" - - build:target_test - -# overwrite the esp32s3 component ut again -"test:component_ut-esp32s3": # component_ut will trigger by unit_test as well, since now we have 2 kinds of UT - labels: - - "component_ut_esp32s3" - - "unit_test_esp32s3" - included_in: - - build:component_ut - - "build:component_ut-esp32s3" - - build:target_test - "test:integration_test": labels: - integration_test diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 5aad86a7ce..97edcf4dbc 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -498,8 +498,6 @@ changes: *patterns-build_system - <<: *if-dev-push changes: *patterns-component_ut - - <<: *if-dev-push - changes: *patterns-unit_test .rules:build:component_ut-esp32: rules: @@ -606,8 +604,6 @@ changes: *patterns-build_system - <<: *if-dev-push changes: *patterns-component_ut - - <<: *if-dev-push - changes: *patterns-unit_test .rules:build:custom_test: rules: @@ -1473,8 +1469,13 @@ - <<: *if-protected - <<: *if-label-build-only when: never + - <<: *if-label-component_ut - <<: *if-label-component_ut_esp32s3 + - <<: *if-label-target_test + - <<: *if-label-unit_test - <<: *if-label-unit_test_esp32s3 + - <<: *if-dev-push + changes: *patterns-component_ut .rules:test:component_ut-esp32s3-bt: rules: @@ -1808,7 +1809,11 @@ - <<: *if-protected - <<: *if-label-build-only when: never + - <<: *if-label-custom_test - <<: *if-label-custom_test_esp32s3 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-custom_test .rules:test:custom_test-esp32s3-bt: rules: @@ -2198,7 +2203,13 @@ - <<: *if-protected - <<: *if-label-build-only when: never + - <<: *if-label-example_test - <<: *if-label-example_test_esp32s3 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-build-example_test + - <<: *if-dev-push + changes: *patterns-example_test .rules:test:example_test-esp32s3-bt: rules: @@ -2582,7 +2593,11 @@ - <<: *if-protected - <<: *if-label-build-only when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test - <<: *if-label-unit_test_esp32s3 + - <<: *if-dev-push + changes: *patterns-unit_test .rules:test:unit_test-esp32s3-bt: rules: From abd754f48794479c021b0d5394634813147aa6f4 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Mon, 8 Aug 2022 09:43:31 +0200 Subject: [PATCH 015/665] Tools: Detect missing component manager and print proper error message --- tools/idf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/idf.py b/tools/idf.py index 2a705e556d..0b91e13ff0 100755 --- a/tools/idf.py +++ b/tools/idf.py @@ -39,6 +39,8 @@ try: from idf_py_actions.errors import FatalError # noqa: E402 from idf_py_actions.tools import (PropertyDict, executable_exists, get_target, idf_version, # noqa: E402 merge_action_lists, realpath) + if os.getenv('IDF_COMPONENT_MANAGER') != '0': + from idf_component_manager import idf_extensions except ImportError: # For example, importing click could cause this. print('Please use idf.py only in an ESP-IDF shell environment.', file=sys.stderr) @@ -672,7 +674,6 @@ def init_cli(verbose_output: List=None) -> Any: # Load component manager idf.py extensions if not explicitly disabled if os.getenv('IDF_COMPONENT_MANAGER') != '0': - from idf_component_manager import idf_extensions extensions.append(('component_manager_ext', idf_extensions)) # Optional load `pyclang` for additional clang-tidy related functionalities From d91c8759c00576e5a46135b1a113dcec54dfaaad Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 4 Aug 2022 13:08:48 +0800 Subject: [PATCH 016/665] driver: remove -Wno-format flag --- components/console/linenoise/linenoise.h | 1 + components/driver/CMakeLists.txt | 2 -- components/driver/deprecated/i2s_legacy.c | 10 ++++----- components/driver/deprecated/rmt_legacy.c | 8 +++---- .../deprecated/rtc_temperature_legacy.c | 2 +- components/driver/gpio/dedic_gpio.c | 10 ++++----- components/driver/gpio/gpio.c | 2 +- components/driver/gptimer.c | 12 +++++----- components/driver/i2s/i2s_common.c | 10 ++++----- components/driver/i2s/i2s_pdm.c | 4 ++-- components/driver/i2s/i2s_std.c | 2 +- components/driver/i2s/i2s_tdm.c | 4 ++-- components/driver/ledc.c | 22 +++++++++---------- components/driver/mcpwm/mcpwm_com.c | 2 +- components/driver/mcpwm/mcpwm_gen.c | 2 +- components/driver/mcpwm/mcpwm_oper.c | 2 +- components/driver/mcpwm/mcpwm_timer.c | 4 ++-- components/driver/pulse_cnt.c | 2 +- components/driver/rmt/rmt_common.c | 4 ++-- components/driver/rmt/rmt_rx.c | 6 ++--- components/driver/rmt/rmt_tx.c | 8 +++---- components/driver/sdm.c | 2 +- components/driver/sdmmc_host.c | 2 +- components/driver/sdmmc_transaction.c | 12 +++++----- components/driver/sdspi_host.c | 4 ++-- components/driver/sdspi_transaction.c | 2 +- components/driver/temperature_sensor.c | 2 +- .../i2s_test_apps/i2s/main/CMakeLists.txt | 1 - .../i2s_test_apps/i2s/main/test_i2s.c | 13 ++++++----- .../legacy_i2s_driver/main/CMakeLists.txt | 1 - .../legacy_i2s_driver/main/test_legacy_i2s.c | 13 ++++++----- .../test_apps/mcpwm/main/CMakeLists.txt | 1 - .../test_apps/mcpwm/main/test_mcpwm_cap.c | 7 +++--- .../test_apps/mcpwm/main/test_mcpwm_cmpr.c | 3 ++- .../test_apps/mcpwm/main/test_mcpwm_iram.c | 3 ++- components/esp_lcd/CMakeLists.txt | 1 - components/esp_lcd/include/esp_lcd_panel_io.h | 2 +- components/esp_lcd/src/esp_lcd_panel_io_i2s.c | 6 ++--- components/esp_lcd/src/esp_lcd_panel_io_i80.c | 2 +- components/esp_lcd/src/esp_lcd_rgb_panel.c | 2 +- .../test_apps/rgb_lcd/main/CMakeLists.txt | 1 - .../test_apps/rgb_lcd/main/test_rgb_panel.c | 3 ++- .../adc/continuous_read/main/CMakeLists.txt | 1 - .../main/continuous_read_main.c | 2 +- .../gpio/generic_gpio/main/CMakeLists.txt | 1 - .../generic_gpio/main/gpio_example_main.c | 5 +++-- .../components/matrix_keyboard/CMakeLists.txt | 1 - .../matrix_keyboard/src/matrix_keyboard.c | 20 +++++------------ .../gpio/matrix_keyboard/main/CMakeLists.txt | 1 - .../main/matrix_keyboard_example_main.c | 4 ++-- .../i2c/i2c_self_test/main/CMakeLists.txt | 3 +-- .../i2c/i2c_self_test/main/i2c_example_main.c | 2 +- .../i2c/i2c_tools/main/CMakeLists.txt | 3 +-- .../i2c/i2c_tools/main/cmd_i2ctools.c | 2 +- .../i2s/i2s_adc_dac/main/CMakeLists.txt | 1 - .../i2s/i2s_adc_dac/main/app_main.c | 6 ++--- .../lcd/rgb_panel/main/CMakeLists.txt | 2 -- .../main/CMakeLists.txt | 1 - .../mcpwm_bldc_hall_control_example_main.c | 2 +- .../mcpwm_capture_hc_sr04/main/CMakeLists.txt | 1 - .../peripherals/sdio/host/main/CMakeLists.txt | 1 - .../peripherals/sdio/host/main/app_main.c | 2 +- .../spi_master/lcd/main/CMakeLists.txt | 2 -- .../lcd/main/spi_master_example_main.c | 3 ++- .../append_mode/slave/main/CMakeLists.txt | 1 - .../seg_master/main/CMakeLists.txt | 1 - .../segment_mode/seg_master/main/app_main.c | 8 +++---- .../seg_slave/main/CMakeLists.txt | 1 - .../segment_mode/seg_slave/main/app_main.c | 2 +- .../temp_sensor/main/CMakeLists.txt | 3 +-- .../main/CMakeLists.txt | 1 - .../twai_network_example_listen_only_main.c | 2 +- .../twai_network_master/main/CMakeLists.txt | 1 - .../main/twai_network_example_master_main.c | 2 +- .../twai_network_slave/main/CMakeLists.txt | 1 - .../main/twai_network_example_slave_main.c | 2 +- tools/ci/check_copyright_ignore.txt | 1 - tools/ci/check_public_headers_exceptions.txt | 12 ---------- 78 files changed, 132 insertions(+), 174 deletions(-) diff --git a/components/console/linenoise/linenoise.h b/components/console/linenoise/linenoise.h index 730ba9b5b1..98876104aa 100644 --- a/components/console/linenoise/linenoise.h +++ b/components/console/linenoise/linenoise.h @@ -44,6 +44,7 @@ extern "C" { #endif #include +#include typedef struct linenoiseCompletions { size_t len; diff --git a/components/driver/CMakeLists.txt b/components/driver/CMakeLists.txt index 729db55b13..4e65c15274 100644 --- a/components/driver/CMakeLists.txt +++ b/components/driver/CMakeLists.txt @@ -125,5 +125,3 @@ else() REQUIRES esp_pm esp_ringbuf freertos soc hal esp_hw_support LDFRAGMENTS linker.lf) endif() - -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/driver/deprecated/i2s_legacy.c b/components/driver/deprecated/i2s_legacy.c index 3fe8cc17df..2e36ab2608 100644 --- a/components/driver/deprecated/i2s_legacy.c +++ b/components/driver/deprecated/i2s_legacy.c @@ -535,7 +535,7 @@ static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, i2s_dma_t *dma_obj) if (p_i2s[i2s_num]->dir & I2S_DIR_RX) { i2s_ll_rx_set_eof_num(p_i2s[i2s_num]->hal.dev, dma_obj->buf_size); } - ESP_LOGD(TAG, "DMA Malloc info, datalen=blocksize=%d, dma_desc_num=%d", dma_obj->buf_size, buf_cnt); + ESP_LOGD(TAG, "DMA Malloc info, datalen=blocksize=%d, dma_desc_num=%"PRIu32, dma_obj->buf_size, buf_cnt); return ESP_OK; err: /* Delete DMA buffer if failed to allocate memory */ @@ -644,9 +644,9 @@ static uint32_t i2s_config_source_clock(i2s_port_t i2s_num, bool use_apll, uint3 return 0; } if (ret == ESP_ERR_INVALID_STATE) { - ESP_LOGW(TAG, "APLL is occupied already, it is working at %d Hz", real_freq); + ESP_LOGW(TAG, "APLL is occupied already, it is working at %"PRIu32" Hz", real_freq); } - ESP_LOGD(TAG, "APLL expected frequency is %d Hz, real frequency is %d Hz", expt_freq, real_freq); + ESP_LOGD(TAG, "APLL expected frequency is %"PRIu32" Hz, real frequency is %"PRIu32" Hz", expt_freq, real_freq); /* In APLL mode, there is no sclk but only mclk, so return 0 here to indicate APLL mode */ return real_freq; } @@ -804,7 +804,7 @@ static esp_err_t i2s_calculate_clock(i2s_port_t i2s_num, i2s_hal_clock_info_t *c /* Calculate clock for common mode */ ESP_RETURN_ON_ERROR(i2s_calculate_common_clock(i2s_num, clk_info), TAG, "Common clock calculate failed"); - ESP_LOGD(TAG, "[sclk] %d [mclk] %d [mclk_div] %d [bclk] %d [bclk_div] %d", + ESP_LOGD(TAG, "[sclk] %"PRIu32" [mclk] %"PRIu32" [mclk_div] %d [bclk] %"PRIu32" [bclk_div] %d", clk_info->sclk, clk_info->mclk, clk_info->mclk_div, clk_info->bclk, clk_info->bclk_div); return ESP_OK; } @@ -1077,7 +1077,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ slot_mask = (slot_cfg->slot_mode == I2S_SLOT_MODE_MONO) ? 1 : 2; } ESP_RETURN_ON_FALSE(p_i2s[i2s_num]->total_slot >= (32 - __builtin_clz(slot_mask)), ESP_ERR_INVALID_ARG, TAG, - "The max channel number can't be greater than CH%d\n", p_i2s[i2s_num]->total_slot); + "The max channel number can't be greater than CH%"PRIu32, p_i2s[i2s_num]->total_slot); p_i2s[i2s_num]->active_slot = __builtin_popcount(slot_mask); } else #endif diff --git a/components/driver/deprecated/rmt_legacy.c b/components/driver/deprecated/rmt_legacy.c index 53a8e6c79e..d0aadbb618 100644 --- a/components/driver/deprecated/rmt_legacy.c +++ b/components/driver/deprecated/rmt_legacy.c @@ -586,11 +586,11 @@ static esp_err_t rmt_internal_config(rmt_dev_t *dev, const rmt_config_t *rmt_par s_rmt_source_clock_hz[channel] = rmt_source_clk_hz; #else if (s_rmt_source_clock_hz && rmt_source_clk_hz != s_rmt_source_clock_hz) { - ESP_LOGW(TAG, "RMT clock source has been configured to %d by other channel, now reconfigure it to %d", s_rmt_source_clock_hz, rmt_source_clk_hz); + ESP_LOGW(TAG, "RMT clock source has been configured to %"PRIu32" by other channel, now reconfigure it to %"PRIu32, s_rmt_source_clock_hz, rmt_source_clk_hz); } s_rmt_source_clock_hz = rmt_source_clk_hz; #endif - ESP_LOGD(TAG, "rmt_source_clk_hz: %d\n", rmt_source_clk_hz); + ESP_LOGD(TAG, "rmt_source_clk_hz: %"PRIu32, rmt_source_clk_hz); if (mode == RMT_MODE_TX) { uint16_t carrier_duty_percent = rmt_param->tx_config.carrier_duty_percent; @@ -625,7 +625,7 @@ static esp_err_t rmt_internal_config(rmt_dev_t *dev, const rmt_config_t *rmt_par } RMT_EXIT_CRITICAL(); - ESP_LOGD(TAG, "Rmt Tx Channel %u|Gpio %u|Sclk_Hz %u|Div %u|Carrier_Hz %u|Duty %u", + ESP_LOGD(TAG, "Rmt Tx Channel %u|Gpio %u|Sclk_Hz %"PRIu32"|Div %u|Carrier_Hz %"PRIu32"|Duty %u", channel, gpio_num, rmt_source_clk_hz, clk_div, carrier_freq_hz, carrier_duty_percent); } else if (RMT_MODE_RX == mode) { uint8_t filter_cnt = rmt_param->rx_config.filter_ticks_thresh; @@ -659,7 +659,7 @@ static esp_err_t rmt_internal_config(rmt_dev_t *dev, const rmt_config_t *rmt_par #endif RMT_EXIT_CRITICAL(); - ESP_LOGD(TAG, "Rmt Rx Channel %u|Gpio %u|Sclk_Hz %u|Div %u|Thresold %u|Filter %u", + ESP_LOGD(TAG, "Rmt Rx Channel %u|Gpio %u|Sclk_Hz %"PRIu32"|Div %u|Thresold %u|Filter %u", channel, gpio_num, rmt_source_clk_hz, clk_div, threshold, filter_cnt); } diff --git a/components/driver/deprecated/rtc_temperature_legacy.c b/components/driver/deprecated/rtc_temperature_legacy.c index eb69c7604e..965973dab7 100644 --- a/components/driver/deprecated/rtc_temperature_legacy.c +++ b/components/driver/deprecated/rtc_temperature_legacy.c @@ -145,7 +145,7 @@ esp_err_t temp_sensor_read_celsius(float *celsius) uint32_t tsens_out = 0; temp_sensor_get_config(&tsens); temp_sensor_read_raw(&tsens_out); - ESP_LOGV(TAG, "tsens_out %d", tsens_out); + ESP_LOGV(TAG, "tsens_out %"PRIu32, tsens_out); const tsens_dac_offset_t *dac = &dac_offset[tsens.dac_offset]; *celsius = parse_temp_sensor_raw_value(tsens_out, dac->offset); if (*celsius < dac->range_min || *celsius > dac->range_max) { diff --git a/components/driver/gpio/dedic_gpio.c b/components/driver/gpio/dedic_gpio.c index 943dcdd2c4..b67217f7d8 100644 --- a/components/driver/gpio/dedic_gpio.c +++ b/components/driver/gpio/dedic_gpio.c @@ -67,7 +67,7 @@ struct dedic_gpio_bundle_t { int gpio_array[]; // array of GPIO numbers (configured by user) }; -static esp_err_t dedic_gpio_build_platform(uint32_t core_id) +static esp_err_t dedic_gpio_build_platform(int core_id) { esp_err_t ret = ESP_OK; if (!s_platform[core_id]) { @@ -196,7 +196,7 @@ esp_err_t dedic_gpio_new_bundle(const dedic_gpio_bundle_config_t *config, dedic_ dedic_gpio_bundle_t *bundle = NULL; uint32_t out_mask = 0; uint32_t in_mask = 0; - uint32_t core_id = esp_cpu_get_core_id(); // dedicated GPIO will be binded to the CPU who invokes this API + int core_id = esp_cpu_get_core_id(); // dedicated GPIO will be binded to the CPU who invokes this API ESP_GOTO_ON_FALSE(config && ret_bundle, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); ESP_GOTO_ON_FALSE(config->gpio_array && config->array_size > 0, ESP_ERR_INVALID_ARG, err, TAG, "invalid GPIO array or size"); @@ -233,7 +233,7 @@ esp_err_t dedic_gpio_new_bundle(const dedic_gpio_bundle_config_t *config, dedic_ } portEXIT_CRITICAL(&s_platform[core_id]->spinlock); ESP_GOTO_ON_FALSE(out_mask, ESP_ERR_NOT_FOUND, err, TAG, "no free outward channels on core[%d]", core_id); - ESP_LOGD(TAG, "new outward bundle(%p) on core[%d], offset=%d, mask(%x)", bundle, core_id, out_offset, out_mask); + ESP_LOGD(TAG, "new outward bundle(%p) on core[%d], offset=%"PRIu32", mask(%"PRIx32")", bundle, core_id, out_offset, out_mask); } // configure inwards channels @@ -255,7 +255,7 @@ esp_err_t dedic_gpio_new_bundle(const dedic_gpio_bundle_config_t *config, dedic_ } portEXIT_CRITICAL(&s_platform[core_id]->spinlock); ESP_GOTO_ON_FALSE(in_mask, ESP_ERR_NOT_FOUND, err, TAG, "no free inward channels on core[%d]", core_id); - ESP_LOGD(TAG, "new inward bundle(%p) on core[%d], offset=%d, mask(%x)", bundle, core_id, in_offset, in_mask); + ESP_LOGD(TAG, "new inward bundle(%p) on core[%d], offset=%"PRIu32", mask(%"PRIx32")", bundle, core_id, in_offset, in_mask); } // route dedicated GPIO channel signals to GPIO matrix @@ -377,7 +377,7 @@ esp_err_t dedic_gpio_bundle_set_interrupt_and_callback(dedic_gpio_bundle_handle_ { esp_err_t ret = ESP_OK; ESP_GOTO_ON_FALSE(bundle, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); - uint32_t core_id = esp_cpu_get_core_id(); + int core_id = esp_cpu_get_core_id(); // lazy alloc interrupt ESP_GOTO_ON_ERROR(dedic_gpio_install_interrupt(core_id), err, TAG, "allocate interrupt on core %d failed", core_id); diff --git a/components/driver/gpio/gpio.c b/components/driver/gpio/gpio.c index 0abbbeb5e0..4ced5e8baf 100644 --- a/components/driver/gpio/gpio.c +++ b/components/driver/gpio/gpio.c @@ -371,7 +371,7 @@ esp_err_t gpio_config(const gpio_config_t *pGPIOConfig) gpio_pulldown_dis(io_num); } - ESP_LOGI(GPIO_TAG, "GPIO[%d]| InputEn: %d| OutputEn: %d| OpenDrain: %d| Pullup: %d| Pulldown: %d| Intr:%d ", io_num, input_en, output_en, od_en, pu_en, pd_en, pGPIOConfig->intr_type); + ESP_LOGI(GPIO_TAG, "GPIO[%"PRIu32"]| InputEn: %d| OutputEn: %d| OpenDrain: %d| Pullup: %d| Pulldown: %d| Intr:%d ", io_num, input_en, output_en, od_en, pu_en, pd_en, pGPIOConfig->intr_type); gpio_set_intr_type(io_num, pGPIOConfig->intr_type); if (pGPIOConfig->intr_type) { diff --git a/components/driver/gptimer.c b/components/driver/gptimer.c index 223277f127..21a5597088 100644 --- a/components/driver/gptimer.c +++ b/components/driver/gptimer.c @@ -71,9 +71,9 @@ typedef enum { struct gptimer_t { gptimer_group_t *group; int timer_id; - unsigned int resolution_hz; - unsigned long long reload_count; - unsigned long long alarm_count; + uint32_t resolution_hz; + uint64_t reload_count; + uint64_t alarm_count; gptimer_count_direction_t direction; timer_hal_context_t hal; gptimer_fsm_t fsm; @@ -164,7 +164,7 @@ esp_err_t gptimer_new_timer(const gptimer_config_t *config, gptimer_handle_t *re esp_err_t ret = ESP_OK; gptimer_t *timer = NULL; ESP_GOTO_ON_FALSE(config && ret_timer, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); - ESP_GOTO_ON_FALSE(config->resolution_hz, ESP_ERR_INVALID_ARG, err, TAG, "invalid timer resolution:%d", config->resolution_hz); + ESP_GOTO_ON_FALSE(config->resolution_hz, ESP_ERR_INVALID_ARG, err, TAG, "invalid timer resolution:%"PRIu32, config->resolution_hz); timer = heap_caps_calloc(1, sizeof(gptimer_t), GPTIMER_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(timer, ESP_ERR_NO_MEM, err, TAG, "no mem for gptimer"); @@ -197,7 +197,7 @@ esp_err_t gptimer_new_timer(const gptimer_config_t *config, gptimer_handle_t *re timer->fsm = GPTIMER_FSM_INIT; // put the timer into init state timer->direction = config->direction; timer->flags.intr_shared = config->flags.intr_shared; - ESP_LOGD(TAG, "new gptimer (%d,%d) at %p, resolution=%uHz", group_id, timer_id, timer, timer->resolution_hz); + ESP_LOGD(TAG, "new gptimer (%d,%d) at %p, resolution=%"PRIu32"Hz", group_id, timer_id, timer, timer->resolution_hz); *ret_timer = timer; return ESP_OK; @@ -474,7 +474,7 @@ static esp_err_t gptimer_select_periph_clock(gptimer_t *timer, gptimer_clock_sou timer_ll_set_clock_prescale(timer->hal.dev, timer_id, prescale); timer->resolution_hz = counter_src_hz / prescale; // this is the real resolution if (timer->resolution_hz != resolution_hz) { - ESP_LOGW(TAG, "resolution lost, expect %u, real %u", resolution_hz, timer->resolution_hz); + ESP_LOGW(TAG, "resolution lost, expect %"PRIu32", real %"PRIu32, resolution_hz, timer->resolution_hz); } return ret; } diff --git a/components/driver/i2s/i2s_common.c b/components/driver/i2s/i2s_common.c index 4a3f8e75be..8aca6e30f6 100644 --- a/components/driver/i2s/i2s_common.c +++ b/components/driver/i2s/i2s_common.c @@ -371,7 +371,7 @@ uint32_t i2s_get_buf_size(i2s_chan_handle_t handle, uint32_t data_bit_width, uin if (bufsize > I2S_DMA_BUFFER_MAX_SIZE) { uint32_t frame_num = I2S_DMA_BUFFER_MAX_SIZE / bytes_per_frame; bufsize = frame_num * bytes_per_frame; - ESP_LOGW(TAG, "dma frame num is out of dma buffer size, limited to %d", frame_num); + ESP_LOGW(TAG, "dma frame num is out of dma buffer size, limited to %"PRIu32, frame_num); } return bufsize; } @@ -436,7 +436,7 @@ esp_err_t i2s_alloc_dma_desc(i2s_chan_handle_t handle, uint32_t num, uint32_t bu if (handle->dir == I2S_DIR_RX) { i2s_ll_rx_set_eof_num(handle->controller->hal.dev, bufsize); } - ESP_LOGD(TAG, "DMA malloc info: dma_desc_num = %d, dma_desc_buf_size = dma_frame_num * slot_num * data_bit_width = %d", num, bufsize); + ESP_LOGD(TAG, "DMA malloc info: dma_desc_num = %"PRIu32", dma_desc_buf_size = dma_frame_num * slot_num * data_bit_width = %"PRIu32, num, bufsize); return ESP_OK; err: i2s_free_dma_desc(handle); @@ -465,10 +465,10 @@ uint32_t i2s_set_get_apll_freq(uint32_t mclk_freq_hz) return 0; } if (ret == ESP_ERR_INVALID_STATE) { - ESP_LOGW(TAG, "APLL is occupied already, it is working at %d Hz while the expected frequency is %d Hz", real_freq, expt_freq); - ESP_LOGW(TAG, "Trying to work at %d Hz...", real_freq); + ESP_LOGW(TAG, "APLL is occupied already, it is working at %"PRIu32" Hz while the expected frequency is %"PRIu32" Hz", real_freq, expt_freq); + ESP_LOGW(TAG, "Trying to work at %"PRIu32" Hz...", real_freq); } - ESP_LOGD(TAG, "APLL expected frequency is %d Hz, real frequency is %d Hz", expt_freq, real_freq); + ESP_LOGD(TAG, "APLL expected frequency is %"PRIu32" Hz, real frequency is %"PRIu32" Hz", expt_freq, real_freq); return real_freq; } #endif diff --git a/components/driver/i2s/i2s_pdm.c b/components/driver/i2s/i2s_pdm.c index a08d630f30..cb3b2e8c36 100644 --- a/components/driver/i2s/i2s_pdm.c +++ b/components/driver/i2s/i2s_pdm.c @@ -61,7 +61,7 @@ static esp_err_t i2s_pdm_tx_set_clock(i2s_chan_handle_t handle, const i2s_pdm_tx i2s_hal_clock_info_t clk_info; /* Calculate clock parameters */ ESP_RETURN_ON_ERROR(i2s_pdm_tx_calculate_clock(handle, clk_cfg, &clk_info), TAG, "clock calculate failed"); - ESP_LOGD(TAG, "Clock division info: [sclk] %d Hz [mdiv] %d [mclk] %d Hz [bdiv] %d [bclk] %d Hz", + ESP_LOGD(TAG, "Clock division info: [sclk] %"PRIu32" Hz [mdiv] %d [mclk] %"PRIu32" Hz [bdiv] %d [bclk] %"PRIu32" Hz", clk_info.sclk, clk_info.mclk_div, clk_info.mclk, clk_info.bclk_div, clk_info.bclk); portENTER_CRITICAL(&g_i2s.spinlock); @@ -348,7 +348,7 @@ static esp_err_t i2s_pdm_rx_set_clock(i2s_chan_handle_t handle, const i2s_pdm_rx i2s_hal_clock_info_t clk_info; /* Calculate clock parameters */ ESP_RETURN_ON_ERROR(i2s_pdm_rx_calculate_clock(handle, clk_cfg, &clk_info), TAG, "clock calculate failed"); - ESP_LOGD(TAG, "Clock division info: [sclk] %d Hz [mdiv] %d [mclk] %d Hz [bdiv] %d [bclk] %d Hz", + ESP_LOGD(TAG, "Clock division info: [sclk] %"PRIu32" Hz [mdiv] %d [mclk] %"PRIu32" Hz [bdiv] %d [bclk] %"PRIu32" Hz", clk_info.sclk, clk_info.mclk_div, clk_info.mclk, clk_info.bclk_div, clk_info.bclk); portENTER_CRITICAL(&g_i2s.spinlock); diff --git a/components/driver/i2s/i2s_std.c b/components/driver/i2s/i2s_std.c index 5b9ba1e91e..ba1097e908 100644 --- a/components/driver/i2s/i2s_std.c +++ b/components/driver/i2s/i2s_std.c @@ -69,7 +69,7 @@ static esp_err_t i2s_std_set_clock(i2s_chan_handle_t handle, const i2s_std_clk_c i2s_hal_clock_info_t clk_info; /* Calculate clock parameters */ ESP_RETURN_ON_ERROR(i2s_std_calculate_clock(handle, clk_cfg, &clk_info), TAG, "clock calculate failed"); - ESP_LOGD(TAG, "Clock division info: [sclk] %d Hz [mdiv] %d [mclk] %d Hz [bdiv] %d [bclk] %d Hz", + ESP_LOGD(TAG, "Clock division info: [sclk] %"PRIu32" Hz [mdiv] %d [mclk] %"PRIu32" Hz [bdiv] %d [bclk] %"PRIu32" Hz", clk_info.sclk, clk_info.mclk_div, clk_info.mclk, clk_info.bclk_div, clk_info.bclk); portENTER_CRITICAL(&g_i2s.spinlock); diff --git a/components/driver/i2s/i2s_tdm.c b/components/driver/i2s/i2s_tdm.c index aaf39a6632..fdbb9b0174 100644 --- a/components/driver/i2s/i2s_tdm.c +++ b/components/driver/i2s/i2s_tdm.c @@ -45,7 +45,7 @@ static esp_err_t i2s_tdm_calculate_clock(i2s_chan_handle_t handle, const i2s_tdm clk_info->mclk *= 2; clk_info->bclk_div = clk_info->mclk / clk_info->bclk; if (clk_info->bclk_div <= 2) { - ESP_LOGW(TAG, "the current mclk multiple is too small, adjust the mclk multiple to %d", clk_info->mclk / rate); + ESP_LOGW(TAG, "the current mclk multiple is too small, adjust the mclk multiple to %"PRIu32, clk_info->mclk / rate); } } while (clk_info->bclk_div <= 2); } else { @@ -76,7 +76,7 @@ static esp_err_t i2s_tdm_set_clock(i2s_chan_handle_t handle, const i2s_tdm_clk_c i2s_hal_clock_info_t clk_info; /* Calculate clock parameters */ ESP_RETURN_ON_ERROR(i2s_tdm_calculate_clock(handle, clk_cfg, &clk_info), TAG, "clock calculate failed"); - ESP_LOGD(TAG, "Clock division info: [sclk] %d Hz [mdiv] %d [mclk] %d Hz [bdiv] %d [bclk] %d Hz", + ESP_LOGD(TAG, "Clock division info: [sclk] %"PRIu32" Hz [mdiv] %d [mclk] %"PRIu32" Hz [bdiv] %d [bclk] %"PRIu32" Hz", clk_info.sclk, clk_info.mclk_div, clk_info.mclk, clk_info.bclk_div, clk_info.bclk); portENTER_CRITICAL(&g_i2s.spinlock); diff --git a/components/driver/ledc.c b/components/driver/ledc.c index 27b5cea484..c05ef9859b 100644 --- a/components/driver/ledc.c +++ b/components/driver/ledc.c @@ -103,9 +103,9 @@ static bool ledc_slow_clk_calibrate(void) s_ledc_slow_clk_8M = periph_rtc_dig_clk8m_get_freq(); #if CONFIG_IDF_TARGET_ESP32H2 /* Workaround: Calibration cannot be done for CLK8M on H2, we just use its theoretic frequency */ - ESP_LOGD(LEDC_TAG, "Calibration cannot be performed, approximate CLK8M_CLK : %d Hz", s_ledc_slow_clk_8M); + ESP_LOGD(LEDC_TAG, "Calibration cannot be performed, approximate CLK8M_CLK : %"PRIu32" Hz", s_ledc_slow_clk_8M); #else - ESP_LOGD(LEDC_TAG, "Calibrate CLK8M_CLK : %d Hz", s_ledc_slow_clk_8M); + ESP_LOGD(LEDC_TAG, "Calibrate CLK8M_CLK : %"PRIu32" Hz", s_ledc_slow_clk_8M); #endif return true; } @@ -548,7 +548,7 @@ static esp_err_t ledc_set_timer_div(ledc_mode_t speed_mode, ledc_timer_t timer_n } /* The following debug message makes more sense for AUTO mode. */ - ESP_LOGD(LEDC_TAG, "Using clock source %d (in %s mode), divisor: 0x%x\n", + ESP_LOGD(LEDC_TAG, "Using clock source %d (in %s mode), divisor: 0x%"PRIx32, timer_clk_src, (speed_mode == LEDC_LOW_SPEED_MODE ? "slow" : "fast"), div_param); /* The following block configures the global clock. @@ -587,8 +587,7 @@ static esp_err_t ledc_set_timer_div(ledc_mode_t speed_mode, ledc_timer_t timer_n return ESP_OK; error: - ESP_LOGE(LEDC_TAG, "requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=%d", - (uint32_t ) div_param); + ESP_LOGE(LEDC_TAG, "requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=%"PRIu32, div_param); return ESP_FAIL; } @@ -603,11 +602,11 @@ esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf) LEDC_ARG_CHECK(!((timer_conf->clk_cfg == LEDC_USE_RTC8M_CLK) && (speed_mode != LEDC_LOW_SPEED_MODE)), "Only low speed channel support RTC8M_CLK"); periph_module_enable(PERIPH_LEDC_MODULE); if (freq_hz == 0 || duty_resolution == 0 || duty_resolution >= LEDC_TIMER_BIT_MAX) { - ESP_LOGE(LEDC_TAG, "freq_hz=%u duty_resolution=%u", freq_hz, duty_resolution); + ESP_LOGE(LEDC_TAG, "freq_hz=%"PRIu32" duty_resolution=%"PRIu32, freq_hz, duty_resolution); return ESP_ERR_INVALID_ARG; } if (timer_num > LEDC_TIMER_3) { - ESP_LOGE(LEDC_TAG, "invalid timer #%u", timer_num); + ESP_LOGE(LEDC_TAG, "invalid timer #%"PRIu32, timer_num); return ESP_ERR_INVALID_ARG; } @@ -673,9 +672,8 @@ esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf) portENTER_CRITICAL(&ledc_spinlock); ledc_enable_intr_type(speed_mode, ledc_channel, intr_type); portEXIT_CRITICAL(&ledc_spinlock); - ESP_LOGD(LEDC_TAG, "LEDC_PWM CHANNEL %1u|GPIO %02u|Duty %04u|Time %01u", - ledc_channel, gpio_num, duty, timer_select - ); + ESP_LOGD(LEDC_TAG, "LEDC_PWM CHANNEL %"PRIu32"|GPIO %02u|Duty %04"PRIu32"|Time %"PRIu32, + ledc_channel, gpio_num, duty, timer_select); /*set LEDC signal in gpio matrix*/ gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[gpio_num], PIN_FUNC_GPIO); gpio_set_level(gpio_num, output_invert); @@ -1048,13 +1046,13 @@ static esp_err_t _ledc_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t portENTER_CRITICAL(&ledc_spinlock); ledc_duty_config(speed_mode, channel, LEDC_VAL_NO_CHANGE, duty_cur, dir, step_num, cycle_num, scale); portEXIT_CRITICAL(&ledc_spinlock); - ESP_LOGD(LEDC_TAG, "cur duty: %d; target: %d, step: %d, cycle: %d; scale: %d; dir: %d\n", + ESP_LOGD(LEDC_TAG, "cur duty: %"PRIu32"; target: %"PRIu32", step: %d, cycle: %d; scale: %d; dir: %d\n", duty_cur, target_duty, step_num, cycle_num, scale, dir); } else { portENTER_CRITICAL(&ledc_spinlock); ledc_duty_config(speed_mode, channel, LEDC_VAL_NO_CHANGE, target_duty, dir, 0, 1, 0); portEXIT_CRITICAL(&ledc_spinlock); - ESP_LOGD(LEDC_TAG, "Set to target duty: %d", target_duty); + ESP_LOGD(LEDC_TAG, "Set to target duty: %"PRIu32, target_duty); } return ESP_OK; } diff --git a/components/driver/mcpwm/mcpwm_com.c b/components/driver/mcpwm/mcpwm_com.c index 7d9e555e32..fb9975d650 100644 --- a/components/driver/mcpwm/mcpwm_com.c +++ b/components/driver/mcpwm/mcpwm_com.c @@ -129,7 +129,7 @@ esp_err_t mcpwm_select_periph_clock(mcpwm_group_t *group, mcpwm_timer_clock_sour } mcpwm_ll_group_set_clock_prescale(group->hal.dev, MCPWM_PERIPH_CLOCK_PRE_SCALE); group->resolution_hz = periph_src_clk_hz / MCPWM_PERIPH_CLOCK_PRE_SCALE; - ESP_LOGD(TAG, "group (%d) clock resolution:%uHz", group->group_id, group->resolution_hz); + ESP_LOGD(TAG, "group (%d) clock resolution:%"PRIu32"Hz", group->group_id, group->resolution_hz); } return ret; } diff --git a/components/driver/mcpwm/mcpwm_gen.c b/components/driver/mcpwm/mcpwm_gen.c index 41ec7c2f62..eaaf866860 100644 --- a/components/driver/mcpwm/mcpwm_gen.c +++ b/components/driver/mcpwm/mcpwm_gen.c @@ -258,7 +258,7 @@ esp_err_t mcpwm_generator_set_dead_time(mcpwm_gen_handle_t in_generator, mcpwm_g mcpwm_ll_deadtime_set_falling_delay(hal->dev, oper_id, config->negedge_delay_ticks); } - ESP_LOGD(TAG, "operator (%d,%d) dead time (R:%u,F:%u), topology code:%x", group->group_id, oper_id, + ESP_LOGD(TAG, "operator (%d,%d) dead time (R:%"PRIu32",F:%"PRIu32"), topology code:%"PRIx32, group->group_id, oper_id, config->posedge_delay_ticks, config->negedge_delay_ticks, mcpwm_ll_deadtime_get_switch_topology(hal->dev, oper_id)); return ESP_OK; } diff --git a/components/driver/mcpwm/mcpwm_oper.c b/components/driver/mcpwm/mcpwm_oper.c index cbf3219dea..6a805f8ddc 100644 --- a/components/driver/mcpwm/mcpwm_oper.c +++ b/components/driver/mcpwm/mcpwm_oper.c @@ -203,7 +203,7 @@ esp_err_t mcpwm_operator_apply_carrier(mcpwm_oper_handle_t oper, const mcpwm_car mcpwm_ll_carrier_enable(hal->dev, oper_id, real_frequency > 0); if (real_frequency > 0) { - ESP_LOGD(TAG, "enable carrier modulation for operator(%d,%d), freq=%uHz, duty=%.2f, FPD=%dus", + ESP_LOGD(TAG, "enable carrier modulation for operator(%d,%d), freq=%"PRIu32"Hz, duty=%.2f, FPD=%"PRIu32"us", group->group_id, oper_id, real_frequency, real_duty, real_fpd); } else { ESP_LOGD(TAG, "disable carrier for operator (%d,%d)", group->group_id, oper_id); diff --git a/components/driver/mcpwm/mcpwm_timer.c b/components/driver/mcpwm/mcpwm_timer.c index e816a7db7a..09c22c287d 100644 --- a/components/driver/mcpwm/mcpwm_timer.c +++ b/components/driver/mcpwm/mcpwm_timer.c @@ -109,7 +109,7 @@ esp_err_t mcpwm_new_timer(const mcpwm_timer_config_t *config, mcpwm_timer_handle mcpwm_ll_timer_set_clock_prescale(hal->dev, timer_id, prescale); timer->resolution_hz = group->resolution_hz / prescale; if (timer->resolution_hz != config->resolution_hz) { - ESP_LOGW(TAG, "adjust timer resolution to %uHz", timer->resolution_hz); + ESP_LOGW(TAG, "adjust timer resolution to %"PRIu32"Hz", timer->resolution_hz); } // set the peak tickes that the timer can reach to @@ -130,7 +130,7 @@ esp_err_t mcpwm_new_timer(const mcpwm_timer_config_t *config, mcpwm_timer_handle timer->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; timer->fsm = MCPWM_TIMER_FSM_INIT; *ret_timer = timer; - ESP_LOGD(TAG, "new timer(%d,%d) at %p, resolution:%uHz, peak:%u, count_mod:%c", + ESP_LOGD(TAG, "new timer(%d,%d) at %p, resolution:%"PRIu32"Hz, peak:%"PRIu32", count_mod:%c", group_id, timer_id, timer, timer->resolution_hz, timer->peak_ticks, "SUDB"[timer->count_mode]); return ESP_OK; diff --git a/components/driver/pulse_cnt.c b/components/driver/pulse_cnt.c index c40d9f8a9c..875578e0b1 100644 --- a/components/driver/pulse_cnt.c +++ b/components/driver/pulse_cnt.c @@ -81,7 +81,7 @@ typedef enum { struct pcnt_unit_t { pcnt_group_t *group; // which group the pcnt unit belongs to portMUX_TYPE spinlock; // Spinlock, stop one unit from accessing different parts of a same register concurrently - uint32_t unit_id; // allocated unit numerical ID + int unit_id; // allocated unit numerical ID int low_limit; // low limit value int high_limit; // high limit value pcnt_chan_t *channels[SOC_PCNT_CHANNELS_PER_UNIT]; // array of PCNT channels diff --git a/components/driver/rmt/rmt_common.c b/components/driver/rmt/rmt_common.c index 308f5ec629..09911b729c 100644 --- a/components/driver/rmt/rmt_common.c +++ b/components/driver/rmt/rmt_common.c @@ -66,7 +66,7 @@ rmt_group_t *rmt_acquire_group_handle(int group_id) _lock_release(&s_platform.mutex); if (new_group) { - ESP_LOGD(TAG, "new group(%d) at %p, occupy=%x", group_id, group, group->occupy_mask); + ESP_LOGD(TAG, "new group(%d) at %p, occupy=%"PRIx32, group_id, group, group->occupy_mask); } return group; } @@ -153,7 +153,7 @@ esp_err_t rmt_select_periph_clock(rmt_channel_handle_t chan, rmt_clock_source_t // no division for group clock source, to achieve highest resolution rmt_ll_set_group_clock_src(group->hal.regs, channel_id, clk_src, 1, 1, 0); group->resolution_hz = periph_src_clk_hz; - ESP_LOGD(TAG, "group clock resolution:%u", group->resolution_hz); + ESP_LOGD(TAG, "group clock resolution:%"PRIu32, group->resolution_hz); return ret; } diff --git a/components/driver/rmt/rmt_rx.c b/components/driver/rmt/rmt_rx.c index e38ab7231f..9dc3a94d5a 100644 --- a/components/driver/rmt/rmt_rx.c +++ b/components/driver/rmt/rmt_rx.c @@ -239,7 +239,7 @@ esp_err_t rmt_new_rx_channel(const rmt_rx_channel_config_t *config, rmt_channel_ // resolution loss due to division, calculate the real resolution rx_channel->base.resolution_hz = group->resolution_hz / real_div; if (rx_channel->base.resolution_hz != config->resolution_hz) { - ESP_LOGW(TAG, "channel resolution loss, real=%u", rx_channel->base.resolution_hz); + ESP_LOGW(TAG, "channel resolution loss, real=%"PRIu32, rx_channel->base.resolution_hz); } rmt_ll_rx_set_mem_blocks(hal->regs, channel_id, rx_channel->base.mem_block_num); @@ -282,7 +282,7 @@ esp_err_t rmt_new_rx_channel(const rmt_rx_channel_config_t *config, rmt_channel_ rx_channel->base.disable = rmt_rx_disable; // return general channel handle *ret_chan = &rx_channel->base; - ESP_LOGD(TAG, "new rx channel(%d,%d) at %p, gpio=%d, res=%uHz, hw_mem_base=%p, ping_pong_size=%d", + ESP_LOGD(TAG, "new rx channel(%d,%d) at %p, gpio=%d, res=%"PRIu32"Hz, hw_mem_base=%p, ping_pong_size=%d", group_id, channel_id, rx_channel, config->gpio_num, rx_channel->base.resolution_hz, rx_channel->base.hw_mem_base, rx_channel->ping_pong_symbols); return ESP_OK; @@ -405,7 +405,7 @@ static esp_err_t rmt_rx_demodulate_carrier(rmt_channel_handle_t channel, const r portEXIT_CRITICAL(&channel->spinlock); if (real_frequency > 0) { - ESP_LOGD(TAG, "enable carrier demodulation for channel(%d,%d), freq=%uHz", group_id, channel_id, real_frequency); + ESP_LOGD(TAG, "enable carrier demodulation for channel(%d,%d), freq=%"PRIu32"Hz", group_id, channel_id, real_frequency); } else { ESP_LOGD(TAG, "disable carrier demodulation for channel(%d, %d)", group_id, channel_id); } diff --git a/components/driver/rmt/rmt_tx.c b/components/driver/rmt/rmt_tx.c index b2c6bff66e..5d814a515a 100644 --- a/components/driver/rmt/rmt_tx.c +++ b/components/driver/rmt/rmt_tx.c @@ -260,7 +260,7 @@ esp_err_t rmt_new_tx_channel(const rmt_tx_channel_config_t *config, rmt_channel_ // resolution lost due to division, calculate the real resolution tx_channel->base.resolution_hz = group->resolution_hz / real_div; if (tx_channel->base.resolution_hz != config->resolution_hz) { - ESP_LOGW(TAG, "channel resolution loss, real=%u", tx_channel->base.resolution_hz); + ESP_LOGW(TAG, "channel resolution loss, real=%"PRIu32, tx_channel->base.resolution_hz); } rmt_ll_tx_set_mem_blocks(hal->regs, channel_id, tx_channel->base.mem_block_num); @@ -300,7 +300,7 @@ esp_err_t rmt_new_tx_channel(const rmt_tx_channel_config_t *config, rmt_channel_ tx_channel->base.disable = rmt_tx_disable; // return general channel handle *ret_chan = &tx_channel->base; - ESP_LOGD(TAG, "new tx channel(%d,%d) at %p, gpio=%d, res=%uHz, hw_mem_base=%p, dma_mem_base=%p, ping_pong_size=%zu, queue_depth=%zu", + ESP_LOGD(TAG, "new tx channel(%d,%d) at %p, gpio=%d, res=%"PRIu32"Hz, hw_mem_base=%p, dma_mem_base=%p, ping_pong_size=%zu, queue_depth=%zu", group_id, channel_id, tx_channel, config->gpio_num, tx_channel->base.resolution_hz, tx_channel->base.hw_mem_base, tx_channel->base.dma_mem_base, tx_channel->ping_pong_symbols, tx_channel->queue_size); return ESP_OK; @@ -380,7 +380,7 @@ esp_err_t rmt_new_sync_manager(const rmt_sync_manager_config_t *config, rmt_sync *ret_synchro = synchro; - ESP_LOGD(TAG, "new sync manager at %p, with channel mask:%02x", synchro, synchro->channel_mask); + ESP_LOGD(TAG, "new sync manager at %p, with channel mask:%02"PRIx32, synchro, synchro->channel_mask); return ESP_OK; err: @@ -797,7 +797,7 @@ static esp_err_t rmt_tx_modulate_carrier(rmt_channel_handle_t channel, const rmt portEXIT_CRITICAL(&channel->spinlock); if (real_frequency > 0) { - ESP_LOGD(TAG, "enable carrier modulation for channel(%d,%d), freq=%uHz", group_id, channel_id, real_frequency); + ESP_LOGD(TAG, "enable carrier modulation for channel(%d,%d), freq=%"PRIu32"Hz", group_id, channel_id, real_frequency); } else { ESP_LOGD(TAG, "disable carrier modulation for channel(%d,%d)", group_id, channel_id); } diff --git a/components/driver/sdm.c b/components/driver/sdm.c index 435af6853c..6a0830ca3a 100644 --- a/components/driver/sdm.c +++ b/components/driver/sdm.c @@ -247,7 +247,7 @@ esp_err_t sdm_new_channel(const sdm_config_t *config, sdm_channel_handle_t *ret_ chan->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; chan->fsm = SDM_FSM_INIT; // put the channel into init state - ESP_LOGD(TAG, "new sdm channel (%d,%d) at %p, gpio=%d, sample rate=%uHz", group_id, chan_id, chan, chan->gpio_num, chan->sample_rate_hz); + ESP_LOGD(TAG, "new sdm channel (%d,%d) at %p, gpio=%d, sample rate=%"PRIu32"Hz", group_id, chan_id, chan, chan->gpio_num, chan->sample_rate_hz); *ret_chan = chan; return ESP_OK; err: diff --git a/components/driver/sdmmc_host.c b/components/driver/sdmmc_host.c index 1f2b281602..41438d930f 100644 --- a/components/driver/sdmmc_host.c +++ b/components/driver/sdmmc_host.c @@ -270,7 +270,7 @@ esp_err_t sdmmc_host_init(void) // Reset sdmmc_host_reset(); - ESP_LOGD(TAG, "peripheral version %x, hardware config %08x", SDMMC.verid, SDMMC.hcon); + ESP_LOGD(TAG, "peripheral version %"PRIx32", hardware config %08"PRIx32, SDMMC.verid, SDMMC.hcon); // Clear interrupt status and set interrupt mask to known state SDMMC.rintsts.val = 0xffffffff; diff --git a/components/driver/sdmmc_transaction.c b/components/driver/sdmmc_transaction.c index e4dc22e465..9c56b1c2f8 100644 --- a/components/driver/sdmmc_transaction.c +++ b/components/driver/sdmmc_transaction.c @@ -239,7 +239,7 @@ static esp_err_t handle_idle_state_events(void) evt.sdmmc_status &= ~SDMMC_INTMASK_CD; } if (evt.sdmmc_status != 0 || evt.dma_status != 0) { - ESP_LOGE(TAG, "handle_idle_state_events unhandled: %08x %08x", + ESP_LOGE(TAG, "handle_idle_state_events unhandled: %08"PRIx32" %08"PRIx32, evt.sdmmc_status, evt.dma_status); } @@ -260,13 +260,13 @@ static esp_err_t handle_event(sdmmc_command_t* cmd, sdmmc_req_state_t* state, } return err; } - ESP_LOGV(TAG, "sdmmc_handle_event: event %08x %08x, unhandled %08x %08x", + ESP_LOGV(TAG, "sdmmc_handle_event: event %08"PRIx32" %08"PRIx32", unhandled %08"PRIx32" %08"PRIx32, event.sdmmc_status, event.dma_status, unhandled_events->sdmmc_status, unhandled_events->dma_status); event.sdmmc_status |= unhandled_events->sdmmc_status; event.dma_status |= unhandled_events->dma_status; process_events(event, cmd, state, unhandled_events); - ESP_LOGV(TAG, "sdmmc_handle_event: events unhandled: %08x %08x", unhandled_events->sdmmc_status, unhandled_events->dma_status); + ESP_LOGV(TAG, "sdmmc_handle_event: events unhandled: %08"PRIx32" %08"PRIx32, unhandled_events->sdmmc_status, unhandled_events->dma_status); return ESP_OK; } @@ -347,7 +347,7 @@ static void process_command_response(uint32_t status, sdmmc_command_t* cmd) if (cmd->data) { sdmmc_host_dma_stop(); } - ESP_LOGD(TAG, "%s: error 0x%x (status=%08x)", __func__, err, status); + ESP_LOGD(TAG, "%s: error 0x%x (status=%08"PRIx32")", __func__, err, status); } } @@ -370,7 +370,7 @@ static void process_data_status(uint32_t status, sdmmc_command_t* cmd) if (cmd->data) { sdmmc_host_dma_stop(); } - ESP_LOGD(TAG, "%s: error 0x%x (status=%08x)", __func__, cmd->error, status); + ESP_LOGD(TAG, "%s: error 0x%x (status=%08"PRIx32")", __func__, cmd->error, status); } } @@ -391,7 +391,7 @@ static esp_err_t process_events(sdmmc_event_t evt, sdmmc_command_t* cmd, "BUSY" }; sdmmc_event_t orig_evt = evt; - ESP_LOGV(TAG, "%s: state=%s evt=%x dma=%x", __func__, s_state_names[*pstate], + ESP_LOGV(TAG, "%s: state=%s evt=%"PRIx32" dma=%"PRIx32, __func__, s_state_names[*pstate], evt.sdmmc_status, evt.dma_status); sdmmc_req_state_t next_state = *pstate; sdmmc_req_state_t state = (sdmmc_req_state_t) -1; diff --git a/components/driver/sdspi_host.c b/components/driver/sdspi_host.c index a09a63595d..184d48d968 100644 --- a/components/driver/sdspi_host.c +++ b/components/driver/sdspi_host.c @@ -289,7 +289,7 @@ esp_err_t sdspi_host_set_card_clk(sdspi_dev_handle_t handle, uint32_t freq_khz) if (slot == NULL) { return ESP_ERR_INVALID_ARG; } - ESP_LOGD(TAG, "Setting card clock to %d kHz", freq_khz); + ESP_LOGD(TAG, "Setting card clock to %"PRIu32" kHz", freq_khz); return configure_spi_dev(slot, freq_khz * 1000); } @@ -434,7 +434,7 @@ esp_err_t sdspi_host_start_command(sdspi_dev_handle_t handle, sdspi_hw_cmd_t *cm uint32_t cmd_arg; memcpy(&cmd_arg, cmd->arguments, sizeof(cmd_arg)); cmd_arg = __builtin_bswap32(cmd_arg); - ESP_LOGV(TAG, "%s: slot=%i, CMD%d, arg=0x%08x flags=0x%x, data=%p, data_size=%i crc=0x%02x", + ESP_LOGV(TAG, "%s: slot=%i, CMD%d, arg=0x%08"PRIx32" flags=0x%x, data=%p, data_size=%"PRIu32" crc=0x%02x", __func__, handle, cmd_index, cmd_arg, flags, data, data_size, cmd->crc7); spi_device_acquire_bus(slot->spi_handle, portMAX_DELAY); diff --git a/components/driver/sdspi_transaction.c b/components/driver/sdspi_transaction.c index 583c6cfc35..f60b9535d0 100644 --- a/components/driver/sdspi_transaction.c +++ b/components/driver/sdspi_transaction.c @@ -152,7 +152,7 @@ esp_err_t sdspi_host_do_transaction(int slot, sdmmc_command_t *cmdinfo) // Extract response bytes and store them into cmdinfo structure if (ret == ESP_OK) { - ESP_LOGV(TAG, "r1 = 0x%02x hw_cmd.r[0]=0x%08x", hw_cmd.r1, hw_cmd.response[0]); + ESP_LOGV(TAG, "r1 = 0x%02x hw_cmd.r[0]=0x%08"PRIx32, hw_cmd.r1, hw_cmd.response[0]); // Some errors should be reported using return code if (flags & (SDSPI_CMD_FLAG_RSP_R1 | SDSPI_CMD_FLAG_RSP_R1B)) { cmdinfo->response[0] = hw_cmd.r1; diff --git a/components/driver/temperature_sensor.c b/components/driver/temperature_sensor.c index bb11e3148e..c0e0d9629a 100644 --- a/components/driver/temperature_sensor.c +++ b/components/driver/temperature_sensor.c @@ -185,7 +185,7 @@ esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens, floa ESP_RETURN_ON_FALSE(tsens->fsm == TEMP_SENSOR_FSM_ENABLE, ESP_ERR_INVALID_STATE, TAG, "tsens not enabled yet"); uint32_t tsens_out = temperature_sensor_ll_get_raw_value(); - ESP_LOGV(TAG, "tsens_out %d", tsens_out); + ESP_LOGV(TAG, "tsens_out %"PRIu32, tsens_out); *out_celsius = parse_temp_sensor_raw_value(tsens_out, tsens->tsens_attribute->offset); if (*out_celsius < tsens->tsens_attribute->range_min || *out_celsius > tsens->tsens_attribute->range_max) { diff --git a/components/driver/test_apps/i2s_test_apps/i2s/main/CMakeLists.txt b/components/driver/test_apps/i2s_test_apps/i2s/main/CMakeLists.txt index c7f16431cc..22bdc0d96d 100644 --- a/components/driver/test_apps/i2s_test_apps/i2s/main/CMakeLists.txt +++ b/components/driver/test_apps/i2s_test_apps/i2s/main/CMakeLists.txt @@ -4,4 +4,3 @@ set(srcs "test_app_main.c" idf_component_register(SRCS ${srcs} WHOLE_ARCHIVE) -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/driver/test_apps/i2s_test_apps/i2s/main/test_i2s.c b/components/driver/test_apps/i2s_test_apps/i2s/main/test_i2s.c index 52cc31eed6..c787c0f79a 100644 --- a/components/driver/test_apps/i2s_test_apps/i2s/main/test_i2s.c +++ b/components/driver/test_apps/i2s_test_apps/i2s/main/test_i2s.c @@ -6,6 +6,7 @@ #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" @@ -226,7 +227,7 @@ static void i2s_read_task(void *args) { while (task_run_flag) { ret = i2s_channel_read(rx_handle, recv_buf, 2000, &recv_size, 300); if (ret == ESP_ERR_TIMEOUT) { - printf("Read timeout count: %d\n", cnt++); + printf("Read timeout count: %"PRIu32"\n", cnt++); } } @@ -245,7 +246,7 @@ static void i2s_write_task(void *args) { while (task_run_flag) { ret = i2s_channel_write(tx_handle, send_buf, 2000, &send_size, 300); if (ret == ESP_ERR_TIMEOUT) { - printf("Write timeout count: %d\n", cnt++); + printf("Write timeout count: %"PRIu32"\n", cnt++); } } @@ -607,7 +608,7 @@ TEST_CASE("I2S_memory_leak_test", "[i2s]") TEST_ESP_OK(i2s_del_channel(rx_handle)); TEST_ASSERT(memory_left == esp_get_free_heap_size()); } - printf("\r\nHeap size after: %d\n", esp_get_free_heap_size()); + printf("\r\nHeap size after: %"PRIu32"\n", esp_get_free_heap_size()); } TEST_CASE("I2S_loopback_test", "[i2s]") @@ -762,7 +763,7 @@ static void i2s_test_common_sample_rate(i2s_chan_handle_t rx_chan, i2s_std_clk_c vTaskDelay(pdMS_TO_TICKS(TEST_I2S_PERIOD_MS)); TEST_ESP_OK(pcnt_unit_stop(pcnt_unit)); TEST_ESP_OK(pcnt_unit_get_count(pcnt_unit, &real_pulse)); - printf("[%d Hz] %d pulses, expected %d, err %d\n", test_freq[i], real_pulse, expt_pulse, real_pulse - expt_pulse); + printf("[%"PRIu32" Hz] %d pulses, expected %d, err %d\n", test_freq[i], real_pulse, expt_pulse, real_pulse - expt_pulse); TEST_ESP_OK(i2s_channel_disable(rx_chan)); // Check if the error between real pulse number and expected pulse number is within 1% TEST_ASSERT_INT_WITHIN(expt_pulse * 0.01, expt_pulse, real_pulse); @@ -858,7 +859,7 @@ TEST_CASE("I2S_package_lost_test", "[i2s]") size_t bytes_read = 0; int i; for (i = 0; i < test_num; i++) { - printf("Testing %d Hz sample rate\n", test_freq[i]); + printf("Testing %"PRIu32" Hz sample rate\n", test_freq[i]); std_cfg.clk_cfg.sample_rate_hz = test_freq[i]; std_cfg.clk_cfg.sample_rate_hz = test_freq[i]; TEST_ESP_OK(i2s_channel_reconfig_std_clock(rx_handle, &std_cfg.clk_cfg)); @@ -870,7 +871,7 @@ TEST_CASE("I2S_package_lost_test", "[i2s]") } TEST_ESP_OK(i2s_channel_disable(rx_handle)); if (count > 0) { - printf("package lost detected at %d Hz\n", test_freq[i]); + printf("package lost detected at %"PRIu32" Hz\n", test_freq[i]); goto finish; } } diff --git a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/CMakeLists.txt b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/CMakeLists.txt index fe200a444a..60f64e8760 100644 --- a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/CMakeLists.txt +++ b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/CMakeLists.txt @@ -3,4 +3,3 @@ set(srcs "test_app_main.c" idf_component_register(SRCS ${srcs} WHOLE_ARCHIVE) -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/test_legacy_i2s.c b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/test_legacy_i2s.c index 7d87bfc643..f6309687ee 100644 --- a/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/test_legacy_i2s.c +++ b/components/driver/test_apps/i2s_test_apps/legacy_i2s_driver/main/test_legacy_i2s.c @@ -13,6 +13,7 @@ #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" @@ -444,7 +445,7 @@ TEST_CASE("I2S_TDM_loopback_test_with_master_tx_and_rx", "[i2s_legacy]") TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config)); i2s_test_io_config(I2S_TEST_MODE_LOOPBACK); - printf("\r\nheap size: %d\n", esp_get_free_heap_size()); + printf("\r\nheap size: %"PRIu32"\n", esp_get_free_heap_size()); uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400); size_t i2s_bytes_write = 0; @@ -519,7 +520,7 @@ TEST_CASE("I2S_write_and_read_test_with_master_tx_and_slave_rx", "[i2s_legacy]") TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config)); i2s_test_io_config(I2S_TEST_MODE_MASTER_TO_SLAVE); - printf("\r\nheap size: %d\n", esp_get_free_heap_size()); + printf("\r\nheap size: %"PRIu32"\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { .mode = I2S_MODE_SLAVE | I2S_MODE_RX, @@ -551,7 +552,7 @@ TEST_CASE("I2S_write_and_read_test_with_master_tx_and_slave_rx", "[i2s_legacy]") TEST_ESP_OK(i2s_driver_install(I2S_NUM_1, &slave_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_1, &slave_pin_config)); i2s_test_io_config(I2S_TEST_MODE_MASTER_TO_SLAVE); - printf("\r\nheap size: %d\n", esp_get_free_heap_size()); + printf("\r\nheap size: %"PRIu32"\n", esp_get_free_heap_size()); uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400); size_t i2s_bytes_write = 0; @@ -623,7 +624,7 @@ TEST_CASE("I2S_write_and_read_test_master_rx_and_slave_tx", "[i2s_legacy]") TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config)); i2s_test_io_config(I2S_TEST_MODE_SLAVE_TO_MASTER); - printf("\r\nheap size: %d\n", esp_get_free_heap_size()); + printf("\r\nheap size: %"PRIu32"\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX @@ -655,7 +656,7 @@ TEST_CASE("I2S_write_and_read_test_master_rx_and_slave_tx", "[i2s_legacy]") TEST_ESP_OK(i2s_driver_install(I2S_NUM_1, &slave_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_1, &slave_pin_config)); i2s_test_io_config(I2S_TEST_MODE_SLAVE_TO_MASTER); - printf("\r\nheap size: %d\n", esp_get_free_heap_size()); + printf("\r\nheap size: %"PRIu32"\n", esp_get_free_heap_size()); uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400); size_t i2s_bytes_write = 0; @@ -896,7 +897,7 @@ static void i2s_test_common_sample_rate(i2s_port_t id) vTaskDelay(pdMS_TO_TICKS(TEST_I2S_PERIOD_MS)); TEST_ESP_OK(pcnt_unit_stop(pcnt_unit)); TEST_ESP_OK(pcnt_unit_get_count(pcnt_unit, &real_pulse)); - printf("[%d Hz] %d pulses, expected %d, err %d\n", test_freq[i], real_pulse, expt_pulse, real_pulse - expt_pulse); + printf("[%"PRIu32" Hz] %d pulses, expected %d, err %d\n", test_freq[i], real_pulse, expt_pulse, real_pulse - expt_pulse); // Check if the error between real pulse number and expected pulse number is within 1% TEST_ASSERT_INT_WITHIN(expt_pulse * 0.01, expt_pulse, real_pulse); } diff --git a/components/driver/test_apps/mcpwm/main/CMakeLists.txt b/components/driver/test_apps/mcpwm/main/CMakeLists.txt index 1a38f86ffa..69804189bb 100644 --- a/components/driver/test_apps/mcpwm/main/CMakeLists.txt +++ b/components/driver/test_apps/mcpwm/main/CMakeLists.txt @@ -16,4 +16,3 @@ endif() # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} WHOLE_ARCHIVE) -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/driver/test_apps/mcpwm/main/test_mcpwm_cap.c b/components/driver/test_apps/mcpwm/main/test_mcpwm_cap.c index 2a6dd37943..e1fd2f11e1 100644 --- a/components/driver/test_apps/mcpwm/main/test_mcpwm_cap.c +++ b/components/driver/test_apps/mcpwm/main/test_mcpwm_cap.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" @@ -110,7 +111,7 @@ TEST_CASE("mcpwm_capture_ext_gpio", "[mcpwm]") vTaskDelay(pdMS_TO_TICKS(100)); gpio_set_level(cap_gpio, 0); vTaskDelay(pdMS_TO_TICKS(100)); - printf("capture value: Pos=%u, Neg=%u\r\n", cap_value[0], cap_value[1]); + printf("capture value: Pos=%"PRIu32", Neg=%"PRIu32"\r\n", cap_value[0], cap_value[1]); // Capture timer is clocked from APB by default uint32_t clk_src_res = esp_clk_apb_freq(); TEST_ASSERT_UINT_WITHIN(100000, clk_src_res / 10, cap_value[1] - cap_value[0]); @@ -225,12 +226,12 @@ TEST_CASE("mcpwm_capture_timer_sync_phase_lock", "[mcpwm]") TEST_ESP_OK(mcpwm_capture_channel_trigger_soft_catch(cap_channel)); vTaskDelay(pdMS_TO_TICKS(10)); - printf("capture data before sync: %u\r\n", cap_data); + printf("capture data before sync: %"PRIu32"\r\n", cap_data); TEST_ESP_OK(mcpwm_soft_sync_activate(soft_sync)); TEST_ESP_OK(mcpwm_capture_channel_trigger_soft_catch(cap_channel)); vTaskDelay(pdMS_TO_TICKS(10)); - printf("capture data after sync: %u\r\n", cap_data); + printf("capture data after sync: %"PRIu32"\r\n", cap_data); TEST_ASSERT_EQUAL(1000, cap_data); TEST_ESP_OK(mcpwm_del_capture_channel(cap_channel)); TEST_ESP_OK(mcpwm_del_capture_timer(cap_timer)); diff --git a/components/driver/test_apps/mcpwm/main/test_mcpwm_cmpr.c b/components/driver/test_apps/mcpwm/main/test_mcpwm_cmpr.c index 5e0404d18b..93a60c85a0 100644 --- a/components/driver/test_apps/mcpwm/main/test_mcpwm_cmpr.c +++ b/components/driver/test_apps/mcpwm/main/test_mcpwm_cmpr.c @@ -3,6 +3,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "unity.h" @@ -101,7 +102,7 @@ TEST_CASE("mcpwm_comparator_event_callback", "[mcpwm]") vTaskDelay(pdMS_TO_TICKS(1000)); TEST_ESP_OK(mcpwm_timer_start_stop(timer, MCPWM_TIMER_STOP_EMPTY)); - printf("compare_counts=%u\r\n", compare_counts); + printf("compare_counts=%"PRIu32"\r\n", compare_counts); // the timer period is 10ms, the expected compare_counts = 1s/10ms = 100 TEST_ASSERT_INT_WITHIN(1, 100, compare_counts); diff --git a/components/driver/test_apps/mcpwm/main/test_mcpwm_iram.c b/components/driver/test_apps/mcpwm/main/test_mcpwm_iram.c index 29ed573d50..a59d59e670 100644 --- a/components/driver/test_apps/mcpwm/main/test_mcpwm_iram.c +++ b/components/driver/test_apps/mcpwm/main/test_mcpwm_iram.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" @@ -78,7 +79,7 @@ TEST_CASE("mcpwm_capture_iram_safe", "[mcpwm]") printf("disable cache, simulate GPIO capture signal\r\n"); test_mcpwm_capture_gpio_simulate(cap_gpio); - printf("capture value: Pos=%u, Neg=%u\r\n", cap_value[0], cap_value[1]); + printf("capture value: Pos=%"PRIu32", Neg=%"PRIu32"\r\n", cap_value[0], cap_value[1]); // Capture timer is clocked from APB by default uint32_t clk_src_res = esp_clk_apb_freq(); TEST_ASSERT_UINT_WITHIN(2000, clk_src_res / 1000, cap_value[1] - cap_value[0]); diff --git a/components/esp_lcd/CMakeLists.txt b/components/esp_lcd/CMakeLists.txt index 4382f91ec1..a77acae0d9 100644 --- a/components/esp_lcd/CMakeLists.txt +++ b/components/esp_lcd/CMakeLists.txt @@ -21,7 +21,6 @@ idf_component_register(SRCS ${srcs} INCLUDE_DIRS ${includes} PRIV_REQUIRES ${priv_requires} LDFRAGMENTS linker.lf) -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") if(CONFIG_SPIRAM) idf_component_optional_requires(PRIVATE esp_psram) diff --git a/components/esp_lcd/include/esp_lcd_panel_io.h b/components/esp_lcd/include/esp_lcd_panel_io.h index 9d0196eb71..f702a9251e 100644 --- a/components/esp_lcd/include/esp_lcd_panel_io.h +++ b/components/esp_lcd/include/esp_lcd_panel_io.h @@ -208,7 +208,7 @@ esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus); */ typedef struct { int cs_gpio_num; /*!< GPIO used for CS line, set to -1 will declaim exclusively use of I80 bus */ - unsigned int pclk_hz; /*!< Frequency of pixel clock */ + uint32_t pclk_hz; /*!< Frequency of pixel clock */ size_t trans_queue_depth; /*!< Transaction queue size, larger queue, higher throughput */ esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data was tranferred done */ void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2s.c b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c index e57d3303fb..282b8129f8 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2s.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c @@ -95,7 +95,7 @@ struct lcd_panel_io_i80_t { esp_lcd_panel_io_t base; // Base class of generic lcd panel io esp_lcd_i80_bus_t *bus; // Which bus the device is attached to int cs_gpio_num; // GPIO used for CS line - unsigned int pclk_hz; // PCLK clock frequency + uint32_t pclk_hz; // PCLK clock frequency size_t clock_prescale; // Prescaler coefficient, determined by user's configured PCLK frequency QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller @@ -263,7 +263,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p // because we set the I2S's left channel data same to right channel, so f_pclk = f_i2s/pclk_div/2 uint32_t pclk_prescale = bus->resolution_hz / 2 / io_config->pclk_hz; ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= I2S_LL_BCK_MAX_PRESCALE, ESP_ERR_NOT_SUPPORTED, err, TAG, - "prescaler can't satisfy PCLK clock %u", io_config->pclk_hz); + "prescaler can't satisfy PCLK clock %"PRIu32"Hz", io_config->pclk_hz); i80_device = heap_caps_calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t), LCD_I80_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); // create two queues for i80 device @@ -302,7 +302,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_config->cs_gpio_num], PIN_FUNC_GPIO); } *ret_io = &(i80_device->base); - ESP_LOGD(TAG, "new i80 lcd panel io @%p on bus(%d), pclk=%uHz", i80_device, bus->bus_id, i80_device->pclk_hz); + ESP_LOGD(TAG, "new i80 lcd panel io @%p on bus(%d), pclk=%"PRIu32"Hz", i80_device, bus->bus_id, i80_device->pclk_hz); return ESP_OK; err: diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i80.c b/components/esp_lcd/src/esp_lcd_panel_io_i80.c index a015148e31..fb9aa5cc8f 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i80.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i80.c @@ -249,7 +249,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p // check if pixel clock setting is valid uint32_t pclk_prescale = bus->resolution_hz / io_config->pclk_hz; ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= LCD_LL_PCLK_DIV_MAX, ESP_ERR_NOT_SUPPORTED, err, TAG, - "prescaler can't satisfy PCLK clock %u", io_config->pclk_hz); + "prescaler can't satisfy PCLK clock %"PRIu32"Hz", io_config->pclk_hz); i80_device = heap_caps_calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t), LCD_I80_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); // create two queues for i80 device diff --git a/components/esp_lcd/src/esp_lcd_rgb_panel.c b/components/esp_lcd/src/esp_lcd_rgb_panel.c index 61abf5f1a9..8aa6ea2168 100644 --- a/components/esp_lcd/src/esp_lcd_rgb_panel.c +++ b/components/esp_lcd/src/esp_lcd_rgb_panel.c @@ -444,7 +444,7 @@ static esp_err_t rgb_panel_init(esp_lcd_panel_t *panel) if (rgb_panel->flags.stream_mode) { lcd_rgb_panel_start_transmission(rgb_panel); } - ESP_LOGD(TAG, "rgb panel(%d) start, pclk=%uHz", rgb_panel->panel_id, rgb_panel->timings.pclk_hz); + ESP_LOGD(TAG, "rgb panel(%d) start, pclk=%"PRIu32"Hz", rgb_panel->panel_id, rgb_panel->timings.pclk_hz); return ret; } diff --git a/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt b/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt index f694abfeab..ade68f9236 100644 --- a/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt +++ b/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt @@ -5,4 +5,3 @@ set(srcs "test_app_main.c" # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} WHOLE_ARCHIVE) -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c b/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c index 687d5077a5..24194076fb 100644 --- a/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c +++ b/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c @@ -5,6 +5,7 @@ */ #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "unity.h" @@ -281,7 +282,7 @@ TEST_CASE("lcd_rgb_panel_iram_safe", "[lcd]") printf("disable the cache for a while\r\n"); test_disable_flash_cache(); printf("the RGB ISR handle should keep working while the flash cache is disabled\r\n"); - printf("callback calls: %d\r\n", callback_calls); + printf("callback calls: %"PRIu32"\r\n", callback_calls); TEST_ASSERT(callback_calls > 2); printf("delete RGB panel\r\n"); diff --git a/examples/peripherals/adc/continuous_read/main/CMakeLists.txt b/examples/peripherals/adc/continuous_read/main/CMakeLists.txt index c9dd1dd9cd..902872a063 100644 --- a/examples/peripherals/adc/continuous_read/main/CMakeLists.txt +++ b/examples/peripherals/adc/continuous_read/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "continuous_read_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/adc/continuous_read/main/continuous_read_main.c b/examples/peripherals/adc/continuous_read/main/continuous_read_main.c index 47f51edb61..bdfbf8965d 100644 --- a/examples/peripherals/adc/continuous_read/main/continuous_read_main.c +++ b/examples/peripherals/adc/continuous_read/main/continuous_read_main.c @@ -133,7 +133,7 @@ void app_main(void) while (1) { ret = adc_continuous_read(handle, result, EXAMPLE_READ_LEN, &ret_num, 0); if (ret == ESP_OK) { - ESP_LOGI("TASK", "ret is %x, ret_num is %d", ret, ret_num); + ESP_LOGI("TASK", "ret is %x, ret_num is %"PRIu32, ret, ret_num); for (int i = 0; i < ret_num; i += SOC_ADC_DIGI_RESULT_BYTES) { adc_digi_output_data_t *p = (void*)&result[i]; #if CONFIG_IDF_TARGET_ESP32 diff --git a/examples/peripherals/gpio/generic_gpio/main/CMakeLists.txt b/examples/peripherals/gpio/generic_gpio/main/CMakeLists.txt index 8adcdef66d..81e99f92f9 100644 --- a/examples/peripherals/gpio/generic_gpio/main/CMakeLists.txt +++ b/examples/peripherals/gpio/generic_gpio/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "gpio_example_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c b/examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c index e0ec63efd1..baa4bcef27 100644 --- a/examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c +++ b/examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" @@ -55,7 +56,7 @@ static void gpio_task_example(void* arg) uint32_t io_num; for(;;) { if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { - printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num)); + printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num)); } } } @@ -107,7 +108,7 @@ void app_main(void) //hook isr handler for specific gpio pin again gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0); - printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size()); + printf("Minimum free heap size: %"PRIu32" bytes\n", esp_get_minimum_free_heap_size()); int cnt = 0; while(1) { diff --git a/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/CMakeLists.txt b/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/CMakeLists.txt index 98f9bcab35..167e6b2d80 100644 --- a/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/CMakeLists.txt +++ b/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/CMakeLists.txt @@ -5,4 +5,3 @@ idf_component_register(SRCS "${component_srcs}" PRIV_INCLUDE_DIRS "" PRIV_REQUIRES "driver" REQUIRES "") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c b/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c index e801b02846..b19d4eea71 100644 --- a/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c +++ b/examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -67,7 +59,7 @@ static void matrix_kbd_debounce_timer_callback(TimerHandle_t xTimer) uint32_t row_out = dedic_gpio_bundle_read_out(mkbd->row_bundle); uint32_t col_in = dedic_gpio_bundle_read_in(mkbd->col_bundle); row_out = (~row_out) & ((1 << mkbd->nr_row_gpios) - 1); - ESP_LOGD(TAG, "row_out=%x, col_in=%x", row_out, col_in); + ESP_LOGD(TAG, "row_out=%"PRIx32", col_in=%"PRIx32, row_out, col_in); int row = -1; int col = -1; uint32_t key_code = 0; diff --git a/examples/peripherals/gpio/matrix_keyboard/main/CMakeLists.txt b/examples/peripherals/gpio/matrix_keyboard/main/CMakeLists.txt index ad6b382f26..ce42fe41d6 100644 --- a/examples/peripherals/gpio/matrix_keyboard/main/CMakeLists.txt +++ b/examples/peripherals/gpio/matrix_keyboard/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "matrix_keyboard_example_main.c" INCLUDE_DIRS "") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c b/examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c index af121e0815..fd1008e90b 100644 --- a/examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c +++ b/examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c @@ -21,10 +21,10 @@ esp_err_t example_matrix_kbd_event_handler(matrix_kbd_handle_t mkbd_handle, matr uint32_t key_code = (uint32_t)event_data; switch (event) { case MATRIX_KBD_EVENT_DOWN: - ESP_LOGI(TAG, "press event, key code = %04x", key_code); + ESP_LOGI(TAG, "press event, key code = %04"PRIx32, key_code); break; case MATRIX_KBD_EVENT_UP: - ESP_LOGI(TAG, "release event, key code = %04x", key_code); + ESP_LOGI(TAG, "release event, key code = %04"PRIx32, key_code); break; } return ESP_OK; diff --git a/examples/peripherals/i2c/i2c_self_test/main/CMakeLists.txt b/examples/peripherals/i2c/i2c_self_test/main/CMakeLists.txt index a1ac988361..3603c38d49 100644 --- a/examples/peripherals/i2c/i2c_self_test/main/CMakeLists.txt +++ b/examples/peripherals/i2c/i2c_self_test/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "i2c_example_main.c" - INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") + INCLUDE_DIRS ".") diff --git a/examples/peripherals/i2c/i2c_self_test/main/i2c_example_main.c b/examples/peripherals/i2c/i2c_self_test/main/i2c_example_main.c index 184ccfcc35..26b6db52b7 100644 --- a/examples/peripherals/i2c/i2c_self_test/main/i2c_example_main.c +++ b/examples/peripherals/i2c/i2c_self_test/main/i2c_example_main.c @@ -213,7 +213,7 @@ static void disp_buf(uint8_t *buf, int len) static void i2c_test_task(void *arg) { int ret; - uint32_t task_idx = (uint32_t)arg; + int task_idx = (int)arg; #if SOC_I2C_NUM > 1 int i = 0; uint8_t *data = (uint8_t *)malloc(DATA_LENGTH); diff --git a/examples/peripherals/i2c/i2c_tools/main/CMakeLists.txt b/examples/peripherals/i2c/i2c_tools/main/CMakeLists.txt index d61b866297..60f09894c4 100644 --- a/examples/peripherals/i2c/i2c_tools/main/CMakeLists.txt +++ b/examples/peripherals/i2c/i2c_tools/main/CMakeLists.txt @@ -1,4 +1,3 @@ idf_component_register(SRCS "i2ctools_example_main.c" "cmd_i2ctools.c" - INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") + INCLUDE_DIRS ".") diff --git a/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c b/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c index 28b97b2180..1c5b7595e1 100644 --- a/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c +++ b/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c @@ -380,7 +380,7 @@ static int do_i2cdump_cmd(int argc, char **argv) } else if ((block[k] & 0xff) < 32 || (block[k] & 0xff) >= 127) { printf("?"); } else { - printf("%c", block[k] & 0xff); + printf("%c", (char)(block[k] & 0xff)); } } printf("\r\n"); diff --git a/examples/peripherals/i2s/i2s_adc_dac/main/CMakeLists.txt b/examples/peripherals/i2s/i2s_adc_dac/main/CMakeLists.txt index c31750a8f7..61fac40e63 100644 --- a/examples/peripherals/i2s/i2s_adc_dac/main/CMakeLists.txt +++ b/examples/peripherals/i2s/i2s_adc_dac/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "app_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c b/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c index 645c975503..79606b5c37 100644 --- a/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c +++ b/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c @@ -101,7 +101,7 @@ void example_erase_flash(void) data_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, PARTITION_NAME); if (data_partition != NULL) { - printf("partiton addr: 0x%08x; size: %d; label: %s\n", data_partition->address, data_partition->size, data_partition->label); + printf("partiton addr: 0x%08"PRIx32"; size: %"PRIu32"; label: %s\n", data_partition->address, data_partition->size, data_partition->label); } printf("Erase size: %d Bytes\n", FLASH_ERASE_SIZE); ESP_ERROR_CHECK(esp_partition_erase_range(data_partition, 0, FLASH_ERASE_SIZE)); @@ -209,7 +209,7 @@ void example_i2s_adc_dac(void*arg) data_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, PARTITION_NAME); if (data_partition != NULL) { - printf("partiton addr: 0x%08x; size: %d; label: %s\n", data_partition->address, data_partition->size, data_partition->label); + printf("partiton addr: 0x%08"PRIx32"; size: %"PRIu32"; label: %s\n", data_partition->address, data_partition->size, data_partition->label); } else { ESP_LOGE(TAG, "Partition error: can't find partition name: %s\n", PARTITION_NAME); vTaskDelete(NULL); @@ -288,7 +288,7 @@ void adc_read_task(void* arg) uint32_t voltage; vTaskDelay(200 / portTICK_PERIOD_MS); esp_adc_cal_get_voltage(ADC1_TEST_CHANNEL, &characteristics, &voltage); - ESP_LOGI(TAG, "%d mV", voltage); + ESP_LOGI(TAG, "%"PRIu32" mV", voltage); } } diff --git a/examples/peripherals/lcd/rgb_panel/main/CMakeLists.txt b/examples/peripherals/lcd/rgb_panel/main/CMakeLists.txt index 30da0c0318..4e9a3d43e5 100644 --- a/examples/peripherals/lcd/rgb_panel/main/CMakeLists.txt +++ b/examples/peripherals/lcd/rgb_panel/main/CMakeLists.txt @@ -1,4 +1,2 @@ idf_component_register(SRCS "rgb_lcd_example_main.c" "lvgl_demo_ui.c" INCLUDE_DIRS ".") - -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/CMakeLists.txt index 2ecff3751d..1d97d04dc0 100644 --- a/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "mcpwm_bldc_hall_control_example_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/mcpwm_bldc_hall_control_example_main.c b/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/mcpwm_bldc_hall_control_example_main.c index 3fcb12d21e..8afae790b3 100644 --- a/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/mcpwm_bldc_hall_control_example_main.c +++ b/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/mcpwm_bldc_hall_control_example_main.c @@ -344,7 +344,7 @@ void app_main(void) if (hall_sensor_value >= 1 && hall_sensor_value <= 6) { s_hall_actions[hall_sensor_value](generators); } else { - ESP_LOGE(TAG, "invalid bldc phase, wrong hall sensor value:%d", hall_sensor_value); + ESP_LOGE(TAG, "invalid bldc phase, wrong hall sensor value:%"PRIu32, hall_sensor_value); } ulTaskNotifyTake(pdTRUE, portMAX_DELAY); } diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt index bd120826dd..450a211ce5 100644 --- a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "mcpwm_capture_hc_sr04.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/sdio/host/main/CMakeLists.txt b/examples/peripherals/sdio/host/main/CMakeLists.txt index c31750a8f7..61fac40e63 100644 --- a/examples/peripherals/sdio/host/main/CMakeLists.txt +++ b/examples/peripherals/sdio/host/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "app_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/sdio/host/main/app_main.c b/examples/peripherals/sdio/host/main/app_main.c index 2dfa2165d4..0ff49aec61 100644 --- a/examples/peripherals/sdio/host/main/app_main.c +++ b/examples/peripherals/sdio/host/main/app_main.c @@ -307,7 +307,7 @@ static esp_err_t get_intr(essl_handle_t handle, uint32_t* out_raw, uint32_t* out if (ret != ESP_OK) return ret; ret = essl_clear_intr(handle, *out_raw, TIMEOUT_MAX); if (ret != ESP_OK) return ret; - ESP_LOGD(TAG, "intr: %08X", *out_raw); + ESP_LOGD(TAG, "intr: %08"PRIX32, *out_raw); return ESP_OK; } diff --git a/examples/peripherals/spi_master/lcd/main/CMakeLists.txt b/examples/peripherals/spi_master/lcd/main/CMakeLists.txt index a59f4a0ae5..0d34bee60e 100644 --- a/examples/peripherals/spi_master/lcd/main/CMakeLists.txt +++ b/examples/peripherals/spi_master/lcd/main/CMakeLists.txt @@ -6,5 +6,3 @@ set(srcs "pretty_effect.c" idf_component_register(SRCS ${srcs} INCLUDE_DIRS "." EMBED_FILES image.jpg) - -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c b/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c index f46e4b0a28..fba231f517 100644 --- a/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c +++ b/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" @@ -272,7 +273,7 @@ void lcd_init(spi_device_handle_t spi) int lcd_detected_type = 0; int lcd_type; - printf("LCD ID: %08X\n", lcd_id); + printf("LCD ID: %08"PRIx32"\n", lcd_id); if ( lcd_id == 0 ) { //zero, ili lcd_detected_type = LCD_TYPE_ILI; diff --git a/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt b/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt index c31750a8f7..61fac40e63 100644 --- a/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt +++ b/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "app_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/CMakeLists.txt b/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/CMakeLists.txt index c31750a8f7..61fac40e63 100644 --- a/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/CMakeLists.txt +++ b/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "app_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/app_main.c b/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/app_main.c index 59022bb485..667342090a 100644 --- a/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/app_main.c +++ b/examples/peripherals/spi_slave_hd/segment_mode/seg_master/main/app_main.c @@ -207,8 +207,8 @@ void app_main(void) ESP_ERROR_CHECK(get_slave_max_buf_size(spi, &slave_max_tx_buf_size, &slave_max_rx_buf_size)); uint32_t rx_buf_size = slave_max_tx_buf_size; printf("\n\n---------SLAVE INFO---------\n\n"); - printf("Slave MAX Send Buffer Size: %d\n", slave_max_tx_buf_size); - printf("Slave MAX Receive Buffer Size: %d\n", slave_max_rx_buf_size); + printf("Slave MAX Send Buffer Size: %"PRIu32"\n", slave_max_tx_buf_size); + printf("Slave MAX Receive Buffer Size: %"PRIu32"\n", slave_max_rx_buf_size); uint8_t *recv_buf = heap_caps_calloc(1, rx_buf_size, MALLOC_CAP_DMA); if (!recv_buf) { @@ -245,7 +245,7 @@ void app_main(void) uint32_t size_can_be_read = get_slave_tx_buf_size(spi) - size_has_read; if (size_can_be_read > rx_buf_size) { - ESP_LOGW(TAG, "Slave is going to send buffer(%d Bytes) larger than pre-negotiated MAX size", size_can_be_read); + ESP_LOGW(TAG, "Slave is going to send buffer(%"PRIu32" Bytes) larger than pre-negotiated MAX size", size_can_be_read); /** * NOTE: * In this condition, Master should still increase its counter (``size_has_read``) by the size that Slave has loaded, @@ -277,7 +277,7 @@ void app_main(void) //Prepare your TX transaction in your own way. Here is an example. //You can set any size to send (shorter, longer or equal to the Slave Max RX buf size), Slave can get the actual length by ``trans_len`` member of ``spi_slave_hd_data_t`` uint32_t actual_tx_size = (rand() % (slave_max_rx_buf_size - TX_SIZE_MIN + 1)) + TX_SIZE_MIN; - snprintf((char *)send_buf, slave_max_rx_buf_size, "this is master's transaction %d", tx_trans_id); + snprintf((char *)send_buf, slave_max_rx_buf_size, "this is master's transaction %"PRIu32, tx_trans_id); for (int i = 0; i < num_to_send; i++) { ESP_ERROR_CHECK(essl_spi_wrdma(spi, send_buf, actual_tx_size, -1, 0)); diff --git a/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/CMakeLists.txt b/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/CMakeLists.txt index c31750a8f7..61fac40e63 100644 --- a/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/CMakeLists.txt +++ b/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "app_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/app_main.c b/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/app_main.c index 0801e8a975..1945f2fed9 100644 --- a/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/app_main.c +++ b/examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/app_main.c @@ -156,7 +156,7 @@ static bool get_tx_data(uint8_t *data, uint32_t max_len, uint32_t *out_len) return false; } - snprintf((char *)data, *out_len, "Transaction No.%d from slave, length: %d", s_tx_data_id, *out_len); + snprintf((char *)data, *out_len, "Transaction No.%"PRIu32" from slave, length: %"PRIu32, s_tx_data_id, *out_len); s_tx_data_id++; return true; } diff --git a/examples/peripherals/temp_sensor/main/CMakeLists.txt b/examples/peripherals/temp_sensor/main/CMakeLists.txt index 84c61f9473..8e713a2504 100644 --- a/examples/peripherals/temp_sensor/main/CMakeLists.txt +++ b/examples/peripherals/temp_sensor/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "temp_sensor_main.c" - INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") + INCLUDE_DIRS ".") diff --git a/examples/peripherals/twai/twai_network/twai_network_listen_only/main/CMakeLists.txt b/examples/peripherals/twai/twai_network/twai_network_listen_only/main/CMakeLists.txt index 0075b952ca..e26450a577 100644 --- a/examples/peripherals/twai/twai_network/twai_network_listen_only/main/CMakeLists.txt +++ b/examples/peripherals/twai/twai_network/twai_network_listen_only/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "twai_network_example_listen_only_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/twai/twai_network/twai_network_listen_only/main/twai_network_example_listen_only_main.c b/examples/peripherals/twai/twai_network/twai_network_listen_only/main/twai_network_example_listen_only_main.c index 53474c14d6..0f6b3b7bab 100644 --- a/examples/peripherals/twai/twai_network/twai_network_listen_only/main/twai_network_example_listen_only_main.c +++ b/examples/peripherals/twai/twai_network/twai_network_listen_only/main/twai_network_example_listen_only_main.c @@ -78,7 +78,7 @@ static void twai_receive_task(void *arg) for (int i = 0; i < rx_msg.data_length_code; i++) { data |= (rx_msg.data[i] << (i * 8)); } - ESP_LOGI(EXAMPLE_TAG, "Received data value %d", data); + ESP_LOGI(EXAMPLE_TAG, "Received data value %"PRIu32, data); } else if (rx_msg.identifier == ID_MASTER_STOP_CMD) { ESP_LOGI(EXAMPLE_TAG, "Received master stop command"); } else if (rx_msg.identifier == ID_SLAVE_STOP_RESP) { diff --git a/examples/peripherals/twai/twai_network/twai_network_master/main/CMakeLists.txt b/examples/peripherals/twai/twai_network/twai_network_master/main/CMakeLists.txt index 06a6d3828a..112b3ca1b4 100644 --- a/examples/peripherals/twai/twai_network/twai_network_master/main/CMakeLists.txt +++ b/examples/peripherals/twai/twai_network/twai_network_master/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "twai_network_example_master_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/twai/twai_network/twai_network_master/main/twai_network_example_master_main.c b/examples/peripherals/twai/twai_network/twai_network_master/main/twai_network_example_master_main.c index 6392480630..e1a7007435 100644 --- a/examples/peripherals/twai/twai_network/twai_network_master/main/twai_network_example_master_main.c +++ b/examples/peripherals/twai/twai_network/twai_network_master/main/twai_network_example_master_main.c @@ -109,7 +109,7 @@ static void twai_receive_task(void *arg) for (int i = 0; i < rx_msg.data_length_code; i++) { data |= (rx_msg.data[i] << (i * 8)); } - ESP_LOGI(EXAMPLE_TAG, "Received data value %d", data); + ESP_LOGI(EXAMPLE_TAG, "Received data value %"PRIu32, data); data_msgs_rec ++; } } diff --git a/examples/peripherals/twai/twai_network/twai_network_slave/main/CMakeLists.txt b/examples/peripherals/twai/twai_network/twai_network_slave/main/CMakeLists.txt index 7e8c1cd4ec..84241dd1d3 100644 --- a/examples/peripherals/twai/twai_network/twai_network_slave/main/CMakeLists.txt +++ b/examples/peripherals/twai/twai_network/twai_network_slave/main/CMakeLists.txt @@ -1,3 +1,2 @@ idf_component_register(SRCS "twai_network_example_slave_main.c" INCLUDE_DIRS ".") -target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/examples/peripherals/twai/twai_network/twai_network_slave/main/twai_network_example_slave_main.c b/examples/peripherals/twai/twai_network/twai_network_slave/main/twai_network_example_slave_main.c index 1a5785cdaa..836ee61291 100644 --- a/examples/peripherals/twai/twai_network/twai_network_slave/main/twai_network_example_slave_main.c +++ b/examples/peripherals/twai/twai_network/twai_network_slave/main/twai_network_example_slave_main.c @@ -146,7 +146,7 @@ static void twai_transmit_task(void *arg) data_message.data[i] = (sensor_data >> (i * 8)) & 0xFF; } twai_transmit(&data_message, portMAX_DELAY); - ESP_LOGI(EXAMPLE_TAG, "Transmitted data value %d", sensor_data); + ESP_LOGI(EXAMPLE_TAG, "Transmitted data value %"PRIu32, sensor_data); vTaskDelay(pdMS_TO_TICKS(DATA_PERIOD_MS)); if (xSemaphoreTake(stop_data_sem, 0) == pdTRUE) { break; diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 062f951c32..bb3f804fd2 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1728,7 +1728,6 @@ examples/peripherals/adc/single_read/adc2/main/adc2_example_main.c examples/peripherals/gpio/generic_gpio/example_test.py examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/include/matrix_keyboard.h -examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c examples/peripherals/i2c/i2c_tools/example_test.py diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index 71b5cd3f5d..065adf8f4d 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -24,9 +24,6 @@ components/esp_rom/include/esp32s2/rom/rsa_pss.h components/esp_common/include/esp_private/ -components/esp32/include/esp32/brownout.h -components/esp32/include/esp32/cache_err_int.h - # LWIP: sockets.h uses #include_next<>, which doesn't work correctly with the checker # memp_std.h is supposed to be included multiple times with different settings components/lwip/lwip/src/include/lwip/priv/memp_std.h @@ -115,9 +112,6 @@ components/esp_rom/include/esp32s2/rom/efuse.h components/esp_rom/include/esp32s3/rom/rtc.h components/esp_rom/include/esp32h2/rom/rtc.h components/esp_rom/include/esp32c2/rom/rtc.h -components/esp32/include/esp32/dport_access.h -components/esp32/include/rom/sha.h -components/esp32/include/rom/secure_boot.h components/esp_ringbuf/include/freertos/ringbuf.h components/esp_wifi/include/esp_wifi_crypto_types.h components/esp_wifi/include/esp_coexist_internal.h @@ -130,7 +124,6 @@ components/esp_netif/include/esp_netif_sta_list.h components/esp_netif/include/esp_netif_defaults.h components/esp_netif/include/esp_netif_net_stack.h components/esp_netif/include/esp_netif_ppp.h -components/console/linenoise/linenoise.h components/protocomm/include/transports/protocomm_httpd.h components/fatfs/src/diskio.h components/fatfs/diskio/diskio_sdmmc.h @@ -162,8 +155,3 @@ components/espcoredump/include/port/xtensa/esp_core_dump_summary_port.h components/riscv/include/esp_private/panic_reason.h components/riscv/include/riscv/interrupt.h components/riscv/include/riscv/rvruntime-frames.h - - -### To be fixed: files which don't compile for esp32c2 target: - -components/efuse/esp32c2/include/esp_efuse_table.h From 77d7ab88138c9f4c598a9468d5618fa1eee6b5d9 Mon Sep 17 00:00:00 2001 From: Linda Date: Mon, 8 Aug 2022 17:02:49 +0800 Subject: [PATCH 017/665] docs: update the diagram of FSM of I2S --- .../diagrams/i2s/i2s_state_machine.png | Bin 55562 -> 53484 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_static/diagrams/i2s/i2s_state_machine.png b/docs/_static/diagrams/i2s/i2s_state_machine.png index 8c56ca9063eca4c3017c927008c39bfa2d9ae389..620206077f9cac3a389602ef9adfb9872225c641 100644 GIT binary patch literal 53484 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 From afe78ba0aae4f6cb2727adf25a014427ed730d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20M=C3=BAdry?= Date: Sun, 7 Aug 2022 17:45:23 +0200 Subject: [PATCH 018/665] sdspi: Allow CS line to be set to GPIO_NUM_NC (-1) Closes https://github.com/espressif/esp-idf/issues/7852 --- components/driver/include/driver/sdspi_host.h | 1 + components/driver/sdspi_host.c | 33 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/components/driver/include/driver/sdspi_host.h b/components/driver/include/driver/sdspi_host.h index 61f29811dd..63ad84aeab 100644 --- a/components/driver/include/driver/sdspi_host.h +++ b/components/driver/include/driver/sdspi_host.h @@ -63,6 +63,7 @@ typedef struct { gpio_num_t gpio_int; ///< GPIO number of interrupt line (input) for SDIO card. } sdspi_device_config_t; +#define SDSPI_SLOT_NO_CS GPIO_NUM_NC ///< indicates that card select line is not used #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 diff --git a/components/driver/sdspi_host.c b/components/driver/sdspi_host.c index a09a63595d..1c7f69949d 100644 --- a/components/driver/sdspi_host.c +++ b/components/driver/sdspi_host.c @@ -43,7 +43,7 @@ typedef struct { spi_host_device_t host_id; //!< SPI host id. spi_device_handle_t spi_handle; //!< SPI device handle, used for transactions - uint8_t gpio_cs; //!< CS GPIO + uint8_t gpio_cs; //!< CS GPIO, or GPIO_UNUSED uint8_t gpio_cd; //!< Card detect GPIO, or GPIO_UNUSED uint8_t gpio_wp; //!< Write protect GPIO, or GPIO_UNUSED uint8_t gpio_int; //!< Write protect GPIO, or GPIO_UNUSED @@ -120,13 +120,17 @@ static slot_info_t* remove_slot_info(sdspi_dev_handle_t handle) /// Set CS high for given slot static void cs_high(slot_info_t *slot) { - gpio_set_level(slot->gpio_cs, 1); + if (slot->gpio_cs != GPIO_UNUSED) { + gpio_set_level(slot->gpio_cs, 1); + } } /// Set CS low for given slot static void cs_low(slot_info_t *slot) { - gpio_set_level(slot->gpio_cs, 0); + if (slot->gpio_cs != GPIO_UNUSED) { + gpio_set_level(slot->gpio_cs, 0); + } } /// Return true if WP pin is configured and is low @@ -248,7 +252,9 @@ static esp_err_t deinit_slot(slot_info_t *slot) .mode = GPIO_MODE_INPUT, .intr_type = GPIO_INTR_DISABLE, }; - gpio_config(&config); + if (pin_bit_mask != 0) { + gpio_config(&config); + } if (slot->semphr_int) { vSemaphoreDelete(slot->semphr_int); @@ -332,13 +338,20 @@ esp_err_t sdspi_host_init_device(const sdspi_device_config_t* slot_config, sdspi .mode = GPIO_MODE_OUTPUT, .pin_bit_mask = 1ULL << slot_config->gpio_cs, }; - - ret = gpio_config(&io_conf); - if (ret != ESP_OK) { - ESP_LOGD(TAG, "gpio_config (CS) failed with rc=0x%x", ret); - goto cleanup; + if (slot_config->gpio_cs != SDSPI_SLOT_NO_CS) { + slot->gpio_cs = slot_config->gpio_cs; + } else { + slot->gpio_cs = GPIO_UNUSED; + } + + if (slot->gpio_cs != GPIO_UNUSED) { + ret = gpio_config(&io_conf); + if (ret != ESP_OK) { + ESP_LOGD(TAG, "gpio_config (CS) failed with rc=0x%x", ret); + goto cleanup; + } + cs_high(slot); } - cs_high(slot); // Configure CD and WP pins io_conf = (gpio_config_t) { From 3b7eee3978c31dde7ee99ca07d0b61739360cc15 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 8 Aug 2022 12:57:45 +0200 Subject: [PATCH 019/665] build: fix excluded components being passed to component manager `__COMPONENT_TARGETS` is evaluated very early when components and component directories are added to the build, which means that all components (including the ones which are in EXCLUDE_COMPONENTS) have a build system target defined. The component manager was given the list of all known components (derived from the list of targets), not the list of components after EXCLUDE_COMPONENTS were processed. Because of that, EXCLUDE_COMPONENTS didn't effectively exclude the component from the consideration of the component manager. --- tools/ci/test_build_system_cmake.sh | 8 ++++++++ tools/cmake/build.cmake | 6 ++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/ci/test_build_system_cmake.sh b/tools/ci/test_build_system_cmake.sh index 247d3e1e05..f75a3e710b 100755 --- a/tools/ci/test_build_system_cmake.sh +++ b/tools/ci/test_build_system_cmake.sh @@ -936,6 +936,14 @@ endmenu\n" >> ${IDF_PATH}/Kconfig mv CMakeLists.bak CMakeLists.txt # revert previous modifications rm -rf extra_dir components + print_status "Components in EXCLUDE_COMPONENTS not passed to idf_component_manager" + clean_build_dir + idf.py create-component -C components/ to_be_excluded || failure "Failed to create a component" + echo "invalid syntax..." > components/to_be_excluded/idf_component.yml + ! idf.py reconfigure || failure "Build should have failed due to invalid syntax in idf_component.yml" + idf.py -DEXCLUDE_COMPONENTS=to_be_excluded reconfigure || failure "Build should have succeeded when the component is excluded" + rm -rf components/to_be_excluded + print_status "Create project using idf.py and build it" echo "Trying to create project." (idf.py -C projects create-project temp_test_project) || failure "Failed to create the project." diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index 0a274e89eb..589d163fb7 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -494,10 +494,8 @@ macro(idf_build_process target) set(local_components_list_file ${build_dir}/local_components_list.temp.yml) set(__contents "components:\n") - idf_build_get_property(__component_targets __COMPONENT_TARGETS) - foreach(__component_target ${__component_targets}) - __component_get_property(__component_name ${__component_target} COMPONENT_NAME) - __component_get_property(__component_dir ${__component_target} COMPONENT_DIR) + foreach(__component_name ${components}) + idf_component_get_property(__component_dir ${__component_name} COMPONENT_DIR) set(__contents "${__contents} - name: \"${__component_name}\"\n path: \"${__component_dir}\"\n") endforeach() From 0a1d8c1e0908a2b3ee96693fdfe81ea0af5f1684 Mon Sep 17 00:00:00 2001 From: Geng Yuchao Date: Mon, 25 Jul 2022 14:02:07 +0800 Subject: [PATCH 020/665] Fix soc caps define for all chips --- .../soc/esp32/include/soc/Kconfig.soc_caps.in | 12 ++++-- components/soc/esp32/include/soc/soc_caps.h | 5 ++- .../esp32c2/include/soc/Kconfig.soc_caps.in | 12 ++++-- components/soc/esp32c2/include/soc/soc_caps.h | 5 ++- .../esp32c3/include/soc/Kconfig.soc_caps.in | 4 ++ components/soc/esp32c3/include/soc/soc_caps.h | 3 ++ .../esp32h2/include/soc/Kconfig.soc_caps.in | 12 ++++-- components/soc/esp32h2/include/soc/soc_caps.h | 5 ++- .../esp32s3/include/soc/Kconfig.soc_caps.in | 4 ++ components/soc/esp32s3/include/soc/soc_caps.h | 3 ++ docs/conf_common.py | 2 +- docs/en/api-reference/bluetooth/index.rst | 2 +- .../release-5.x/bluetooth-classic.rst | 23 ---------- .../release-5.x/bluetooth-low-energy.rst | 43 +++++++++++++++++++ .../en/migration-guides/release-5.x/index.rst | 3 +- docs/zh_CN/api-reference/bluetooth/index.rst | 2 +- .../release-5.x/bluetooth-low-energy.rst | 1 + .../migration-guides/release-5.x/index.rst | 3 +- 18 files changed, 101 insertions(+), 43 deletions(-) create mode 100644 docs/en/migration-guides/release-5.x/bluetooth-low-energy.rst create mode 100644 docs/zh_CN/migration-guides/release-5.x/bluetooth-low-energy.rst diff --git a/components/soc/esp32/include/soc/Kconfig.soc_caps.in b/components/soc/esp32/include/soc/Kconfig.soc_caps.in index 03480b7cd9..c4466d4269 100644 --- a/components/soc/esp32/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32/include/soc/Kconfig.soc_caps.in @@ -39,10 +39,6 @@ config SOC_BT_SUPPORTED bool default y -config SOC_CLASSIC_BT_SUPPORTED - bool - default y - config SOC_PCNT_SUPPORTED bool default y @@ -726,3 +722,11 @@ config SOC_WIFI_CSI_SUPPORT config SOC_WIFI_MESH_SUPPORT bool default y + +config SOC_BLE_SUPPORTED + bool + default y + +config SOC_BT_CLASSIC_SUPPORTED + bool + default y diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 3c284abc5e..e9fa2b4228 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -69,7 +69,6 @@ #define SOC_MCPWM_SUPPORTED 1 #define SOC_SDMMC_HOST_SUPPORTED 1 #define SOC_BT_SUPPORTED 1 -#define SOC_CLASSIC_BT_SUPPORTED 1 #define SOC_PCNT_SUPPORTED 1 #define SOC_WIFI_SUPPORTED 1 #define SOC_SDIO_SLAVE_SUPPORTED 1 @@ -387,3 +386,7 @@ #define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ #define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ #define SOC_WIFI_MESH_SUPPORT (1) /*!< Support WIFI MESH */ + +/*---------------------------------- Bluetooth CAPS ----------------------------------*/ +#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ +#define SOC_BT_CLASSIC_SUPPORTED (1) /*!< Support Bluetooth Classic hardware */ diff --git a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in index d32f09d2c6..e4baa151fd 100644 --- a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in @@ -19,10 +19,6 @@ config SOC_BT_SUPPORTED bool default y -config SOC_ESP_NIMBLE_CONTROLLER - bool - default y - config SOC_WIFI_SUPPORTED bool default y @@ -574,3 +570,11 @@ config SOC_WIFI_CSI_SUPPORT config SOC_WIFI_MESH_SUPPORT bool default n + +config SOC_BLE_SUPPORTED + bool + default y + +config SOC_ESP_NIMBLE_CONTROLLER + bool + default y diff --git a/components/soc/esp32c2/include/soc/soc_caps.h b/components/soc/esp32c2/include/soc/soc_caps.h index 10259a7949..965ff9fe1d 100644 --- a/components/soc/esp32c2/include/soc/soc_caps.h +++ b/components/soc/esp32c2/include/soc/soc_caps.h @@ -29,7 +29,6 @@ #define SOC_DEDICATED_GPIO_SUPPORTED 1 #define SOC_GDMA_SUPPORTED 1 #define SOC_BT_SUPPORTED 1 -#define SOC_ESP_NIMBLE_CONTROLLER 1 #define SOC_WIFI_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_SUPPORTS_SECURE_DL_MODE 1 @@ -277,3 +276,7 @@ #define SOC_WIFI_WAPI_SUPPORT (0) /*!< WAPI is not supported */ #define SOC_WIFI_CSI_SUPPORT (0) /*!< CSI is not supported */ #define SOC_WIFI_MESH_SUPPORT (0) /*!< WIFI MESH is not supported */ + +/*---------------------------------- Bluetooth CAPS ----------------------------------*/ +#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ +#define SOC_ESP_NIMBLE_CONTROLLER (1) /*!< Support BLE EMBEDDED controller V1 */ diff --git a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in index cf719099f8..83b5f689f9 100644 --- a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in @@ -810,3 +810,7 @@ config SOC_WIFI_CSI_SUPPORT config SOC_WIFI_MESH_SUPPORT bool default y + +config SOC_BLE_SUPPORTED + bool + default y diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index b69476162f..16a3a21d8b 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -374,3 +374,6 @@ #define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ #define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ #define SOC_WIFI_MESH_SUPPORT (1) /*!< Support WIFI MESH */ + +/*---------------------------------- Bluetooth CAPS ----------------------------------*/ +#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ diff --git a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in index 7c38936113..2852aa37f7 100644 --- a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in @@ -23,10 +23,6 @@ config SOC_BT_SUPPORTED bool default y -config SOC_ESP_NIMBLE_CONTROLLER - bool - default y - config SOC_ASYNC_MEMCPY_SUPPORTED bool default y @@ -738,3 +734,11 @@ config SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC config SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL bool default y + +config SOC_BLE_SUPPORTED + bool + default y + +config SOC_ESP_NIMBLE_CONTROLLER + bool + default y diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index e990dbf6b1..dd42e85503 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -38,7 +38,6 @@ #define SOC_GDMA_SUPPORTED 1 #define SOC_TWAI_SUPPORTED 1 #define SOC_BT_SUPPORTED 1 -#define SOC_ESP_NIMBLE_CONTROLLER 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_USB_SERIAL_JTAG_SUPPORTED 1 #define SOC_SUPPORTS_SECURE_DL_MODE 1 @@ -358,3 +357,7 @@ /*-------------------------- Temperature Sensor CAPS -------------------------------------*/ #define SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC (1) #define SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL (1) + +/*---------------------------------- Bluetooth CAPS ----------------------------------*/ +#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ +#define SOC_ESP_NIMBLE_CONTROLLER (1) /*!< Support BLE EMBEDDED controller V1 */ diff --git a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in index c2ca8c5d34..9ac34bc0ef 100644 --- a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in @@ -1031,6 +1031,10 @@ config SOC_WIFI_MESH_SUPPORT bool default y +config SOC_BLE_SUPPORTED + bool + default y + config SOC_TWAI_BRP_MIN int default 2 diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index f777535268..333d6364c1 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -442,3 +442,6 @@ #define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ #define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ #define SOC_WIFI_MESH_SUPPORT (1) /*!< Support WIFI MESH */ + +/*---------------------------------- Bluetooth CAPS ----------------------------------*/ +#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ diff --git a/docs/conf_common.py b/docs/conf_common.py index a752816949..6e43ca6600 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -144,7 +144,7 @@ ESP32C3_DOCS = ['hw-reference/esp32c3/**', # format: {tag needed to include: documents to included}, tags are parsed from sdkconfig and peripheral_caps.h headers conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'SOC_WIFI_SUPPORTED':WIFI_DOCS, - 'SOC_CLASSIC_BT_SUPPORTED':CLASSIC_BT_DOCS, + 'SOC_BT_CLASSIC_SUPPORTED':CLASSIC_BT_DOCS, 'SOC_SUPPORT_COEXISTENCE':COEXISTENCE_DOCS, 'SOC_SDMMC_HOST_SUPPORTED':SDMMC_DOCS, 'SOC_SDIO_SLAVE_SUPPORTED':SDIO_SLAVE_DOCS, diff --git a/docs/en/api-reference/bluetooth/index.rst b/docs/en/api-reference/bluetooth/index.rst index 52326945c6..8863d35595 100644 --- a/docs/en/api-reference/bluetooth/index.rst +++ b/docs/en/api-reference/bluetooth/index.rst @@ -8,7 +8,7 @@ Bluetooth API bt_common bt_le - :SOC_CLASSIC_BT_SUPPORTED: classic_bt + :SOC_BT_CLASSIC_SUPPORTED: classic_bt controller_vhci esp-ble-mesh nimble/index diff --git a/docs/en/migration-guides/release-5.x/bluetooth-classic.rst b/docs/en/migration-guides/release-5.x/bluetooth-classic.rst index 3fb7824ea6..fb46287a16 100644 --- a/docs/en/migration-guides/release-5.x/bluetooth-classic.rst +++ b/docs/en/migration-guides/release-5.x/bluetooth-classic.rst @@ -4,29 +4,6 @@ Bluetooth Classic Bluedroid --------- - The following Bluedroid macros, types, and functions have been renamed: - - - :component_file:`bt/host/bluedroid/api/include/api/esp_gap_ble_api.h` - - - In :cpp:enum:`esp_gap_ble_cb_event_t` - - - ``ESP_GAP_BLE_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT`` renamed to ``ESP_GAP_BLE_SET_PREFERRED_DEFAULT_PHY_COMPLETE_EVT`` - - ``ESP_GAP_BLE_SET_PREFERED_PHY_COMPLETE_EVT`` renamed to ``ESP_GAP_BLE_SET_PREFERRED_PHY_COMPLETE_EVT`` - - ``ESP_GAP_BLE_CHANNEL_SELETE_ALGORITHM_EVT`` renamed to ``ESP_GAP_BLE_CHANNEL_SELECT_ALGORITHM_EVT`` - - - ``esp_ble_wl_opration_t`` renamed to :cpp:enum:`esp_ble_wl_operation_t` - - ``esp_ble_gap_cb_param_t.pkt_data_lenth_cmpl`` renamed to ``pkt_data_length_cmpl`` - - ``esp_ble_gap_cb_param_t.update_whitelist_cmpl.wl_opration`` renamed to ``wl_operation`` - - ``esp_ble_gap_set_prefered_default_phy`` renamed to :cpp:func:`esp_ble_gap_set_preferred_default_phy` - - ``esp_ble_gap_set_prefered_phy`` renamed to :cpp:func:`esp_ble_gap_set_preferred_phy` - - - :component_file:`bt/host/bluedroid/api/include/api/esp_gatt_defs.h` - - - In :cpp:enum:`esp_gatt_status_t` - - - ``ESP_GATT_ENCRYPED_MITM`` renamed to ``ESP_GATT_ENCRYPTED_MITM`` - - ``ESP_GATT_ENCRYPED_NO_MITM`` renamed to ``ESP_GATT_ENCRYPTED_NO_MITM`` - - :component_file:`bt/host/bluedroid/api/include/api/esp_hf_defs.h` - In :cpp:enum:`esp_hf_cme_err_t` diff --git a/docs/en/migration-guides/release-5.x/bluetooth-low-energy.rst b/docs/en/migration-guides/release-5.x/bluetooth-low-energy.rst new file mode 100644 index 0000000000..ded3985925 --- /dev/null +++ b/docs/en/migration-guides/release-5.x/bluetooth-low-energy.rst @@ -0,0 +1,43 @@ +Bluetooth Low Energy +==================== + +Bluedroid +--------- + + The following Bluedroid macros, types, and functions have been renamed: + + - :component_file:`bt/host/bluedroid/api/include/api/esp_gap_ble_api.h` + + - In :cpp:enum:`esp_gap_ble_cb_event_t` + + - ``ESP_GAP_BLE_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT`` renamed to ``ESP_GAP_BLE_SET_PREFERRED_DEFAULT_PHY_COMPLETE_EVT`` + - ``ESP_GAP_BLE_SET_PREFERED_PHY_COMPLETE_EVT`` renamed to ``ESP_GAP_BLE_SET_PREFERRED_PHY_COMPLETE_EVT`` + - ``ESP_GAP_BLE_CHANNEL_SELETE_ALGORITHM_EVT`` renamed to ``ESP_GAP_BLE_CHANNEL_SELECT_ALGORITHM_EVT`` + + - ``esp_ble_wl_opration_t`` renamed to :cpp:enum:`esp_ble_wl_operation_t` + - ``esp_ble_gap_cb_param_t.pkt_data_lenth_cmpl`` renamed to ``pkt_data_length_cmpl`` + - ``esp_ble_gap_cb_param_t.update_whitelist_cmpl.wl_opration`` renamed to ``wl_operation`` + - ``esp_ble_gap_set_prefered_default_phy`` renamed to :cpp:func:`esp_ble_gap_set_preferred_default_phy` + - ``esp_ble_gap_set_prefered_phy`` renamed to :cpp:func:`esp_ble_gap_set_preferred_phy` + + - :component_file:`bt/host/bluedroid/api/include/api/esp_gatt_defs.h` + + - In :cpp:enum:`esp_gatt_status_t` + + - ``ESP_GATT_ENCRYPED_MITM`` renamed to ``ESP_GATT_ENCRYPTED_MITM`` + - ``ESP_GATT_ENCRYPED_NO_MITM`` renamed to ``ESP_GATT_ENCRYPTED_NO_MITM`` + +Nimble +-------- + + The following Nimble APIs have been removed: + + - :component_file:`bt/host/nimble/esp-hci/include/esp_nimble_hci.h` + + - Remove : esp_err_t esp_nimble_hci_and_controller_init(void); + + - Controller initialization, enable and HCI initialization calls have been moved to `nimble_port_init`. This function can be deleted directly. + + - Remove : esp_err_t esp_nimble_hci_and_controller_deinit(void); + + - Controller deinitialization, disable and HCI deinitialization calls have been moved to `nimble_port_deinit`. This function can be deleted directly. diff --git a/docs/en/migration-guides/release-5.x/index.rst b/docs/en/migration-guides/release-5.x/index.rst index c9cc97d89e..eaf292ec93 100644 --- a/docs/en/migration-guides/release-5.x/index.rst +++ b/docs/en/migration-guides/release-5.x/index.rst @@ -6,7 +6,8 @@ Migration from 4.4 to 5.0 .. toctree:: :maxdepth: 1 - :SOC_CLASSIC_BT_SUPPORTED: bluetooth-classic + :SOC_BT_CLASSIC_SUPPORTED: bluetooth-classic + bluetooth-low-energy build-system gcc networking diff --git a/docs/zh_CN/api-reference/bluetooth/index.rst b/docs/zh_CN/api-reference/bluetooth/index.rst index b1a3f3e0de..088c2975b4 100644 --- a/docs/zh_CN/api-reference/bluetooth/index.rst +++ b/docs/zh_CN/api-reference/bluetooth/index.rst @@ -8,7 +8,7 @@ bt_common bt_le - :SOC_CLASSIC_BT_SUPPORTED: classic_bt + :SOC_BT_CLASSIC_SUPPORTED: classic_bt controller_vhci esp-ble-mesh nimble/index diff --git a/docs/zh_CN/migration-guides/release-5.x/bluetooth-low-energy.rst b/docs/zh_CN/migration-guides/release-5.x/bluetooth-low-energy.rst new file mode 100644 index 0000000000..15cd74bfc2 --- /dev/null +++ b/docs/zh_CN/migration-guides/release-5.x/bluetooth-low-energy.rst @@ -0,0 +1 @@ +.. include:: ../../../en/migration-guides/release-5.x/bluetooth-low-energy.rst diff --git a/docs/zh_CN/migration-guides/release-5.x/index.rst b/docs/zh_CN/migration-guides/release-5.x/index.rst index 3c4a3b45e2..c5970670e0 100644 --- a/docs/zh_CN/migration-guides/release-5.x/index.rst +++ b/docs/zh_CN/migration-guides/release-5.x/index.rst @@ -6,7 +6,8 @@ .. toctree:: :maxdepth: 1 - :SOC_CLASSIC_BT_SUPPORTED: bluetooth-classic + :SOC_BT_CLASSIC_SUPPORTED: bluetooth-classic + bluetooth-low-energy build-system gcc networking From 98c0481914801a2b69b13bff22b4d0cc10c149ee Mon Sep 17 00:00:00 2001 From: Geng Yuchao Date: Mon, 25 Jul 2022 14:26:32 +0800 Subject: [PATCH 021/665] Updated the nimble instructions for ESP32. --- docs/en/api-reference/bluetooth/nimble/index.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/api-reference/bluetooth/nimble/index.rst b/docs/en/api-reference/bluetooth/nimble/index.rst index 04b0a14e58..fb68debdd8 100644 --- a/docs/en/api-reference/bluetooth/nimble/index.rst +++ b/docs/en/api-reference/bluetooth/nimble/index.rst @@ -30,8 +30,7 @@ To begin with, make sure that the NimBLE stack is enabled from menuconfig :ref:` Typical programming sequence with NimBLE stack consists of the following steps: * Initialize NVS flash using :cpp:func:`nvs_flash_init` API. This is because ESP controller uses NVS during initialization. - * Call :cpp:func:`esp_nimble_hci_and_controller_init` to initialize ESP controller as well as transport layer. This will also link the host and controller modules together. Alternatively, if ESP controller is already initialized, then :cpp:func:`esp_nimble_hci_init` can be called for the remaining initialization. - * Initialize the host stack using ``nimble_port_init``. + * Initialize the host and controller stack using ``nimble_port_init``. * Initialize the required NimBLE host configuration parameters and callbacks * Perform application specific tasks/initialization * Run the thread for host stack using ``nimble_port_freertos_init`` From e34e0db12ac2dfb8746c88565d40f3d628e04061 Mon Sep 17 00:00:00 2001 From: Geng Yuchao Date: Mon, 1 Aug 2022 20:16:37 +0800 Subject: [PATCH 022/665] Remove docs not update for classic_bt --- docs/docs_not_updated/esp32c2.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/docs_not_updated/esp32c2.txt b/docs/docs_not_updated/esp32c2.txt index 3df61368f7..18c5521ad3 100644 --- a/docs/docs_not_updated/esp32c2.txt +++ b/docs/docs_not_updated/esp32c2.txt @@ -42,4 +42,3 @@ api-reference/bluetooth/esp_gatt_defs api-reference/bluetooth/esp-ble-mesh api-reference/bluetooth/index api-reference/bluetooth/esp_gap_ble -api-reference/bluetooth/classic_bt From f070ac4da87039265ae93997e5d96862013ab2b1 Mon Sep 17 00:00:00 2001 From: Geng Yuchao Date: Thu, 4 Aug 2022 15:47:00 +0800 Subject: [PATCH 023/665] Update BLE documentation scope --- docs/conf_common.py | 3 ++- docs/en/migration-guides/release-5.x/index.rst | 2 +- docs/zh_CN/migration-guides/release-5.x/index.rst | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/conf_common.py b/docs/conf_common.py index 6e43ca6600..645ff657f1 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -34,7 +34,8 @@ BT_DOCS = ['api-guides/blufi.rst', 'api-reference/bluetooth/esp_blufi.rst', 'api-reference/bluetooth/esp-ble-mesh.rst', 'api-reference/bluetooth/index.rst', - 'api-reference/bluetooth/nimble/index.rst'] + 'api-reference/bluetooth/nimble/index.rst', + 'migration-guides/release-5.x/bluetooth-low-energy.rst'] CLASSIC_BT_DOCS = ['api-reference/bluetooth/classic_bt.rst', 'api-reference/bluetooth/esp_a2dp.rst', diff --git a/docs/en/migration-guides/release-5.x/index.rst b/docs/en/migration-guides/release-5.x/index.rst index eaf292ec93..44ccc789be 100644 --- a/docs/en/migration-guides/release-5.x/index.rst +++ b/docs/en/migration-guides/release-5.x/index.rst @@ -7,7 +7,7 @@ Migration from 4.4 to 5.0 :maxdepth: 1 :SOC_BT_CLASSIC_SUPPORTED: bluetooth-classic - bluetooth-low-energy + :SOC_BLE_SUPPORTED: bluetooth-low-energy build-system gcc networking diff --git a/docs/zh_CN/migration-guides/release-5.x/index.rst b/docs/zh_CN/migration-guides/release-5.x/index.rst index c5970670e0..4b476cfa3f 100644 --- a/docs/zh_CN/migration-guides/release-5.x/index.rst +++ b/docs/zh_CN/migration-guides/release-5.x/index.rst @@ -7,7 +7,7 @@ :maxdepth: 1 :SOC_BT_CLASSIC_SUPPORTED: bluetooth-classic - bluetooth-low-energy + :SOC_BLE_SUPPORTED: bluetooth-low-energy build-system gcc networking From 38bd98acf0c258abfbbc6e99cbaa3b14c37b4924 Mon Sep 17 00:00:00 2001 From: Chen Yudong Date: Wed, 3 Aug 2022 17:36:28 +0800 Subject: [PATCH 024/665] CI: add integration test env --- .gitlab-ci.yml | 20 ++++--------------- .gitlab/ci/assign-test.yml | 2 +- .gitlab/ci/target-test.yml | 13 ++++++------ .../ci/integration_test/prepare_test_bins.py | 9 ++++++++- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 78596a86bd..c367f0fd5f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -77,8 +77,6 @@ variables: # target test repo parameters TEST_ENV_CONFIG_REPO: "https://gitlab-ci-token:${BOT_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/qa/ci-test-runner-configs.git" - CI_AUTO_TEST_SCRIPT_REPO_URL: "https://gitlab-ci-token:${BOT_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/qa/auto_test_script.git" - CI_AUTO_TEST_SCRIPT_REPO_BRANCH: "ci/v4.1" # cache python dependencies PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" @@ -183,20 +181,10 @@ before_script: .before_script_integration_test: before_script: - # need to install esptool, needn't install idf python env - - source tools/ci/utils.sh - - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - - *set_include_nightly_run - - source tools/ci/setup_python.sh - - add_gitlab_ssh_keys - - fetch_submodules - # download the constraint file manually - - mkdir -p ~/.espressif - - wget -O ~/.espressif/${CI_PYTHON_CONSTRAINT_FILE} --header="Authorization:Bearer ${ESPCI_TOKEN}" ${GITLAB_HTTP_SERVER}/api/v4/projects/2581/repository/files/${CI_PYTHON_CONSTRAINT_FILE}/raw - - *download_test_python_contraint_file - # TODO: remove this, IDFCI-1207 - - pip install esptool -c ~/.espressif/${CI_PYTHON_CONSTRAINT_FILE} - - *download_test_python_tool + # needn't install idf python env + - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS + - add_gitlab_ssh_keys .before_script_macos: before_script: diff --git a/.gitlab/ci/assign-test.yml b/.gitlab/ci/assign-test.yml index 55cc6ca65c..ea342e59ad 100644 --- a/.gitlab/ci/assign-test.yml +++ b/.gitlab/ci/assign-test.yml @@ -85,6 +85,7 @@ assign_integration_test: extends: - .assign_test_template - .rules:test:integration_test + image: ${CI_INTEGRATION_TEST_ENV_IMAGE} needs: - build_ssc_esp32 - build_ssc_esp32c3 @@ -98,7 +99,6 @@ assign_integration_test: INTEGRATION_TEST_CASE_PATH: "${CI_PROJECT_DIR}/auto_test_script/TestCaseFiles" ASSIGN_TEST_CASE_SCRIPT: "${CI_PROJECT_DIR}/auto_test_script/bin/CIAssignTestCases.py" PYTHONPATH: ${CI_PROJECT_DIR}/auto_test_script/packages - PYTHON_VER: 3.7.7 script: # clone test script to assign tests # can not retry if downing git lfs files failed, so using empty_branch first. diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index c4c3591d48..a41ac5208c 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -1028,6 +1028,8 @@ UT_S3_FLASH: - .rules:test:integration_test # needn't install idf python env - .before_script_integration_test + image: ${CI_INTEGRATION_TEST_ENV_IMAGE} + cache: [] needs: # the assign already needs all the build jobs - assign_integration_test variables: @@ -1038,10 +1040,9 @@ UT_S3_FLASH: KNOWN_ISSUE_FILE: "${CI_PROJECT_DIR}/tools/ci/integration_test/KnownIssues" CI_RUNNER_SCRIPT: "${CI_PROJECT_DIR}/auto_test_script/bin/CIRunner.py" PREPARE_TEST_BIN_SCRIPT: "${CI_PROJECT_DIR}/tools/ci/integration_test/prepare_test_bins.py" - PYTHONPATH: "${CI_PROJECT_DIR}/auto_test_script/packages:${PYTHONPATH}" + PYTHONPATH: "${CI_PROJECT_DIR}/auto_test_script/packages:${CI_PROJECT_DIR}/tools/ci/python_packages:${PYTHONPATH}" + SETUP_SCRIPT: "${CI_PROJECT_DIR}/auto_test_script/tools/ci/setup_idfci.sh" INITIAL_CONDITION_RETRY_COUNT: "1" - # auto_test_script only supports python 3.7.x - PYTHON_VER: 3.7.7 script: - *define_config_file_name # first test if config file exists, if not exist, exit 0 @@ -1054,6 +1055,7 @@ UT_S3_FLASH: - retry_failed git clone ${CI_AUTO_TEST_SCRIPT_REPO_URL} -b empty_branch - retry_failed git -C auto_test_script checkout -f ${CI_AUTO_TEST_SCRIPT_REPO_BRANCH} - python $CHECKOUT_REF_SCRIPT auto_test_script auto_test_script --customized_only + - if [ -f ${SETUP_SCRIPT} ]; then ${SETUP_SCRIPT}; fi - cat ${KNOWN_ISSUE_FILE} >> ${TEST_CASE_FILE_PATH}/KnownIssues # run test - python ${PREPARE_TEST_BIN_SCRIPT} $CONFIG_FILE @@ -1080,10 +1082,6 @@ nvs_compatible_test: - *define_config_file_name # first test if config file exists, if not exist, exit 0 - test -e $CONFIG_FILE || exit 0 - # prepare test utilities - - source tools/ci/setup_python.sh - - add_gitlab_ssh_keys - - fetch_submodules # clone local test env configs - retry_failed git clone $TEST_ENV_CONFIG_REPO - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs ci-test-runner-configs @@ -1091,6 +1089,7 @@ nvs_compatible_test: # can not retry if downing git lfs files failed, so using empty_branch first. - retry_failed git clone ${CI_AUTO_TEST_SCRIPT_REPO_URL} -b empty_branch - retry_failed git -C auto_test_script checkout -f ${CI_AUTO_TEST_SCRIPT_REPO_BRANCH} + - if [ -f ${SETUP_SCRIPT} ]; then ${SETUP_SCRIPT}; fi - python $CHECKOUT_REF_SCRIPT auto_test_script auto_test_script --customized_only # prepare nvs bins - cd auto_test_script diff --git a/tools/ci/integration_test/prepare_test_bins.py b/tools/ci/integration_test/prepare_test_bins.py index 8e6598a37e..48d847c7c8 100644 --- a/tools/ci/integration_test/prepare_test_bins.py +++ b/tools/ci/integration_test/prepare_test_bins.py @@ -7,7 +7,14 @@ import argparse import os import gitlab -import gitlab_api + +try: + import gitlab_api +except ImportError: + import sys + sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'python_packages')) + import gitlab_api + from AutoTestScript.RunnerConfigs.Config import Config SSC_BUILD_JOB_MAP = { From f78298b04a2dde52811da9f61cd16adf5127fbc1 Mon Sep 17 00:00:00 2001 From: tgotic Date: Mon, 8 Aug 2022 16:18:16 +0200 Subject: [PATCH 025/665] local copy of btc_msg_t No need to use local copy of btc_msg_t in btc_transfer_context, create it on heap and pass to osi_thread_post(). --- components/bt/common/btc/core/btc_task.c | 47 +++++++++++------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/components/bt/common/btc/core/btc_task.c b/components/bt/common/btc/core/btc_task.c index e611890904..724445c0e8 100644 --- a/components/bt/common/btc/core/btc_task.c +++ b/components/bt/common/btc/core/btc_task.c @@ -218,16 +218,7 @@ static void btc_thread_handler(void *arg) static bt_status_t btc_task_post(btc_msg_t *msg, uint32_t timeout) { - btc_msg_t *lmsg; - - lmsg = (btc_msg_t *)osi_malloc(sizeof(btc_msg_t)); - if (lmsg == NULL) { - return BT_STATUS_NOMEM; - } - - memcpy(lmsg, msg, sizeof(btc_msg_t)); - - if (osi_thread_post(btc_thread, btc_thread_handler, lmsg, 0, timeout) == false) { + if (osi_thread_post(btc_thread, btc_thread_handler, msg, 0, timeout) == false) { return BT_STATUS_BUSY; } @@ -245,7 +236,7 @@ static bt_status_t btc_task_post(btc_msg_t *msg, uint32_t timeout) */ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg_deep_copy_t copy_func) { - btc_msg_t lmsg; + btc_msg_t* lmsg; if (msg == NULL) { return BT_STATUS_PARM_INVALID; @@ -253,22 +244,28 @@ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg BTC_TRACE_DEBUG("%s msg %u %u %u %p\n", __func__, msg->sig, msg->pid, msg->act, arg); - memcpy(&lmsg, msg, sizeof(btc_msg_t)); - if (arg) { - lmsg.arg = (void *)osi_malloc(arg_len); - if (lmsg.arg == NULL) { - return BT_STATUS_NOMEM; - } - memset(lmsg.arg, 0x00, arg_len); //important, avoid arg which have no length - memcpy(lmsg.arg, arg, arg_len); - if (copy_func) { - copy_func(&lmsg, lmsg.arg, arg); - } - } else { - lmsg.arg = NULL; + lmsg = (btc_msg_t *)osi_malloc(sizeof(btc_msg_t)); + if (lmsg == NULL) { + return BT_STATUS_NOMEM; } - return btc_task_post(&lmsg, OSI_THREAD_MAX_TIMEOUT); + memcpy(lmsg, msg, sizeof(btc_msg_t)); + if (arg) { + lmsg->arg = (void *)osi_malloc(arg_len); + if (lmsg->arg == NULL) { + free(lmsg); + return BT_STATUS_NOMEM; + } + memset(lmsg->arg, 0x00, arg_len); //important, avoid arg which have no length + memcpy(lmsg->arg, arg, arg_len); + if (copy_func) { + copy_func(lmsg, lmsg->arg, arg); + } + } else { + lmsg->arg = NULL; + } + + return btc_task_post(lmsg, OSI_THREAD_MAX_TIMEOUT); } From 2bfffa68ca59fd576e5b8d396002c40821dbce93 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Mon, 8 Aug 2022 17:38:04 +0000 Subject: [PATCH 026/665] tools: update gdb version to '11.2_20220808' Closes https://github.com/espressif/esp-idf/issues/9522 --- tools/tools.json | 112 +++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/tools/tools.json b/tools/tools.json index bc9151c714..f74f24fb99 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -26,51 +26,51 @@ "versions": [ { "linux-amd64": { - "sha256": "f78d520a4302f87a21966486898f44848be390d7b2f734bec0bad00f074295d9", - "size": 26942536, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-x86_64-linux-gnu.tar.gz" + "sha256": "a68ba3e142b9c2b1202756ce29f869f808f07298a22c080d061aa606d298a903", + "size": 26942439, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-x86_64-linux-gnu.tar.gz" }, "linux-arm64": { - "sha256": "85712369aa1880d2431dc2f6078b137692c6dcaf8b2d99d09d334af1488d6d27", - "size": 27126980, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-aarch64-linux-gnu.tar.gz" + "sha256": "50e6f37db46bed058520fb60734959f70124760e9284005aceae6c65383c0c49", + "size": 27128251, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-aarch64-linux-gnu.tar.gz" }, "linux-armel": { - "sha256": "570f130660a0d9d304eeafad4aaf874f80697897a6be9fe4777ed24feb455063", - "size": 25199132, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-arm-linux-gnueabi.tar.gz" + "sha256": "3e587ca9fd1162555df3f2349be4ae86ad9279507500f6e412d5f111c692f84b", + "size": 25199023, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-arm-linux-gnueabi.tar.gz" }, "linux-armhf": { - "sha256": "4eba7e93999e2bfa5352451d320ebeaac5b9e606adaa407e2f72c090842dc31e", - "size": 23484789, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-arm-linux-gnueabihf.tar.gz" + "sha256": "3c8e3721784bcb644a4f4fe486fa4939b51cef2a22eda601c830695ab3fc8108", + "size": 23483241, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-arm-linux-gnueabihf.tar.gz" }, "linux-i686": { - "sha256": "924d68835cb7c236127f84faaf26834894f3affa4271c32714994319bd670049", - "size": 25972600, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-i586-linux-gnu.tar.gz" + "sha256": "c0a92aa2edc1463ca2cd09c3c9828bc48f2a69402de5ce413abe0a1ce01db8ea", + "size": 25972305, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-i586-linux-gnu.tar.gz" }, "macos": { - "sha256": "f9c87a8cbdfaae9144b148236a3721f691a958e183c581d524735c11d8056993", - "size": 36473326, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-x86_64-apple-darwin14.tar.gz" + "sha256": "8a19adf0ffb241727240078b917f50ef5c5340d32bba81e433fcf5c04547bf32", + "size": 36473471, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-x86_64-apple-darwin14.tar.gz" }, "macos-arm64": { - "sha256": "f9c87a8cbdfaae9144b148236a3721f691a958e183c581d524735c11d8056993", - "size": 36473326, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-x86_64-apple-darwin14.tar.gz" + "sha256": "8a19adf0ffb241727240078b917f50ef5c5340d32bba81e433fcf5c04547bf32", + "size": 36473471, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-x86_64-apple-darwin14.tar.gz" }, - "name": "11.2_20220729", + "name": "11.2_20220808", "status": "recommended", "win32": { - "sha256": "a575e08eb1c9a3fde54f6c1f4edabf37f18e8469637af18a720fb35b44bfb5a3", - "size": 23240692, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-i686-w64-mingw32.zip" + "sha256": "fc6f4ca1cbe00bb51bf49282b276356ec2cba566c314a647892d6213accd6c8a", + "size": 23240883, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-i686-w64-mingw32.zip" }, "win64": { - "sha256": "79f253059524a77aa115e333780e9ae7d44af24bb857e103256140f332a28200", - "size": 25132854, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/xtensa-esp-elf-gdb-11.2_20220729-x86_64-w64-mingw32.zip" + "sha256": "f53af973b66490697bdaa46937fc8fe89c5ca23ecc889be8c918383dcfcf0e0f", + "size": 25133502, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/xtensa-esp-elf-gdb-11.2_20220808-x86_64-w64-mingw32.zip" } } ] @@ -99,51 +99,51 @@ "versions": [ { "linux-amd64": { - "sha256": "fe619ee33f0a586230d704486248b39d4e5f1aa39e377e89cccea40d56b3be11", - "size": 26795857, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-x86_64-linux-gnu.tar.gz" + "sha256": "ee1f2f5bfc8805e3887ba628a7475c22b56dfa69f90a1eaec1b1ab7fbff0b27b", + "size": 26795828, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-x86_64-linux-gnu.tar.gz" }, "linux-arm64": { - "sha256": "8772c7a84ff935549f60471182fb53edbe2764492cfaf988cf80b7198b339561", - "size": 27018885, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-aarch64-linux-gnu.tar.gz" + "sha256": "1de34770a1421b25eb79e57505d6e5ad3a73b31075064c7667ae66bf060f5746", + "size": 27017662, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-aarch64-linux-gnu.tar.gz" }, "linux-armel": { - "sha256": "43ab8752194682e470955c1fd4c1f773e319d9a6819305c5e40fa42d471564a4", - "size": 25531105, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-arm-linux-gnueabi.tar.gz" + "sha256": "edc4ca65cfb59e01cac604e1e8915a6a85c8d44a193f13b5664dd2bcfe144f43", + "size": 25530723, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-arm-linux-gnueabi.tar.gz" }, "linux-armhf": { - "sha256": "331b7c3e2b4ca6dd47cfa611f5eb32d10f89f5a5f5d7159d6134ca7434ea8800", - "size": 23773733, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-arm-linux-gnueabihf.tar.gz" + "sha256": "40874852b4a30fd90eb52996f077363bf7645c50f0f7defdf8b8e4adc5f45681", + "size": 23773773, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-arm-linux-gnueabihf.tar.gz" }, "linux-i686": { - "sha256": "b27d6ae348eae1c51f993a4b352739a502dfdb4b123d5ac3770cf96666211e11", - "size": 26182611, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-i586-linux-gnu.tar.gz" + "sha256": "0d20d58ea1acc9ae35f455a4139c8cd06174c1f0910a7751793bc4265b464550", + "size": 26184428, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-i586-linux-gnu.tar.gz" }, "macos": { - "sha256": "757417237ed28408b4ab62708be4dc32a57292acd06d3e1f98bcaa233fd8041a", - "size": 36494413, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-x86_64-apple-darwin14.tar.gz" + "sha256": "a4a7df6e41e378614af4600ef82f958308e1b0826680763b504c88bd55ca1551", + "size": 36498017, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-x86_64-apple-darwin14.tar.gz" }, "macos-arm64": { - "sha256": "757417237ed28408b4ab62708be4dc32a57292acd06d3e1f98bcaa233fd8041a", - "size": 36494413, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-x86_64-apple-darwin14.tar.gz" + "sha256": "a4a7df6e41e378614af4600ef82f958308e1b0826680763b504c88bd55ca1551", + "size": 36498017, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-x86_64-apple-darwin14.tar.gz" }, - "name": "11.2_20220729", + "name": "11.2_20220808", "status": "recommended", "win32": { - "sha256": "110a052a0717b24eb7c9fa1e6170041efd7444492f23a94a91fd798e4d62fa60", - "size": 23435344, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-i686-w64-mingw32.zip" + "sha256": "2cb141a778d501c3b885e4f11a25aa24a20b6bf06bc9cfcc12b672418b0e967c", + "size": 23435406, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-i686-w64-mingw32.zip" }, "win64": { - "sha256": "da6a444d076611f9821a88af44e245c27880cac85870a1604b363fc6fad3aadc", - "size": 24801843, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220729/riscv32-esp-elf-gdb-11.2_20220729-x86_64-w64-mingw32.zip" + "sha256": "01063604e35e3271837eca383ed38e2f069b88c84e5b41a6ad5be7399f14eed7", + "size": 24801931, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v11.2_20220808/riscv32-esp-elf-gdb-11.2_20220808-x86_64-w64-mingw32.zip" } } ] From a17b207e4fcac5f35d4a3436200a257c9322c849 Mon Sep 17 00:00:00 2001 From: Shang Zhou Date: Tue, 9 Aug 2022 11:45:34 +0800 Subject: [PATCH 027/665] docs: Sync up EN and CN lines of ble-mesh, wifi, and i2c --- docs/en/api-guides/wifi.rst | 3 --- docs/zh_CN/api-guides/esp-ble-mesh/ble-mesh-index.rst | 4 +--- docs/zh_CN/api-guides/wifi.rst | 3 ++- docs/zh_CN/api-reference/peripherals/i2c.rst | 1 + 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/en/api-guides/wifi.rst b/docs/en/api-guides/wifi.rst index b94d5239d7..12158ccef6 100644 --- a/docs/en/api-guides/wifi.rst +++ b/docs/en/api-guides/wifi.rst @@ -2479,7 +2479,6 @@ The parameters not mentioned in the following table should be set to the default - 31.5 - 27.7 - .. only:: esp32s3 .. list-table:: @@ -2577,14 +2576,12 @@ The parameters not mentioned in the following table should be set to the default The test was performed with a single stream in a shielded box using an ASUS RT-N66U router. {IDF_TARGET_NAME}'s CPU is single core with 160 MHz. {IDF_TARGET_NAME}'s flash is in QIO mode with 80 MHz. - .. only:: esp32c2 .. note:: The test was performed with a single stream in a shielded box using an Redmi RM2100 router. {IDF_TARGET_NAME}'s CPU is single core with 120 MHz. {IDF_TARGET_NAME}'s flash is in QIO mode with 60 MHz. - .. only:: esp32 **Ranks:** diff --git a/docs/zh_CN/api-guides/esp-ble-mesh/ble-mesh-index.rst b/docs/zh_CN/api-guides/esp-ble-mesh/ble-mesh-index.rst index bbe638b231..5afeac626d 100644 --- a/docs/zh_CN/api-guides/esp-ble-mesh/ble-mesh-index.rst +++ b/docs/zh_CN/api-guides/esp-ble-mesh/ble-mesh-index.rst @@ -4,9 +4,6 @@ ESP-BLE-MESH :link_to_translation:`en:[English]` -概述 -===== - 蓝牙 mesh 网络实现了无线设备的“多对多”通讯,其可用于建立包含大量设备的网络。 设备能将数据中继至不在初始设备无线电覆盖范围内的其他设备。这样,mesh 网络就能够覆盖非常大的物理区域,并且囊括大量设备。Mesh 网络非常适用于楼宇自动化、传感器网络和其他物联网解决方案,这些情景下数以十计、百计、千计的设备需要与其他设备进行安全可靠的通信。 @@ -37,6 +34,7 @@ ESP-BLE-MESH 快速入门 如果您是第一次接触 ESP-IDF,请参见 esp-idf :doc:`../../get-started/index` 来设置开发环境,编译、烧写和运行示例应用程序。 + 硬件及软件准备 -------------- diff --git a/docs/zh_CN/api-guides/wifi.rst b/docs/zh_CN/api-guides/wifi.rst index 1b03912d14..26816c9694 100644 --- a/docs/zh_CN/api-guides/wifi.rst +++ b/docs/zh_CN/api-guides/wifi.rst @@ -5,6 +5,8 @@ {IDF_TARGET_NAME} Wi-Fi 功能列表 ------------------------------------ +{IDF_TARGET_NAME} 支持以下 Wi-Fi 功能: + .. only:: esp32 or esp32s2 or esp32c3 or esp32s3 - 支持 4 个虚拟接口,即STA、AP、Sniffer 和 reserved。 @@ -1167,7 +1169,6 @@ API esp_wifi_set_config() 可用于配置 AP。下表详细介绍了各个字段 - beacon 间隔。值为 100 ~ 60000 ms,默认值为 100 ms。如果该值不在上述范围,AP 默认取 100 ms。 - Wi-Fi 协议模式 +++++++++++++++++++++++++ diff --git a/docs/zh_CN/api-reference/peripherals/i2c.rst b/docs/zh_CN/api-reference/peripherals/i2c.rst index b1bb004acf..4e148f7079 100644 --- a/docs/zh_CN/api-reference/peripherals/i2c.rst +++ b/docs/zh_CN/api-reference/peripherals/i2c.rst @@ -105,6 +105,7 @@ I2C 驱动程序管理在 I2C 总线上设备的通信,该驱动程序具备 .mode = I2C_MODE_SLAVE, .slave.addr_10bit_en = 0, .slave.slave_addr = ESP_SLAVE_ADDR, // address of your project + .clk_flags = 0, }; 在此阶段,:cpp:func:`i2c_param_config` 还将其他 I2C 配置参数设置为 I2C 总线协议规范中定义的默认值。有关默认值及修改默认值的详细信息,请参考 :ref:`i2c-api-customized-configuration`。 From 36feb95a9e97ee8b9241b8ecd8132d765955ec91 Mon Sep 17 00:00:00 2001 From: muhaidong Date: Tue, 9 Aug 2022 16:49:42 +0800 Subject: [PATCH 028/665] esp_wifi: done beacon monitor timer and eloop timer when deinit --- components/esp_wifi/lib | 2 +- components/wpa_supplicant/port/eloop.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index fd23b3bc66..cf381efc7e 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit fd23b3bc66102918dd0ce6492997f7cfdd6e86c0 +Subproject commit cf381efc7ebd3c607fd9ab00599bb71c95fcc305 diff --git a/components/wpa_supplicant/port/eloop.c b/components/wpa_supplicant/port/eloop.c index 92aaa02fb2..37ce1a5c4a 100644 --- a/components/wpa_supplicant/port/eloop.c +++ b/components/wpa_supplicant/port/eloop.c @@ -366,5 +366,6 @@ void eloop_destroy(void) eloop_data_lock = NULL; } os_timer_disarm(&eloop.eloop_timer); + os_timer_done(&eloop.eloop_timer); os_memset(&eloop, 0, sizeof(eloop)); } From 54baaa9bc1561823956a4c2dc2159cc0855cdcfc Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Tue, 9 Aug 2022 17:18:29 +0530 Subject: [PATCH 029/665] ci: updates rules to trigger docker build on submodules change --- .gitlab/ci/dependencies/dependencies.yml | 1 + .gitlab/ci/rules.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.gitlab/ci/dependencies/dependencies.yml b/.gitlab/ci/dependencies/dependencies.yml index 15adcae2d4..a6c7771234 100644 --- a/.gitlab/ci/dependencies/dependencies.yml +++ b/.gitlab/ci/dependencies/dependencies.yml @@ -33,6 +33,7 @@ - docker patterns: - docker + - submodule "build:windows": labels: diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index c356292c50..481a43a580 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -736,6 +736,8 @@ - <<: *if-label-docker - <<: *if-dev-push changes: *patterns-docker + - <<: *if-dev-push + changes: *patterns-submodule .rules:build:example_test: rules: From 35dda59209c21e6bf583fea888e3fb9bc28c8613 Mon Sep 17 00:00:00 2001 From: "simon.chupin" Date: Thu, 7 Jul 2022 14:45:09 +0200 Subject: [PATCH 030/665] tools: remove the dependency on the future package --- .../nvs_partition_gen.py | 3 -- .../i2s_adc_dac/tools/generate_audio_file.py | 3 -- .../advanced_tests/scripts/test.py | 16 +------- .../pytest_http_server_persistence.py | 4 -- .../simple/pytest_http_server_simple.py | 4 -- .../mqtt/ssl/mqtt_ssl_example_test.py | 3 -- .../protocols/mqtt/ws/mqtt_ws_example_test.py | 3 -- .../mqtt/wss/mqtt_wss_example_test.py | 3 -- .../sockets/tcp_client/example_test.py | 4 -- .../sockets/udp_client/example_test.py | 4 -- examples/wifi/iperf/iperf_test.py | 3 -- tools/ci/check_copyright_ignore.txt | 1 - .../idf_http_server_test/adder.py | 3 -- .../idf_http_server_test/client.py | 3 -- .../idf_http_server_test/test.py | 3 -- .../idf_iperf_test_util/IperfUtility.py | 1 - tools/gdb_panic_server.py | 1 - tools/gen_esp_err_to_name.py | 17 +------- tools/idf_monitor.py | 1 - tools/idf_size.py | 39 +++++++++++-------- tools/kconfig_new/confgen.py | 18 +-------- tools/kconfig_new/confserver.py | 4 +- .../kconfig_new/test/confgen/test_confgen.py | 4 +- tools/ldgen/ldgen.py | 10 +---- tools/mass_mfg/mfg_gen.py | 5 +-- tools/mkdfu.py | 6 +-- tools/mkuf2.py | 8 ++-- tools/requirements/requirements.core.txt | 1 - .../test_idf_monitor/run_test_idf_monitor.py | 3 -- 29 files changed, 35 insertions(+), 143 deletions(-) diff --git a/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py b/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py index b515d12ac2..c99db28bdc 100755 --- a/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py +++ b/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py @@ -7,8 +7,6 @@ # SPDX-License-Identifier: Apache-2.0 # -from __future__ import division, print_function - import argparse import array import binascii @@ -21,7 +19,6 @@ import random import struct import sys import zlib -from builtins import bytes, int, range from io import open try: diff --git a/examples/peripherals/i2s/i2s_adc_dac/tools/generate_audio_file.py b/examples/peripherals/i2s/i2s_adc_dac/tools/generate_audio_file.py index edc4ae3ea0..2d1a20fcac 100644 --- a/examples/peripherals/i2s/i2s_adc_dac/tools/generate_audio_file.py +++ b/examples/peripherals/i2s/i2s_adc_dac/tools/generate_audio_file.py @@ -1,11 +1,8 @@ # SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Unlicense OR CC0-1.0 -from __future__ import print_function - import os import struct import wave -from builtins import range try: from typing import List diff --git a/examples/protocols/http_server/advanced_tests/scripts/test.py b/examples/protocols/http_server/advanced_tests/scripts/test.py index dc43fdd197..e3e11b0d15 100644 --- a/examples/protocols/http_server/advanced_tests/scripts/test.py +++ b/examples/protocols/http_server/advanced_tests/scripts/test.py @@ -1,18 +1,7 @@ #!/usr/bin/env python # -# Copyright 2018 Espressif Systems (Shanghai) PTE LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 # Utility for testing the web server. Test cases: # Assume the device supports 'n' simultaneous open sockets @@ -139,7 +128,6 @@ import string import sys import threading import time -from builtins import object, range, str try: import Utility diff --git a/examples/protocols/http_server/persistent_sockets/pytest_http_server_persistence.py b/examples/protocols/http_server/persistent_sockets/pytest_http_server_persistence.py index ac8b3febc3..c0514e54e2 100644 --- a/examples/protocols/http_server/persistent_sockets/pytest_http_server_persistence.py +++ b/examples/protocols/http_server/persistent_sockets/pytest_http_server_persistence.py @@ -2,14 +2,10 @@ # # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - -from __future__ import division, print_function, unicode_literals - import logging import os import random import sys -from builtins import range, str import pytest diff --git a/examples/protocols/http_server/simple/pytest_http_server_simple.py b/examples/protocols/http_server/simple/pytest_http_server_simple.py index fc1b3d9b58..eb5d8a95b4 100644 --- a/examples/protocols/http_server/simple/pytest_http_server_simple.py +++ b/examples/protocols/http_server/simple/pytest_http_server_simple.py @@ -2,9 +2,6 @@ # # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - -from __future__ import division, print_function, unicode_literals - import logging import os import random @@ -13,7 +10,6 @@ import string import sys import threading import time -from builtins import range import pytest diff --git a/examples/protocols/mqtt/ssl/mqtt_ssl_example_test.py b/examples/protocols/mqtt/ssl/mqtt_ssl_example_test.py index 3309ca4d2a..51ac4e9754 100644 --- a/examples/protocols/mqtt/ssl/mqtt_ssl_example_test.py +++ b/examples/protocols/mqtt/ssl/mqtt_ssl_example_test.py @@ -1,10 +1,7 @@ -from __future__ import print_function, unicode_literals - import os import re import ssl import sys -from builtins import str from threading import Event, Thread import paho.mqtt.client as mqtt diff --git a/examples/protocols/mqtt/ws/mqtt_ws_example_test.py b/examples/protocols/mqtt/ws/mqtt_ws_example_test.py index 72d4fa71e7..c24cfec336 100644 --- a/examples/protocols/mqtt/ws/mqtt_ws_example_test.py +++ b/examples/protocols/mqtt/ws/mqtt_ws_example_test.py @@ -1,9 +1,6 @@ -from __future__ import print_function, unicode_literals - import os import re import sys -from builtins import str from threading import Event, Thread import paho.mqtt.client as mqtt diff --git a/examples/protocols/mqtt/wss/mqtt_wss_example_test.py b/examples/protocols/mqtt/wss/mqtt_wss_example_test.py index 9f8ab12692..c0a1454dc5 100644 --- a/examples/protocols/mqtt/wss/mqtt_wss_example_test.py +++ b/examples/protocols/mqtt/wss/mqtt_wss_example_test.py @@ -1,10 +1,7 @@ -from __future__ import unicode_literals - import os import re import ssl import sys -from builtins import str from threading import Event, Thread import paho.mqtt.client as mqtt diff --git a/examples/protocols/sockets/tcp_client/example_test.py b/examples/protocols/sockets/tcp_client/example_test.py index 3427296b5b..6ab409fda5 100644 --- a/examples/protocols/sockets/tcp_client/example_test.py +++ b/examples/protocols/sockets/tcp_client/example_test.py @@ -5,14 +5,10 @@ # CONDITIONS OF ANY KIND, either express or implied. # -*- coding: utf-8 -*- - -from __future__ import print_function, unicode_literals - import os import re import socket import sys -from builtins import input from threading import Event, Thread import netifaces diff --git a/examples/protocols/sockets/udp_client/example_test.py b/examples/protocols/sockets/udp_client/example_test.py index a5425b8614..5b4593fc15 100644 --- a/examples/protocols/sockets/udp_client/example_test.py +++ b/examples/protocols/sockets/udp_client/example_test.py @@ -5,14 +5,10 @@ # CONDITIONS OF ANY KIND, either express or implied. # -*- coding: utf-8 -*- - -from __future__ import print_function, unicode_literals - import os import re import socket import sys -from builtins import input from threading import Event, Thread import netifaces diff --git a/examples/wifi/iperf/iperf_test.py b/examples/wifi/iperf/iperf_test.py index f95716bfde..a2a83899b0 100644 --- a/examples/wifi/iperf/iperf_test.py +++ b/examples/wifi/iperf/iperf_test.py @@ -19,13 +19,10 @@ The test env Example_ShieldBox do need the following config:: apc_ip: "192.168.1.88" pc_nic: "eth0" """ -from __future__ import division, unicode_literals - import os import re import subprocess import time -from builtins import range, str import ttfw_idf from idf_iperf_test_util import Attenuator, IperfUtility, PowerControl, TestReport diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 062f951c32..165b5f2690 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1792,7 +1792,6 @@ examples/protocols/http_server/advanced_tests/http_server_advanced_test.py examples/protocols/http_server/advanced_tests/main/include/tests.h examples/protocols/http_server/advanced_tests/main/main.c examples/protocols/http_server/advanced_tests/main/tests.c -examples/protocols/http_server/advanced_tests/scripts/test.py examples/protocols/http_server/captive_portal/example_test.py examples/protocols/http_server/captive_portal/main/dns_server.c examples/protocols/http_server/captive_portal/main/include/dns_server.h diff --git a/tools/ci/python_packages/idf_http_server_test/adder.py b/tools/ci/python_packages/idf_http_server_test/adder.py index d11a8a2c4c..85ff255fa5 100644 --- a/tools/ci/python_packages/idf_http_server_test/adder.py +++ b/tools/ci/python_packages/idf_http_server_test/adder.py @@ -3,12 +3,9 @@ # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 -from __future__ import print_function, unicode_literals - import argparse import http.client import logging -from builtins import range, str def start_session(ip, port): diff --git a/tools/ci/python_packages/idf_http_server_test/client.py b/tools/ci/python_packages/idf_http_server_test/client.py index 9215fe017e..a8dd67e1bf 100644 --- a/tools/ci/python_packages/idf_http_server_test/client.py +++ b/tools/ci/python_packages/idf_http_server_test/client.py @@ -3,13 +3,10 @@ # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 -from __future__ import print_function, unicode_literals - import argparse import errno import http.client import logging -from builtins import str def verbose_print(verbosity, *args): diff --git a/tools/ci/python_packages/idf_http_server_test/test.py b/tools/ci/python_packages/idf_http_server_test/test.py index dac5e29d8b..0f0db77b03 100644 --- a/tools/ci/python_packages/idf_http_server_test/test.py +++ b/tools/ci/python_packages/idf_http_server_test/test.py @@ -118,8 +118,6 @@ # - Simple GET on /hello/restart_results (returns the leak results) -from __future__ import division, print_function - import argparse import http.client import logging @@ -129,7 +127,6 @@ import string import sys import threading import time -from builtins import object, range, str _verbose_ = False diff --git a/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py b/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py index 4d928da777..6bc55460a1 100644 --- a/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py +++ b/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py @@ -4,7 +4,6 @@ import os import re import subprocess import time -from builtins import object, range, str from idf_iperf_test_util import LineChart from tiny_test_fw import DUT, Utility diff --git a/tools/gdb_panic_server.py b/tools/gdb_panic_server.py index cd66a20b11..f576937ed9 100644 --- a/tools/gdb_panic_server.py +++ b/tools/gdb_panic_server.py @@ -25,7 +25,6 @@ import binascii import logging import struct import sys -from builtins import bytes from collections import namedtuple # Used for type annotations only. Silence linter warnings. diff --git a/tools/gen_esp_err_to_name.py b/tools/gen_esp_err_to_name.py index b4957d967c..9d1ef8cfc5 100755 --- a/tools/gen_esp_err_to_name.py +++ b/tools/gen_esp_err_to_name.py @@ -3,22 +3,6 @@ # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 -from __future__ import print_function, unicode_literals - -import sys -from typing import Any, List, Optional, TextIO - -try: - from builtins import object, range, str -except ImportError: - # This should not happen because the Python packages are checked before invoking this script. However, here is - # some output which should help if we missed something. - print('Import has failed probably because of the missing "future" package. Please install all the packages for ' - 'interpreter {} from the requirements.txt file.'.format(sys.executable)) - # The path to requirements.txt is not provided because this script could be invoked from an IDF project (then the - # requirements.txt from the IDF_PATH should be used) or from the documentation project (then the requirements.txt - # for the documentation directory should be used). - sys.exit(1) import argparse import collections import fnmatch @@ -27,6 +11,7 @@ import os import re import textwrap from io import open +from typing import Any, List, Optional, TextIO # list files here which should not be parsed ignore_files: list = list() diff --git a/tools/idf_monitor.py b/tools/idf_monitor.py index b990ba3be5..8e4e372909 100755 --- a/tools/idf_monitor.py +++ b/tools/idf_monitor.py @@ -29,7 +29,6 @@ import subprocess import sys import threading import time -from builtins import bytes from typing import Any, List, Optional, Type, Union import serial diff --git a/tools/idf_size.py b/tools/idf_size.py index bfac433f80..5d5d0e0853 100755 --- a/tools/idf_size.py +++ b/tools/idf_size.py @@ -9,8 +9,6 @@ # SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # -from __future__ import division, print_function, unicode_literals - import argparse import collections import json @@ -20,9 +18,16 @@ import sys from typing import Any, Callable, Collection, Dict, Iterable, List, Optional, TextIO, Tuple, Union import yaml -from future.utils import iteritems -Section = Dict[str, Union[str, int]] + +class Section(Dict): + # define for python type hints + size: int + address: int + name: str + sources: List[Dict] + + SectionDict = Dict[str, Section] @@ -726,7 +731,7 @@ def get_summary(path: str, segments: Dict, sections: Dict, target: str, if diff_en: reference_json_dic = reference.get_json_dic() diff_json_dic = collections.OrderedDict([ - (k, v - reference_json_dic[k]) for k, v in iteritems(current_json_dic)]) + (k, v - reference_json_dic[k]) for k, v in current_json_dic.items()]) output = format_json(collections.OrderedDict([('current', current_json_dic), ('reference', reference_json_dic), ('diff', diff_json_dic), @@ -878,7 +883,7 @@ class StructureForDetailedSizes(object): Key can be either "archive" (for per-archive data) or "file" (for per-file data) in the result. """ result = {} # type: Dict[str, Dict[str, int]] - for _, section in iteritems(sections): + for _, section in sections.items(): for s in section['sources']: if not s[key] in result: result[s[key]] = {} @@ -962,7 +967,7 @@ def get_detailed_sizes(sections: Dict, key: str, header: str, as_json: bool=Fals header_format = _get_header_format(disp_list) output = header_format.format(header, *disp_list) - for key, data_info in iteritems(data): + for key, data_info in data.items(): if key not in selection: continue @@ -1003,7 +1008,7 @@ def get_detailed_sizes(sections: Dict, key: str, header: str, as_json: bool=Fals output += header_format.format('', *f_print) output += header_line - for key, data_info in iteritems(curr): + for key, data_info in curr.items(): try: v2 = ref[key] except KeyError: @@ -1060,7 +1065,7 @@ class StructureForArchiveSymbols(object): interested_sections = LinkingSections.filter_sections(sections) result = dict([(t, {}) for t in interested_sections]) # type: Dict[str, Dict[str, int]] - for _, section in iteritems(sections): + for _, section in sections.items(): section_name = section['name'] if section_name not in interested_sections: continue @@ -1104,14 +1109,14 @@ def get_archive_symbols(sections: Dict, archive: str, as_json: bool=False, secti output = format_json(current) else: def _get_item_pairs(name: str, section: collections.OrderedDict) -> collections.OrderedDict: - return collections.OrderedDict([(key.replace(name + '.', ''), val) for key, val in iteritems(section)]) + return collections.OrderedDict([(key.replace(name + '.', ''), val) for key, val in section.items()]) def _get_max_len(symbols_dict: Dict) -> Tuple[int, int]: # the lists have 0 in them because max() doesn't work with empty lists names_max_len = 0 numbers_max_len = 0 - for t, s in iteritems(symbols_dict): - numbers_max_len = max([numbers_max_len, *[len(str(x)) for _, x in iteritems(s)]]) + for t, s in symbols_dict.items(): + numbers_max_len = max([numbers_max_len, *[len(str(x)) for _, x in s.items()]]) names_max_len = max([names_max_len, *[len(x) for x in _get_item_pairs(t, s)]]) return names_max_len, numbers_max_len @@ -1119,12 +1124,12 @@ def get_archive_symbols(sections: Dict, archive: str, as_json: bool=False, secti def _get_output(section_symbols: Dict) -> str: output = '' names_max_len, numbers_max_len = _get_max_len(section_symbols) - for t, s in iteritems(section_symbols): + for t, s in section_symbols.items(): output += '{}Symbols from section: {}{}'.format(os.linesep, t, os.linesep) item_pairs = _get_item_pairs(t, s) - for key, val in iteritems(item_pairs): + for key, val in item_pairs.items(): output += ' '.join([('\t{:<%d} : {:>%d}\n' % (names_max_len,numbers_max_len)).format(key, val)]) - section_total = sum([val for _, val in iteritems(item_pairs)]) + section_total = sum([val for _, val in item_pairs.items()]) output += 'Section total: {}{}'.format(section_total, os.linesep) return output @@ -1147,8 +1152,8 @@ def get_archive_symbols(sections: Dict, archive: str, as_json: bool=False, secti '', '', ' - ') + os.linesep - current_section_total = sum([val for _, val in iteritems(current_item_pairs)]) - reference_section_total = sum([val for _, val in iteritems(reference_item_pairs)]) + current_section_total = sum([val for _, val in current_item_pairs.items()]) + reference_section_total = sum([val for _, val in reference_item_pairs.items()]) diff_section_total = current_section_total - reference_section_total all_item_names = sorted(list(frozenset(current_item_pairs.keys()) | frozenset(reference_item_pairs.keys()))) diff --git a/tools/kconfig_new/confgen.py b/tools/kconfig_new/confgen.py index 6b2d3fd33a..922fa6fe15 100755 --- a/tools/kconfig_new/confgen.py +++ b/tools/kconfig_new/confgen.py @@ -22,7 +22,6 @@ from collections import defaultdict import gen_kconfig_doc import kconfiglib -from future.utils import iteritems __version__ = '0.1' @@ -175,21 +174,6 @@ class DeprecatedOptions(object): f_o.write('#define {}{} {}{}\n'.format(self.config_prefix, dep_opt, self.config_prefix, new_opt)) -def dict_enc_for_env(dic, encoding=sys.getfilesystemencoding() or 'utf-8'): - """ - This function can be deleted after dropping support for Python 2. - There is no rule for it that environment variables cannot be Unicode but usually people try to avoid it. - The upstream kconfiglib cannot detect strings properly if the environment variables are "unicode". This is problem - only in Python 2. - """ - if sys.version_info[0] >= 3: - return dic - ret = dict() - for (key, value) in iteritems(dic): - ret[key.encode(encoding)] = value.encode(encoding) - return ret - - def main(): parser = argparse.ArgumentParser(description='confgen.py v%s - Config Generation Tool' % __version__, prog=os.path.basename(sys.argv[0])) @@ -251,7 +235,7 @@ def main(): if args.env_file is not None: env = json.load(args.env_file) - os.environ.update(dict_enc_for_env(env)) + os.environ.update(env) config = kconfiglib.Kconfig(args.kconfig) config.warn_assign_redun = False diff --git a/tools/kconfig_new/confserver.py b/tools/kconfig_new/confserver.py index b0aed9aa35..f54dabcf8a 100755 --- a/tools/kconfig_new/confserver.py +++ b/tools/kconfig_new/confserver.py @@ -3,8 +3,6 @@ # Long-running server process uses stdin & stdout to communicate JSON # with a caller # -from __future__ import print_function - import argparse import json import os @@ -66,7 +64,7 @@ def main(): if args.env_file is not None: env = json.load(args.env_file) - os.environ.update(confgen.dict_enc_for_env(env)) + os.environ.update(env) run_server(args.kconfig, args.config, args.sdkconfig_rename) diff --git a/tools/kconfig_new/test/confgen/test_confgen.py b/tools/kconfig_new/test/confgen/test_confgen.py index 00a57c315a..b41808e070 100755 --- a/tools/kconfig_new/test/confgen/test_confgen.py +++ b/tools/kconfig_new/test/confgen/test_confgen.py @@ -8,8 +8,6 @@ import tempfile import textwrap import unittest -from future.utils import iteritems - class ConfgenBaseTestCase(unittest.TestCase): @classmethod @@ -36,7 +34,7 @@ class ConfgenBaseTestCase(unittest.TestCase): def invoke_confgen(self, args): call_args = [sys.executable, '../../confgen.py'] - for (k, v) in iteritems(args): + for (k, v) in args.items(): if k != 'output': if isinstance(v, type('')): # easy Python 2/3 compatible str/unicode call_args += ['--{}'.format(k), v] diff --git a/tools/ldgen/ldgen.py b/tools/ldgen/ldgen.py index 767b34bbc7..5f19b7b553 100755 --- a/tools/ldgen/ldgen.py +++ b/tools/ldgen/ldgen.py @@ -21,14 +21,6 @@ from ldgen.linker_script import LinkerScript from ldgen.sdkconfig import SDKConfig from pyparsing import ParseException, ParseFatalException -try: - import confgen -except Exception: - parent_dir_name = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - kconfig_new_dir = os.path.abspath(parent_dir_name + '/kconfig_new') - sys.path.insert(0, kconfig_new_dir) - import confgen - def _update_environment(args): env = [(name, value) for (name,value) in (e.split('=',1) for e in args.env)] @@ -38,7 +30,7 @@ def _update_environment(args): if args.env_file is not None: env = json.load(args.env_file) - os.environ.update(confgen.dict_enc_for_env(env)) + os.environ.update(env) def main(): diff --git a/tools/mass_mfg/mfg_gen.py b/tools/mass_mfg/mfg_gen.py index 0d4dce1605..600b2d7371 100644 --- a/tools/mass_mfg/mfg_gen.py +++ b/tools/mass_mfg/mfg_gen.py @@ -4,15 +4,12 @@ # SPDX-License-Identifier: Apache-2.0 # -from __future__ import print_function - import argparse import csv import distutils.dir_util import os import sys - -from future.moves.itertools import zip_longest +from itertools import zip_longest try: idf_path = os.environ['IDF_PATH'] diff --git a/tools/mkdfu.py b/tools/mkdfu.py index 4cd2dacbe5..5c994e71ec 100755 --- a/tools/mkdfu.py +++ b/tools/mkdfu.py @@ -21,8 +21,6 @@ import zlib from collections import namedtuple from functools import partial -from future.utils import iteritems - try: import typing except ImportError: @@ -312,9 +310,9 @@ def main(): # type: () -> None with open(args.json) as f: files += [(int(addr, 0), - process_json_file(f_name)) for addr, f_name in iteritems(json.load(f)['flash_files'])] + process_json_file(f_name)) for addr, f_name in json.load(f)['flash_files'].items()] - files = sorted([(addr, f_name.decode('utf-8') if isinstance(f_name, type(b'')) else f_name) for addr, f_name in iteritems(dict(files))], + files = sorted([(addr, f_name) for addr, f_name in dict(files).items()], key=lambda x: x[0]) # remove possible duplicates and sort based on the address cmd_args = {'output_file': args.output_file, diff --git a/tools/mkuf2.py b/tools/mkuf2.py index e76bae895f..fdc8f4bfe5 100755 --- a/tools/mkuf2.py +++ b/tools/mkuf2.py @@ -13,8 +13,6 @@ import struct from functools import partial from typing import Dict, List -from future.utils import iteritems - def round_up_int_div(n: int, d: int) -> int: # equivalent to math.ceil(n / d) @@ -172,15 +170,15 @@ def main() -> None: flash_dic = dict((x['offset'], x['file']) for x in bin_selection) except KeyError: print('Invalid binary was selected.') - valid = [k if all(x in v for x in ('offset', 'file')) else None for k, v in iteritems(json_content)] + valid = [k if all(x in v for x in ('offset', 'file')) else None for k, v in json_content.items()] print('Valid ones:', ' '.join(x for x in valid if x)) exit(1) else: flash_dic = json_content['flash_files'] - files += [(parse_addr(addr), process_json_file(f_name)) for addr, f_name in iteritems(flash_dic)] + files += [(parse_addr(addr), process_json_file(f_name)) for addr, f_name in flash_dic.items()] - files = sorted([(addr, f_name) for addr, f_name in iteritems(dict(files))], + files = sorted([(addr, f_name) for addr, f_name in dict(files).items()], key=lambda x: x[0]) # remove possible duplicates and sort based on the address cmd_args = {'output_file': args.output_file, diff --git a/tools/requirements/requirements.core.txt b/tools/requirements/requirements.core.txt index fc3cb0b48a..d433d99b86 100644 --- a/tools/requirements/requirements.core.txt +++ b/tools/requirements/requirements.core.txt @@ -3,7 +3,6 @@ setuptools click pyserial -future cryptography pyparsing pyelftools diff --git a/tools/test_idf_monitor/run_test_idf_monitor.py b/tools/test_idf_monitor/run_test_idf_monitor.py index dc151a16e7..ed4523a098 100755 --- a/tools/test_idf_monitor/run_test_idf_monitor.py +++ b/tools/test_idf_monitor/run_test_idf_monitor.py @@ -3,8 +3,6 @@ # SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 -from __future__ import print_function, unicode_literals - import errno import filecmp import os @@ -16,7 +14,6 @@ import sys import tempfile import threading import time -from builtins import object from io import open XTENSA_ARGS = '--toolchain-prefix xtensa-esp32-elf-' From 887368e7b3b4db1a130b8d1acf009404b91c60d4 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Fri, 22 Jul 2022 18:23:09 +0200 Subject: [PATCH 031/665] CI: Migrate monitor IDE integration test to pytest --- .gitlab/ci/target-test.yml | 10 ++ pytest.ini | 1 + tools/requirements/requirements.ci.txt | 1 + .../monitor_ide_integration/app_test.py | 93 ------------------- .../pytest_monitor_ide_integration.py | 92 ++++++++++++++++++ 5 files changed, 104 insertions(+), 93 deletions(-) delete mode 100644 tools/test_apps/system/monitor_ide_integration/app_test.py create mode 100644 tools/test_apps/system/monitor_ide_integration/pytest_monitor_ide_integration.py diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index c4c3591d48..385d7bdc26 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -332,6 +332,16 @@ test_app_test_pytest_esp32_generic: variables: SETUP_TOOLS: "1" # need gdb +test_app_test_pytest_esp32_jtag: + extends: + - .pytest_test_apps_dir_template + - .rules:test:custom_test-esp32 + needs: + - build_pytest_test_apps_esp32 + tags: [ esp32, test_jtag_arm] + variables: + SETUP_TOOLS: "1" # need gdb + test_app_test_pytest_esp32s2_generic: extends: - .pytest_test_apps_dir_template diff --git a/pytest.ini b/pytest.ini index 2433ce2571..4213d0dc13 100644 --- a/pytest.ini +++ b/pytest.ini @@ -59,6 +59,7 @@ markers = MSPI_F8R8: runner with Octal Flash and Octal PSRAM MSPI_F4R8: runner with Quad Flash and Octal PSRAM MSPI_F4R4: runner with Quad Flash and Quad PSRAM + test_jtag_arm: runner where the chip is accessible through JTAG as well # multi-dut markers multi_dut_generic: tests should be run on generic runners, at least have two duts connected. diff --git a/tools/requirements/requirements.ci.txt b/tools/requirements/requirements.ci.txt index b183644fec..a7e9416371 100644 --- a/tools/requirements/requirements.ci.txt +++ b/tools/requirements/requirements.ci.txt @@ -7,3 +7,4 @@ idf-build-apps junit_xml python-gitlab pyyaml +SimpleWebSocketServer diff --git a/tools/test_apps/system/monitor_ide_integration/app_test.py b/tools/test_apps/system/monitor_ide_integration/app_test.py deleted file mode 100644 index 4aceecd041..0000000000 --- a/tools/test_apps/system/monitor_ide_integration/app_test.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import unicode_literals - -import glob -import json -import os -import re -import threading - -import ttfw_idf -from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket -from tiny_test_fw import Utility - - -class IDEWSProtocol(WebSocket): - - def handleMessage(self): - try: - j = json.loads(self.data) - except Exception as e: - Utility.console_log('Server ignores error: {}'.format(e), 'orange') - return - event = j.get('event') - if event and 'prog' in j and ((event == 'gdb_stub' and 'port' in j) or - (event == 'coredump' and 'file' in j)): - payload = {'event': 'debug_finished'} - self.sendMessage(json.dumps(payload)) - Utility.console_log('Server sent: {}'.format(payload)) - else: - Utility.console_log('Server received: {}'.format(j), 'orange') - - def handleConnected(self): - Utility.console_log('{} connected to server'.format(self.address)) - - def handleClose(self): - Utility.console_log('{} closed the connection'.format(self.address)) - - -class WebSocketServer(object): - HOST = '127.0.0.1' - PORT = 1123 - - def run(self): - server = SimpleWebSocketServer(self.HOST, self.PORT, IDEWSProtocol) - while not self.exit_event.is_set(): - server.serveonce() - - def __init__(self): - self.exit_event = threading.Event() - self.thread = threading.Thread(target=self.run) - self.thread.start() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.exit_event.set() - self.thread.join(10) - if self.thread.is_alive(): - Utility.console_log('Thread cannot be joined', 'orange') - - -@ttfw_idf.idf_custom_test(env_tag='test_jtag_arm', group='test-apps') -def test_monitor_ide_integration(env, extra_data): - config_files = glob.glob(os.path.join(os.path.dirname(__file__), 'sdkconfig.ci.*')) - config_names = [os.path.basename(s).replace('sdkconfig.ci.', '') for s in config_files] - rel_proj_path = 'tools/test_apps/system/monitor_ide_integration' - for name in config_names: - Utility.console_log('Checking config "{}"... '.format(name), 'green', end='') - dut = env.get_dut('panic', rel_proj_path, app_config_name=name) - monitor_path = os.path.join(dut.app.idf_path, 'tools/idf_monitor.py') - elf_path = os.path.join(dut.app.binary_path, 'panic.elf') - dut.start_app() - # Closing the DUT because we will reconnect with IDF Monitor - env.close_dut(dut.name) - - with WebSocketServer(), ttfw_idf.CustomProcess(' '.join([monitor_path, - elf_path, - '--port', str(dut.port), - '--ws', 'ws://{}:{}'.format(WebSocketServer.HOST, - WebSocketServer.PORT)]), - logfile='monitor_{}.log'.format(name)) as p: - p.pexpect_proc.expect(re.compile(r'Guru Meditation Error'), timeout=10) - p.pexpect_proc.expect_exact('Communicating through WebSocket', timeout=5) - # "u?" is for Python 2 only in the following regular expressions. - # The elements of dictionary can be printed in different order depending on the Python version. - p.pexpect_proc.expect(re.compile(r"WebSocket sent: \{u?.*'event': u?'" + name + "'"), timeout=5) - p.pexpect_proc.expect_exact('Waiting for debug finished event', timeout=5) - p.pexpect_proc.expect(re.compile(r"WebSocket received: \{u?'event': u?'debug_finished'\}"), timeout=5) - p.pexpect_proc.expect_exact('Communications through WebSocket is finished', timeout=5) - - -if __name__ == '__main__': - test_monitor_ide_integration() diff --git a/tools/test_apps/system/monitor_ide_integration/pytest_monitor_ide_integration.py b/tools/test_apps/system/monitor_ide_integration/pytest_monitor_ide_integration.py new file mode 100644 index 0000000000..6ddd1778e7 --- /dev/null +++ b/tools/test_apps/system/monitor_ide_integration/pytest_monitor_ide_integration.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import json +import logging +import multiprocessing +import os +import re +import sys +from types import TracebackType +from typing import Optional, Type, TypeVar + +import pexpect +import pytest +from pytest_embedded import Dut +from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket + +WebSocketServerType = TypeVar('WebSocketServerType') + + +class IDEWSProtocol(WebSocket): + + def handleMessage(self) -> None: + try: + j = json.loads(self.data) + except Exception as e: + logging.info(f'Server ignores error: {e}') + return + event = j.get('event') + if event and 'prog' in j and ((event == 'gdb_stub' and 'port' in j) or + (event == 'coredump' and 'file' in j)): + payload = {'event': 'debug_finished'} + self.sendMessage(json.dumps(payload)) + logging.info(f'Server sent: {payload}') + else: + logging.info(f'Server received: {j}') + + def handleConnected(self) -> None: + logging.info(f'{self.address} connected to server') + + def handleClose(self) -> None: + logging.info(f'{self.address} closed the connection') + + +class WebSocketServer(object): + HOST = '127.0.0.1' + PORT = 1123 + + def run(self) -> None: + server = SimpleWebSocketServer(self.HOST, self.PORT, IDEWSProtocol) + while not self.exit_event.is_set(): + server.serveonce() + + def __init__(self) -> None: + self.exit_event = multiprocessing.Event() + self.proc = multiprocessing.Process(target=self.run) + self.proc.start() + + def __enter__(self: WebSocketServerType) -> WebSocketServerType: + return self + + def __exit__(self, exc_type: Optional[Type[BaseException]], exc_value: Optional[BaseException], traceback: + Optional[TracebackType]) -> None: + self.exit_event.set() + self.proc.join(10) + if self.proc.is_alive(): + logging.info('Process cannot be joined') + + +@pytest.mark.esp32 +@pytest.mark.test_jtag_arm +@pytest.mark.parametrize('config', ['gdb_stub', 'coredump'], indirect=True) +def test_monitor_ide_integration(config: str, dut: Dut) -> None: + # The port needs to be closed because idf_monitor.py will connect to it + dut.serial.stop_redirect_thread() + + monitor_py = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_monitor.py') + with open(f'monitor_{config}.log', 'w') as log: + monitor_cmd = ' '.join([sys.executable, monitor_py, os.path.join(dut.app.binary_path, 'panic.elf'), + '--port', str(dut.serial.port), + '--ws', f'ws://{WebSocketServer.HOST}:{WebSocketServer.PORT}']) + with WebSocketServer(), pexpect.spawn(monitor_cmd, + logfile=log, + timeout=60, + encoding='utf-8', + codec_errors='ignore') as p: + p.expect(re.compile(r'Guru Meditation Error'), timeout=10) + p.expect_exact('Communicating through WebSocket', timeout=5) + # The elements of dictionary can be printed in different order depending on the Python version. + p.expect(re.compile(r"WebSocket sent: \{.*'event': '" + config + "'"), timeout=5) + p.expect_exact('Waiting for debug finished event', timeout=5) + p.expect(re.compile(r"WebSocket received: \{'event': 'debug_finished'\}"), timeout=5) + p.expect_exact('Communications through WebSocket is finished', timeout=5) From 8b904d0c06a453deefb5b44f410c259f262440c1 Mon Sep 17 00:00:00 2001 From: Mo Fei Fei Date: Wed, 10 Aug 2022 11:57:09 +0800 Subject: [PATCH 032/665] Docs: update CN trans for migration-guides/system.rst --- docs/zh_CN/migration-guides/release-5.x/system.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_CN/migration-guides/release-5.x/system.rst b/docs/zh_CN/migration-guides/release-5.x/system.rst index 5c6ca2cc14..9fa7bb5903 100644 --- a/docs/zh_CN/migration-guides/release-5.x/system.rst +++ b/docs/zh_CN/migration-guides/release-5.x/system.rst @@ -54,7 +54,7 @@ esp_hw_support - ``esp_cpu_get_ccount()``、``esp_cpu_set_ccount()`` 和 ``esp_cpu_in_ocd_debug_mode()`` 已从 ``esp_cpu.h`` 中移除。请分别使用 ``esp_cpu_get_cycle_count()``、``esp_cpu_set_cycle_count()`` 和 ``esp_cpu_dbgr_is_attached()`` 代替。 - 头文件 ``esp_intr.h`` 已被移除。请包含 ``esp_intr_alloc.h`` 以分配和操作中断。 - Panic API(即以 ``esp_panic`` 为前缀的函数、类型或宏)已被更新为私有 API。因此,原先的包含路径 ``#include "esp_panic.h"`` 已被移除。如仍需使用 Panic API(并不推荐),请使用 ``#include "esp_private/panic_reason.h"`` 来包含。此外,请包含 ``esp_debug_helpers.h`` 以使用与调试有关的任意辅助函数,如打印回溯。 -- 头文件 ``soc_log.h`` 现更名为 ``esp_hw_log.h``,所有日志宏也从 ``SOC_LOGx`` 更新为 ``ESP_HW_LOGx``。请使用更新后的格式。 +- 头文件 ``soc_log.h`` 现更名为 ``esp_hw_log.h``,并已更新为私有。建议用户使用 ``esp_log.h`` 头文件下的日志 API。 - 包含头文件 ``spinlock.h``、``clk_ctrl_os.h`` 和 ``rtc_wdt.h`` 时不应当使用 ``soc`` 前缀,如 ``#include "spinlock.h"``。 - ``esp_chip_info()`` 命令返回芯片版本,格式为 = 100 * ``主要 eFuse 版本`` + ``次要 eFuse 版本``。因此,为适应新格式, ``esp_chip_info_t`` 结构体中的 ``revision`` 被扩展为 uint16_t。 From f887922cf4f6456d29390a6e168ade6b11419346 Mon Sep 17 00:00:00 2001 From: Laukik Hase Date: Wed, 10 Aug 2022 10:25:45 +0530 Subject: [PATCH 033/665] protocols/provisioning: Added hints for breaking changes - For migrating from ESP-IDF v4.4.x to v5.0 --- tools/idf_py_actions/hints.yml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/idf_py_actions/hints.yml b/tools/idf_py_actions/hints.yml index d46b191efe..f5da043248 100644 --- a/tools/idf_py_actions/hints.yml +++ b/tools/idf_py_actions/hints.yml @@ -52,8 +52,9 @@ - re: "error: implicit declaration of function '(\\w+)'" - hint: "Maybe you forgot to import {} library(s) in header file or add the necessary REQURIES component. Try to add missing libraries to your project header file or check idf_component_register(REQUIRES ...) section in your component CmakeList.txt file. For more information run 'idf.py docs -sp api-guides/build-system.html'." + hint: "Maybe you forgot to import {} library(s) in header file or add the necessary REQURIES component. Try to add missing libraries to your project header file or check idf_component_register(REQUIRES ...) section in your component CmakeList.txt file. For more information run 'idf.py docs -sp api-guides/build-system.html'.\nAlso, please check if the function has been removed, renamed or replaced by an alternative function - refer to the migration guide for more information." match_to_output: True + - re: "fatal error: esp32\\w*\\/clk.h: No such file or directory" hint: "The ESP Clock API (functions/types/macros prefixed with 'esp_clk') has been made into a private API. If users still require usage of the ESP Clock API (though this is not recommended), it can be included via '#include \"esp_private/esp_clk.h\"'." @@ -71,7 +72,7 @@ - re: "fatal error: [\\w/]+\\.h: No such file or directory" - hint: "Please check if you've specified all component dependencies with 'idf_component_register(REQUIRES ...)'. If the component is not present then it should be added by the IDF Component Manager. For more information run 'idf.py docs -sp api-guides/build-system.html'." + hint: "Please check if you've specified all component dependencies with 'idf_component_register(REQUIRES ...)'. If the component is not present then it should be added by the IDF Component Manager. For more information run 'idf.py docs -sp api-guides/build-system.html'.\nAlso, please check if the header file has been removed, renamed or relocated - refer to the migration guide for more information." - re: "The CMAKE_[A-Z]+_COMPILER: [\\w+-]+ is not a full path and was not found in the PATH\\." @@ -85,6 +86,10 @@ re: "CMake Error at .* \\(message\\): Could not create symbolic link for: error\\.c --> Cannot create a file when that file already exists\\." hint: "Run 'idf.py fullclean' and try the build again." +- + re: "CMake Error at .* \\(message\\): Directory specified in EXTRA_COMPONENT_DIRS doesn't exist: \\/.*\\/examples\\/common_components\\/.*" + hint: "The component with path specified in the EXTRA_COMPONENT_DIRS variable has been moved to IDF component manager (or has been removed).\nPlease look out for component in 'https://components.espressif.com' and add using 'idf.py add-dependency' command.\nRefer to the migration guide for more details." + - re: "ImportError: bad magic number in 'kconfiglib':" hint: "Run 'idf.py python-clean', and try again" @@ -104,3 +109,16 @@ - re: "Failed to resolve component 'esp_ipc'" hint: "IPC component has been moved to esp_system. Any `REQUIRES esp_ipc` can simply be deleted as esp_system is REQUIRED by default." + +- + re: "error: invalid use of incomplete typedef 'esp_tls_t'" + hint: "The struct 'esp_tls_t' has now been made private - its elements can be only be accessed/modified through respective getter/setter functions. Please refer to the migration guide for more information." + +- + re: "error: enumeration value 'HTTP_EVENT_REDIRECT' not handled in switch" + hint: "The event handler, specified in the 'event_handler' element, of the 'esp_http_client_config_t' struct now needs to handle the new 'HTTP_EVENT_REDIRECT' event case." + +- + re: "Failed to resolve component '(?!esp_ipc)(\\w+)'" + hint: "The component {} has been moved to the IDF component manager or has been removed and refactored into some other component.\nPlease look out for component in 'https://components.espressif.com' and add using 'idf.py add-dependency' command.\nRefer to the migration guide for more details." + match_to_output: True From 51f785fabe6bea35b229b16f4c570dcd059045d2 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 10 Aug 2022 12:08:40 +0530 Subject: [PATCH 034/665] wpa_supplicant: Add WPS ssid length validation --- components/wpa_supplicant/esp_supplicant/src/esp_wps.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c index d70717ac41..e12f76dbae 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c @@ -397,6 +397,7 @@ wps_parse_scan_result(struct wps_scan_ie *scan) for (count = 0; count < WPS_MAX_DIS_AP_NUM; count++) { if (os_memcmp(sm->dis_ap_list[count].bssid, scan->bssid, ETH_ALEN) == 0) { wpa_printf(MSG_INFO, "discard ap bssid "MACSTR, MAC2STR(scan->bssid)); + wpabuf_free(buf); return false; } } @@ -404,6 +405,9 @@ wps_parse_scan_result(struct wps_scan_ie *scan) if (ap_found || sm->ignore_sel_reg) { wpabuf_free(buf); + if (scan->ssid[1] > SSID_MAX_LEN) { + return false; + } esp_wifi_enable_sta_privacy_internal(); os_memset(sm->ssid[0], 0, SSID_MAX_LEN); os_memcpy(sm->ssid[0], (char *)&scan->ssid[2], (int)scan->ssid[1]); From 41c535970336674e62a60709e3c21a0e6728d7b5 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Mon, 25 Jul 2022 16:13:40 +0530 Subject: [PATCH 035/665] esp32s3: Update world controller headers --- components/soc/esp32s3/include/soc/reg_base.h | 2 +- .../include/soc/world_controller_reg.h | 2570 ++++++++++------- .../include/soc/world_controller_struct.h | 2339 ++++++++++----- .../soc/esp32s3/ld/esp32s3.peripherals.ld | 1 + tools/ci/check_copyright_ignore.txt | 1 - tools/ci/check_public_headers_exceptions.txt | 2 - 6 files changed, 3066 insertions(+), 1849 deletions(-) diff --git a/components/soc/esp32s3/include/soc/reg_base.h b/components/soc/esp32s3/include/soc/reg_base.h index 9beea9fde3..ad1b7d143a 100644 --- a/components/soc/esp32s3/include/soc/reg_base.h +++ b/components/soc/esp32s3/include/soc/reg_base.h @@ -61,4 +61,4 @@ #define DR_REG_INTERRUPT_BASE 0x600C2000 #define DR_REG_EXTMEM_BASE 0x600C4000 #define DR_REG_ASSIST_DEBUG_BASE 0x600CE000 -#define DR_REG_WORLD_CNTL_BASE 0x600D0000 +#define DR_REG_WCL_BASE 0x600D0000 diff --git a/components/soc/esp32s3/include/soc/world_controller_reg.h b/components/soc/esp32s3/include/soc/world_controller_reg.h index 610e66089d..1ba5333cf2 100644 --- a/components/soc/esp32s3/include/soc/world_controller_reg.h +++ b/components/soc/esp32s3/include/soc/world_controller_reg.h @@ -1,1084 +1,1504 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_WORLD_CONTROLLER_REG_H_ -#define _SOC_WORLD_CONTROLLER_REG_H_ +/** + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once - -#include "soc.h" +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_1_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x0) -/* WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 1 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_1_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_2_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4) -/* WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 2 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_2_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_3_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x8) -/* WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 3 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_3_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_4_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xC) -/* WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 4 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_4_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_5_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x10) -/* WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 5 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_5_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_6_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x14) -/* WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 6 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_6_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_7_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x18) -/* WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 7 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_7_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_8_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x1C) -/* WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 8 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_8_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_9_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x20) -/* WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 9 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_9_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_10_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x24) -/* WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 10 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_10_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_11_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x28) -/* WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 11 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_11_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_12_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x2C) -/* WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 12 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_12_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_13_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x30) -/* WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_0 Entry 13 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR_M ((WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_13_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_ENTRY_CHECK_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x7C) -/* WORLD_CONTROLLER_CORE_0_ENTRY_CHECK : R/W ;bitpos:[13:1] ;default: 1'b1 ; */ -/*description: This filed is used to enable entry address check .*/ -#define WORLD_CONTROLLER_CORE_0_ENTRY_CHECK 0x00001FFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_CHECK_M ((WORLD_CONTROLLER_CORE_0_ENTRY_CHECK_V)<<(WORLD_CONTROLLER_CORE_0_ENTRY_CHECK_S)) -#define WORLD_CONTROLLER_CORE_0_ENTRY_CHECK_V 0x1FFF -#define WORLD_CONTROLLER_CORE_0_ENTRY_CHECK_S 1 - -#define WORLD_CONTROLLER_WCL_CORE_0_MESSAGE_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x100) -/* WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to set address that need to write when enter WORLD0.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR_M ((WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_MESSAGE_MAX_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x104) -/* WORLD_CONTROLLER_CORE_0_MESSAGE_MAX : R/W ;bitpos:[3:0] ;default: 4'b0 ; */ -/*description: This filed is used to set the max value of clear write_buffer.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MAX 0x0000000F -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MAX_M ((WORLD_CONTROLLER_CORE_0_MESSAGE_MAX_V)<<(WORLD_CONTROLLER_CORE_0_MESSAGE_MAX_S)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MAX_V 0xF -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MAX_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE1_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x80) -/* WORLD_CONTROLLER_CORE_0_CURRENT_1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 1 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_1 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_1_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_1_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_1_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 1.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_1_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 1 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_1 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_1_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_1_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_1_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE2_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x84) -/* WORLD_CONTROLLER_CORE_0_CURRENT_2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 2 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_2 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_2_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_2_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_2_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 2.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_2_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_2 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 2 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_2 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_2_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_2_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_2_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE3_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x88) -/* WORLD_CONTROLLER_CORE_0_CURRENT_3 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 3 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_3 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_3_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_3_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_3_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 3.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_3_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_3 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 3 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_3 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_3_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_3_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_3_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE4_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x8C) -/* WORLD_CONTROLLER_CORE_0_CURRENT_4 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 4 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_4 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_4_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_4_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_4_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 4.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_4_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_4 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 4 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_4 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_4_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_4_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_4_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE5_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x90) -/* WORLD_CONTROLLER_CORE_0_CURRENT_5 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 5 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_5 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_5_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_5_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_5_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 5.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_5_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_5 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 5 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_5 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_5_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_5_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_5_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE6_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x94) -/* WORLD_CONTROLLER_CORE_0_CURRENT_6 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 6 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_6 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_6_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_6_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_6_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 6.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_6_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_6 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 6 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_6 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_6_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_6_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_6_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE7_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x98) -/* WORLD_CONTROLLER_CORE_0_CURRENT_7 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 7 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_7 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_7_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_7_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_7_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 7.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_7_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_7 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 7 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_7 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_7_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_7_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_7_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE8_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x9C) -/* WORLD_CONTROLLER_CORE_0_CURRENT_8 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 8 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_8 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_8_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_8_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_8_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 8.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_8_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_8 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 8 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_8 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_8_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_8_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_8_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE9_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xA0) -/* WORLD_CONTROLLER_CORE_0_CURRENT_9 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 9 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_9 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_9_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_9_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_9_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 9.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_9_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_9 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 9 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_9 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_9_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_9_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_9_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE10_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xA4) -/* WORLD_CONTROLLER_CORE_0_CURRENT_10 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 10 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_10 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_10_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_10_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_10_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 10.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_10_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_10 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 10 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_10 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_10_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_10_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_10_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE11_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xA8) -/* WORLD_CONTROLLER_CORE_0_CURRENT_11 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 11 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_11 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_11_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_11_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_11_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 11.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_11_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_11 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 11 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_11 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_11_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_11_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_11_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE12_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xAC) -/* WORLD_CONTROLLER_CORE_0_CURRENT_12 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 12 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_12 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_12_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_12_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_12_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 12.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_12_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_12 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 12 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_12 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_12_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_12_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_12_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE13_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xB0) -/* WORLD_CONTROLLER_CORE_0_CURRENT_13 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 13 .*/ -#define WORLD_CONTROLLER_CORE_0_CURRENT_13 (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_13_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_CURRENT_13_V 0x1 -#define WORLD_CONTROLLER_CORE_0_CURRENT_13_S 5 -/* WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 13.*/ -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13 0x0000000F -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13_M ((WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13_V)<<(WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13_S)) -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13_V 0xF -#define WORLD_CONTROLLER_CORE_0_FROM_ENTRY_13_S 1 -/* WORLD_CONTROLLER_CORE_0_FROM_WORLD_13 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 13 .*/ -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_13 (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_13_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_13_V 0x1 -#define WORLD_CONTROLLER_CORE_0_FROM_WORLD_13_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_STATUSTABLE_CURRENT_REG (DR_REG_WORLD_CONTROLLER_BASE + 0xFC) -/* WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT : R/W ;bitpos:[13:1] ;default: 13'b0 ; */ -/*description: This field is used to quickly read and rewrite the current field of all STATUSTA -BLE registers.For example.*/ -#define WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT 0x00001FFF -#define WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT_M ((WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT_V)<<(WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT_S)) -#define WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT_V 0x1FFF -#define WORLD_CONTROLLER_CORE_0_STATUSTABLE_CURRENT_S 1 - -#define WORLD_CONTROLLER_WCL_CORE_0_MESSAGE_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x108) -/* WORLD_CONTROLLER_CORE_0_MESSAGE_ADDRESSPHASE : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: If this bit is 1.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDRESSPHASE (BIT(6)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDRESSPHASE_M (BIT(6)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDRESSPHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_0_MESSAGE_ADDRESSPHASE_S 6 -/* WORLD_CONTROLLER_CORE_0_MESSAGE_DATAPHASE : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: If this bit is 1.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_DATAPHASE (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_DATAPHASE_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_DATAPHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_0_MESSAGE_DATAPHASE_S 5 -/* WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT : RO ;bitpos:[4:1] ;default: 4'b0 ; */ -/*description: This field indicates the data to be written next time.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT 0x0000000F -#define WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT_M ((WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT_V)<<(WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT_S)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT_V 0xF -#define WORLD_CONTROLLER_CORE_0_MESSAGE_EXPECT_S 1 -/* WORLD_CONTROLLER_CORE_0_MESSAGE_MATCH : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit indicates whether the check is successful.*/ -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MATCH (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MATCH_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MATCH_V 0x1 -#define WORLD_CONTROLLER_CORE_0_MESSAGE_MATCH_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_TRIGGER_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x140) -/* WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR : RW ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to configure the entry address from WORLD0 to WORLD1.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR_M ((WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_WORLD_TRIGGER_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_PREPARE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x144) -/* WORLD_CONTROLLER_CORE_0_WORLD_PREPARE : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: This field to used to set world to enter.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_PREPARE 0x00000003 -#define WORLD_CONTROLLER_CORE_0_WORLD_PREPARE_M ((WORLD_CONTROLLER_CORE_0_WORLD_PREPARE_V)<<(WORLD_CONTROLLER_CORE_0_WORLD_PREPARE_S)) -#define WORLD_CONTROLLER_CORE_0_WORLD_PREPARE_V 0x3 -#define WORLD_CONTROLLER_CORE_0_WORLD_PREPARE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_UPDATE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x148) -/* WORLD_CONTROLLER_CORE_0_UPDATE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to update configuration completed.*/ -#define WORLD_CONTROLLER_CORE_0_UPDATE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_UPDATE_M ((WORLD_CONTROLLER_CORE_0_UPDATE_V)<<(WORLD_CONTROLLER_CORE_0_UPDATE_S)) -#define WORLD_CONTROLLER_CORE_0_UPDATE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_UPDATE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_CANCEL_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x14C) -/* WORLD_CONTROLLER_CORE_0_WORLD_CANCEL : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to cancel switch world configuration.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_CANCEL 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_WORLD_CANCEL_M ((WORLD_CONTROLLER_CORE_0_WORLD_CANCEL_V)<<(WORLD_CONTROLLER_CORE_0_WORLD_CANCEL_S)) -#define WORLD_CONTROLLER_CORE_0_WORLD_CANCEL_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_WORLD_CANCEL_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_IRAM0_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x150) -/* WORLD_CONTROLLER_CORE_0_WORLD_IRAM0 : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: this field is used to read current world of Iram0 bus.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_IRAM0 0x00000003 -#define WORLD_CONTROLLER_CORE_0_WORLD_IRAM0_M ((WORLD_CONTROLLER_CORE_0_WORLD_IRAM0_V)<<(WORLD_CONTROLLER_CORE_0_WORLD_IRAM0_S)) -#define WORLD_CONTROLLER_CORE_0_WORLD_IRAM0_V 0x3 -#define WORLD_CONTROLLER_CORE_0_WORLD_IRAM0_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_DRAM0_PIF_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x154) -/* WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: this field is used to read current world of Dram0 bus and PIF bus.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF 0x00000003 -#define WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF_M ((WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF_V)<<(WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF_S)) -#define WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF_V 0x3 -#define WORLD_CONTROLLER_CORE_0_WORLD_DRAM0_PIF_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_WORLD_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x158) -/* WORLD_CONTROLLER_CORE_0_WORLD_PHASE : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit indicates whether is preparing to switch to WORLD1.*/ -#define WORLD_CONTROLLER_CORE_0_WORLD_PHASE (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_WORLD_PHASE_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_WORLD_PHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_0_WORLD_PHASE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_ENABLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x180) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to set NMI mask.*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE_M ((WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE_V)<<(WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE_S)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_ENABLE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x184) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field to used to set trigger address.*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR_M ((WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR_V)<<(WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR_S)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_TRIGGER_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_DISABLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x188) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to disable NMI mask.*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE_M ((WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE_V)<<(WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE_S)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_DISABLE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_CANCLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x18C) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to cancel NMI mask disable function..*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL_M ((WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL_V)<<(WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL_S)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_CANCEL_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x190) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: this bit is used to mask NMI interrupt.*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_V 0x1 -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_0_NMI_MASK_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x194) -/* WORLD_CONTROLLER_CORE_0_NMI_MASK_PHASE : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: this bit is used to indicates whether the NMI interrupt is being masked.*/ -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_PHASE (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_PHASE_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_PHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_0_NMI_MASK_PHASE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_1_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x400) -/* WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 1 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_1_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_2_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x404) -/* WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 2 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_2_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_3_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x408) -/* WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 3 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_3_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_4_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x40C) -/* WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 4 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_4_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_5_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x410) -/* WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 5 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_5_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_6_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x414) -/* WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 6 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_6_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_7_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x418) -/* WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 7 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_7_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_8_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x41C) -/* WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 8 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_8_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_9_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x420) -/* WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 9 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_9_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_10_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x424) -/* WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 10 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_10_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_11_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x428) -/* WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 11 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_11_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_12_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x42C) -/* WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 12 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_12_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_13_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x430) -/* WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR : R/W ;bitpos:[31:0] ;default: 31'b0 ; */ -/*description: Core_1 Entry 13 address from WORLD1 to WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR_M ((WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_13_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_ENTRY_CHECK_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x47C) -/* WORLD_CONTROLLER_CORE_1_ENTRY_CHECK : R/W ;bitpos:[13:1] ;default: 1'b1 ; */ -/*description: This filed is used to enable entry address check .*/ -#define WORLD_CONTROLLER_CORE_1_ENTRY_CHECK 0x00001FFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_CHECK_M ((WORLD_CONTROLLER_CORE_1_ENTRY_CHECK_V)<<(WORLD_CONTROLLER_CORE_1_ENTRY_CHECK_S)) -#define WORLD_CONTROLLER_CORE_1_ENTRY_CHECK_V 0x1FFF -#define WORLD_CONTROLLER_CORE_1_ENTRY_CHECK_S 1 - -#define WORLD_CONTROLLER_WCL_CORE_1_MESSAGE_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x500) -/* WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to set address that need to write when enter WORLD0.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR_M ((WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_MESSAGE_MAX_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x504) -/* WORLD_CONTROLLER_CORE_1_MESSAGE_MAX : R/W ;bitpos:[3:0] ;default: 4'b0 ; */ -/*description: This filed is used to set the max value of clear write_buffer.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MAX 0x0000000F -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MAX_M ((WORLD_CONTROLLER_CORE_1_MESSAGE_MAX_V)<<(WORLD_CONTROLLER_CORE_1_MESSAGE_MAX_S)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MAX_V 0xF -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MAX_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE1_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x480) -/* WORLD_CONTROLLER_CORE_1_CURRENT_1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 1 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_1 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_1_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_1_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_1_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 1.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_1_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 1 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_1 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_1_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_1_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_1_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE2_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x484) -/* WORLD_CONTROLLER_CORE_1_CURRENT_2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 2 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_2 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_2_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_2_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_2_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 2.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_2_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_2 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 2 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_2 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_2_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_2_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_2_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE3_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x488) -/* WORLD_CONTROLLER_CORE_1_CURRENT_3 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 3 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_3 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_3_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_3_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_3_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 3.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_3_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_3 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 3 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_3 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_3_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_3_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_3_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE4_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x48C) -/* WORLD_CONTROLLER_CORE_1_CURRENT_4 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 4 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_4 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_4_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_4_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_4_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 4.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_4_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_4 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 4 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_4 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_4_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_4_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_4_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE5_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x490) -/* WORLD_CONTROLLER_CORE_1_CURRENT_5 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 5 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_5 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_5_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_5_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_5_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 5.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_5_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_5 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 5 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_5 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_5_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_5_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_5_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE6_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x494) -/* WORLD_CONTROLLER_CORE_1_CURRENT_6 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 6 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_6 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_6_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_6_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_6_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 6.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_6_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_6 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 6 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_6 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_6_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_6_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_6_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE7_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x498) -/* WORLD_CONTROLLER_CORE_1_CURRENT_7 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 7 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_7 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_7_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_7_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_7_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 7.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_7_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_7 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 7 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_7 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_7_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_7_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_7_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE8_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x49C) -/* WORLD_CONTROLLER_CORE_1_CURRENT_8 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 8 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_8 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_8_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_8_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_8_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 8.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_8_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_8 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 8 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_8 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_8_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_8_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_8_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE9_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4A0) -/* WORLD_CONTROLLER_CORE_1_CURRENT_9 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 9 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_9 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_9_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_9_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_9_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 9.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_9_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_9 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 9 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_9 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_9_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_9_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_9_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE10_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4A4) -/* WORLD_CONTROLLER_CORE_1_CURRENT_10 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 10 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_10 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_10_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_10_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_10_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 10.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_10_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_10 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 10 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_10 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_10_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_10_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_10_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE11_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4A8) -/* WORLD_CONTROLLER_CORE_1_CURRENT_11 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 11 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_11 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_11_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_11_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_11_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 11.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_11_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_11 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 11 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_11 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_11_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_11_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_11_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE12_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4AC) -/* WORLD_CONTROLLER_CORE_1_CURRENT_12 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 12 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_12 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_12_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_12_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_12_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 12.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_12_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_12 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 12 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_12 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_12_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_12_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_12_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE13_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4B0) -/* WORLD_CONTROLLER_CORE_1_CURRENT_13 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This bit is used to confirm whether the current state is in entry 13 .*/ -#define WORLD_CONTROLLER_CORE_1_CURRENT_13 (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_13_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_CURRENT_13_V 0x1 -#define WORLD_CONTROLLER_CORE_1_CURRENT_13_S 5 -/* WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13 : R/W ;bitpos:[4:1] ;default: 4'h0 ; */ -/*description: This filed is used to confirm in which entry before enter entry 13.*/ -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13 0x0000000F -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13_M ((WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13_V)<<(WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13_S)) -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13_V 0xF -#define WORLD_CONTROLLER_CORE_1_FROM_ENTRY_13_S 1 -/* WORLD_CONTROLLER_CORE_1_FROM_WORLD_13 : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit is used to confirm world before enter entry 13 .*/ -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_13 (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_13_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_13_V 0x1 -#define WORLD_CONTROLLER_CORE_1_FROM_WORLD_13_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_STATUSTABLE_CURRENT_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x4FC) -/* WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT : R/W ;bitpos:[13:1] ;default: 13'b0 ; */ -/*description: This field is used to quickly read and rewrite the current field of all STATUSTA -BLE registers.For example.*/ -#define WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT 0x00001FFF -#define WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT_M ((WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT_V)<<(WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT_S)) -#define WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT_V 0x1FFF -#define WORLD_CONTROLLER_CORE_1_STATUSTABLE_CURRENT_S 1 - -#define WORLD_CONTROLLER_WCL_CORE_1_MESSAGE_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x508) -/* WORLD_CONTROLLER_CORE_1_MESSAGE_ADDRESSPHASE : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: If this bit is 1.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDRESSPHASE (BIT(6)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDRESSPHASE_M (BIT(6)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDRESSPHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_1_MESSAGE_ADDRESSPHASE_S 6 -/* WORLD_CONTROLLER_CORE_1_MESSAGE_DATAPHASE : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: If this bit is 1.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_DATAPHASE (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_DATAPHASE_M (BIT(5)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_DATAPHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_1_MESSAGE_DATAPHASE_S 5 -/* WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT : RO ;bitpos:[4:1] ;default: 4'b0 ; */ -/*description: This field indicates the data to be written next time.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT 0x0000000F -#define WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT_M ((WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT_V)<<(WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT_S)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT_V 0xF -#define WORLD_CONTROLLER_CORE_1_MESSAGE_EXPECT_S 1 -/* WORLD_CONTROLLER_CORE_1_MESSAGE_MATCH : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit indicates whether the check is successful.*/ -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MATCH (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MATCH_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MATCH_V 0x1 -#define WORLD_CONTROLLER_CORE_1_MESSAGE_MATCH_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_TRIGGER_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x540) -/* WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR : RW ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to configure the entry address from WORLD0 to WORLD1.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR_M ((WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_WORLD_TRIGGER_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_PREPARE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x544) -/* WORLD_CONTROLLER_CORE_1_WORLD_PREPARE : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: This field to used to set world to enter.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_PREPARE 0x00000003 -#define WORLD_CONTROLLER_CORE_1_WORLD_PREPARE_M ((WORLD_CONTROLLER_CORE_1_WORLD_PREPARE_V)<<(WORLD_CONTROLLER_CORE_1_WORLD_PREPARE_S)) -#define WORLD_CONTROLLER_CORE_1_WORLD_PREPARE_V 0x3 -#define WORLD_CONTROLLER_CORE_1_WORLD_PREPARE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_UPDATE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x548) -/* WORLD_CONTROLLER_CORE_1_UPDATE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to update configuration completed.*/ -#define WORLD_CONTROLLER_CORE_1_UPDATE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_UPDATE_M ((WORLD_CONTROLLER_CORE_1_UPDATE_V)<<(WORLD_CONTROLLER_CORE_1_UPDATE_S)) -#define WORLD_CONTROLLER_CORE_1_UPDATE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_UPDATE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_CANCEL_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x54C) -/* WORLD_CONTROLLER_CORE_1_WORLD_CANCEL : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: This field is used to cancel switch world configuration.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_CANCEL 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_WORLD_CANCEL_M ((WORLD_CONTROLLER_CORE_1_WORLD_CANCEL_V)<<(WORLD_CONTROLLER_CORE_1_WORLD_CANCEL_S)) -#define WORLD_CONTROLLER_CORE_1_WORLD_CANCEL_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_WORLD_CANCEL_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_IRAM0_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x550) -/* WORLD_CONTROLLER_CORE_1_WORLD_IRAM0 : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: this field is used to read current world of Iram0 bus.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_IRAM0 0x00000003 -#define WORLD_CONTROLLER_CORE_1_WORLD_IRAM0_M ((WORLD_CONTROLLER_CORE_1_WORLD_IRAM0_V)<<(WORLD_CONTROLLER_CORE_1_WORLD_IRAM0_S)) -#define WORLD_CONTROLLER_CORE_1_WORLD_IRAM0_V 0x3 -#define WORLD_CONTROLLER_CORE_1_WORLD_IRAM0_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_DRAM0_PIF_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x554) -/* WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: this field is used to read current world of Dram0 bus and PIF bus.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF 0x00000003 -#define WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF_M ((WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF_V)<<(WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF_S)) -#define WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF_V 0x3 -#define WORLD_CONTROLLER_CORE_1_WORLD_DRAM0_PIF_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_WORLD_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x558) -/* WORLD_CONTROLLER_CORE_1_WORLD_PHASE : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This bit indicates whether is preparing to switch to WORLD1.*/ -#define WORLD_CONTROLLER_CORE_1_WORLD_PHASE (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_WORLD_PHASE_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_WORLD_PHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_1_WORLD_PHASE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_ENABLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x580) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to set NMI mask.*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE_M ((WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE_V)<<(WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE_S)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_ENABLE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x584) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field to used to set trigger address.*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR_M ((WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR_V)<<(WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR_S)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_TRIGGER_ADDR_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_DISABLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x588) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to disable NMI mask.*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE_M ((WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE_V)<<(WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE_S)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_DISABLE_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_CANCLE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x58C) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL : WO ;bitpos:[31:0] ;default: 32'b0 ; */ -/*description: this field is used to cancel NMI mask disable function..*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL_M ((WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL_V)<<(WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL_S)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL_V 0xFFFFFFFF -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_CANCEL_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x590) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: this bit is used to mask NMI interrupt.*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_V 0x1 -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_S 0 - -#define WORLD_CONTROLLER_WCL_CORE_1_NMI_MASK_PHASE_REG (DR_REG_WORLD_CONTROLLER_BASE + 0x594) -/* WORLD_CONTROLLER_CORE_1_NMI_MASK_PHASE : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: this bit is used to indicates whether the NMI interrupt is being masked.*/ -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_PHASE (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_PHASE_M (BIT(0)) -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_PHASE_V 0x1 -#define WORLD_CONTROLLER_CORE_1_NMI_MASK_PHASE_S 0 - +/** WCL_Core_0_ENTRY_1_ADDR_REG register + * Core_0 Entry 1 address configuration Register + */ +#define WCL_CORE_0_ENTRY_1_ADDR_REG (DR_REG_WCL_BASE + 0x0) +/** WCL_CORE_0_ENTRY_1_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 1 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_1_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_1_ADDR_M (WCL_CORE_0_ENTRY_1_ADDR_V << WCL_CORE_0_ENTRY_1_ADDR_S) +#define WCL_CORE_0_ENTRY_1_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_1_ADDR_S 0 + +/** WCL_Core_0_ENTRY_2_ADDR_REG register + * Core_0 Entry 2 address configuration Register + */ +#define WCL_CORE_0_ENTRY_2_ADDR_REG (DR_REG_WCL_BASE + 0x4) +/** WCL_CORE_0_ENTRY_2_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 2 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_2_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_2_ADDR_M (WCL_CORE_0_ENTRY_2_ADDR_V << WCL_CORE_0_ENTRY_2_ADDR_S) +#define WCL_CORE_0_ENTRY_2_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_2_ADDR_S 0 + +/** WCL_Core_0_ENTRY_3_ADDR_REG register + * Core_0 Entry 3 address configuration Register + */ +#define WCL_CORE_0_ENTRY_3_ADDR_REG (DR_REG_WCL_BASE + 0x8) +/** WCL_CORE_0_ENTRY_3_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 3 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_3_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_3_ADDR_M (WCL_CORE_0_ENTRY_3_ADDR_V << WCL_CORE_0_ENTRY_3_ADDR_S) +#define WCL_CORE_0_ENTRY_3_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_3_ADDR_S 0 + +/** WCL_Core_0_ENTRY_4_ADDR_REG register + * Core_0 Entry 4 address configuration Register + */ +#define WCL_CORE_0_ENTRY_4_ADDR_REG (DR_REG_WCL_BASE + 0xc) +/** WCL_CORE_0_ENTRY_4_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 4 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_4_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_4_ADDR_M (WCL_CORE_0_ENTRY_4_ADDR_V << WCL_CORE_0_ENTRY_4_ADDR_S) +#define WCL_CORE_0_ENTRY_4_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_4_ADDR_S 0 + +/** WCL_Core_0_ENTRY_5_ADDR_REG register + * Core_0 Entry 5 address configuration Register + */ +#define WCL_CORE_0_ENTRY_5_ADDR_REG (DR_REG_WCL_BASE + 0x10) +/** WCL_CORE_0_ENTRY_5_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 5 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_5_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_5_ADDR_M (WCL_CORE_0_ENTRY_5_ADDR_V << WCL_CORE_0_ENTRY_5_ADDR_S) +#define WCL_CORE_0_ENTRY_5_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_5_ADDR_S 0 + +/** WCL_Core_0_ENTRY_6_ADDR_REG register + * Core_0 Entry 6 address configuration Register + */ +#define WCL_CORE_0_ENTRY_6_ADDR_REG (DR_REG_WCL_BASE + 0x14) +/** WCL_CORE_0_ENTRY_6_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 6 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_6_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_6_ADDR_M (WCL_CORE_0_ENTRY_6_ADDR_V << WCL_CORE_0_ENTRY_6_ADDR_S) +#define WCL_CORE_0_ENTRY_6_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_6_ADDR_S 0 + +/** WCL_Core_0_ENTRY_7_ADDR_REG register + * Core_0 Entry 7 address configuration Register + */ +#define WCL_CORE_0_ENTRY_7_ADDR_REG (DR_REG_WCL_BASE + 0x18) +/** WCL_CORE_0_ENTRY_7_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 7 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_7_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_7_ADDR_M (WCL_CORE_0_ENTRY_7_ADDR_V << WCL_CORE_0_ENTRY_7_ADDR_S) +#define WCL_CORE_0_ENTRY_7_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_7_ADDR_S 0 + +/** WCL_Core_0_ENTRY_8_ADDR_REG register + * Core_0 Entry 8 address configuration Register + */ +#define WCL_CORE_0_ENTRY_8_ADDR_REG (DR_REG_WCL_BASE + 0x1c) +/** WCL_CORE_0_ENTRY_8_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 8 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_8_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_8_ADDR_M (WCL_CORE_0_ENTRY_8_ADDR_V << WCL_CORE_0_ENTRY_8_ADDR_S) +#define WCL_CORE_0_ENTRY_8_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_8_ADDR_S 0 + +/** WCL_Core_0_ENTRY_9_ADDR_REG register + * Core_0 Entry 9 address configuration Register + */ +#define WCL_CORE_0_ENTRY_9_ADDR_REG (DR_REG_WCL_BASE + 0x20) +/** WCL_CORE_0_ENTRY_9_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 9 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_9_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_9_ADDR_M (WCL_CORE_0_ENTRY_9_ADDR_V << WCL_CORE_0_ENTRY_9_ADDR_S) +#define WCL_CORE_0_ENTRY_9_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_9_ADDR_S 0 + +/** WCL_Core_0_ENTRY_10_ADDR_REG register + * Core_0 Entry 10 address configuration Register + */ +#define WCL_CORE_0_ENTRY_10_ADDR_REG (DR_REG_WCL_BASE + 0x24) +/** WCL_CORE_0_ENTRY_10_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 10 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_10_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_10_ADDR_M (WCL_CORE_0_ENTRY_10_ADDR_V << WCL_CORE_0_ENTRY_10_ADDR_S) +#define WCL_CORE_0_ENTRY_10_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_10_ADDR_S 0 + +/** WCL_Core_0_ENTRY_11_ADDR_REG register + * Core_0 Entry 11 address configuration Register + */ +#define WCL_CORE_0_ENTRY_11_ADDR_REG (DR_REG_WCL_BASE + 0x28) +/** WCL_CORE_0_ENTRY_11_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 11 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_11_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_11_ADDR_M (WCL_CORE_0_ENTRY_11_ADDR_V << WCL_CORE_0_ENTRY_11_ADDR_S) +#define WCL_CORE_0_ENTRY_11_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_11_ADDR_S 0 + +/** WCL_Core_0_ENTRY_12_ADDR_REG register + * Core_0 Entry 12 address configuration Register + */ +#define WCL_CORE_0_ENTRY_12_ADDR_REG (DR_REG_WCL_BASE + 0x2c) +/** WCL_CORE_0_ENTRY_12_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 12 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_12_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_12_ADDR_M (WCL_CORE_0_ENTRY_12_ADDR_V << WCL_CORE_0_ENTRY_12_ADDR_S) +#define WCL_CORE_0_ENTRY_12_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_12_ADDR_S 0 + +/** WCL_Core_0_ENTRY_13_ADDR_REG register + * Core_0 Entry 13 address configuration Register + */ +#define WCL_CORE_0_ENTRY_13_ADDR_REG (DR_REG_WCL_BASE + 0x30) +/** WCL_CORE_0_ENTRY_13_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 13 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_0_ENTRY_13_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_13_ADDR_M (WCL_CORE_0_ENTRY_13_ADDR_V << WCL_CORE_0_ENTRY_13_ADDR_S) +#define WCL_CORE_0_ENTRY_13_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_ENTRY_13_ADDR_S 0 + +/** WCL_Core_0_ENTRY_CHECK_REG register + * Core_0 Entry check configuration Register + */ +#define WCL_CORE_0_ENTRY_CHECK_REG (DR_REG_WCL_BASE + 0x7c) +/** WCL_CORE_0_ENTRY_CHECK : R/W; bitpos: [13:1]; default: 1; + * This filed is used to enable entry address check + */ +#define WCL_CORE_0_ENTRY_CHECK 0x00001FFFU +#define WCL_CORE_0_ENTRY_CHECK_M (WCL_CORE_0_ENTRY_CHECK_V << WCL_CORE_0_ENTRY_CHECK_S) +#define WCL_CORE_0_ENTRY_CHECK_V 0x00001FFFU +#define WCL_CORE_0_ENTRY_CHECK_S 1 + +/** WCL_Core_0_STATUSTABLE1_REG register + * Status register of world switch of entry 1 + */ +#define WCL_CORE_0_STATUSTABLE1_REG (DR_REG_WCL_BASE + 0x80) +/** WCL_CORE_0_FROM_WORLD_1 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 1 + */ +#define WCL_CORE_0_FROM_WORLD_1 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_1_M (WCL_CORE_0_FROM_WORLD_1_V << WCL_CORE_0_FROM_WORLD_1_S) +#define WCL_CORE_0_FROM_WORLD_1_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_1_S 0 +/** WCL_CORE_0_FROM_ENTRY_1 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 1 + */ +#define WCL_CORE_0_FROM_ENTRY_1 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_1_M (WCL_CORE_0_FROM_ENTRY_1_V << WCL_CORE_0_FROM_ENTRY_1_S) +#define WCL_CORE_0_FROM_ENTRY_1_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_1_S 1 +/** WCL_CORE_0_CURRENT_1 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 1 + */ +#define WCL_CORE_0_CURRENT_1 (BIT(5)) +#define WCL_CORE_0_CURRENT_1_M (WCL_CORE_0_CURRENT_1_V << WCL_CORE_0_CURRENT_1_S) +#define WCL_CORE_0_CURRENT_1_V 0x00000001U +#define WCL_CORE_0_CURRENT_1_S 5 + +/** WCL_Core_0_STATUSTABLE2_REG register + * Status register of world switch of entry 2 + */ +#define WCL_CORE_0_STATUSTABLE2_REG (DR_REG_WCL_BASE + 0x84) +/** WCL_CORE_0_FROM_WORLD_2 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 2 + */ +#define WCL_CORE_0_FROM_WORLD_2 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_2_M (WCL_CORE_0_FROM_WORLD_2_V << WCL_CORE_0_FROM_WORLD_2_S) +#define WCL_CORE_0_FROM_WORLD_2_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_2_S 0 +/** WCL_CORE_0_FROM_ENTRY_2 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 2 + */ +#define WCL_CORE_0_FROM_ENTRY_2 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_2_M (WCL_CORE_0_FROM_ENTRY_2_V << WCL_CORE_0_FROM_ENTRY_2_S) +#define WCL_CORE_0_FROM_ENTRY_2_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_2_S 1 +/** WCL_CORE_0_CURRENT_2 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 2 + */ +#define WCL_CORE_0_CURRENT_2 (BIT(5)) +#define WCL_CORE_0_CURRENT_2_M (WCL_CORE_0_CURRENT_2_V << WCL_CORE_0_CURRENT_2_S) +#define WCL_CORE_0_CURRENT_2_V 0x00000001U +#define WCL_CORE_0_CURRENT_2_S 5 + +/** WCL_Core_0_STATUSTABLE3_REG register + * Status register of world switch of entry 3 + */ +#define WCL_CORE_0_STATUSTABLE3_REG (DR_REG_WCL_BASE + 0x88) +/** WCL_CORE_0_FROM_WORLD_3 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 3 + */ +#define WCL_CORE_0_FROM_WORLD_3 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_3_M (WCL_CORE_0_FROM_WORLD_3_V << WCL_CORE_0_FROM_WORLD_3_S) +#define WCL_CORE_0_FROM_WORLD_3_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_3_S 0 +/** WCL_CORE_0_FROM_ENTRY_3 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 3 + */ +#define WCL_CORE_0_FROM_ENTRY_3 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_3_M (WCL_CORE_0_FROM_ENTRY_3_V << WCL_CORE_0_FROM_ENTRY_3_S) +#define WCL_CORE_0_FROM_ENTRY_3_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_3_S 1 +/** WCL_CORE_0_CURRENT_3 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 3 + */ +#define WCL_CORE_0_CURRENT_3 (BIT(5)) +#define WCL_CORE_0_CURRENT_3_M (WCL_CORE_0_CURRENT_3_V << WCL_CORE_0_CURRENT_3_S) +#define WCL_CORE_0_CURRENT_3_V 0x00000001U +#define WCL_CORE_0_CURRENT_3_S 5 + +/** WCL_Core_0_STATUSTABLE4_REG register + * Status register of world switch of entry 4 + */ +#define WCL_CORE_0_STATUSTABLE4_REG (DR_REG_WCL_BASE + 0x8c) +/** WCL_CORE_0_FROM_WORLD_4 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 4 + */ +#define WCL_CORE_0_FROM_WORLD_4 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_4_M (WCL_CORE_0_FROM_WORLD_4_V << WCL_CORE_0_FROM_WORLD_4_S) +#define WCL_CORE_0_FROM_WORLD_4_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_4_S 0 +/** WCL_CORE_0_FROM_ENTRY_4 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 4 + */ +#define WCL_CORE_0_FROM_ENTRY_4 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_4_M (WCL_CORE_0_FROM_ENTRY_4_V << WCL_CORE_0_FROM_ENTRY_4_S) +#define WCL_CORE_0_FROM_ENTRY_4_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_4_S 1 +/** WCL_CORE_0_CURRENT_4 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 4 + */ +#define WCL_CORE_0_CURRENT_4 (BIT(5)) +#define WCL_CORE_0_CURRENT_4_M (WCL_CORE_0_CURRENT_4_V << WCL_CORE_0_CURRENT_4_S) +#define WCL_CORE_0_CURRENT_4_V 0x00000001U +#define WCL_CORE_0_CURRENT_4_S 5 + +/** WCL_Core_0_STATUSTABLE5_REG register + * Status register of world switch of entry 5 + */ +#define WCL_CORE_0_STATUSTABLE5_REG (DR_REG_WCL_BASE + 0x90) +/** WCL_CORE_0_FROM_WORLD_5 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 5 + */ +#define WCL_CORE_0_FROM_WORLD_5 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_5_M (WCL_CORE_0_FROM_WORLD_5_V << WCL_CORE_0_FROM_WORLD_5_S) +#define WCL_CORE_0_FROM_WORLD_5_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_5_S 0 +/** WCL_CORE_0_FROM_ENTRY_5 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 5 + */ +#define WCL_CORE_0_FROM_ENTRY_5 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_5_M (WCL_CORE_0_FROM_ENTRY_5_V << WCL_CORE_0_FROM_ENTRY_5_S) +#define WCL_CORE_0_FROM_ENTRY_5_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_5_S 1 +/** WCL_CORE_0_CURRENT_5 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 5 + */ +#define WCL_CORE_0_CURRENT_5 (BIT(5)) +#define WCL_CORE_0_CURRENT_5_M (WCL_CORE_0_CURRENT_5_V << WCL_CORE_0_CURRENT_5_S) +#define WCL_CORE_0_CURRENT_5_V 0x00000001U +#define WCL_CORE_0_CURRENT_5_S 5 + +/** WCL_Core_0_STATUSTABLE6_REG register + * Status register of world switch of entry 6 + */ +#define WCL_CORE_0_STATUSTABLE6_REG (DR_REG_WCL_BASE + 0x94) +/** WCL_CORE_0_FROM_WORLD_6 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 6 + */ +#define WCL_CORE_0_FROM_WORLD_6 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_6_M (WCL_CORE_0_FROM_WORLD_6_V << WCL_CORE_0_FROM_WORLD_6_S) +#define WCL_CORE_0_FROM_WORLD_6_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_6_S 0 +/** WCL_CORE_0_FROM_ENTRY_6 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 6 + */ +#define WCL_CORE_0_FROM_ENTRY_6 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_6_M (WCL_CORE_0_FROM_ENTRY_6_V << WCL_CORE_0_FROM_ENTRY_6_S) +#define WCL_CORE_0_FROM_ENTRY_6_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_6_S 1 +/** WCL_CORE_0_CURRENT_6 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 6 + */ +#define WCL_CORE_0_CURRENT_6 (BIT(5)) +#define WCL_CORE_0_CURRENT_6_M (WCL_CORE_0_CURRENT_6_V << WCL_CORE_0_CURRENT_6_S) +#define WCL_CORE_0_CURRENT_6_V 0x00000001U +#define WCL_CORE_0_CURRENT_6_S 5 + +/** WCL_Core_0_STATUSTABLE7_REG register + * Status register of world switch of entry 7 + */ +#define WCL_CORE_0_STATUSTABLE7_REG (DR_REG_WCL_BASE + 0x98) +/** WCL_CORE_0_FROM_WORLD_7 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 7 + */ +#define WCL_CORE_0_FROM_WORLD_7 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_7_M (WCL_CORE_0_FROM_WORLD_7_V << WCL_CORE_0_FROM_WORLD_7_S) +#define WCL_CORE_0_FROM_WORLD_7_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_7_S 0 +/** WCL_CORE_0_FROM_ENTRY_7 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 7 + */ +#define WCL_CORE_0_FROM_ENTRY_7 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_7_M (WCL_CORE_0_FROM_ENTRY_7_V << WCL_CORE_0_FROM_ENTRY_7_S) +#define WCL_CORE_0_FROM_ENTRY_7_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_7_S 1 +/** WCL_CORE_0_CURRENT_7 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 7 + */ +#define WCL_CORE_0_CURRENT_7 (BIT(5)) +#define WCL_CORE_0_CURRENT_7_M (WCL_CORE_0_CURRENT_7_V << WCL_CORE_0_CURRENT_7_S) +#define WCL_CORE_0_CURRENT_7_V 0x00000001U +#define WCL_CORE_0_CURRENT_7_S 5 + +/** WCL_Core_0_STATUSTABLE8_REG register + * Status register of world switch of entry 8 + */ +#define WCL_CORE_0_STATUSTABLE8_REG (DR_REG_WCL_BASE + 0x9c) +/** WCL_CORE_0_FROM_WORLD_8 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 8 + */ +#define WCL_CORE_0_FROM_WORLD_8 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_8_M (WCL_CORE_0_FROM_WORLD_8_V << WCL_CORE_0_FROM_WORLD_8_S) +#define WCL_CORE_0_FROM_WORLD_8_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_8_S 0 +/** WCL_CORE_0_FROM_ENTRY_8 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 8 + */ +#define WCL_CORE_0_FROM_ENTRY_8 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_8_M (WCL_CORE_0_FROM_ENTRY_8_V << WCL_CORE_0_FROM_ENTRY_8_S) +#define WCL_CORE_0_FROM_ENTRY_8_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_8_S 1 +/** WCL_CORE_0_CURRENT_8 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 8 + */ +#define WCL_CORE_0_CURRENT_8 (BIT(5)) +#define WCL_CORE_0_CURRENT_8_M (WCL_CORE_0_CURRENT_8_V << WCL_CORE_0_CURRENT_8_S) +#define WCL_CORE_0_CURRENT_8_V 0x00000001U +#define WCL_CORE_0_CURRENT_8_S 5 + +/** WCL_Core_0_STATUSTABLE9_REG register + * Status register of world switch of entry 9 + */ +#define WCL_CORE_0_STATUSTABLE9_REG (DR_REG_WCL_BASE + 0xa0) +/** WCL_CORE_0_FROM_WORLD_9 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 9 + */ +#define WCL_CORE_0_FROM_WORLD_9 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_9_M (WCL_CORE_0_FROM_WORLD_9_V << WCL_CORE_0_FROM_WORLD_9_S) +#define WCL_CORE_0_FROM_WORLD_9_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_9_S 0 +/** WCL_CORE_0_FROM_ENTRY_9 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 9 + */ +#define WCL_CORE_0_FROM_ENTRY_9 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_9_M (WCL_CORE_0_FROM_ENTRY_9_V << WCL_CORE_0_FROM_ENTRY_9_S) +#define WCL_CORE_0_FROM_ENTRY_9_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_9_S 1 +/** WCL_CORE_0_CURRENT_9 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 9 + */ +#define WCL_CORE_0_CURRENT_9 (BIT(5)) +#define WCL_CORE_0_CURRENT_9_M (WCL_CORE_0_CURRENT_9_V << WCL_CORE_0_CURRENT_9_S) +#define WCL_CORE_0_CURRENT_9_V 0x00000001U +#define WCL_CORE_0_CURRENT_9_S 5 + +/** WCL_Core_0_STATUSTABLE10_REG register + * Status register of world switch of entry 10 + */ +#define WCL_CORE_0_STATUSTABLE10_REG (DR_REG_WCL_BASE + 0xa4) +/** WCL_CORE_0_FROM_WORLD_10 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 10 + */ +#define WCL_CORE_0_FROM_WORLD_10 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_10_M (WCL_CORE_0_FROM_WORLD_10_V << WCL_CORE_0_FROM_WORLD_10_S) +#define WCL_CORE_0_FROM_WORLD_10_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_10_S 0 +/** WCL_CORE_0_FROM_ENTRY_10 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 10 + */ +#define WCL_CORE_0_FROM_ENTRY_10 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_10_M (WCL_CORE_0_FROM_ENTRY_10_V << WCL_CORE_0_FROM_ENTRY_10_S) +#define WCL_CORE_0_FROM_ENTRY_10_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_10_S 1 +/** WCL_CORE_0_CURRENT_10 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 10 + */ +#define WCL_CORE_0_CURRENT_10 (BIT(5)) +#define WCL_CORE_0_CURRENT_10_M (WCL_CORE_0_CURRENT_10_V << WCL_CORE_0_CURRENT_10_S) +#define WCL_CORE_0_CURRENT_10_V 0x00000001U +#define WCL_CORE_0_CURRENT_10_S 5 + +/** WCL_Core_0_STATUSTABLE11_REG register + * Status register of world switch of entry 11 + */ +#define WCL_CORE_0_STATUSTABLE11_REG (DR_REG_WCL_BASE + 0xa8) +/** WCL_CORE_0_FROM_WORLD_11 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 11 + */ +#define WCL_CORE_0_FROM_WORLD_11 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_11_M (WCL_CORE_0_FROM_WORLD_11_V << WCL_CORE_0_FROM_WORLD_11_S) +#define WCL_CORE_0_FROM_WORLD_11_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_11_S 0 +/** WCL_CORE_0_FROM_ENTRY_11 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 11 + */ +#define WCL_CORE_0_FROM_ENTRY_11 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_11_M (WCL_CORE_0_FROM_ENTRY_11_V << WCL_CORE_0_FROM_ENTRY_11_S) +#define WCL_CORE_0_FROM_ENTRY_11_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_11_S 1 +/** WCL_CORE_0_CURRENT_11 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 11 + */ +#define WCL_CORE_0_CURRENT_11 (BIT(5)) +#define WCL_CORE_0_CURRENT_11_M (WCL_CORE_0_CURRENT_11_V << WCL_CORE_0_CURRENT_11_S) +#define WCL_CORE_0_CURRENT_11_V 0x00000001U +#define WCL_CORE_0_CURRENT_11_S 5 + +/** WCL_Core_0_STATUSTABLE12_REG register + * Status register of world switch of entry 12 + */ +#define WCL_CORE_0_STATUSTABLE12_REG (DR_REG_WCL_BASE + 0xac) +/** WCL_CORE_0_FROM_WORLD_12 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 12 + */ +#define WCL_CORE_0_FROM_WORLD_12 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_12_M (WCL_CORE_0_FROM_WORLD_12_V << WCL_CORE_0_FROM_WORLD_12_S) +#define WCL_CORE_0_FROM_WORLD_12_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_12_S 0 +/** WCL_CORE_0_FROM_ENTRY_12 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 12 + */ +#define WCL_CORE_0_FROM_ENTRY_12 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_12_M (WCL_CORE_0_FROM_ENTRY_12_V << WCL_CORE_0_FROM_ENTRY_12_S) +#define WCL_CORE_0_FROM_ENTRY_12_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_12_S 1 +/** WCL_CORE_0_CURRENT_12 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 12 + */ +#define WCL_CORE_0_CURRENT_12 (BIT(5)) +#define WCL_CORE_0_CURRENT_12_M (WCL_CORE_0_CURRENT_12_V << WCL_CORE_0_CURRENT_12_S) +#define WCL_CORE_0_CURRENT_12_V 0x00000001U +#define WCL_CORE_0_CURRENT_12_S 5 + +/** WCL_Core_0_STATUSTABLE13_REG register + * Status register of world switch of entry 13 + */ +#define WCL_CORE_0_STATUSTABLE13_REG (DR_REG_WCL_BASE + 0xb0) +/** WCL_CORE_0_FROM_WORLD_13 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 13 + */ +#define WCL_CORE_0_FROM_WORLD_13 (BIT(0)) +#define WCL_CORE_0_FROM_WORLD_13_M (WCL_CORE_0_FROM_WORLD_13_V << WCL_CORE_0_FROM_WORLD_13_S) +#define WCL_CORE_0_FROM_WORLD_13_V 0x00000001U +#define WCL_CORE_0_FROM_WORLD_13_S 0 +/** WCL_CORE_0_FROM_ENTRY_13 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 13 + */ +#define WCL_CORE_0_FROM_ENTRY_13 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_13_M (WCL_CORE_0_FROM_ENTRY_13_V << WCL_CORE_0_FROM_ENTRY_13_S) +#define WCL_CORE_0_FROM_ENTRY_13_V 0x0000000FU +#define WCL_CORE_0_FROM_ENTRY_13_S 1 +/** WCL_CORE_0_CURRENT_13 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 13 + */ +#define WCL_CORE_0_CURRENT_13 (BIT(5)) +#define WCL_CORE_0_CURRENT_13_M (WCL_CORE_0_CURRENT_13_V << WCL_CORE_0_CURRENT_13_S) +#define WCL_CORE_0_CURRENT_13_V 0x00000001U +#define WCL_CORE_0_CURRENT_13_S 5 + +/** WCL_Core_0_STATUSTABLE_CURRENT_REG register + * Status register of statustable current + */ +#define WCL_CORE_0_STATUSTABLE_CURRENT_REG (DR_REG_WCL_BASE + 0xfc) +/** WCL_CORE_0_STATUSTABLE_CURRENT : R/W; bitpos: [13:1]; default: 0; + * This field is used to quickly read and rewrite the current field of all STATUSTABLE + * registers,for example,bit 1 represents the current field of STATUSTABLE1,bit2 + * represents the current field of STATUSTABLE2 + */ +#define WCL_CORE_0_STATUSTABLE_CURRENT 0x00001FFFU +#define WCL_CORE_0_STATUSTABLE_CURRENT_M (WCL_CORE_0_STATUSTABLE_CURRENT_V << WCL_CORE_0_STATUSTABLE_CURRENT_S) +#define WCL_CORE_0_STATUSTABLE_CURRENT_V 0x00001FFFU +#define WCL_CORE_0_STATUSTABLE_CURRENT_S 1 + +/** WCL_Core_0_MESSAGE_ADDR_REG register + * Clear writer_buffer write address configuration register + */ +#define WCL_CORE_0_MESSAGE_ADDR_REG (DR_REG_WCL_BASE + 0x100) +/** WCL_CORE_0_MESSAGE_ADDR : R/W; bitpos: [31:0]; default: 0; + * This field is used to set address that need to write when enter WORLD0 + */ +#define WCL_CORE_0_MESSAGE_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_MESSAGE_ADDR_M (WCL_CORE_0_MESSAGE_ADDR_V << WCL_CORE_0_MESSAGE_ADDR_S) +#define WCL_CORE_0_MESSAGE_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_MESSAGE_ADDR_S 0 + +/** WCL_Core_0_MESSAGE_MAX_REG register + * Clear writer_buffer write number configuration register + */ +#define WCL_CORE_0_MESSAGE_MAX_REG (DR_REG_WCL_BASE + 0x104) +/** WCL_CORE_0_MESSAGE_MAX : R/W; bitpos: [3:0]; default: 0; + * This filed is used to set the max value of clear write_buffer + */ +#define WCL_CORE_0_MESSAGE_MAX 0x0000000FU +#define WCL_CORE_0_MESSAGE_MAX_M (WCL_CORE_0_MESSAGE_MAX_V << WCL_CORE_0_MESSAGE_MAX_S) +#define WCL_CORE_0_MESSAGE_MAX_V 0x0000000FU +#define WCL_CORE_0_MESSAGE_MAX_S 0 + +/** WCL_Core_0_MESSAGE_PHASE_REG register + * Clear writer_buffer status register + */ +#define WCL_CORE_0_MESSAGE_PHASE_REG (DR_REG_WCL_BASE + 0x108) +/** WCL_CORE_0_MESSAGE_MATCH : RO; bitpos: [0]; default: 0; + * This bit indicates whether the check is successful + */ +#define WCL_CORE_0_MESSAGE_MATCH (BIT(0)) +#define WCL_CORE_0_MESSAGE_MATCH_M (WCL_CORE_0_MESSAGE_MATCH_V << WCL_CORE_0_MESSAGE_MATCH_S) +#define WCL_CORE_0_MESSAGE_MATCH_V 0x00000001U +#define WCL_CORE_0_MESSAGE_MATCH_S 0 +/** WCL_CORE_0_MESSAGE_EXPECT : RO; bitpos: [4:1]; default: 0; + * This field indicates the data to be written next time + */ +#define WCL_CORE_0_MESSAGE_EXPECT 0x0000000FU +#define WCL_CORE_0_MESSAGE_EXPECT_M (WCL_CORE_0_MESSAGE_EXPECT_V << WCL_CORE_0_MESSAGE_EXPECT_S) +#define WCL_CORE_0_MESSAGE_EXPECT_V 0x0000000FU +#define WCL_CORE_0_MESSAGE_EXPECT_S 1 +/** WCL_CORE_0_MESSAGE_DATAPHASE : RO; bitpos: [5]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation,and is + * checking data + */ +#define WCL_CORE_0_MESSAGE_DATAPHASE (BIT(5)) +#define WCL_CORE_0_MESSAGE_DATAPHASE_M (WCL_CORE_0_MESSAGE_DATAPHASE_V << WCL_CORE_0_MESSAGE_DATAPHASE_S) +#define WCL_CORE_0_MESSAGE_DATAPHASE_V 0x00000001U +#define WCL_CORE_0_MESSAGE_DATAPHASE_S 5 +/** WCL_CORE_0_MESSAGE_ADDRESSPHASE : RO; bitpos: [6]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation,and is + * checking address. + */ +#define WCL_CORE_0_MESSAGE_ADDRESSPHASE (BIT(6)) +#define WCL_CORE_0_MESSAGE_ADDRESSPHASE_M (WCL_CORE_0_MESSAGE_ADDRESSPHASE_V << WCL_CORE_0_MESSAGE_ADDRESSPHASE_S) +#define WCL_CORE_0_MESSAGE_ADDRESSPHASE_V 0x00000001U +#define WCL_CORE_0_MESSAGE_ADDRESSPHASE_S 6 + +/** WCL_Core_0_World_TRIGGER_ADDR_REG register + * Core_0 trigger address configuration Register + */ +#define WCL_CORE_0_WORLD_TRIGGER_ADDR_REG (DR_REG_WCL_BASE + 0x140) +/** WCL_CORE_0_WORLD_TRIGGER_ADDR : RW; bitpos: [31:0]; default: 0; + * This field is used to configure the entry address from WORLD0 to WORLD1,when the + * CPU executes to this address,switch to WORLD1 + */ +#define WCL_CORE_0_WORLD_TRIGGER_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_WORLD_TRIGGER_ADDR_M (WCL_CORE_0_WORLD_TRIGGER_ADDR_V << WCL_CORE_0_WORLD_TRIGGER_ADDR_S) +#define WCL_CORE_0_WORLD_TRIGGER_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_WORLD_TRIGGER_ADDR_S 0 + +/** WCL_Core_0_World_PREPARE_REG register + * Core_0 prepare world configuration Register + */ +#define WCL_CORE_0_WORLD_PREPARE_REG (DR_REG_WCL_BASE + 0x144) +/** WCL_CORE_0_WORLD_PREPARE : R/W; bitpos: [1:0]; default: 0; + * This field to used to set world to enter, 2'b01 means WORLD0, 2'b10 means WORLD1 + */ +#define WCL_CORE_0_WORLD_PREPARE 0x00000003U +#define WCL_CORE_0_WORLD_PREPARE_M (WCL_CORE_0_WORLD_PREPARE_V << WCL_CORE_0_WORLD_PREPARE_S) +#define WCL_CORE_0_WORLD_PREPARE_V 0x00000003U +#define WCL_CORE_0_WORLD_PREPARE_S 0 + +/** WCL_Core_0_World_UPDATE_REG register + * Core_0 configuration update register + */ +#define WCL_CORE_0_WORLD_UPDATE_REG (DR_REG_WCL_BASE + 0x148) +/** WCL_CORE_0_UPDATE : WO; bitpos: [31:0]; default: 0; + * This field is used to update configuration completed, can write any value,the + * hardware only checks the write operation of this register and does not case about + * its value + */ +#define WCL_CORE_0_UPDATE 0xFFFFFFFFU +#define WCL_CORE_0_UPDATE_M (WCL_CORE_0_UPDATE_V << WCL_CORE_0_UPDATE_S) +#define WCL_CORE_0_UPDATE_V 0xFFFFFFFFU +#define WCL_CORE_0_UPDATE_S 0 + +/** WCL_Core_0_World_Cancel_REG register + * Core_0 configuration cancel register + */ +#define WCL_CORE_0_WORLD_CANCEL_REG (DR_REG_WCL_BASE + 0x14c) +/** WCL_CORE_0_WORLD_CANCEL : WO; bitpos: [31:0]; default: 0; + * This field is used to cancel switch world configuration,if the trigger address and + * update configuration complete,use this register to cancel world switch, jujst need + * write any value,the hardware only checks the write operation of this register and + * does not case about its value + */ +#define WCL_CORE_0_WORLD_CANCEL 0xFFFFFFFFU +#define WCL_CORE_0_WORLD_CANCEL_M (WCL_CORE_0_WORLD_CANCEL_V << WCL_CORE_0_WORLD_CANCEL_S) +#define WCL_CORE_0_WORLD_CANCEL_V 0xFFFFFFFFU +#define WCL_CORE_0_WORLD_CANCEL_S 0 + +/** WCL_Core_0_World_IRam0_REG register + * Core_0 Iram0 world register + */ +#define WCL_CORE_0_WORLD_IRAM0_REG (DR_REG_WCL_BASE + 0x150) +/** WCL_CORE_0_WORLD_IRAM0 : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Iram0 bus + */ +#define WCL_CORE_0_WORLD_IRAM0 0x00000003U +#define WCL_CORE_0_WORLD_IRAM0_M (WCL_CORE_0_WORLD_IRAM0_V << WCL_CORE_0_WORLD_IRAM0_S) +#define WCL_CORE_0_WORLD_IRAM0_V 0x00000003U +#define WCL_CORE_0_WORLD_IRAM0_S 0 + +/** WCL_Core_0_World_DRam0_PIF_REG register + * Core_0 dram0 and PIF world register + */ +#define WCL_CORE_0_WORLD_DRAM0_PIF_REG (DR_REG_WCL_BASE + 0x154) +/** WCL_CORE_0_WORLD_DRAM0_PIF : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Dram0 bus and PIF bus + */ +#define WCL_CORE_0_WORLD_DRAM0_PIF 0x00000003U +#define WCL_CORE_0_WORLD_DRAM0_PIF_M (WCL_CORE_0_WORLD_DRAM0_PIF_V << WCL_CORE_0_WORLD_DRAM0_PIF_S) +#define WCL_CORE_0_WORLD_DRAM0_PIF_V 0x00000003U +#define WCL_CORE_0_WORLD_DRAM0_PIF_S 0 + +/** WCL_Core_0_World_Phase_REG register + * Core_0 world status register + */ +#define WCL_CORE_0_WORLD_PHASE_REG (DR_REG_WCL_BASE + 0x158) +/** WCL_CORE_0_WORLD_PHASE : RO; bitpos: [0]; default: 0; + * This bit indicates whether is preparing to switch to WORLD1, 1 means value. + */ +#define WCL_CORE_0_WORLD_PHASE (BIT(0)) +#define WCL_CORE_0_WORLD_PHASE_M (WCL_CORE_0_WORLD_PHASE_V << WCL_CORE_0_WORLD_PHASE_S) +#define WCL_CORE_0_WORLD_PHASE_V 0x00000001U +#define WCL_CORE_0_WORLD_PHASE_S 0 + +/** WCL_Core_0_NMI_MASK_ENABLE_REG register + * Core_0 NMI mask enable register + */ +#define WCL_CORE_0_NMI_MASK_ENABLE_REG (DR_REG_WCL_BASE + 0x180) +/** WCL_CORE_0_NMI_MASK_ENABLE : WO; bitpos: [31:0]; default: 0; + * this field is used to set NMI mask,it can write any value,when write this + * register,the hardware start masking NMI interrupt + */ +#define WCL_CORE_0_NMI_MASK_ENABLE 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_ENABLE_M (WCL_CORE_0_NMI_MASK_ENABLE_V << WCL_CORE_0_NMI_MASK_ENABLE_S) +#define WCL_CORE_0_NMI_MASK_ENABLE_V 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_ENABLE_S 0 + +/** WCL_Core_0_NMI_MASK_TRIGGER_ADDR_REG register + * Core_0 NMI mask trigger address register + */ +#define WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_REG (DR_REG_WCL_BASE + 0x184) +/** WCL_CORE_0_NMI_MASK_TRIGGER_ADDR : R/W; bitpos: [31:0]; default: 0; + * this field to used to set trigger address, when CPU executes to this address,NMI + * mask automatically fails + */ +#define WCL_CORE_0_NMI_MASK_TRIGGER_ADDR 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_M (WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_V << WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_S) +#define WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_TRIGGER_ADDR_S 0 + +/** WCL_Core_0_NMI_MASK_DISABLE_REG register + * Core_0 NMI mask disable register + */ +#define WCL_CORE_0_NMI_MASK_DISABLE_REG (DR_REG_WCL_BASE + 0x188) +/** WCL_CORE_0_NMI_MASK_DISABLE : WO; bitpos: [31:0]; default: 0; + * this field is used to disable NMI mask,it will not take effect immediately,only + * when the CPU executes to the trigger address will it start to cancel NMI mask + */ +#define WCL_CORE_0_NMI_MASK_DISABLE 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_DISABLE_M (WCL_CORE_0_NMI_MASK_DISABLE_V << WCL_CORE_0_NMI_MASK_DISABLE_S) +#define WCL_CORE_0_NMI_MASK_DISABLE_V 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_DISABLE_S 0 + +/** WCL_Core_0_NMI_MASK_CANCLE_REG register + * Core_0 NMI mask disable register + */ +#define WCL_CORE_0_NMI_MASK_CANCLE_REG (DR_REG_WCL_BASE + 0x18c) +/** WCL_CORE_0_NMI_MASK_CANCEL : WO; bitpos: [31:0]; default: 0; + * this field is used to cancel NMI mask disable function. + */ +#define WCL_CORE_0_NMI_MASK_CANCEL 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_CANCEL_M (WCL_CORE_0_NMI_MASK_CANCEL_V << WCL_CORE_0_NMI_MASK_CANCEL_S) +#define WCL_CORE_0_NMI_MASK_CANCEL_V 0xFFFFFFFFU +#define WCL_CORE_0_NMI_MASK_CANCEL_S 0 + +/** WCL_Core_0_NMI_MASK_REG register + * Core_0 NMI mask register + */ +#define WCL_CORE_0_NMI_MASK_REG (DR_REG_WCL_BASE + 0x190) +/** WCL_CORE_0_NMI_MASK : R/W; bitpos: [0]; default: 0; + * this bit is used to mask NMI interrupt,it can directly mask NMI interrupt + */ +#define WCL_CORE_0_NMI_MASK (BIT(0)) +#define WCL_CORE_0_NMI_MASK_M (WCL_CORE_0_NMI_MASK_V << WCL_CORE_0_NMI_MASK_S) +#define WCL_CORE_0_NMI_MASK_V 0x00000001U +#define WCL_CORE_0_NMI_MASK_S 0 + +/** WCL_Core_0_NMI_MASK_PHASE_REG register + * Core_0 NMI mask phase register + */ +#define WCL_CORE_0_NMI_MASK_PHASE_REG (DR_REG_WCL_BASE + 0x194) +/** WCL_CORE_0_NMI_MASK_PHASE : RO; bitpos: [0]; default: 0; + * this bit is used to indicates whether the NMI interrupt is being masked, 1 means + * NMI interrupt is being masked + */ +#define WCL_CORE_0_NMI_MASK_PHASE (BIT(0)) +#define WCL_CORE_0_NMI_MASK_PHASE_M (WCL_CORE_0_NMI_MASK_PHASE_V << WCL_CORE_0_NMI_MASK_PHASE_S) +#define WCL_CORE_0_NMI_MASK_PHASE_V 0x00000001U +#define WCL_CORE_0_NMI_MASK_PHASE_S 0 + +/** WCL_Core_1_ENTRY_1_ADDR_REG register + * Core_1 Entry 1 address configuration Register + */ +#define WCL_CORE_1_ENTRY_1_ADDR_REG (DR_REG_WCL_BASE + 0x400) +/** WCL_CORE_1_ENTRY_1_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 1 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_1_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_1_ADDR_M (WCL_CORE_1_ENTRY_1_ADDR_V << WCL_CORE_1_ENTRY_1_ADDR_S) +#define WCL_CORE_1_ENTRY_1_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_1_ADDR_S 0 + +/** WCL_Core_1_ENTRY_2_ADDR_REG register + * Core_1 Entry 2 address configuration Register + */ +#define WCL_CORE_1_ENTRY_2_ADDR_REG (DR_REG_WCL_BASE + 0x404) +/** WCL_CORE_1_ENTRY_2_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 2 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_2_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_2_ADDR_M (WCL_CORE_1_ENTRY_2_ADDR_V << WCL_CORE_1_ENTRY_2_ADDR_S) +#define WCL_CORE_1_ENTRY_2_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_2_ADDR_S 0 + +/** WCL_Core_1_ENTRY_3_ADDR_REG register + * Core_1 Entry 3 address configuration Register + */ +#define WCL_CORE_1_ENTRY_3_ADDR_REG (DR_REG_WCL_BASE + 0x408) +/** WCL_CORE_1_ENTRY_3_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 3 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_3_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_3_ADDR_M (WCL_CORE_1_ENTRY_3_ADDR_V << WCL_CORE_1_ENTRY_3_ADDR_S) +#define WCL_CORE_1_ENTRY_3_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_3_ADDR_S 0 + +/** WCL_Core_1_ENTRY_4_ADDR_REG register + * Core_1 Entry 4 address configuration Register + */ +#define WCL_CORE_1_ENTRY_4_ADDR_REG (DR_REG_WCL_BASE + 0x40c) +/** WCL_CORE_1_ENTRY_4_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 4 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_4_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_4_ADDR_M (WCL_CORE_1_ENTRY_4_ADDR_V << WCL_CORE_1_ENTRY_4_ADDR_S) +#define WCL_CORE_1_ENTRY_4_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_4_ADDR_S 0 + +/** WCL_Core_1_ENTRY_5_ADDR_REG register + * Core_1 Entry 5 address configuration Register + */ +#define WCL_CORE_1_ENTRY_5_ADDR_REG (DR_REG_WCL_BASE + 0x410) +/** WCL_CORE_1_ENTRY_5_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 5 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_5_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_5_ADDR_M (WCL_CORE_1_ENTRY_5_ADDR_V << WCL_CORE_1_ENTRY_5_ADDR_S) +#define WCL_CORE_1_ENTRY_5_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_5_ADDR_S 0 + +/** WCL_Core_1_ENTRY_6_ADDR_REG register + * Core_1 Entry 6 address configuration Register + */ +#define WCL_CORE_1_ENTRY_6_ADDR_REG (DR_REG_WCL_BASE + 0x414) +/** WCL_CORE_1_ENTRY_6_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 6 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_6_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_6_ADDR_M (WCL_CORE_1_ENTRY_6_ADDR_V << WCL_CORE_1_ENTRY_6_ADDR_S) +#define WCL_CORE_1_ENTRY_6_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_6_ADDR_S 0 + +/** WCL_Core_1_ENTRY_7_ADDR_REG register + * Core_1 Entry 7 address configuration Register + */ +#define WCL_CORE_1_ENTRY_7_ADDR_REG (DR_REG_WCL_BASE + 0x418) +/** WCL_CORE_1_ENTRY_7_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 7 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_7_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_7_ADDR_M (WCL_CORE_1_ENTRY_7_ADDR_V << WCL_CORE_1_ENTRY_7_ADDR_S) +#define WCL_CORE_1_ENTRY_7_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_7_ADDR_S 0 + +/** WCL_Core_1_ENTRY_8_ADDR_REG register + * Core_1 Entry 8 address configuration Register + */ +#define WCL_CORE_1_ENTRY_8_ADDR_REG (DR_REG_WCL_BASE + 0x41c) +/** WCL_CORE_1_ENTRY_8_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 8 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_8_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_8_ADDR_M (WCL_CORE_1_ENTRY_8_ADDR_V << WCL_CORE_1_ENTRY_8_ADDR_S) +#define WCL_CORE_1_ENTRY_8_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_8_ADDR_S 0 + +/** WCL_Core_1_ENTRY_9_ADDR_REG register + * Core_1 Entry 9 address configuration Register + */ +#define WCL_CORE_1_ENTRY_9_ADDR_REG (DR_REG_WCL_BASE + 0x420) +/** WCL_CORE_1_ENTRY_9_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 9 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_9_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_9_ADDR_M (WCL_CORE_1_ENTRY_9_ADDR_V << WCL_CORE_1_ENTRY_9_ADDR_S) +#define WCL_CORE_1_ENTRY_9_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_9_ADDR_S 0 + +/** WCL_Core_1_ENTRY_10_ADDR_REG register + * Core_1 Entry 10 address configuration Register + */ +#define WCL_CORE_1_ENTRY_10_ADDR_REG (DR_REG_WCL_BASE + 0x424) +/** WCL_CORE_1_ENTRY_10_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 10 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_10_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_10_ADDR_M (WCL_CORE_1_ENTRY_10_ADDR_V << WCL_CORE_1_ENTRY_10_ADDR_S) +#define WCL_CORE_1_ENTRY_10_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_10_ADDR_S 0 + +/** WCL_Core_1_ENTRY_11_ADDR_REG register + * Core_1 Entry 11 address configuration Register + */ +#define WCL_CORE_1_ENTRY_11_ADDR_REG (DR_REG_WCL_BASE + 0x428) +/** WCL_CORE_1_ENTRY_11_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 11 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_11_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_11_ADDR_M (WCL_CORE_1_ENTRY_11_ADDR_V << WCL_CORE_1_ENTRY_11_ADDR_S) +#define WCL_CORE_1_ENTRY_11_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_11_ADDR_S 0 + +/** WCL_Core_1_ENTRY_12_ADDR_REG register + * Core_1 Entry 12 address configuration Register + */ +#define WCL_CORE_1_ENTRY_12_ADDR_REG (DR_REG_WCL_BASE + 0x42c) +/** WCL_CORE_1_ENTRY_12_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 12 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_12_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_12_ADDR_M (WCL_CORE_1_ENTRY_12_ADDR_V << WCL_CORE_1_ENTRY_12_ADDR_S) +#define WCL_CORE_1_ENTRY_12_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_12_ADDR_S 0 + +/** WCL_Core_1_ENTRY_13_ADDR_REG register + * Core_1 Entry 13 address configuration Register + */ +#define WCL_CORE_1_ENTRY_13_ADDR_REG (DR_REG_WCL_BASE + 0x430) +/** WCL_CORE_1_ENTRY_13_ADDR : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 13 address from WORLD1 to WORLD0 + */ +#define WCL_CORE_1_ENTRY_13_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_13_ADDR_M (WCL_CORE_1_ENTRY_13_ADDR_V << WCL_CORE_1_ENTRY_13_ADDR_S) +#define WCL_CORE_1_ENTRY_13_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_ENTRY_13_ADDR_S 0 + +/** WCL_Core_1_ENTRY_CHECK_REG register + * Core_1 Entry check configuration Register + */ +#define WCL_CORE_1_ENTRY_CHECK_REG (DR_REG_WCL_BASE + 0x47c) +/** WCL_CORE_1_ENTRY_CHECK : R/W; bitpos: [13:1]; default: 1; + * This filed is used to enable entry address check + */ +#define WCL_CORE_1_ENTRY_CHECK 0x00001FFFU +#define WCL_CORE_1_ENTRY_CHECK_M (WCL_CORE_1_ENTRY_CHECK_V << WCL_CORE_1_ENTRY_CHECK_S) +#define WCL_CORE_1_ENTRY_CHECK_V 0x00001FFFU +#define WCL_CORE_1_ENTRY_CHECK_S 1 + +/** WCL_Core_1_STATUSTABLE1_REG register + * Status register of world switch of entry 1 + */ +#define WCL_CORE_1_STATUSTABLE1_REG (DR_REG_WCL_BASE + 0x480) +/** WCL_CORE_1_FROM_WORLD_1 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 1 + */ +#define WCL_CORE_1_FROM_WORLD_1 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_1_M (WCL_CORE_1_FROM_WORLD_1_V << WCL_CORE_1_FROM_WORLD_1_S) +#define WCL_CORE_1_FROM_WORLD_1_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_1_S 0 +/** WCL_CORE_1_FROM_ENTRY_1 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 1 + */ +#define WCL_CORE_1_FROM_ENTRY_1 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_1_M (WCL_CORE_1_FROM_ENTRY_1_V << WCL_CORE_1_FROM_ENTRY_1_S) +#define WCL_CORE_1_FROM_ENTRY_1_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_1_S 1 +/** WCL_CORE_1_CURRENT_1 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 1 + */ +#define WCL_CORE_1_CURRENT_1 (BIT(5)) +#define WCL_CORE_1_CURRENT_1_M (WCL_CORE_1_CURRENT_1_V << WCL_CORE_1_CURRENT_1_S) +#define WCL_CORE_1_CURRENT_1_V 0x00000001U +#define WCL_CORE_1_CURRENT_1_S 5 + +/** WCL_Core_1_STATUSTABLE2_REG register + * Status register of world switch of entry 2 + */ +#define WCL_CORE_1_STATUSTABLE2_REG (DR_REG_WCL_BASE + 0x484) +/** WCL_CORE_1_FROM_WORLD_2 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 2 + */ +#define WCL_CORE_1_FROM_WORLD_2 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_2_M (WCL_CORE_1_FROM_WORLD_2_V << WCL_CORE_1_FROM_WORLD_2_S) +#define WCL_CORE_1_FROM_WORLD_2_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_2_S 0 +/** WCL_CORE_1_FROM_ENTRY_2 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 2 + */ +#define WCL_CORE_1_FROM_ENTRY_2 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_2_M (WCL_CORE_1_FROM_ENTRY_2_V << WCL_CORE_1_FROM_ENTRY_2_S) +#define WCL_CORE_1_FROM_ENTRY_2_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_2_S 1 +/** WCL_CORE_1_CURRENT_2 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 2 + */ +#define WCL_CORE_1_CURRENT_2 (BIT(5)) +#define WCL_CORE_1_CURRENT_2_M (WCL_CORE_1_CURRENT_2_V << WCL_CORE_1_CURRENT_2_S) +#define WCL_CORE_1_CURRENT_2_V 0x00000001U +#define WCL_CORE_1_CURRENT_2_S 5 + +/** WCL_Core_1_STATUSTABLE3_REG register + * Status register of world switch of entry 3 + */ +#define WCL_CORE_1_STATUSTABLE3_REG (DR_REG_WCL_BASE + 0x488) +/** WCL_CORE_1_FROM_WORLD_3 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 3 + */ +#define WCL_CORE_1_FROM_WORLD_3 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_3_M (WCL_CORE_1_FROM_WORLD_3_V << WCL_CORE_1_FROM_WORLD_3_S) +#define WCL_CORE_1_FROM_WORLD_3_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_3_S 0 +/** WCL_CORE_1_FROM_ENTRY_3 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 3 + */ +#define WCL_CORE_1_FROM_ENTRY_3 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_3_M (WCL_CORE_1_FROM_ENTRY_3_V << WCL_CORE_1_FROM_ENTRY_3_S) +#define WCL_CORE_1_FROM_ENTRY_3_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_3_S 1 +/** WCL_CORE_1_CURRENT_3 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 3 + */ +#define WCL_CORE_1_CURRENT_3 (BIT(5)) +#define WCL_CORE_1_CURRENT_3_M (WCL_CORE_1_CURRENT_3_V << WCL_CORE_1_CURRENT_3_S) +#define WCL_CORE_1_CURRENT_3_V 0x00000001U +#define WCL_CORE_1_CURRENT_3_S 5 + +/** WCL_Core_1_STATUSTABLE4_REG register + * Status register of world switch of entry 4 + */ +#define WCL_CORE_1_STATUSTABLE4_REG (DR_REG_WCL_BASE + 0x48c) +/** WCL_CORE_1_FROM_WORLD_4 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 4 + */ +#define WCL_CORE_1_FROM_WORLD_4 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_4_M (WCL_CORE_1_FROM_WORLD_4_V << WCL_CORE_1_FROM_WORLD_4_S) +#define WCL_CORE_1_FROM_WORLD_4_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_4_S 0 +/** WCL_CORE_1_FROM_ENTRY_4 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 4 + */ +#define WCL_CORE_1_FROM_ENTRY_4 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_4_M (WCL_CORE_1_FROM_ENTRY_4_V << WCL_CORE_1_FROM_ENTRY_4_S) +#define WCL_CORE_1_FROM_ENTRY_4_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_4_S 1 +/** WCL_CORE_1_CURRENT_4 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 4 + */ +#define WCL_CORE_1_CURRENT_4 (BIT(5)) +#define WCL_CORE_1_CURRENT_4_M (WCL_CORE_1_CURRENT_4_V << WCL_CORE_1_CURRENT_4_S) +#define WCL_CORE_1_CURRENT_4_V 0x00000001U +#define WCL_CORE_1_CURRENT_4_S 5 + +/** WCL_Core_1_STATUSTABLE5_REG register + * Status register of world switch of entry 5 + */ +#define WCL_CORE_1_STATUSTABLE5_REG (DR_REG_WCL_BASE + 0x490) +/** WCL_CORE_1_FROM_WORLD_5 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 5 + */ +#define WCL_CORE_1_FROM_WORLD_5 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_5_M (WCL_CORE_1_FROM_WORLD_5_V << WCL_CORE_1_FROM_WORLD_5_S) +#define WCL_CORE_1_FROM_WORLD_5_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_5_S 0 +/** WCL_CORE_1_FROM_ENTRY_5 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 5 + */ +#define WCL_CORE_1_FROM_ENTRY_5 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_5_M (WCL_CORE_1_FROM_ENTRY_5_V << WCL_CORE_1_FROM_ENTRY_5_S) +#define WCL_CORE_1_FROM_ENTRY_5_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_5_S 1 +/** WCL_CORE_1_CURRENT_5 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 5 + */ +#define WCL_CORE_1_CURRENT_5 (BIT(5)) +#define WCL_CORE_1_CURRENT_5_M (WCL_CORE_1_CURRENT_5_V << WCL_CORE_1_CURRENT_5_S) +#define WCL_CORE_1_CURRENT_5_V 0x00000001U +#define WCL_CORE_1_CURRENT_5_S 5 + +/** WCL_Core_1_STATUSTABLE6_REG register + * Status register of world switch of entry 6 + */ +#define WCL_CORE_1_STATUSTABLE6_REG (DR_REG_WCL_BASE + 0x494) +/** WCL_CORE_1_FROM_WORLD_6 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 6 + */ +#define WCL_CORE_1_FROM_WORLD_6 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_6_M (WCL_CORE_1_FROM_WORLD_6_V << WCL_CORE_1_FROM_WORLD_6_S) +#define WCL_CORE_1_FROM_WORLD_6_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_6_S 0 +/** WCL_CORE_1_FROM_ENTRY_6 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 6 + */ +#define WCL_CORE_1_FROM_ENTRY_6 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_6_M (WCL_CORE_1_FROM_ENTRY_6_V << WCL_CORE_1_FROM_ENTRY_6_S) +#define WCL_CORE_1_FROM_ENTRY_6_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_6_S 1 +/** WCL_CORE_1_CURRENT_6 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 6 + */ +#define WCL_CORE_1_CURRENT_6 (BIT(5)) +#define WCL_CORE_1_CURRENT_6_M (WCL_CORE_1_CURRENT_6_V << WCL_CORE_1_CURRENT_6_S) +#define WCL_CORE_1_CURRENT_6_V 0x00000001U +#define WCL_CORE_1_CURRENT_6_S 5 + +/** WCL_Core_1_STATUSTABLE7_REG register + * Status register of world switch of entry 7 + */ +#define WCL_CORE_1_STATUSTABLE7_REG (DR_REG_WCL_BASE + 0x498) +/** WCL_CORE_1_FROM_WORLD_7 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 7 + */ +#define WCL_CORE_1_FROM_WORLD_7 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_7_M (WCL_CORE_1_FROM_WORLD_7_V << WCL_CORE_1_FROM_WORLD_7_S) +#define WCL_CORE_1_FROM_WORLD_7_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_7_S 0 +/** WCL_CORE_1_FROM_ENTRY_7 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 7 + */ +#define WCL_CORE_1_FROM_ENTRY_7 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_7_M (WCL_CORE_1_FROM_ENTRY_7_V << WCL_CORE_1_FROM_ENTRY_7_S) +#define WCL_CORE_1_FROM_ENTRY_7_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_7_S 1 +/** WCL_CORE_1_CURRENT_7 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 7 + */ +#define WCL_CORE_1_CURRENT_7 (BIT(5)) +#define WCL_CORE_1_CURRENT_7_M (WCL_CORE_1_CURRENT_7_V << WCL_CORE_1_CURRENT_7_S) +#define WCL_CORE_1_CURRENT_7_V 0x00000001U +#define WCL_CORE_1_CURRENT_7_S 5 + +/** WCL_Core_1_STATUSTABLE8_REG register + * Status register of world switch of entry 8 + */ +#define WCL_CORE_1_STATUSTABLE8_REG (DR_REG_WCL_BASE + 0x49c) +/** WCL_CORE_1_FROM_WORLD_8 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 8 + */ +#define WCL_CORE_1_FROM_WORLD_8 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_8_M (WCL_CORE_1_FROM_WORLD_8_V << WCL_CORE_1_FROM_WORLD_8_S) +#define WCL_CORE_1_FROM_WORLD_8_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_8_S 0 +/** WCL_CORE_1_FROM_ENTRY_8 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 8 + */ +#define WCL_CORE_1_FROM_ENTRY_8 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_8_M (WCL_CORE_1_FROM_ENTRY_8_V << WCL_CORE_1_FROM_ENTRY_8_S) +#define WCL_CORE_1_FROM_ENTRY_8_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_8_S 1 +/** WCL_CORE_1_CURRENT_8 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 8 + */ +#define WCL_CORE_1_CURRENT_8 (BIT(5)) +#define WCL_CORE_1_CURRENT_8_M (WCL_CORE_1_CURRENT_8_V << WCL_CORE_1_CURRENT_8_S) +#define WCL_CORE_1_CURRENT_8_V 0x00000001U +#define WCL_CORE_1_CURRENT_8_S 5 + +/** WCL_Core_1_STATUSTABLE9_REG register + * Status register of world switch of entry 9 + */ +#define WCL_CORE_1_STATUSTABLE9_REG (DR_REG_WCL_BASE + 0x4a0) +/** WCL_CORE_1_FROM_WORLD_9 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 9 + */ +#define WCL_CORE_1_FROM_WORLD_9 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_9_M (WCL_CORE_1_FROM_WORLD_9_V << WCL_CORE_1_FROM_WORLD_9_S) +#define WCL_CORE_1_FROM_WORLD_9_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_9_S 0 +/** WCL_CORE_1_FROM_ENTRY_9 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 9 + */ +#define WCL_CORE_1_FROM_ENTRY_9 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_9_M (WCL_CORE_1_FROM_ENTRY_9_V << WCL_CORE_1_FROM_ENTRY_9_S) +#define WCL_CORE_1_FROM_ENTRY_9_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_9_S 1 +/** WCL_CORE_1_CURRENT_9 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 9 + */ +#define WCL_CORE_1_CURRENT_9 (BIT(5)) +#define WCL_CORE_1_CURRENT_9_M (WCL_CORE_1_CURRENT_9_V << WCL_CORE_1_CURRENT_9_S) +#define WCL_CORE_1_CURRENT_9_V 0x00000001U +#define WCL_CORE_1_CURRENT_9_S 5 + +/** WCL_Core_1_STATUSTABLE10_REG register + * Status register of world switch of entry 10 + */ +#define WCL_CORE_1_STATUSTABLE10_REG (DR_REG_WCL_BASE + 0x4a4) +/** WCL_CORE_1_FROM_WORLD_10 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 10 + */ +#define WCL_CORE_1_FROM_WORLD_10 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_10_M (WCL_CORE_1_FROM_WORLD_10_V << WCL_CORE_1_FROM_WORLD_10_S) +#define WCL_CORE_1_FROM_WORLD_10_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_10_S 0 +/** WCL_CORE_1_FROM_ENTRY_10 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 10 + */ +#define WCL_CORE_1_FROM_ENTRY_10 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_10_M (WCL_CORE_1_FROM_ENTRY_10_V << WCL_CORE_1_FROM_ENTRY_10_S) +#define WCL_CORE_1_FROM_ENTRY_10_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_10_S 1 +/** WCL_CORE_1_CURRENT_10 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 10 + */ +#define WCL_CORE_1_CURRENT_10 (BIT(5)) +#define WCL_CORE_1_CURRENT_10_M (WCL_CORE_1_CURRENT_10_V << WCL_CORE_1_CURRENT_10_S) +#define WCL_CORE_1_CURRENT_10_V 0x00000001U +#define WCL_CORE_1_CURRENT_10_S 5 + +/** WCL_Core_1_STATUSTABLE11_REG register + * Status register of world switch of entry 11 + */ +#define WCL_CORE_1_STATUSTABLE11_REG (DR_REG_WCL_BASE + 0x4a8) +/** WCL_CORE_1_FROM_WORLD_11 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 11 + */ +#define WCL_CORE_1_FROM_WORLD_11 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_11_M (WCL_CORE_1_FROM_WORLD_11_V << WCL_CORE_1_FROM_WORLD_11_S) +#define WCL_CORE_1_FROM_WORLD_11_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_11_S 0 +/** WCL_CORE_1_FROM_ENTRY_11 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 11 + */ +#define WCL_CORE_1_FROM_ENTRY_11 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_11_M (WCL_CORE_1_FROM_ENTRY_11_V << WCL_CORE_1_FROM_ENTRY_11_S) +#define WCL_CORE_1_FROM_ENTRY_11_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_11_S 1 +/** WCL_CORE_1_CURRENT_11 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 11 + */ +#define WCL_CORE_1_CURRENT_11 (BIT(5)) +#define WCL_CORE_1_CURRENT_11_M (WCL_CORE_1_CURRENT_11_V << WCL_CORE_1_CURRENT_11_S) +#define WCL_CORE_1_CURRENT_11_V 0x00000001U +#define WCL_CORE_1_CURRENT_11_S 5 + +/** WCL_Core_1_STATUSTABLE12_REG register + * Status register of world switch of entry 12 + */ +#define WCL_CORE_1_STATUSTABLE12_REG (DR_REG_WCL_BASE + 0x4ac) +/** WCL_CORE_1_FROM_WORLD_12 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 12 + */ +#define WCL_CORE_1_FROM_WORLD_12 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_12_M (WCL_CORE_1_FROM_WORLD_12_V << WCL_CORE_1_FROM_WORLD_12_S) +#define WCL_CORE_1_FROM_WORLD_12_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_12_S 0 +/** WCL_CORE_1_FROM_ENTRY_12 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 12 + */ +#define WCL_CORE_1_FROM_ENTRY_12 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_12_M (WCL_CORE_1_FROM_ENTRY_12_V << WCL_CORE_1_FROM_ENTRY_12_S) +#define WCL_CORE_1_FROM_ENTRY_12_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_12_S 1 +/** WCL_CORE_1_CURRENT_12 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 12 + */ +#define WCL_CORE_1_CURRENT_12 (BIT(5)) +#define WCL_CORE_1_CURRENT_12_M (WCL_CORE_1_CURRENT_12_V << WCL_CORE_1_CURRENT_12_S) +#define WCL_CORE_1_CURRENT_12_V 0x00000001U +#define WCL_CORE_1_CURRENT_12_S 5 + +/** WCL_Core_1_STATUSTABLE13_REG register + * Status register of world switch of entry 13 + */ +#define WCL_CORE_1_STATUSTABLE13_REG (DR_REG_WCL_BASE + 0x4b0) +/** WCL_CORE_1_FROM_WORLD_13 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 13 + */ +#define WCL_CORE_1_FROM_WORLD_13 (BIT(0)) +#define WCL_CORE_1_FROM_WORLD_13_M (WCL_CORE_1_FROM_WORLD_13_V << WCL_CORE_1_FROM_WORLD_13_S) +#define WCL_CORE_1_FROM_WORLD_13_V 0x00000001U +#define WCL_CORE_1_FROM_WORLD_13_S 0 +/** WCL_CORE_1_FROM_ENTRY_13 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 13 + */ +#define WCL_CORE_1_FROM_ENTRY_13 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_13_M (WCL_CORE_1_FROM_ENTRY_13_V << WCL_CORE_1_FROM_ENTRY_13_S) +#define WCL_CORE_1_FROM_ENTRY_13_V 0x0000000FU +#define WCL_CORE_1_FROM_ENTRY_13_S 1 +/** WCL_CORE_1_CURRENT_13 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 13 + */ +#define WCL_CORE_1_CURRENT_13 (BIT(5)) +#define WCL_CORE_1_CURRENT_13_M (WCL_CORE_1_CURRENT_13_V << WCL_CORE_1_CURRENT_13_S) +#define WCL_CORE_1_CURRENT_13_V 0x00000001U +#define WCL_CORE_1_CURRENT_13_S 5 + +/** WCL_Core_1_STATUSTABLE_CURRENT_REG register + * Status register of statustable current + */ +#define WCL_CORE_1_STATUSTABLE_CURRENT_REG (DR_REG_WCL_BASE + 0x4fc) +/** WCL_CORE_1_STATUSTABLE_CURRENT : R/W; bitpos: [13:1]; default: 0; + * This field is used to quickly read and rewrite the current field of all STATUSTABLE + * registers,for example,bit 1 represents the current field of STATUSTABLE1 + */ +#define WCL_CORE_1_STATUSTABLE_CURRENT 0x00001FFFU +#define WCL_CORE_1_STATUSTABLE_CURRENT_M (WCL_CORE_1_STATUSTABLE_CURRENT_V << WCL_CORE_1_STATUSTABLE_CURRENT_S) +#define WCL_CORE_1_STATUSTABLE_CURRENT_V 0x00001FFFU +#define WCL_CORE_1_STATUSTABLE_CURRENT_S 1 + +/** WCL_Core_1_MESSAGE_ADDR_REG register + * Clear writer_buffer write address configuration register + */ +#define WCL_CORE_1_MESSAGE_ADDR_REG (DR_REG_WCL_BASE + 0x500) +/** WCL_CORE_1_MESSAGE_ADDR : R/W; bitpos: [31:0]; default: 0; + * This field is used to set address that need to write when enter WORLD0 + */ +#define WCL_CORE_1_MESSAGE_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_MESSAGE_ADDR_M (WCL_CORE_1_MESSAGE_ADDR_V << WCL_CORE_1_MESSAGE_ADDR_S) +#define WCL_CORE_1_MESSAGE_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_MESSAGE_ADDR_S 0 + +/** WCL_Core_1_MESSAGE_MAX_REG register + * Clear writer_buffer write number configuration register + */ +#define WCL_CORE_1_MESSAGE_MAX_REG (DR_REG_WCL_BASE + 0x504) +/** WCL_CORE_1_MESSAGE_MAX : R/W; bitpos: [3:0]; default: 0; + * This filed is used to set the max value of clear write_buffer + */ +#define WCL_CORE_1_MESSAGE_MAX 0x0000000FU +#define WCL_CORE_1_MESSAGE_MAX_M (WCL_CORE_1_MESSAGE_MAX_V << WCL_CORE_1_MESSAGE_MAX_S) +#define WCL_CORE_1_MESSAGE_MAX_V 0x0000000FU +#define WCL_CORE_1_MESSAGE_MAX_S 0 + +/** WCL_Core_1_MESSAGE_PHASE_REG register + * Clear writer_buffer status register + */ +#define WCL_CORE_1_MESSAGE_PHASE_REG (DR_REG_WCL_BASE + 0x508) +/** WCL_CORE_1_MESSAGE_MATCH : RO; bitpos: [0]; default: 0; + * This bit indicates whether the check is successful + */ +#define WCL_CORE_1_MESSAGE_MATCH (BIT(0)) +#define WCL_CORE_1_MESSAGE_MATCH_M (WCL_CORE_1_MESSAGE_MATCH_V << WCL_CORE_1_MESSAGE_MATCH_S) +#define WCL_CORE_1_MESSAGE_MATCH_V 0x00000001U +#define WCL_CORE_1_MESSAGE_MATCH_S 0 +/** WCL_CORE_1_MESSAGE_EXPECT : RO; bitpos: [4:1]; default: 0; + * This field indicates the data to be written next time + */ +#define WCL_CORE_1_MESSAGE_EXPECT 0x0000000FU +#define WCL_CORE_1_MESSAGE_EXPECT_M (WCL_CORE_1_MESSAGE_EXPECT_V << WCL_CORE_1_MESSAGE_EXPECT_S) +#define WCL_CORE_1_MESSAGE_EXPECT_V 0x0000000FU +#define WCL_CORE_1_MESSAGE_EXPECT_S 1 +/** WCL_CORE_1_MESSAGE_DATAPHASE : RO; bitpos: [5]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation, and is + * checking data + */ +#define WCL_CORE_1_MESSAGE_DATAPHASE (BIT(5)) +#define WCL_CORE_1_MESSAGE_DATAPHASE_M (WCL_CORE_1_MESSAGE_DATAPHASE_V << WCL_CORE_1_MESSAGE_DATAPHASE_S) +#define WCL_CORE_1_MESSAGE_DATAPHASE_V 0x00000001U +#define WCL_CORE_1_MESSAGE_DATAPHASE_S 5 +/** WCL_CORE_1_MESSAGE_ADDRESSPHASE : RO; bitpos: [6]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation, and is + * checking address. + */ +#define WCL_CORE_1_MESSAGE_ADDRESSPHASE (BIT(6)) +#define WCL_CORE_1_MESSAGE_ADDRESSPHASE_M (WCL_CORE_1_MESSAGE_ADDRESSPHASE_V << WCL_CORE_1_MESSAGE_ADDRESSPHASE_S) +#define WCL_CORE_1_MESSAGE_ADDRESSPHASE_V 0x00000001U +#define WCL_CORE_1_MESSAGE_ADDRESSPHASE_S 6 + +/** WCL_Core_1_World_TRIGGER_ADDR_REG register + * Core_1 trigger address configuration Register + */ +#define WCL_CORE_1_WORLD_TRIGGER_ADDR_REG (DR_REG_WCL_BASE + 0x540) +/** WCL_CORE_1_WORLD_TRIGGER_ADDR : RW; bitpos: [31:0]; default: 0; + * This field is used to configure the entry address from WORLD0 to WORLD1,when the + * CPU executes to this address,switch to WORLD1 + */ +#define WCL_CORE_1_WORLD_TRIGGER_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_WORLD_TRIGGER_ADDR_M (WCL_CORE_1_WORLD_TRIGGER_ADDR_V << WCL_CORE_1_WORLD_TRIGGER_ADDR_S) +#define WCL_CORE_1_WORLD_TRIGGER_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_WORLD_TRIGGER_ADDR_S 0 + +/** WCL_Core_1_World_PREPARE_REG register + * Core_1 prepare world configuration Register + */ +#define WCL_CORE_1_WORLD_PREPARE_REG (DR_REG_WCL_BASE + 0x544) +/** WCL_CORE_1_WORLD_PREPARE : R/W; bitpos: [1:0]; default: 0; + * This field to used to set world to enter,2'b01 means WORLD0, 2'b10 means WORLD1 + */ +#define WCL_CORE_1_WORLD_PREPARE 0x00000003U +#define WCL_CORE_1_WORLD_PREPARE_M (WCL_CORE_1_WORLD_PREPARE_V << WCL_CORE_1_WORLD_PREPARE_S) +#define WCL_CORE_1_WORLD_PREPARE_V 0x00000003U +#define WCL_CORE_1_WORLD_PREPARE_S 0 + +/** WCL_Core_1_World_UPDATE_REG register + * Core_1 configuration update register + */ +#define WCL_CORE_1_WORLD_UPDATE_REG (DR_REG_WCL_BASE + 0x548) +/** WCL_CORE_1_UPDATE : WO; bitpos: [31:0]; default: 0; + * This field is used to update configuration completed, can write any value,the + * hardware only checks the write operation of this register and does not case about + * its value + */ +#define WCL_CORE_1_UPDATE 0xFFFFFFFFU +#define WCL_CORE_1_UPDATE_M (WCL_CORE_1_UPDATE_V << WCL_CORE_1_UPDATE_S) +#define WCL_CORE_1_UPDATE_V 0xFFFFFFFFU +#define WCL_CORE_1_UPDATE_S 0 + +/** WCL_Core_1_World_Cancel_REG register + * Core_1 configuration cancel register + */ +#define WCL_CORE_1_WORLD_CANCEL_REG (DR_REG_WCL_BASE + 0x54c) +/** WCL_CORE_1_WORLD_CANCEL : WO; bitpos: [31:0]; default: 0; + * This field is used to cancel switch world configuration,if the trigger address and + * update configuration complete,can use this register to cancel world switch. can + * write any value, the hardware only checks the write operation of this register and + * does not case about its value + */ +#define WCL_CORE_1_WORLD_CANCEL 0xFFFFFFFFU +#define WCL_CORE_1_WORLD_CANCEL_M (WCL_CORE_1_WORLD_CANCEL_V << WCL_CORE_1_WORLD_CANCEL_S) +#define WCL_CORE_1_WORLD_CANCEL_V 0xFFFFFFFFU +#define WCL_CORE_1_WORLD_CANCEL_S 0 + +/** WCL_Core_1_World_IRam0_REG register + * Core_1 Iram0 world register + */ +#define WCL_CORE_1_WORLD_IRAM0_REG (DR_REG_WCL_BASE + 0x550) +/** WCL_CORE_1_WORLD_IRAM0 : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Iram0 bus + */ +#define WCL_CORE_1_WORLD_IRAM0 0x00000003U +#define WCL_CORE_1_WORLD_IRAM0_M (WCL_CORE_1_WORLD_IRAM0_V << WCL_CORE_1_WORLD_IRAM0_S) +#define WCL_CORE_1_WORLD_IRAM0_V 0x00000003U +#define WCL_CORE_1_WORLD_IRAM0_S 0 + +/** WCL_Core_1_World_DRam0_PIF_REG register + * Core_1 dram0 and PIF world register + */ +#define WCL_CORE_1_WORLD_DRAM0_PIF_REG (DR_REG_WCL_BASE + 0x554) +/** WCL_CORE_1_WORLD_DRAM0_PIF : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Dram0 bus and PIF bus + */ +#define WCL_CORE_1_WORLD_DRAM0_PIF 0x00000003U +#define WCL_CORE_1_WORLD_DRAM0_PIF_M (WCL_CORE_1_WORLD_DRAM0_PIF_V << WCL_CORE_1_WORLD_DRAM0_PIF_S) +#define WCL_CORE_1_WORLD_DRAM0_PIF_V 0x00000003U +#define WCL_CORE_1_WORLD_DRAM0_PIF_S 0 + +/** WCL_Core_1_World_Phase_REG register + * Core_0 world status register + */ +#define WCL_CORE_1_WORLD_PHASE_REG (DR_REG_WCL_BASE + 0x558) +/** WCL_CORE_1_WORLD_PHASE : RO; bitpos: [0]; default: 0; + * This bit indicates whether is preparing to switch to WORLD1,1 means value. + */ +#define WCL_CORE_1_WORLD_PHASE (BIT(0)) +#define WCL_CORE_1_WORLD_PHASE_M (WCL_CORE_1_WORLD_PHASE_V << WCL_CORE_1_WORLD_PHASE_S) +#define WCL_CORE_1_WORLD_PHASE_V 0x00000001U +#define WCL_CORE_1_WORLD_PHASE_S 0 + +/** WCL_Core_1_NMI_MASK_ENABLE_REG register + * Core_1 NMI mask enable register + */ +#define WCL_CORE_1_NMI_MASK_ENABLE_REG (DR_REG_WCL_BASE + 0x580) +/** WCL_CORE_1_NMI_MASK_ENABLE : WO; bitpos: [31:0]; default: 0; + * this field is used to set NMI mask, it can write any value, when write this + * register,the hardware start masking NMI interrupt + */ +#define WCL_CORE_1_NMI_MASK_ENABLE 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_ENABLE_M (WCL_CORE_1_NMI_MASK_ENABLE_V << WCL_CORE_1_NMI_MASK_ENABLE_S) +#define WCL_CORE_1_NMI_MASK_ENABLE_V 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_ENABLE_S 0 + +/** WCL_Core_1_NMI_MASK_TRIGGER_ADDR_REG register + * Core_1 NMI mask trigger addr register + */ +#define WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_REG (DR_REG_WCL_BASE + 0x584) +/** WCL_CORE_1_NMI_MASK_TRIGGER_ADDR : R/W; bitpos: [31:0]; default: 0; + * this field to used to set trigger address + */ +#define WCL_CORE_1_NMI_MASK_TRIGGER_ADDR 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_M (WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_V << WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_S) +#define WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_V 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_TRIGGER_ADDR_S 0 + +/** WCL_Core_1_NMI_MASK_DISABLE_REG register + * Core_1 NMI mask disable register + */ +#define WCL_CORE_1_NMI_MASK_DISABLE_REG (DR_REG_WCL_BASE + 0x588) +/** WCL_CORE_1_NMI_MASK_DISABLE : WO; bitpos: [31:0]; default: 0; + * this field is used to disable NMI mask, it will not take effect immediately,only + * when the CPU executes to the trigger address will it start to cancel NMI mask + */ +#define WCL_CORE_1_NMI_MASK_DISABLE 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_DISABLE_M (WCL_CORE_1_NMI_MASK_DISABLE_V << WCL_CORE_1_NMI_MASK_DISABLE_S) +#define WCL_CORE_1_NMI_MASK_DISABLE_V 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_DISABLE_S 0 + +/** WCL_Core_1_NMI_MASK_CANCLE_REG register + * Core_1 NMI mask disable register + */ +#define WCL_CORE_1_NMI_MASK_CANCLE_REG (DR_REG_WCL_BASE + 0x58c) +/** WCL_CORE_1_NMI_MASK_CANCEL : WO; bitpos: [31:0]; default: 0; + * this field is used to cancel NMI mask disable function. + */ +#define WCL_CORE_1_NMI_MASK_CANCEL 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_CANCEL_M (WCL_CORE_1_NMI_MASK_CANCEL_V << WCL_CORE_1_NMI_MASK_CANCEL_S) +#define WCL_CORE_1_NMI_MASK_CANCEL_V 0xFFFFFFFFU +#define WCL_CORE_1_NMI_MASK_CANCEL_S 0 + +/** WCL_Core_1_NMI_MASK_REG register + * Core_1 NMI mask register + */ +#define WCL_CORE_1_NMI_MASK_REG (DR_REG_WCL_BASE + 0x590) +/** WCL_CORE_1_NMI_MASK : R/W; bitpos: [0]; default: 0; + * this bit is used to mask NMI interrupt,it can directly mask NMI interrupt + */ +#define WCL_CORE_1_NMI_MASK (BIT(0)) +#define WCL_CORE_1_NMI_MASK_M (WCL_CORE_1_NMI_MASK_V << WCL_CORE_1_NMI_MASK_S) +#define WCL_CORE_1_NMI_MASK_V 0x00000001U +#define WCL_CORE_1_NMI_MASK_S 0 + +/** WCL_Core_1_NMI_MASK_PHASE_REG register + * Core_1 NMI mask phase register + */ +#define WCL_CORE_1_NMI_MASK_PHASE_REG (DR_REG_WCL_BASE + 0x594) +/** WCL_CORE_1_NMI_MASK_PHASE : RO; bitpos: [0]; default: 0; + * this bit is used to indicates whether the NMI interrupt is being masked, 1 means + * NMI interrupt is being masked + */ +#define WCL_CORE_1_NMI_MASK_PHASE (BIT(0)) +#define WCL_CORE_1_NMI_MASK_PHASE_M (WCL_CORE_1_NMI_MASK_PHASE_V << WCL_CORE_1_NMI_MASK_PHASE_S) +#define WCL_CORE_1_NMI_MASK_PHASE_V 0x00000001U +#define WCL_CORE_1_NMI_MASK_PHASE_S 0 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_WORLD_CONTROLLER_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/world_controller_struct.h b/components/soc/esp32s3/include/soc/world_controller_struct.h index 0791caf4b8..80f6661b35 100644 --- a/components/soc/esp32s3/include/soc/world_controller_struct.h +++ b/components/soc/esp32s3/include/soc/world_controller_struct.h @@ -1,7 +1,7 @@ -/* - * SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD +/** + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: Apache-2.0 */ #pragma once @@ -10,773 +10,1572 @@ extern "C" { #endif -typedef volatile struct world_controller_dev_s { - uint32_t wcl_core_0_entry_1_addr; - uint32_t wcl_core_0_entry_2_addr; - uint32_t wcl_core_0_entry_3_addr; - uint32_t wcl_core_0_entry_4_addr; - uint32_t wcl_core_0_entry_5_addr; - uint32_t wcl_core_0_entry_6_addr; - uint32_t wcl_core_0_entry_7_addr; - uint32_t wcl_core_0_entry_8_addr; - uint32_t wcl_core_0_entry_9_addr; - uint32_t wcl_core_0_entry_10_addr; - uint32_t wcl_core_0_entry_11_addr; - uint32_t wcl_core_0_entry_12_addr; - uint32_t wcl_core_0_entry_13_addr; - uint32_t reserved_34; - uint32_t reserved_38; - uint32_t reserved_3c; - uint32_t reserved_40; - uint32_t reserved_44; - uint32_t reserved_48; - uint32_t reserved_4c; - uint32_t reserved_50; - uint32_t reserved_54; - uint32_t reserved_58; - uint32_t reserved_5c; - uint32_t reserved_60; - uint32_t reserved_64; - uint32_t reserved_68; - uint32_t reserved_6c; - uint32_t reserved_70; - uint32_t reserved_74; - uint32_t reserved_78; - union { - struct { - uint32_t reserved0 : 1; - uint32_t reg_core_0_entry_check : 13; /*This filed is used to enable entry address check */ - uint32_t reserved14 : 18; /*reserved*/ - }; - uint32_t val; - } wcl_core_0_entry_check; - 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 reserved_fc; - uint32_t wcl_core_0_message_addr; - union { - struct { - uint32_t reg_core_0_message_max : 4; /*This filed is used to set the max value of clear write_buffer*/ - uint32_t reserved4 : 28; - }; - uint32_t val; - } wcl_core_0_message_max; - union { - struct { - uint32_t reg_core_0_from_world_1 : 1; /*This bit is used to confirm world before enter entry 1 */ - uint32_t reg_core_0_from_entry_1 : 4; /*This filed is used to confirm in which entry before enter entry 1*/ - uint32_t reg_core_0_current_1 : 1; /*This bit is used to confirm whether the current state is in entry 1 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable1; - union { - struct { - uint32_t reg_core_0_from_world_2 : 1; /*This bit is used to confirm world before enter entry 2 */ - uint32_t reg_core_0_from_entry_2 : 4; /*This filed is used to confirm in which entry before enter entry 2*/ - uint32_t reg_core_0_current_2 : 1; /*This bit is used to confirm whether the current state is in entry 2 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable2; - union { - struct { - uint32_t reg_core_0_from_world_3 : 1; /*This bit is used to confirm world before enter entry 3 */ - uint32_t reg_core_0_from_entry_3 : 4; /*This filed is used to confirm in which entry before enter entry 3*/ - uint32_t reg_core_0_current_3 : 1; /*This bit is used to confirm whether the current state is in entry 3 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable3; - union { - struct { - uint32_t reg_core_0_from_world_4 : 1; /*This bit is used to confirm world before enter entry 4 */ - uint32_t reg_core_0_from_entry_4 : 4; /*This filed is used to confirm in which entry before enter entry 4*/ - uint32_t reg_core_0_current_4 : 1; /*This bit is used to confirm whether the current state is in entry 4 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable4; - union { - struct { - uint32_t reg_core_0_from_world_5 : 1; /*This bit is used to confirm world before enter entry 5 */ - uint32_t reg_core_0_from_entry_5 : 4; /*This filed is used to confirm in which entry before enter entry 5*/ - uint32_t reg_core_0_current_5 : 1; /*This bit is used to confirm whether the current state is in entry 5 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable5; - union { - struct { - uint32_t reg_core_0_from_world_6 : 1; /*This bit is used to confirm world before enter entry 6 */ - uint32_t reg_core_0_from_entry_6 : 4; /*This filed is used to confirm in which entry before enter entry 6*/ - uint32_t reg_core_0_current_6 : 1; /*This bit is used to confirm whether the current state is in entry 6 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable6; - union { - struct { - uint32_t reg_core_0_from_world_7 : 1; /*This bit is used to confirm world before enter entry 7 */ - uint32_t reg_core_0_from_entry_7 : 4; /*This filed is used to confirm in which entry before enter entry 7*/ - uint32_t reg_core_0_current_7 : 1; /*This bit is used to confirm whether the current state is in entry 7 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable7; - union { - struct { - uint32_t reg_core_0_from_world_8 : 1; /*This bit is used to confirm world before enter entry 8 */ - uint32_t reg_core_0_from_entry_8 : 4; /*This filed is used to confirm in which entry before enter entry 8*/ - uint32_t reg_core_0_current_8 : 1; /*This bit is used to confirm whether the current state is in entry 8 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable8; - union { - struct { - uint32_t reg_core_0_from_world_9 : 1; /*This bit is used to confirm world before enter entry 9 */ - uint32_t reg_core_0_from_entry_9 : 4; /*This filed is used to confirm in which entry before enter entry 9*/ - uint32_t reg_core_0_current_9 : 1; /*This bit is used to confirm whether the current state is in entry 9 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable9; - union { - struct { - uint32_t reg_core_0_from_world_10 : 1; /*This bit is used to confirm world before enter entry 10 */ - uint32_t reg_core_0_from_entry_10 : 4; /*This filed is used to confirm in which entry before enter entry 10*/ - uint32_t reg_core_0_current_10 : 1; /*This bit is used to confirm whether the current state is in entry 10 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable10; - union { - struct { - uint32_t reg_core_0_from_world_11 : 1; /*This bit is used to confirm world before enter entry 11 */ - uint32_t reg_core_0_from_entry_11 : 4; /*This filed is used to confirm in which entry before enter entry 11*/ - uint32_t reg_core_0_current_11 : 1; /*This bit is used to confirm whether the current state is in entry 11 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable11; - union { - struct { - uint32_t core_0_from_world_12 : 1; /*This bit is used to confirm world before enter entry 12 */ - uint32_t core_0_from_entry_12 : 4; /*This filed is used to confirm in which entry before enter entry 12*/ - uint32_t core_0_current_12 : 1; /*This bit is used to confirm whether the current state is in entry 12 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable12; - union { - struct { - uint32_t reg_core_0_from_world_13 : 1; /*This bit is used to confirm world before enter entry 13 */ - uint32_t reg_core_0_from_entry_13 : 4; /*This filed is used to confirm in which entry before enter entry 13*/ - uint32_t reg_core_0_current_13 : 1; /*This bit is used to confirm whether the current state is in entry 13 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_0_statustable13; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t reserved_f8; - union { - struct { - uint32_t reserved0 : 1; - uint32_t reg_core_0_statustable_current: 13; /*This field is used to quickly read and rewrite the current field of all STATUSTABLE registers.For example*/ - uint32_t reserved14 : 18; - }; - uint32_t val; - } wcl_core_0_statustable_current; - uint32_t reserved_100; - uint32_t reserved_104; - union { - struct { - uint32_t reg_core_0_message_match : 1; /*This bit indicates whether the check is successful*/ - uint32_t reg_core_0_message_expect : 4; /*This field indicates the data to be written next time*/ - uint32_t reg_core_0_message_dataphase : 1; /*If this bit is 1*/ - uint32_t reg_core_0_message_addressphase: 1; /*If this bit is 1*/ - uint32_t reserved7 : 25; - }; - uint32_t val; - } wcl_core_0_message_phase; - uint32_t reserved_10c; - uint32_t reserved_110; - uint32_t reserved_114; - uint32_t reserved_118; - uint32_t reserved_11c; - uint32_t reserved_120; - uint32_t reserved_124; - uint32_t reserved_128; - uint32_t reserved_12c; - uint32_t reserved_130; - uint32_t reserved_134; - uint32_t reserved_138; - uint32_t reserved_13c; - uint32_t wcl_core_0_world_trigger_addr; - union { - struct { - uint32_t reg_core_0_world_prepare : 2; /*This field to used to set world to enter*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_0_world_prepare; - uint32_t wcl_core_0_world_update; - uint32_t wcl_core_0_world_cancel; - union { - struct { - uint32_t reg_core_0_world_iram0 : 2; /*this field is used to read current world of Iram0 bus*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_0_world_iram0; - union { - struct { - uint32_t reg_core_0_world_dram0_pif : 2; /*this field is used to read current world of Dram0 bus and PIF bus*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_0_world_dram0_pif; - union { - struct { - uint32_t reg_core_0_world_phase : 1; /*This bit indicates whether is preparing to switch to WORLD1*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_0_world_phase; - 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 wcl_core_0_nmi_mask_enable; - uint32_t wcl_core_0_nmi_mask_trigger_addr; - uint32_t wcl_core_0_nmi_mask_disable; - uint32_t wcl_core_0_nmi_mask_cancle; - union { - struct { - uint32_t reg_core_0_nmi_mask : 1; /*this bit is used to mask NMI interrupt*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_0_nmi_mask; - union { - struct { - uint32_t reg_core_0_nmi_mask_phase : 1; /*this bit is used to indicates whether the NMI interrupt is being masked*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_0_nmi_mask_phase; - 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; - uint32_t reserved_3fc; - uint32_t wcl_core_1_entry_1_addr; - uint32_t wcl_core_1_entry_2_addr; - uint32_t wcl_core_1_entry_3_addr; - uint32_t wcl_core_1_entry_4_addr; - uint32_t wcl_core_1_entry_5_addr; - uint32_t wcl_core_1_entry_6_addr; - uint32_t wcl_core_1_entry_7_addr; - uint32_t wcl_core_1_entry_8_addr; - uint32_t wcl_core_1_entry_9_addr; - uint32_t wcl_core_1_entry_10_addr; - uint32_t wcl_core_1_entry_11_addr; - uint32_t wcl_core_1_entry_12_addr; - uint32_t wcl_core_1_entry_13_addr; - uint32_t reserved_434; - uint32_t reserved_438; - uint32_t reserved_43c; - uint32_t reserved_440; - uint32_t reserved_444; - uint32_t reserved_448; - uint32_t reserved_44c; - uint32_t reserved_450; - uint32_t reserved_454; - uint32_t reserved_458; - uint32_t reserved_45c; - uint32_t reserved_460; - uint32_t reserved_464; - uint32_t reserved_468; - uint32_t reserved_46c; - uint32_t reserved_470; - uint32_t reserved_474; - uint32_t reserved_478; - union { - struct { - uint32_t reserved0 : 1; - uint32_t reg_core_1_entry_check : 13; /*This filed is used to enable entry address check */ - uint32_t reserved14 : 18; /*reserved*/ - }; - uint32_t val; - } wcl_core_1_entry_check; - uint32_t reserved_480; - uint32_t reserved_484; - uint32_t reserved_488; - uint32_t reserved_48c; - uint32_t reserved_490; - uint32_t reserved_494; - uint32_t reserved_498; - uint32_t reserved_49c; - uint32_t reserved_4a0; - uint32_t reserved_4a4; - uint32_t reserved_4a8; - uint32_t reserved_4ac; - uint32_t reserved_4b0; - uint32_t reserved_4b4; - uint32_t reserved_4b8; - uint32_t reserved_4bc; - uint32_t reserved_4c0; - uint32_t reserved_4c4; - uint32_t reserved_4c8; - uint32_t reserved_4cc; - uint32_t reserved_4d0; - uint32_t reserved_4d4; - uint32_t reserved_4d8; - uint32_t reserved_4dc; - uint32_t reserved_4e0; - uint32_t reserved_4e4; - uint32_t reserved_4e8; - uint32_t reserved_4ec; - uint32_t reserved_4f0; - uint32_t reserved_4f4; - uint32_t reserved_4f8; - uint32_t reserved_4fc; - uint32_t wcl_core_1_message_addr; - union { - struct { - uint32_t reg_core_1_message_max : 4; /*This filed is used to set the max value of clear write_buffer*/ - uint32_t reserved4 : 28; - }; - uint32_t val; - } wcl_core_1_message_max; - union { - struct { - uint32_t reg_core_1_from_world_1 : 1; /*This bit is used to confirm world before enter entry 1 */ - uint32_t reg_core_1_from_entry_1 : 4; /*This filed is used to confirm in which entry before enter entry 1*/ - uint32_t reg_core_1_current_1 : 1; /*This bit is used to confirm whether the current state is in entry 1 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable1; - union { - struct { - uint32_t reg_core_1_from_world_2 : 1; /*This bit is used to confirm world before enter entry 2 */ - uint32_t reg_core_1_from_entry_2 : 4; /*This filed is used to confirm in which entry before enter entry 2*/ - uint32_t reg_core_1_current_2 : 1; /*This bit is used to confirm whether the current state is in entry 2 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable2; - union { - struct { - uint32_t reg_core_1_from_world_3 : 1; /*This bit is used to confirm world before enter entry 3 */ - uint32_t reg_core_1_from_entry_3 : 4; /*This filed is used to confirm in which entry before enter entry 3*/ - uint32_t reg_core_1_current_3 : 1; /*This bit is used to confirm whether the current state is in entry 3 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable3; - union { - struct { - uint32_t reg_core_1_from_world_4 : 1; /*This bit is used to confirm world before enter entry 4 */ - uint32_t reg_core_1_from_entry_4 : 4; /*This filed is used to confirm in which entry before enter entry 4*/ - uint32_t reg_core_1_current_4 : 1; /*This bit is used to confirm whether the current state is in entry 4 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable4; - union { - struct { - uint32_t reg_core_1_from_world_5 : 1; /*This bit is used to confirm world before enter entry 5 */ - uint32_t reg_core_1_from_entry_5 : 4; /*This filed is used to confirm in which entry before enter entry 5*/ - uint32_t reg_core_1_current_5 : 1; /*This bit is used to confirm whether the current state is in entry 5 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable5; - union { - struct { - uint32_t reg_core_1_from_world_6 : 1; /*This bit is used to confirm world before enter entry 6 */ - uint32_t reg_core_1_from_entry_6 : 4; /*This filed is used to confirm in which entry before enter entry 6*/ - uint32_t reg_core_1_current_6 : 1; /*This bit is used to confirm whether the current state is in entry 6 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable6; - union { - struct { - uint32_t reg_core_1_from_world_7 : 1; /*This bit is used to confirm world before enter entry 7 */ - uint32_t reg_core_1_from_entry_7 : 4; /*This filed is used to confirm in which entry before enter entry 7*/ - uint32_t reg_core_1_current_7 : 1; /*This bit is used to confirm whether the current state is in entry 7 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable7; - union { - struct { - uint32_t reg_core_1_from_world_8 : 1; /*This bit is used to confirm world before enter entry 8 */ - uint32_t reg_core_1_from_entry_8 : 4; /*This filed is used to confirm in which entry before enter entry 8*/ - uint32_t reg_core_1_current_8 : 1; /*This bit is used to confirm whether the current state is in entry 8 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable8; - union { - struct { - uint32_t reg_core_1_from_world_9 : 1; /*This bit is used to confirm world before enter entry 9 */ - uint32_t reg_core_1_from_entry_9 : 4; /*This filed is used to confirm in which entry before enter entry 9*/ - uint32_t reg_core_1_current_9 : 1; /*This bit is used to confirm whether the current state is in entry 9 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable9; - union { - struct { - uint32_t reg_core_1_from_world_10 : 1; /*This bit is used to confirm world before enter entry 10 */ - uint32_t reg_core_1_from_entry_10 : 4; /*This filed is used to confirm in which entry before enter entry 10*/ - uint32_t reg_core_1_current_10 : 1; /*This bit is used to confirm whether the current state is in entry 10 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable10; - union { - struct { - uint32_t reg_core_1_from_world_11 : 1; /*This bit is used to confirm world before enter entry 11 */ - uint32_t reg_core_1_from_entry_11 : 4; /*This filed is used to confirm in which entry before enter entry 11*/ - uint32_t reg_core_1_current_11 : 1; /*This bit is used to confirm whether the current state is in entry 11 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable11; - union { - struct { - uint32_t core_1_from_world_12 : 1; /*This bit is used to confirm world before enter entry 12 */ - uint32_t core_1_from_entry_12 : 4; /*This filed is used to confirm in which entry before enter entry 12*/ - uint32_t core_1_current_12 : 1; /*This bit is used to confirm whether the current state is in entry 12 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable12; - union { - struct { - uint32_t reg_core_1_from_world_13 : 1; /*This bit is used to confirm world before enter entry 13 */ - uint32_t reg_core_1_from_entry_13 : 4; /*This filed is used to confirm in which entry before enter entry 13*/ - uint32_t reg_core_1_current_13 : 1; /*This bit is used to confirm whether the current state is in entry 13 */ - uint32_t reserved6 : 26; - }; - uint32_t val; - } wcl_core_1_statustable13; - uint32_t reserved_4b4; - uint32_t reserved_4b8; - uint32_t reserved_4bc; - uint32_t reserved_4c0; - uint32_t reserved_4c4; - uint32_t reserved_4c8; - uint32_t reserved_4cc; - uint32_t reserved_4d0; - uint32_t reserved_4d4; - uint32_t reserved_4d8; - uint32_t reserved_4dc; - uint32_t reserved_4e0; - uint32_t reserved_4e4; - uint32_t reserved_4e8; - uint32_t reserved_4ec; - uint32_t reserved_4f0; - uint32_t reserved_4f4; - uint32_t reserved_4f8; - union { - struct { - uint32_t reserved0 : 1; - uint32_t reg_core_1_statustable_current: 13; /*This field is used to quickly read and rewrite the current field of all STATUSTABLE registers.For example*/ - uint32_t reserved14 : 18; - }; - uint32_t val; - } wcl_core_1_statustable_current; - uint32_t reserved_500; - uint32_t reserved_504; - union { - struct { - uint32_t reg_core_1_message_match : 1; /*This bit indicates whether the check is successful*/ - uint32_t reg_core_1_message_expect : 4; /*This field indicates the data to be written next time*/ - uint32_t reg_core_1_message_dataphase : 1; /*If this bit is 1*/ - uint32_t reg_core_1_message_addressphase: 1; /*If this bit is 1*/ - uint32_t reserved7 : 25; - }; - uint32_t val; - } wcl_core_1_message_phase; - uint32_t reserved_50c; - uint32_t reserved_510; - uint32_t reserved_514; - uint32_t reserved_518; - uint32_t reserved_51c; - uint32_t reserved_520; - uint32_t reserved_524; - uint32_t reserved_528; - uint32_t reserved_52c; - uint32_t reserved_530; - uint32_t reserved_534; - uint32_t reserved_538; - uint32_t reserved_53c; - uint32_t wcl_core_1_world_trigger_addr; - union { - struct { - uint32_t reg_core_1_world_prepare : 2; /*This field to used to set world to enter*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_1_world_prepare; - uint32_t wcl_core_1_world_update; - uint32_t wcl_core_1_world_cancel; - union { - struct { - uint32_t reg_core_1_world_iram0 : 2; /*this field is used to read current world of Iram0 bus*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_1_world_iram0; - union { - struct { - uint32_t reg_core_1_world_dram0_pif : 2; /*this field is used to read current world of Dram0 bus and PIF bus*/ - uint32_t reserved2 : 30; - }; - uint32_t val; - } wcl_core_1_world_dram0_pif; - union { - struct { - uint32_t reg_core_1_world_phase : 1; /*This bit indicates whether is preparing to switch to WORLD1*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_1_world_phase; - uint32_t reserved_55c; - uint32_t reserved_560; - uint32_t reserved_564; - uint32_t reserved_568; - uint32_t reserved_56c; - uint32_t reserved_570; - uint32_t reserved_574; - uint32_t reserved_578; - uint32_t reserved_57c; - uint32_t wcl_core_1_nmi_mask_enable; - uint32_t wcl_core_1_nmi_mask_trigger_addr; - uint32_t wcl_core_1_nmi_mask_disable; - uint32_t wcl_core_1_nmi_mask_cancle; - union { - struct { - uint32_t reg_core_1_nmi_mask : 1; /*this bit is used to mask NMI interrupt*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_1_nmi_mask; - union { - struct { - uint32_t reg_core_1_nmi_mask_phase : 1; /*this bit is used to indicates whether the NMI interrupt is being masked*/ - uint32_t reserved1 : 31; - }; - uint32_t val; - } wcl_core_1_nmi_mask_phase; -} world_controller_dev_t; -extern world_controller_dev_t WORLD_CONTROLLER; +/** Group: WORLD1 to WORLD0 configuration Registers */ +/** Type of core_0_entry_1_addr register + * Core_0 Entry 1 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_1_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 1 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_1_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_1_addr_reg_t; + +/** Type of core_0_entry_2_addr register + * Core_0 Entry 2 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_2_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 2 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_2_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_2_addr_reg_t; + +/** Type of core_0_entry_3_addr register + * Core_0 Entry 3 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_3_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 3 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_3_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_3_addr_reg_t; + +/** Type of core_0_entry_4_addr register + * Core_0 Entry 4 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_4_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 4 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_4_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_4_addr_reg_t; + +/** Type of core_0_entry_5_addr register + * Core_0 Entry 5 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_5_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 5 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_5_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_5_addr_reg_t; + +/** Type of core_0_entry_6_addr register + * Core_0 Entry 6 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_6_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 6 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_6_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_6_addr_reg_t; + +/** Type of core_0_entry_7_addr register + * Core_0 Entry 7 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_7_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 7 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_7_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_7_addr_reg_t; + +/** Type of core_0_entry_8_addr register + * Core_0 Entry 8 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_8_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 8 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_8_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_8_addr_reg_t; + +/** Type of core_0_entry_9_addr register + * Core_0 Entry 9 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_9_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 9 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_9_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_9_addr_reg_t; + +/** Type of core_0_entry_10_addr register + * Core_0 Entry 10 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_10_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 10 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_10_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_10_addr_reg_t; + +/** Type of core_0_entry_11_addr register + * Core_0 Entry 11 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_11_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 11 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_11_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_11_addr_reg_t; + +/** Type of core_0_entry_12_addr register + * Core_0 Entry 12 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_12_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 12 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_12_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_12_addr_reg_t; + +/** Type of core_0_entry_13_addr register + * Core_0 Entry 13 address configuration Register + */ +typedef union { + struct { + /** core_0_entry_13_addr : R/W; bitpos: [31:0]; default: 0; + * Core_0 Entry 13 address from WORLD1 to WORLD0 + */ + uint32_t core_0_entry_13_addr:32; + }; + uint32_t val; +} wcl_core_0_entry_13_addr_reg_t; + +/** Type of core_0_entry_check register + * Core_0 Entry check configuration Register + */ +typedef union { + struct { + uint32_t reserved_0:1; + /** core_0_entry_check : R/W; bitpos: [13:1]; default: 1; + * This filed is used to enable entry address check + */ + uint32_t core_0_entry_check:13; + uint32_t reserved_14:18; + }; + uint32_t val; +} wcl_core_0_entry_check_reg_t; + +/** Type of core_0_message_addr register + * Clear writer_buffer write address configuration register + */ +typedef union { + struct { + /** core_0_message_addr : R/W; bitpos: [31:0]; default: 0; + * This field is used to set address that need to write when enter WORLD0 + */ + uint32_t core_0_message_addr:32; + }; + uint32_t val; +} wcl_core_0_message_addr_reg_t; + +/** Type of core_0_message_max register + * Clear writer_buffer write number configuration register + */ +typedef union { + struct { + /** core_0_message_max : R/W; bitpos: [3:0]; default: 0; + * This filed is used to set the max value of clear write_buffer + */ + uint32_t core_0_message_max:4; + uint32_t reserved_4:28; + }; + uint32_t val; +} wcl_core_0_message_max_reg_t; + +/** Type of core_0_message_phase register + * Clear writer_buffer status register + */ +typedef union { + struct { + /** core_0_message_match : RO; bitpos: [0]; default: 0; + * This bit indicates whether the check is successful + */ + uint32_t core_0_message_match:1; + /** core_0_message_expect : RO; bitpos: [4:1]; default: 0; + * This field indicates the data to be written next time + */ + uint32_t core_0_message_expect:4; + /** core_0_message_dataphase : RO; bitpos: [5]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation,and is + * checking data + */ + uint32_t core_0_message_dataphase:1; + /** core_0_message_addressphase : RO; bitpos: [6]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation,and is + * checking address. + */ + uint32_t core_0_message_addressphase:1; + uint32_t reserved_7:25; + }; + uint32_t val; +} wcl_core_0_message_phase_reg_t; + +/** Type of core_1_entry_1_addr register + * Core_1 Entry 1 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_1_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 1 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_1_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_1_addr_reg_t; + +/** Type of core_1_entry_2_addr register + * Core_1 Entry 2 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_2_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 2 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_2_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_2_addr_reg_t; + +/** Type of core_1_entry_3_addr register + * Core_1 Entry 3 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_3_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 3 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_3_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_3_addr_reg_t; + +/** Type of core_1_entry_4_addr register + * Core_1 Entry 4 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_4_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 4 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_4_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_4_addr_reg_t; + +/** Type of core_1_entry_5_addr register + * Core_1 Entry 5 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_5_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 5 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_5_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_5_addr_reg_t; + +/** Type of core_1_entry_6_addr register + * Core_1 Entry 6 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_6_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 6 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_6_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_6_addr_reg_t; + +/** Type of core_1_entry_7_addr register + * Core_1 Entry 7 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_7_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 7 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_7_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_7_addr_reg_t; + +/** Type of core_1_entry_8_addr register + * Core_1 Entry 8 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_8_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 8 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_8_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_8_addr_reg_t; + +/** Type of core_1_entry_9_addr register + * Core_1 Entry 9 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_9_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 9 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_9_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_9_addr_reg_t; + +/** Type of core_1_entry_10_addr register + * Core_1 Entry 10 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_10_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 10 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_10_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_10_addr_reg_t; + +/** Type of core_1_entry_11_addr register + * Core_1 Entry 11 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_11_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 11 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_11_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_11_addr_reg_t; + +/** Type of core_1_entry_12_addr register + * Core_1 Entry 12 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_12_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 12 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_12_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_12_addr_reg_t; + +/** Type of core_1_entry_13_addr register + * Core_1 Entry 13 address configuration Register + */ +typedef union { + struct { + /** core_1_entry_13_addr : R/W; bitpos: [31:0]; default: 0; + * Core_1 Entry 13 address from WORLD1 to WORLD0 + */ + uint32_t core_1_entry_13_addr:32; + }; + uint32_t val; +} wcl_core_1_entry_13_addr_reg_t; + +/** Type of core_1_entry_check register + * Core_1 Entry check configuration Register + */ +typedef union { + struct { + uint32_t reserved_0:1; + /** core_1_entry_check : R/W; bitpos: [13:1]; default: 1; + * This filed is used to enable entry address check + */ + uint32_t core_1_entry_check:13; + uint32_t reserved_14:18; + }; + uint32_t val; +} wcl_core_1_entry_check_reg_t; + +/** Type of core_1_message_addr register + * Clear writer_buffer write address configuration register + */ +typedef union { + struct { + /** core_1_message_addr : R/W; bitpos: [31:0]; default: 0; + * This field is used to set address that need to write when enter WORLD0 + */ + uint32_t core_1_message_addr:32; + }; + uint32_t val; +} wcl_core_1_message_addr_reg_t; + +/** Type of core_1_message_max register + * Clear writer_buffer write number configuration register + */ +typedef union { + struct { + /** core_1_message_max : R/W; bitpos: [3:0]; default: 0; + * This filed is used to set the max value of clear write_buffer + */ + uint32_t core_1_message_max:4; + uint32_t reserved_4:28; + }; + uint32_t val; +} wcl_core_1_message_max_reg_t; + +/** Type of core_1_message_phase register + * Clear writer_buffer status register + */ +typedef union { + struct { + /** core_1_message_match : RO; bitpos: [0]; default: 0; + * This bit indicates whether the check is successful + */ + uint32_t core_1_message_match:1; + /** core_1_message_expect : RO; bitpos: [4:1]; default: 0; + * This field indicates the data to be written next time + */ + uint32_t core_1_message_expect:4; + /** core_1_message_dataphase : RO; bitpos: [5]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation, and is + * checking data + */ + uint32_t core_1_message_dataphase:1; + /** core_1_message_addressphase : RO; bitpos: [6]; default: 0; + * If this bit is 1, it means that is checking clear write_buffer operation, and is + * checking address. + */ + uint32_t core_1_message_addressphase:1; + uint32_t reserved_7:25; + }; + uint32_t val; +} wcl_core_1_message_phase_reg_t; + + +/** Group: StatusTable Registers */ +/** Type of core_0_statustable1 register + * Status register of world switch of entry 1 + */ +typedef union { + struct { + /** core_0_from_world_1 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 1 + */ + uint32_t core_0_from_world_1:1; + /** core_0_from_entry_1 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 1 + */ + uint32_t core_0_from_entry_1:4; + /** core_0_current_1 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 1 + */ + uint32_t core_0_current_1:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable1_reg_t; + +/** Type of core_0_statustable2 register + * Status register of world switch of entry 2 + */ +typedef union { + struct { + /** core_0_from_world_2 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 2 + */ + uint32_t core_0_from_world_2:1; + /** core_0_from_entry_2 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 2 + */ + uint32_t core_0_from_entry_2:4; + /** core_0_current_2 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 2 + */ + uint32_t core_0_current_2:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable2_reg_t; + +/** Type of core_0_statustable3 register + * Status register of world switch of entry 3 + */ +typedef union { + struct { + /** core_0_from_world_3 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 3 + */ + uint32_t core_0_from_world_3:1; + /** core_0_from_entry_3 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 3 + */ + uint32_t core_0_from_entry_3:4; + /** core_0_current_3 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 3 + */ + uint32_t core_0_current_3:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable3_reg_t; + +/** Type of core_0_statustable4 register + * Status register of world switch of entry 4 + */ +typedef union { + struct { + /** core_0_from_world_4 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 4 + */ + uint32_t core_0_from_world_4:1; + /** core_0_from_entry_4 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 4 + */ + uint32_t core_0_from_entry_4:4; + /** core_0_current_4 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 4 + */ + uint32_t core_0_current_4:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable4_reg_t; + +/** Type of core_0_statustable5 register + * Status register of world switch of entry 5 + */ +typedef union { + struct { + /** core_0_from_world_5 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 5 + */ + uint32_t core_0_from_world_5:1; + /** core_0_from_entry_5 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 5 + */ + uint32_t core_0_from_entry_5:4; + /** core_0_current_5 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 5 + */ + uint32_t core_0_current_5:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable5_reg_t; + +/** Type of core_0_statustable6 register + * Status register of world switch of entry 6 + */ +typedef union { + struct { + /** core_0_from_world_6 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 6 + */ + uint32_t core_0_from_world_6:1; + /** core_0_from_entry_6 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 6 + */ + uint32_t core_0_from_entry_6:4; + /** core_0_current_6 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 6 + */ + uint32_t core_0_current_6:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable6_reg_t; + +/** Type of core_0_statustable7 register + * Status register of world switch of entry 7 + */ +typedef union { + struct { + /** core_0_from_world_7 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 7 + */ + uint32_t core_0_from_world_7:1; + /** core_0_from_entry_7 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 7 + */ + uint32_t core_0_from_entry_7:4; + /** core_0_current_7 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 7 + */ + uint32_t core_0_current_7:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable7_reg_t; + +/** Type of core_0_statustable8 register + * Status register of world switch of entry 8 + */ +typedef union { + struct { + /** core_0_from_world_8 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 8 + */ + uint32_t core_0_from_world_8:1; + /** core_0_from_entry_8 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 8 + */ + uint32_t core_0_from_entry_8:4; + /** core_0_current_8 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 8 + */ + uint32_t core_0_current_8:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable8_reg_t; + +/** Type of core_0_statustable9 register + * Status register of world switch of entry 9 + */ +typedef union { + struct { + /** core_0_from_world_9 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 9 + */ + uint32_t core_0_from_world_9:1; + /** core_0_from_entry_9 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 9 + */ + uint32_t core_0_from_entry_9:4; + /** core_0_current_9 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 9 + */ + uint32_t core_0_current_9:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable9_reg_t; + +/** Type of core_0_statustable10 register + * Status register of world switch of entry 10 + */ +typedef union { + struct { + /** core_0_from_world_10 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 10 + */ + uint32_t core_0_from_world_10:1; + /** core_0_from_entry_10 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 10 + */ + uint32_t core_0_from_entry_10:4; + /** core_0_current_10 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 10 + */ + uint32_t core_0_current_10:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable10_reg_t; + +/** Type of core_0_statustable11 register + * Status register of world switch of entry 11 + */ +typedef union { + struct { + /** core_0_from_world_11 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 11 + */ + uint32_t core_0_from_world_11:1; + /** core_0_from_entry_11 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 11 + */ + uint32_t core_0_from_entry_11:4; + /** core_0_current_11 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 11 + */ + uint32_t core_0_current_11:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable11_reg_t; + +/** Type of core_0_statustable12 register + * Status register of world switch of entry 12 + */ +typedef union { + struct { + /** core_0_from_world_12 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 12 + */ + uint32_t core_0_from_world_12:1; + /** core_0_from_entry_12 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 12 + */ + uint32_t core_0_from_entry_12:4; + /** core_0_current_12 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 12 + */ + uint32_t core_0_current_12:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable12_reg_t; + +/** Type of core_0_statustable13 register + * Status register of world switch of entry 13 + */ +typedef union { + struct { + /** core_0_from_world_13 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 13 + */ + uint32_t core_0_from_world_13:1; + /** core_0_from_entry_13 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 13 + */ + uint32_t core_0_from_entry_13:4; + /** core_0_current_13 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 13 + */ + uint32_t core_0_current_13:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_0_statustable13_reg_t; + +/** Type of core_0_statustable_current register + * Status register of statustable current + */ +typedef union { + struct { + uint32_t reserved_0:1; + /** core_0_statustable_current : R/W; bitpos: [13:1]; default: 0; + * This field is used to quickly read and rewrite the current field of all STATUSTABLE + * registers,for example,bit 1 represents the current field of STATUSTABLE1,bit2 + * represents the current field of STATUSTABLE2 + */ + uint32_t core_0_statustable_current:13; + uint32_t reserved_14:18; + }; + uint32_t val; +} wcl_core_0_statustable_current_reg_t; + +/** Type of core_1_statustable1 register + * Status register of world switch of entry 1 + */ +typedef union { + struct { + /** core_1_from_world_1 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 1 + */ + uint32_t core_1_from_world_1:1; + /** core_1_from_entry_1 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 1 + */ + uint32_t core_1_from_entry_1:4; + /** core_1_current_1 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 1 + */ + uint32_t core_1_current_1:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable1_reg_t; + +/** Type of core_1_statustable2 register + * Status register of world switch of entry 2 + */ +typedef union { + struct { + /** core_1_from_world_2 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 2 + */ + uint32_t core_1_from_world_2:1; + /** core_1_from_entry_2 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 2 + */ + uint32_t core_1_from_entry_2:4; + /** core_1_current_2 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 2 + */ + uint32_t core_1_current_2:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable2_reg_t; + +/** Type of core_1_statustable3 register + * Status register of world switch of entry 3 + */ +typedef union { + struct { + /** core_1_from_world_3 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 3 + */ + uint32_t core_1_from_world_3:1; + /** core_1_from_entry_3 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 3 + */ + uint32_t core_1_from_entry_3:4; + /** core_1_current_3 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 3 + */ + uint32_t core_1_current_3:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable3_reg_t; + +/** Type of core_1_statustable4 register + * Status register of world switch of entry 4 + */ +typedef union { + struct { + /** core_1_from_world_4 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 4 + */ + uint32_t core_1_from_world_4:1; + /** core_1_from_entry_4 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 4 + */ + uint32_t core_1_from_entry_4:4; + /** core_1_current_4 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 4 + */ + uint32_t core_1_current_4:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable4_reg_t; + +/** Type of core_1_statustable5 register + * Status register of world switch of entry 5 + */ +typedef union { + struct { + /** core_1_from_world_5 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 5 + */ + uint32_t core_1_from_world_5:1; + /** core_1_from_entry_5 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 5 + */ + uint32_t core_1_from_entry_5:4; + /** core_1_current_5 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 5 + */ + uint32_t core_1_current_5:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable5_reg_t; + +/** Type of core_1_statustable6 register + * Status register of world switch of entry 6 + */ +typedef union { + struct { + /** core_1_from_world_6 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 6 + */ + uint32_t core_1_from_world_6:1; + /** core_1_from_entry_6 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 6 + */ + uint32_t core_1_from_entry_6:4; + /** core_1_current_6 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 6 + */ + uint32_t core_1_current_6:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable6_reg_t; + +/** Type of core_1_statustable7 register + * Status register of world switch of entry 7 + */ +typedef union { + struct { + /** core_1_from_world_7 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 7 + */ + uint32_t core_1_from_world_7:1; + /** core_1_from_entry_7 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 7 + */ + uint32_t core_1_from_entry_7:4; + /** core_1_current_7 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 7 + */ + uint32_t core_1_current_7:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable7_reg_t; + +/** Type of core_1_statustable8 register + * Status register of world switch of entry 8 + */ +typedef union { + struct { + /** core_1_from_world_8 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 8 + */ + uint32_t core_1_from_world_8:1; + /** core_1_from_entry_8 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 8 + */ + uint32_t core_1_from_entry_8:4; + /** core_1_current_8 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 8 + */ + uint32_t core_1_current_8:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable8_reg_t; + +/** Type of core_1_statustable9 register + * Status register of world switch of entry 9 + */ +typedef union { + struct { + /** core_1_from_world_9 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 9 + */ + uint32_t core_1_from_world_9:1; + /** core_1_from_entry_9 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 9 + */ + uint32_t core_1_from_entry_9:4; + /** core_1_current_9 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 9 + */ + uint32_t core_1_current_9:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable9_reg_t; + +/** Type of core_1_statustable10 register + * Status register of world switch of entry 10 + */ +typedef union { + struct { + /** core_1_from_world_10 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 10 + */ + uint32_t core_1_from_world_10:1; + /** core_1_from_entry_10 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 10 + */ + uint32_t core_1_from_entry_10:4; + /** core_1_current_10 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 10 + */ + uint32_t core_1_current_10:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable10_reg_t; + +/** Type of core_1_statustable11 register + * Status register of world switch of entry 11 + */ +typedef union { + struct { + /** core_1_from_world_11 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 11 + */ + uint32_t core_1_from_world_11:1; + /** core_1_from_entry_11 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 11 + */ + uint32_t core_1_from_entry_11:4; + /** core_1_current_11 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 11 + */ + uint32_t core_1_current_11:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable11_reg_t; + +/** Type of core_1_statustable12 register + * Status register of world switch of entry 12 + */ +typedef union { + struct { + /** core_1_from_world_12 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 12 + */ + uint32_t core_1_from_world_12:1; + /** core_1_from_entry_12 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 12 + */ + uint32_t core_1_from_entry_12:4; + /** core_1_current_12 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 12 + */ + uint32_t core_1_current_12:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable12_reg_t; + +/** Type of core_1_statustable13 register + * Status register of world switch of entry 13 + */ +typedef union { + struct { + /** core_1_from_world_13 : R/W; bitpos: [0]; default: 0; + * This bit is used to confirm world before enter entry 13 + */ + uint32_t core_1_from_world_13:1; + /** core_1_from_entry_13 : R/W; bitpos: [4:1]; default: 0; + * This filed is used to confirm in which entry before enter entry 13 + */ + uint32_t core_1_from_entry_13:4; + /** core_1_current_13 : R/W; bitpos: [5]; default: 0; + * This bit is used to confirm whether the current state is in entry 13 + */ + uint32_t core_1_current_13:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} wcl_core_1_statustable13_reg_t; + +/** Type of core_1_statustable_current register + * Status register of statustable current + */ +typedef union { + struct { + uint32_t reserved_0:1; + /** core_1_statustable_current : R/W; bitpos: [13:1]; default: 0; + * This field is used to quickly read and rewrite the current field of all STATUSTABLE + * registers,for example,bit 1 represents the current field of STATUSTABLE1 + */ + uint32_t core_1_statustable_current:13; + uint32_t reserved_14:18; + }; + uint32_t val; +} wcl_core_1_statustable_current_reg_t; + + +/** Group: WORLD0 to WORLD1 configuration Registers */ +/** Type of core_0_world_trigger_addr register + * Core_0 trigger address configuration Register + */ +typedef union { + struct { + /** core_0_world_trigger_addr : RW; bitpos: [31:0]; default: 0; + * This field is used to configure the entry address from WORLD0 to WORLD1,when the + * CPU executes to this address,switch to WORLD1 + */ + uint32_t core_0_world_trigger_addr:32; + }; + uint32_t val; +} wcl_core_0_world_trigger_addr_reg_t; + +/** Type of core_0_world_prepare register + * Core_0 prepare world configuration Register + */ +typedef union { + struct { + /** core_0_world_prepare : R/W; bitpos: [1:0]; default: 0; + * This field to used to set world to enter, 2'b01 means WORLD0, 2'b10 means WORLD1 + */ + uint32_t core_0_world_prepare:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_0_world_prepare_reg_t; + +/** Type of core_0_world_update register + * Core_0 configuration update register + */ +typedef union { + struct { + /** core_0_update : WO; bitpos: [31:0]; default: 0; + * This field is used to update configuration completed, can write any value,the + * hardware only checks the write operation of this register and does not case about + * its value + */ + uint32_t core_0_update:32; + }; + uint32_t val; +} wcl_core_0_world_update_reg_t; + +/** Type of core_0_world_cancel register + * Core_0 configuration cancel register + */ +typedef union { + struct { + /** core_0_world_cancel : WO; bitpos: [31:0]; default: 0; + * This field is used to cancel switch world configuration,if the trigger address and + * update configuration complete,use this register to cancel world switch, jujst need + * write any value,the hardware only checks the write operation of this register and + * does not case about its value + */ + uint32_t core_0_world_cancel:32; + }; + uint32_t val; +} wcl_core_0_world_cancel_reg_t; + +/** Type of core_0_world_iram0 register + * Core_0 Iram0 world register + */ +typedef union { + struct { + /** core_0_world_iram0 : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Iram0 bus + */ + uint32_t core_0_world_iram0:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_0_world_iram0_reg_t; + +/** Type of core_0_world_dram0_pif register + * Core_0 dram0 and PIF world register + */ +typedef union { + struct { + /** core_0_world_dram0_pif : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Dram0 bus and PIF bus + */ + uint32_t core_0_world_dram0_pif:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_0_world_dram0_pif_reg_t; + +/** Type of core_0_world_phase register + * Core_0 world status register + */ +typedef union { + struct { + /** core_0_world_phase : RO; bitpos: [0]; default: 0; + * This bit indicates whether is preparing to switch to WORLD1, 1 means value. + */ + uint32_t core_0_world_phase:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_0_world_phase_reg_t; + +/** Type of core_1_world_trigger_addr register + * Core_1 trigger address configuration Register + */ +typedef union { + struct { + /** core_1_world_trigger_addr : RW; bitpos: [31:0]; default: 0; + * This field is used to configure the entry address from WORLD0 to WORLD1,when the + * CPU executes to this address,switch to WORLD1 + */ + uint32_t core_1_world_trigger_addr:32; + }; + uint32_t val; +} wcl_core_1_world_trigger_addr_reg_t; + +/** Type of core_1_world_prepare register + * Core_1 prepare world configuration Register + */ +typedef union { + struct { + /** core_1_world_prepare : R/W; bitpos: [1:0]; default: 0; + * This field to used to set world to enter,2'b01 means WORLD0, 2'b10 means WORLD1 + */ + uint32_t core_1_world_prepare:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_1_world_prepare_reg_t; + +/** Type of core_1_world_update register + * Core_1 configuration update register + */ +typedef union { + struct { + /** core_1_update : WO; bitpos: [31:0]; default: 0; + * This field is used to update configuration completed, can write any value,the + * hardware only checks the write operation of this register and does not case about + * its value + */ + uint32_t core_1_update:32; + }; + uint32_t val; +} wcl_core_1_world_update_reg_t; + +/** Type of core_1_world_cancel register + * Core_1 configuration cancel register + */ +typedef union { + struct { + /** core_1_world_cancel : WO; bitpos: [31:0]; default: 0; + * This field is used to cancel switch world configuration,if the trigger address and + * update configuration complete,can use this register to cancel world switch. can + * write any value, the hardware only checks the write operation of this register and + * does not case about its value + */ + uint32_t core_1_world_cancel:32; + }; + uint32_t val; +} wcl_core_1_world_cancel_reg_t; + +/** Type of core_1_world_iram0 register + * Core_1 Iram0 world register + */ +typedef union { + struct { + /** core_1_world_iram0 : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Iram0 bus + */ + uint32_t core_1_world_iram0:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_1_world_iram0_reg_t; + +/** Type of core_1_world_dram0_pif register + * Core_1 dram0 and PIF world register + */ +typedef union { + struct { + /** core_1_world_dram0_pif : R/W; bitpos: [1:0]; default: 0; + * this field is used to read current world of Dram0 bus and PIF bus + */ + uint32_t core_1_world_dram0_pif:2; + uint32_t reserved_2:30; + }; + uint32_t val; +} wcl_core_1_world_dram0_pif_reg_t; + +/** Type of core_1_world_phase register + * Core_0 world status register + */ +typedef union { + struct { + /** core_1_world_phase : RO; bitpos: [0]; default: 0; + * This bit indicates whether is preparing to switch to WORLD1,1 means value. + */ + uint32_t core_1_world_phase:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_1_world_phase_reg_t; + + +/** Group: NMI mask configuration Registers */ +/** Type of core_0_nmi_mask_enable register + * Core_0 NMI mask enable register + */ +typedef union { + struct { + /** core_0_nmi_mask_enable : WO; bitpos: [31:0]; default: 0; + * this field is used to set NMI mask,it can write any value,when write this + * register,the hardware start masking NMI interrupt + */ + uint32_t core_0_nmi_mask_enable:32; + }; + uint32_t val; +} wcl_core_0_nmi_mask_enable_reg_t; + +/** Type of core_0_nmi_mask_trigger_addr register + * Core_0 NMI mask trigger address register + */ +typedef union { + struct { + /** core_0_nmi_mask_trigger_addr : R/W; bitpos: [31:0]; default: 0; + * this field to used to set trigger address, when CPU executes to this address,NMI + * mask automatically fails + */ + uint32_t core_0_nmi_mask_trigger_addr:32; + }; + uint32_t val; +} wcl_core_0_nmi_mask_trigger_addr_reg_t; + +/** Type of core_0_nmi_mask_disable register + * Core_0 NMI mask disable register + */ +typedef union { + struct { + /** core_0_nmi_mask_disable : WO; bitpos: [31:0]; default: 0; + * this field is used to disable NMI mask,it will not take effect immediately,only + * when the CPU executes to the trigger address will it start to cancel NMI mask + */ + uint32_t core_0_nmi_mask_disable:32; + }; + uint32_t val; +} wcl_core_0_nmi_mask_disable_reg_t; + +/** Type of core_0_nmi_mask_cancle register + * Core_0 NMI mask disable register + */ +typedef union { + struct { + /** core_0_nmi_mask_cancel : WO; bitpos: [31:0]; default: 0; + * this field is used to cancel NMI mask disable function. + */ + uint32_t core_0_nmi_mask_cancel:32; + }; + uint32_t val; +} wcl_core_0_nmi_mask_cancle_reg_t; + +/** Type of core_0_nmi_mask register + * Core_0 NMI mask register + */ +typedef union { + struct { + /** core_0_nmi_mask : R/W; bitpos: [0]; default: 0; + * this bit is used to mask NMI interrupt,it can directly mask NMI interrupt + */ + uint32_t core_0_nmi_mask:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_0_nmi_mask_reg_t; + +/** Type of core_0_nmi_mask_phase register + * Core_0 NMI mask phase register + */ +typedef union { + struct { + /** core_0_nmi_mask_phase : RO; bitpos: [0]; default: 0; + * this bit is used to indicates whether the NMI interrupt is being masked, 1 means + * NMI interrupt is being masked + */ + uint32_t core_0_nmi_mask_phase:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_0_nmi_mask_phase_reg_t; + +/** Type of core_1_nmi_mask_enable register + * Core_1 NMI mask enable register + */ +typedef union { + struct { + /** core_1_nmi_mask_enable : WO; bitpos: [31:0]; default: 0; + * this field is used to set NMI mask, it can write any value, when write this + * register,the hardware start masking NMI interrupt + */ + uint32_t core_1_nmi_mask_enable:32; + }; + uint32_t val; +} wcl_core_1_nmi_mask_enable_reg_t; + +/** Type of core_1_nmi_mask_trigger_addr register + * Core_1 NMI mask trigger addr register + */ +typedef union { + struct { + /** core_1_nmi_mask_trigger_addr : R/W; bitpos: [31:0]; default: 0; + * this field to used to set trigger address + */ + uint32_t core_1_nmi_mask_trigger_addr:32; + }; + uint32_t val; +} wcl_core_1_nmi_mask_trigger_addr_reg_t; + +/** Type of core_1_nmi_mask_disable register + * Core_1 NMI mask disable register + */ +typedef union { + struct { + /** core_1_nmi_mask_disable : WO; bitpos: [31:0]; default: 0; + * this field is used to disable NMI mask, it will not take effect immediately,only + * when the CPU executes to the trigger address will it start to cancel NMI mask + */ + uint32_t core_1_nmi_mask_disable:32; + }; + uint32_t val; +} wcl_core_1_nmi_mask_disable_reg_t; + +/** Type of core_1_nmi_mask_cancle register + * Core_1 NMI mask disable register + */ +typedef union { + struct { + /** core_1_nmi_mask_cancel : WO; bitpos: [31:0]; default: 0; + * this field is used to cancel NMI mask disable function. + */ + uint32_t core_1_nmi_mask_cancel:32; + }; + uint32_t val; +} wcl_core_1_nmi_mask_cancle_reg_t; + +/** Type of core_1_nmi_mask register + * Core_1 NMI mask register + */ +typedef union { + struct { + /** core_1_nmi_mask : R/W; bitpos: [0]; default: 0; + * this bit is used to mask NMI interrupt,it can directly mask NMI interrupt + */ + uint32_t core_1_nmi_mask:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_1_nmi_mask_reg_t; + +/** Type of core_1_nmi_mask_phase register + * Core_1 NMI mask phase register + */ +typedef union { + struct { + /** core_1_nmi_mask_phase : RO; bitpos: [0]; default: 0; + * this bit is used to indicates whether the NMI interrupt is being masked, 1 means + * NMI interrupt is being masked + */ + uint32_t core_1_nmi_mask_phase:1; + uint32_t reserved_1:31; + }; + uint32_t val; +} wcl_core_1_nmi_mask_phase_reg_t; + + +typedef struct { + volatile wcl_core_0_entry_1_addr_reg_t core_0_entry_1_addr; + volatile wcl_core_0_entry_2_addr_reg_t core_0_entry_2_addr; + volatile wcl_core_0_entry_3_addr_reg_t core_0_entry_3_addr; + volatile wcl_core_0_entry_4_addr_reg_t core_0_entry_4_addr; + volatile wcl_core_0_entry_5_addr_reg_t core_0_entry_5_addr; + volatile wcl_core_0_entry_6_addr_reg_t core_0_entry_6_addr; + volatile wcl_core_0_entry_7_addr_reg_t core_0_entry_7_addr; + volatile wcl_core_0_entry_8_addr_reg_t core_0_entry_8_addr; + volatile wcl_core_0_entry_9_addr_reg_t core_0_entry_9_addr; + volatile wcl_core_0_entry_10_addr_reg_t core_0_entry_10_addr; + volatile wcl_core_0_entry_11_addr_reg_t core_0_entry_11_addr; + volatile wcl_core_0_entry_12_addr_reg_t core_0_entry_12_addr; + volatile wcl_core_0_entry_13_addr_reg_t core_0_entry_13_addr; + uint32_t reserved_034[18]; + volatile wcl_core_0_entry_check_reg_t core_0_entry_check; + volatile wcl_core_0_statustable1_reg_t core_0_statustable1; + volatile wcl_core_0_statustable2_reg_t core_0_statustable2; + volatile wcl_core_0_statustable3_reg_t core_0_statustable3; + volatile wcl_core_0_statustable4_reg_t core_0_statustable4; + volatile wcl_core_0_statustable5_reg_t core_0_statustable5; + volatile wcl_core_0_statustable6_reg_t core_0_statustable6; + volatile wcl_core_0_statustable7_reg_t core_0_statustable7; + volatile wcl_core_0_statustable8_reg_t core_0_statustable8; + volatile wcl_core_0_statustable9_reg_t core_0_statustable9; + volatile wcl_core_0_statustable10_reg_t core_0_statustable10; + volatile wcl_core_0_statustable11_reg_t core_0_statustable11; + volatile wcl_core_0_statustable12_reg_t core_0_statustable12; + volatile wcl_core_0_statustable13_reg_t core_0_statustable13; + uint32_t reserved_0b4[18]; + volatile wcl_core_0_statustable_current_reg_t core_0_statustable_current; + volatile wcl_core_0_message_addr_reg_t core_0_message_addr; + volatile wcl_core_0_message_max_reg_t core_0_message_max; + volatile wcl_core_0_message_phase_reg_t core_0_message_phase; + uint32_t reserved_10c[13]; + volatile wcl_core_0_world_trigger_addr_reg_t core_0_world_trigger_addr; + volatile wcl_core_0_world_prepare_reg_t core_0_world_prepare; + volatile wcl_core_0_world_update_reg_t core_0_world_update; + volatile wcl_core_0_world_cancel_reg_t core_0_world_cancel; + volatile wcl_core_0_world_iram0_reg_t core_0_world_iram0; + volatile wcl_core_0_world_dram0_pif_reg_t core_0_world_dram0_pif; + volatile wcl_core_0_world_phase_reg_t core_0_world_phase; + uint32_t reserved_15c[9]; + volatile wcl_core_0_nmi_mask_enable_reg_t core_0_nmi_mask_enable; + volatile wcl_core_0_nmi_mask_trigger_addr_reg_t core_0_nmi_mask_trigger_addr; + volatile wcl_core_0_nmi_mask_disable_reg_t core_0_nmi_mask_disable; + volatile wcl_core_0_nmi_mask_cancle_reg_t core_0_nmi_mask_cancle; + volatile wcl_core_0_nmi_mask_reg_t core_0_nmi_mask; + volatile wcl_core_0_nmi_mask_phase_reg_t core_0_nmi_mask_phase; + uint32_t reserved_198[154]; + volatile wcl_core_1_entry_1_addr_reg_t core_1_entry_1_addr; + volatile wcl_core_1_entry_2_addr_reg_t core_1_entry_2_addr; + volatile wcl_core_1_entry_3_addr_reg_t core_1_entry_3_addr; + volatile wcl_core_1_entry_4_addr_reg_t core_1_entry_4_addr; + volatile wcl_core_1_entry_5_addr_reg_t core_1_entry_5_addr; + volatile wcl_core_1_entry_6_addr_reg_t core_1_entry_6_addr; + volatile wcl_core_1_entry_7_addr_reg_t core_1_entry_7_addr; + volatile wcl_core_1_entry_8_addr_reg_t core_1_entry_8_addr; + volatile wcl_core_1_entry_9_addr_reg_t core_1_entry_9_addr; + volatile wcl_core_1_entry_10_addr_reg_t core_1_entry_10_addr; + volatile wcl_core_1_entry_11_addr_reg_t core_1_entry_11_addr; + volatile wcl_core_1_entry_12_addr_reg_t core_1_entry_12_addr; + volatile wcl_core_1_entry_13_addr_reg_t core_1_entry_13_addr; + uint32_t reserved_434[18]; + volatile wcl_core_1_entry_check_reg_t core_1_entry_check; + volatile wcl_core_1_statustable1_reg_t core_1_statustable1; + volatile wcl_core_1_statustable2_reg_t core_1_statustable2; + volatile wcl_core_1_statustable3_reg_t core_1_statustable3; + volatile wcl_core_1_statustable4_reg_t core_1_statustable4; + volatile wcl_core_1_statustable5_reg_t core_1_statustable5; + volatile wcl_core_1_statustable6_reg_t core_1_statustable6; + volatile wcl_core_1_statustable7_reg_t core_1_statustable7; + volatile wcl_core_1_statustable8_reg_t core_1_statustable8; + volatile wcl_core_1_statustable9_reg_t core_1_statustable9; + volatile wcl_core_1_statustable10_reg_t core_1_statustable10; + volatile wcl_core_1_statustable11_reg_t core_1_statustable11; + volatile wcl_core_1_statustable12_reg_t core_1_statustable12; + volatile wcl_core_1_statustable13_reg_t core_1_statustable13; + uint32_t reserved_4b4[18]; + volatile wcl_core_1_statustable_current_reg_t core_1_statustable_current; + volatile wcl_core_1_message_addr_reg_t core_1_message_addr; + volatile wcl_core_1_message_max_reg_t core_1_message_max; + volatile wcl_core_1_message_phase_reg_t core_1_message_phase; + uint32_t reserved_50c[13]; + volatile wcl_core_1_world_trigger_addr_reg_t core_1_world_trigger_addr; + volatile wcl_core_1_world_prepare_reg_t core_1_world_prepare; + volatile wcl_core_1_world_update_reg_t core_1_world_update; + volatile wcl_core_1_world_cancel_reg_t core_1_world_cancel; + volatile wcl_core_1_world_iram0_reg_t core_1_world_iram0; + volatile wcl_core_1_world_dram0_pif_reg_t core_1_world_dram0_pif; + volatile wcl_core_1_world_phase_reg_t core_1_world_phase; + uint32_t reserved_55c[9]; + volatile wcl_core_1_nmi_mask_enable_reg_t core_1_nmi_mask_enable; + volatile wcl_core_1_nmi_mask_trigger_addr_reg_t core_1_nmi_mask_trigger_addr; + volatile wcl_core_1_nmi_mask_disable_reg_t core_1_nmi_mask_disable; + volatile wcl_core_1_nmi_mask_cancle_reg_t core_1_nmi_mask_cancle; + volatile wcl_core_1_nmi_mask_reg_t core_1_nmi_mask; + volatile wcl_core_1_nmi_mask_phase_reg_t core_1_nmi_mask_phase; +} wcl_dev_t; + +extern wcl_dev_t WORLD_CONTROLLER; + +#ifndef __cplusplus +_Static_assert(sizeof(wcl_dev_t) == 0x598, "Invalid size of wcl_dev_t structure"); +#endif + #ifdef __cplusplus } #endif diff --git a/components/soc/esp32s3/ld/esp32s3.peripherals.ld b/components/soc/esp32s3/ld/esp32s3.peripherals.ld index de6ed0abcf..66ed5c0387 100644 --- a/components/soc/esp32s3/ld/esp32s3.peripherals.ld +++ b/components/soc/esp32s3/ld/esp32s3.peripherals.ld @@ -47,3 +47,4 @@ PROVIDE ( USB_SERIAL_JTAG = 0x60038000 ); PROVIDE ( USB0 = 0x60080000 ); PROVIDE ( USBH = 0x60080000 ); PROVIDE ( USB_WRAP = 0x60039000 ); +PROVIDE ( WORLD_CONTROLLER = 0x600D0000 ); diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index bdaaa3d546..e35ce9e501 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1258,7 +1258,6 @@ components/soc/esp32s3/include/soc/usb_wrap_reg.h components/soc/esp32s3/include/soc/usb_wrap_struct.h components/soc/esp32s3/include/soc/usbh_struct.h components/soc/esp32s3/include/soc/wdev_reg.h -components/soc/esp32s3/include/soc/world_controller_reg.h components/soc/esp32s3/interrupts.c components/soc/esp32s3/ledc_periph.c components/soc/esp32s3/rtc_io_periph.c diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index 71b5cd3f5d..c812a8080a 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -152,8 +152,6 @@ components/esp_rom/include/esp32/rom/uart.h ### To be fixed: files which don't compile for esp32s3 target: -components/soc/esp32s3/include/soc/world_controller_struct.h - ### To be fixed: files which don't compile for esp32c3 target: From d422e2e7fadd37c703841b855f30110eb44fd5c1 Mon Sep 17 00:00:00 2001 From: daiziyan Date: Thu, 4 Aug 2022 18:17:53 +0800 Subject: [PATCH 036/665] docs: updated trans for ulp-risc-v,fatfs and sleep_modes --- docs/en/api-reference/system/ulp-risc-v.rst | 11 ++++---- docs/zh_CN/api-reference/storage/fatfs.rst | 5 +++- .../api-reference/system/sleep_modes.rst | 6 +++-- .../zh_CN/api-reference/system/ulp-risc-v.rst | 26 ++++++++++++++++--- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/docs/en/api-reference/system/ulp-risc-v.rst b/docs/en/api-reference/system/ulp-risc-v.rst index a3088a0954..2a1d87daf0 100644 --- a/docs/en/api-reference/system/ulp-risc-v.rst +++ b/docs/en/api-reference/system/ulp-risc-v.rst @@ -35,7 +35,7 @@ To compile the ULP RISC-V code as part of the component, the following steps mus The first argument to ``ulp_embed_binary`` specifies the ULP binary name. The name specified here will also be used by other generated artifacts such as the ELF file, map file, header file and linker export file. The second argument specifies the ULP source files. Finally, the third argument specifies the list of component source files which include the header file to be generated. This list is needed to build the dependencies correctly and ensure that the generated header file will be created before any of these files are compiled. See the section below for the concept of generated header files for ULP applications. -3. Build the application as usual (e.g. `idf.py app`). +3. Build the application as usual (e.g., `idf.py app`). Inside, the build system will take the following steps to build ULP program: @@ -142,21 +142,22 @@ To disable the timer (effectively preventing the ULP program from running again) Debugging Your ULP RISC-V Program ---------------------------------- -When programming the ULP RISC-V it can sometimes be challenging to figure out why the program is not behaving as expected. Due to the simplicity of the core many of the standard methods of debugging, e.g. JTAG or ``printf``, are simply not available. +When programming the ULP RISC-V, it can sometimes be challenging to figure out why the program is not behaving as expected. Due to the simplicity of the core, many of the standard methods of debugging, e.g., JTAG or ``printf``, are simply not available. Keeping this in mind, here are some ways that may help you debug you ULP RISC-V program: * Share program state through shared variables: as described in :ref:`ulp-riscv-access-variables`, both the main CPU and the ULP core can easily access global variables in RTC memory. Writing state information to such a variable from the ULP and reading it from the main CPU can help you discern what is happening on the ULP core. The downside of this approach is that it requires the main CPU to be awake, which will not always be the case. Keeping the main CPU awake might even, in some cases, mask problems, as some issues may only occur when certain power domains are powered down. - * Printing using the bit-banged UART driver: the ULP RISC-V component comes with a low-speed bit-banged UART TX driver that can be used for printing information independently of the main CPU state. See :example:`system/ulp_riscv/uart_print` for an example of how to use this driver. - * Trap signal: the ULP RISC-V has a hardware trap that will trigger under certain conditions, e.g. illegal instruction. This will cause the main CPU to be woken up with the wake-up cause :cpp:enumerator:`ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG`. + * Use the bit-banged UART driver to print: the ULP RISC-V component comes with a low-speed bit-banged UART TX driver that can be used for printing information independently of the main CPU state. See :example:`system/ulp_riscv/uart_print` for an example of how to use this driver. + + * Trap signal: the ULP RISC-V has a hardware trap that will trigger under certain conditions, e.g., illegal instruction. This will cause the main CPU to be woken up with the wake-up cause :cpp:enumerator:`ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG`. Application Examples -------------------- * ULP RISC-V Coprocessor polls GPIO while main CPU is in deep sleep: :example:`system/ulp_riscv/gpio`. -* ULP RISC-V Coprocessor uses bit-banged UART tx to print: :example:`system/ulp_riscv/uart_print`. +* ULP RISC-V Coprocessor uses bit-banged UART driver to print: :example:`system/ulp_riscv/uart_print`. * ULP RISC-V Coprocessor reads external temperature sensor while main CPU is in deep sleep: :example:`system/ulp_riscv/ds18b20_onewire`. API Reference diff --git a/docs/zh_CN/api-reference/storage/fatfs.rst b/docs/zh_CN/api-reference/storage/fatfs.rst index c3aa464dc3..5cddab2e3b 100644 --- a/docs/zh_CN/api-reference/storage/fatfs.rst +++ b/docs/zh_CN/api-reference/storage/fatfs.rst @@ -121,7 +121,10 @@ FatFs 分区生成器 2. base_dir - 目录名称,该目录会被编码为 FatFs 分区,也可以选择将其被烧录进设备。但注意必须在分区表中指定合适的分区大小。 -3. ``FLASH_IN_PROJECT`` 标志 - 用户可以通过指定 ``FLASH_IN_PROJECT``,选择在执行 ``idf.py flash -p `` 时让分区镜像自动与应用程序二进制文件、分区表等一同烧录进设备。 +3. ``FLASH_IN_PROJECT`` 标志 - 可选参数,用户可以通过指定 ``FLASH_IN_PROJECT``,选择在执行 ``idf.py flash -p `` 时让分区镜像自动与应用程序二进制文件、分区表等一同烧录进设备。 + +4. ``PRESERVE_TIME`` 标志 - 可选参数,用户可强制让目标镜像保留源文件夹的时间戳。如果不保留,每个目标镜像的时间戳都将设置为 FATFS 默认初始时间(1980 年 1 月 1 日)。 + 例如:: diff --git a/docs/zh_CN/api-reference/system/sleep_modes.rst b/docs/zh_CN/api-reference/system/sleep_modes.rst index f8b679a543..83f7b42ef4 100644 --- a/docs/zh_CN/api-reference/system/sleep_modes.rst +++ b/docs/zh_CN/api-reference/system/sleep_modes.rst @@ -171,7 +171,9 @@ RTC 外设和内存断电 Flash 断电 ---------- -默认情况下,调用函数 :cpp:func:`esp_light_sleep_start` 后, **不会** 断电 flash。在 sleep 过程中断电 flash 存在风险。因为 flash 断电需要时间,但是在此期间,系统有可能被唤醒。此时 flash 重新被上电,断电尚未完成又重新上电的硬件行为有概率导致 flash 不能正常工作。如果用户为 flash 供电电路添加了滤波电容,断电所需时间可能会更长。此外,即使可以预知 flash 彻底断电所需的时间,有时也不能通过设置足够长的睡眠时间来确保 flash 断电的安全(比如,突发的异步唤醒源会使得实际的睡眠时间不可控)。 +默认情况下,调用函数 :cpp:func:`esp_light_sleep_start` 后, flash **不会** 断电,因为在 sleep 过程中断电 flash 存在风险。具体而言,flash 断电需要时间,但是在此期间,系统有可能被唤醒,导致 flash 重新被上电。此时,断电尚未完成又重新上电的硬件行为有可能导致 flash 无法正常工作。 + +理论上讲,在 flash 完全断电后可以仅唤醒系统,然而现实情况是 flash 断电所需的时间很难预测。如果用户为 flash 供电电路添加了滤波电容,断电所需时间可能会更长。此外,即使可以预知 flash 彻底断电所需的时间,有时也不能通过设置足够长的睡眠时间来确保 flash 断电的安全(比如,突发的异步唤醒源会使得实际的睡眠时间不可控)。 .. warning:: 如果在 flash 的供电电路上添加了滤波电容,那么应当尽一切可能避免 flash 断电。 @@ -193,7 +195,7 @@ Flash 断电 .. list:: - - Light sleep 时,ESP-IDF 并未提供保证 flash 一定会被断电的机制。 + - Light sleep 时,ESP-IDF 没有提供保证 flash 一定会被断电的机制。 - 不管用户的配置如何,函数 :cpp:func:`esp_deep_sleep_start` 都会强制断电 flash。 进入 Light-sleep 模式 diff --git a/docs/zh_CN/api-reference/system/ulp-risc-v.rst b/docs/zh_CN/api-reference/system/ulp-risc-v.rst index f3c2d2c09b..5c9156e243 100644 --- a/docs/zh_CN/api-reference/system/ulp-risc-v.rst +++ b/docs/zh_CN/api-reference/system/ulp-risc-v.rst @@ -11,7 +11,7 @@ ULP RISC-V 协处理器代码以 C 语言(或汇编语言)编写,使用基 如果您已依照 :doc:`快速入门指南 <../../../get-started/index>` 中的介绍安装好了 ESP-IDF 及其 CMake 构建系统,那么 ULP RISC-V 工具链已经被默认安装到了您的开发环境中。 -.. note: 在早期版本的ESP-IDF中,RISC-V工具链具有不同的名称:`riscv-none-embed-gcc`。 +.. note: 在早期版本的 ESP-IDF 中,RISC-V 工具链具有不同的名称:`riscv-none-embed-gcc`。 编译 ULP RISC-V 代码 ----------------------------- @@ -51,18 +51,20 @@ ULP RISC-V 协处理器代码以 C 语言(或汇编语言)编写,使用基 6. **创建 LD 导出脚本和头文件** (``ulp_app_name.ld`` 和 ``ulp_app_name.h``),包含来自 ``ulp_app_name.sym`` 的符号。此步骤可借助 ``esp32ulp_mapgen.py`` 工具来完成。 - 7. **将生成的二进制文件添加到要嵌入应用程序的二进制文件列表中。** + 7. **将生成的二进制文件添加到要嵌入应用程序的二进制文件列表中。** + +.. _ulp-riscv-access-variables: 访问 ULP RISC-V 程序变量 ---------------------------- -在 ULP RISC-V 程序中定义的全局符号也可以在主程序中使用。 +在 ULP RISC-V 程序中定义的全局符号也可以在主程序中使用。 例如,ULP RISC-V 程序可以定义 ``measurement_count`` 变量,此变量可以定义程序从深度睡眠中唤醒芯片之前需要进行的 ADC 测量的次数。 .. code-block:: c - volatile int measurement_count; + volatile int measurement_count; int some_function() { @@ -136,10 +138,26 @@ ULP RISC-V 协处理器由定时器启动,调用 :cpp:func:`ulp_riscv_run` 即 如需禁用定时器(有效防止 ULP 程序再次运行),请清除 ``RTC_CNTL_STATE0_REG`` 寄存器中的 ``RTC_CNTL_ULP_CP_SLP_TIMER_EN`` 位,此项操作可在 ULP 代码或主程序中进行。 + +调试 ULP RISC-V 程序 +---------------------------------- + +在对 ULP RISC-V 进行编程时,若程序未按预期运行,有时很难找出的原因。因为其内核的简单性,许多标准的调试方法如 JTAG 或 ``printf`` 无法使用。 + +以下方法可以帮助您调试 ULP RISC-V 程序: + + * 通过共享变量查看程序状态:如 :ref:`ulp-riscv-access-variables` 中所述,主 CPU 以及 ULP 内核都可以轻松访问 RTC 内存中的全局变量。通过 ULP 向该变量中写入状态信息,然后通过主 CPU 读取状态信息,可帮助您了解 ULP 内核的状态。该方法的缺点在于它要求主 CPU 一直处于唤醒状态,但现实情况可能并非如此。有时,保持主 CPU 处于唤醒状态还可能会掩盖一些问题,因为某些问题可能仅在特定电源域断电时才会出现。 + + * 使用 bit-banged UART 驱动程序打印:ULP RISC-V 组件中有一个低速 bit-banged UART TX 驱动程序,可用于打印独立于主 CPU 状态的信息。有关如何使用此驱动程序的示例,请参阅 :example:`system/ulp_riscv/uart_print`。 + + * 陷阱信号:ULP RISC-V 有一个硬件陷阱,将在特定条件下触发,例如非法指令。这将导致主 CPU 被 :cpp:enumerator:`ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG` 唤醒。 + + 应用示例 -------------------- * 主处理器处于 Deep-sleep 状态时,ULP RISC-V 协处理器轮询 GPIO::example:`system/ulp_riscv/gpio`。 +* ULP RISC-V 协处理器使用 bit-banged UART 驱动程序打印: :example:`system/ulp_riscv/uart_print`. * 主处理器处于 Deep-sleep 状态时,ULP RISC-V 协处理器读取外部温度传感器::example:`system/ulp_riscv/ds18b20_onewire`。 API 参考 From 5804d2b6a7dd2731b0b639925edb569751670c66 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Wed, 10 Aug 2022 14:13:48 +0800 Subject: [PATCH 037/665] freertos: Fix flakey event group unit tests The event group unit tests would previously use a single call bit (the "BIT_CALL" macro) to unblock all the test tasks. However, if one or more tasks were delayed in calling xEventGroupWaitBits(), the other tasks would clear the test bits, leading to the test deadlocking. This commit updates the bits used so that each task gets their own CALL and RESPONSE bits. --- .../event_groups/test_freertos_eventgroups.c | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/components/freertos/test/integration/event_groups/test_freertos_eventgroups.c b/components/freertos/test/integration/event_groups/test_freertos_eventgroups.c index a4521ec91e..e0a9e8c9e6 100644 --- a/components/freertos/test/integration/event_groups/test_freertos_eventgroups.c +++ b/components/freertos/test/integration/event_groups/test_freertos_eventgroups.c @@ -15,11 +15,13 @@ #include "unity.h" #include "unity_test_utils.h" -#define BIT_CALL (1 << 0) -#define BIT_RESPONSE(TASK) (1 << (TASK+1)) -#define ALL_RESPONSE_BITS (((1 << NUM_TASKS) - 1) << 1) +#define NUM_TASKS 8 +#define ALL_TASK_BITS ((1 << NUM_TASKS) - 1) +#define BIT_CALL(task) (1 << (task)) +#define BIT_RESPONSE(task) (1 << ((task) + NUM_TASKS)) +#define ALL_CALL_BITS (ALL_TASK_BITS) +#define ALL_RESPONSE_BITS (ALL_TASK_BITS << NUM_TASKS) -static const int NUM_TASKS = 8; static const int COUNT = 1000; static EventGroupHandle_t eg; static SemaphoreHandle_t done_sem; @@ -33,7 +35,7 @@ static void task_event_group_call_response(void *param) for (int i = 0; i < COUNT; i++) { /* Wait until the common "call" bit is set, starts off all tasks (clear on return) */ - TEST_ASSERT( xEventGroupWaitBits(eg, BIT_CALL, true, false, portMAX_DELAY) ); + TEST_ASSERT( xEventGroupWaitBits(eg, BIT_CALL(task_num), true, false, portMAX_DELAY) ); /* Set our individual "response" bit */ xEventGroupSetBits(eg, BIT_RESPONSE(task_num)); @@ -55,20 +57,20 @@ TEST_CASE("FreeRTOS Event Groups", "[freertos]") /* Note: task_event_group_call_response all have higher priority than this task, so on this core they will always preempt this task. - This is important because we need to know all tasks have blocked on BIT_CALL each time we signal it, - or they get out of sync. + This is important because we need to know all tasks have blocked on their own BIT_CALL(task_num) each time we + signal it, or they get out of sync. */ for (int c = 0; c < NUM_TASKS; c++) { xTaskCreatePinnedToCore(task_event_group_call_response, "tsk_call_resp", 4096, (void *)c, configMAX_PRIORITIES - 1, &task_handles[c], c % portNUM_PROCESSORS); } /* Tasks all start instantly, but this task will resume running at the same time as the higher priority tasks on the - other processor may still be setting up, so allow time for them to also block on BIT_CALL... */ + other processor may still be setting up, so allow time for them to also block on BIT_CALL()... */ vTaskDelay(10); for (int i = 0; i < COUNT; i++) { - /* signal all tasks with "CALL" bit... */ - xEventGroupSetBits(eg, BIT_CALL); + /* signal all the "CALL" bits of each task */ + xEventGroupSetBits(eg, ALL_CALL_BITS); /* Wait until all tasks have set their respective response bits */ TEST_ASSERT_EQUAL_HEX16(ALL_RESPONSE_BITS, xEventGroupWaitBits(eg, ALL_RESPONSE_BITS, true, true, portMAX_DELAY)); @@ -87,8 +89,6 @@ TEST_CASE("FreeRTOS Event Groups", "[freertos]") vEventGroupDelete(eg); } -#define BIT_DONE(X) (1<<(NUM_TASKS+1+X)) - static void task_test_sync(void *param) { int task_num = (int)param; @@ -97,11 +97,11 @@ static void task_test_sync(void *param) for (int i = 0; i < COUNT; i++) { /* set our bit, and wait on all tasks to set their bits */ - xEventGroupSync(eg, BIT_RESPONSE(task_num), ALL_RESPONSE_BITS, portMAX_DELAY); + xEventGroupSync(eg, BIT_CALL(task_num), ALL_CALL_BITS, portMAX_DELAY); /* clear our bit */ - xEventGroupClearBits(eg, BIT_RESPONSE(task_num)); + xEventGroupClearBits(eg, BIT_CALL(task_num)); } - int after_done = xEventGroupSetBits(eg, BIT_DONE(task_num)); + int after_done = xEventGroupSetBits(eg, BIT_RESPONSE(task_num)); printf("Done %d = 0x%08x\n", task_num, after_done); @@ -119,8 +119,8 @@ TEST_CASE("FreeRTOS Event Group Sync", "[freertos]") } for (int c = 0; c < NUM_TASKS; c++) { - printf("Waiting on %d (0x%08x)\n", c, BIT_DONE(c)); - TEST_ASSERT( xEventGroupWaitBits(eg, BIT_DONE(c), false, false, portMAX_DELAY) ); + printf("Waiting on %d (0x%08x)\n", c, BIT_RESPONSE(c)); + TEST_ASSERT( xEventGroupWaitBits(eg, BIT_RESPONSE(c), false, false, portMAX_DELAY) ); } /* Ensure all tasks cleaned up correctly */ From 2a6c6c18f7a1e317201c1f49faea19bc480ca5e7 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 28 Jul 2022 13:49:44 +0800 Subject: [PATCH 038/665] esp_hw_support: esp_clk should use spinlock instead of mutex esp_clk used to be protected using _lock_t (i.e., a FreeRTOS Mutex). However, esp_clk API is current called from from critical sections, thus mutex should not be used (as they can be blocking). This commit updates esp_clk to use spinlocks for critical sections instead. --- components/esp_hw_support/esp_clk.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/components/esp_hw_support/esp_clk.c b/components/esp_hw_support/esp_clk.c index 0fd5deec93..8ede56603e 100644 --- a/components/esp_hw_support/esp_clk.c +++ b/components/esp_hw_support/esp_clk.c @@ -8,6 +8,7 @@ #include #include +#include "freertos/FreeRTOS.h" #include "esp_attr.h" #include "soc/rtc.h" #include "soc/soc_caps.h" @@ -46,7 +47,7 @@ extern uint32_t g_ticks_per_us_app; #endif #endif -static _lock_t s_esp_rtc_time_lock; +static portMUX_TYPE s_esp_rtc_time_lock = portMUX_INITIALIZER_UNLOCKED; // TODO: IDF-4239 static RTC_DATA_ATTR uint64_t s_esp_rtc_time_us = 0, s_rtc_last_ticks = 0; @@ -94,7 +95,7 @@ uint64_t esp_rtc_get_time_us(void) //IDF-3901 return 0; #endif - _lock_acquire(&s_esp_rtc_time_lock); + portENTER_CRITICAL_SAFE(&s_esp_rtc_time_lock); const uint32_t cal = esp_clk_slowclk_cal_get(); const uint64_t rtc_this_ticks = rtc_time_get(); const uint64_t ticks = rtc_this_ticks - s_rtc_last_ticks; @@ -115,7 +116,7 @@ uint64_t esp_rtc_get_time_us(void) ((ticks_high * cal) << (32 - RTC_CLK_CAL_FRACT)); s_esp_rtc_time_us += delta_time_us; s_rtc_last_ticks = rtc_this_ticks; - _lock_release(&s_esp_rtc_time_lock); + portEXIT_CRITICAL_SAFE(&s_esp_rtc_time_lock); return s_esp_rtc_time_us; } From a73dd07d12a75db035b7ec9496a21473afcd4612 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 28 Jul 2022 14:20:16 +0800 Subject: [PATCH 039/665] esp_hw_support: Fix esp_light_sleep_start() deadlock esp_light_sleep_start() will stall the other CPU via esp_ipc_isr_stall_other_cpu(). After stalling the other CPU, will call esp_clk_... API which themselves take locks. If the other stalled CPU is holding those locks, this will result in a deadlock. This commit adds a workaround calling esp_clk_private_lock() to take the lock before stalling the other CPU. --- components/esp_hw_support/esp_clk.c | 10 ++++++++++ .../include/esp_private/esp_clk.h | 13 +++++++++++++ components/esp_hw_support/sleep_modes.c | 18 ++++++++++++++++++ components/esp_system/include/esp_ipc_isr.h | 1 + .../include/esp_private/esp_timer_private.h | 4 ++-- 5 files changed, 44 insertions(+), 2 deletions(-) diff --git a/components/esp_hw_support/esp_clk.c b/components/esp_hw_support/esp_clk.c index 8ede56603e..2421196646 100644 --- a/components/esp_hw_support/esp_clk.c +++ b/components/esp_hw_support/esp_clk.c @@ -144,3 +144,13 @@ uint64_t esp_clk_rtc_time(void) return 0; #endif } + +void esp_clk_private_lock(void) +{ + portENTER_CRITICAL(&s_esp_rtc_time_lock); +} + +void esp_clk_private_unlock(void) +{ + portEXIT_CRITICAL(&s_esp_rtc_time_lock); +} diff --git a/components/esp_hw_support/include/esp_private/esp_clk.h b/components/esp_hw_support/include/esp_private/esp_clk.h index 8462b032ee..01b2849f8a 100644 --- a/components/esp_hw_support/include/esp_private/esp_clk.h +++ b/components/esp_hw_support/include/esp_private/esp_clk.h @@ -82,6 +82,19 @@ int esp_clk_xtal_freq(void); */ uint64_t esp_clk_rtc_time(void); +/** + * @brief obtain internal critical section used esp_clk implementation. + * + * This is used by the esp_light_sleep_start() to avoid deadlocking when it + * calls esp_clk related API after stalling the other CPU. + */ +void esp_clk_private_lock(void); + +/** + * @brief counterpart of esp_clk_private_lock + */ +void esp_clk_private_unlock(void); + #ifdef __cplusplus } #endif diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 58caee9b3e..154b9bb649 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -665,12 +665,29 @@ esp_err_t esp_light_sleep_start(void) s_config.ccount_ticks_record = esp_cpu_get_cycle_count(); static portMUX_TYPE light_sleep_lock = portMUX_INITIALIZER_UNLOCKED; portENTER_CRITICAL(&light_sleep_lock); + /* + Note: We are about to stall the other CPU via the esp_ipc_isr_stall_other_cpu(). However, there is a chance of + deadlock if after stalling the other CPU, we attempt to take spinlocks already held by the other CPU that is. + + Thus any functions that we call after stalling the other CPU will need to have the locks taken first to avoid + deadlock. + + Todo: IDF-5257 + */ + /* We will be calling esp_timer_private_set inside DPORT access critical * section. Make sure the code on the other CPU is not holding esp_timer * lock, otherwise there will be deadlock. */ esp_timer_private_lock(); + /* We will be calling esp_rtc_get_time_us() below. Make sure the code on the other CPU is not holding the + * esp_rtc_get_time_us() lock, otherwise there will be deadlock. esp_rtc_get_time_us() is called via: + * + * - esp_clk_slowclk_cal_set() -> esp_rtc_get_time_us() + */ + esp_clk_private_lock(); + s_config.rtc_ticks_at_sleep_start = rtc_time_get(); uint32_t ccount_at_sleep_start = esp_cpu_get_cycle_count(); uint64_t high_res_time_at_start = esp_timer_get_time(); @@ -793,6 +810,7 @@ esp_err_t esp_light_sleep_start(void) } esp_set_time_from_rtc(); + esp_clk_private_unlock(); esp_timer_private_unlock(); esp_ipc_isr_release_other_cpu(); if (!wdt_was_enabled) { diff --git a/components/esp_system/include/esp_ipc_isr.h b/components/esp_system/include/esp_ipc_isr.h index 22fa5b10b0..70290ba561 100644 --- a/components/esp_system/include/esp_ipc_isr.h +++ b/components/esp_system/include/esp_ipc_isr.h @@ -62,6 +62,7 @@ void esp_ipc_isr_asm_call_blocking(esp_ipc_isr_func_t func, void* arg); * - If the stall feature is paused using esp_ipc_isr_stall_pause(), this function will have no effect * * @note This function is not available in single-core mode. + * @note It is the caller's responsibility to avoid deadlocking on spinlocks */ void esp_ipc_isr_stall_other_cpu(void); diff --git a/components/esp_timer/include/esp_private/esp_timer_private.h b/components/esp_timer/include/esp_private/esp_timer_private.h index 4744b20a39..37aaeac03f 100644 --- a/components/esp_timer/include/esp_private/esp_timer_private.h +++ b/components/esp_timer/include/esp_private/esp_timer_private.h @@ -51,11 +51,11 @@ void esp_timer_private_set(uint64_t new_us); void esp_timer_private_advance(int64_t time_diff_us); /** - * @brief obtain internal critical section used esp_timer implementation + * @brief obtain internal critical section used in the 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_unlock to release the lock + * Call esp_timer_private_unlock to release the lock */ void esp_timer_private_lock(void); From 694c54595b1c796a45dc8545225c745b2c86a36f Mon Sep 17 00:00:00 2001 From: Mo Fei Fei Date: Wed, 10 Aug 2022 18:55:39 +0800 Subject: [PATCH 040/665] Docs: update CN trans for several docs in api-guides --- docs/en/api-guides/fatal-errors.rst | 4 ++-- .../api-guides/linker-script-generation.rst | 2 +- docs/en/api-guides/memory-types.rst | 1 + docs/zh_CN/api-guides/bootloader.rst | 1 - docs/zh_CN/api-guides/fatal-errors.rst | 21 +++++++++++++++++++ .../api-guides/linker-script-generation.rst | 11 +++++----- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/docs/en/api-guides/fatal-errors.rst b/docs/en/api-guides/fatal-errors.rst index 851a44469b..2342325b58 100644 --- a/docs/en/api-guides/fatal-errors.rst +++ b/docs/en/api-guides/fatal-errors.rst @@ -284,7 +284,7 @@ The GDB prompt can be used to inspect CPU registers, local and static variables, RTC Watchdog Timeout -------------------- -The RTC watchdog is used in the startup code to keep track of execution time and also helps to prevent a lock up caused by an unstable power source, it is enabled by default, see :ref:`CONFIG_BOOTLOADER_WDT_ENABLE`. If the execution time is exceeded, the RTC watchdog will restart the system. In this case, the ROM bootloader will print a message with the ``RTC Watchdog Timeout`` reason for the reboot. +The RTC watchdog is used in the startup code to keep track of execution time and it also helps to prevent a lock-up caused by an unstable power source. It is enabled by default (see :ref:`CONFIG_BOOTLOADER_WDT_ENABLE`). If the execution time is exceeded, the RTC watchdog will restart the system. In this case, the ROM bootloader will print a message with the ``RTC Watchdog Timeout`` reason for the reboot. .. only:: esp32 @@ -298,7 +298,7 @@ The RTC watchdog is used in the startup code to keep track of execution time and rst:0x10 (RTCWDT_RTC_RST) -The RTC watchdog covers the execution time from the first stage bootloader (ROM bootloader) to application startup. It is initially set in the ROM bootloader, then configured in the bootloader with the :ref:`CONFIG_BOOTLOADER_WDT_TIME_MS` option (9000ms by default). During the application initialization stage, it is reconfigured again because the source of the slow clock may have changed, and finally disabled right before the ``app_main()`` call. There is an option :ref:`CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE` which allows the RTC watchdog to not be disabled before ``app_main`` and instead the RTC watchdog remains active and must be explicitly reset in your application. +The RTC watchdog covers the execution time from the first stage bootloader (ROM bootloader) to application startup. It is initially set in the ROM bootloader, then configured in the bootloader with the :ref:`CONFIG_BOOTLOADER_WDT_TIME_MS` option (9000 ms by default). During the application initialization stage, it is reconfigured because the source of the slow clock may have changed, and finally disabled right before the ``app_main()`` call. There is an option :ref:`CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE` which prevents the RTC watchdog from being disabled before ``app_main``. Instead, the RTC watchdog remains active and must be fed periodically in your application's code. .. _Guru-Meditation-Errors: diff --git a/docs/en/api-guides/linker-script-generation.rst b/docs/en/api-guides/linker-script-generation.rst index 53f24e6f5e..2770ada499 100644 --- a/docs/en/api-guides/linker-script-generation.rst +++ b/docs/en/api-guides/linker-script-generation.rst @@ -13,7 +13,7 @@ For example, it may be necessary to place: * critical code in RAM for performance reasons. * executable code in IRAM so that it can be ran while cache is disabled. - :SOC_RTC_MEM_SUPPORTED: * code in RTC memory for use in a wake stub or the ULP coprocessor. + :SOC_RTC_MEM_SUPPORTED: * code in RTC memory for use in a wake stub. :SOC_ULP_SUPPORTED: * code in RTC memory for use by the ULP coprocessor. With the linker script generation mechanism, it is possible to specify these placements at the component level within ESP-IDF. The component presents information on how it would like to place its symbols, objects or the entire archive. During build, the information presented by the components are collected, parsed and processed; and the placement rules generated is used to link the app. diff --git a/docs/en/api-guides/memory-types.rst b/docs/en/api-guides/memory-types.rst index 1fa849bbd8..8cc3bddb8e 100644 --- a/docs/en/api-guides/memory-types.rst +++ b/docs/en/api-guides/memory-types.rst @@ -127,6 +127,7 @@ If a function is not explicitly placed into :ref:`iram` or RTC memory, it is pla During :doc:`startup`, the bootloader (which runs from IRAM) configures the MMU flash cache to map the app's instruction code region to the instruction space. Flash accessed via the MMU is cached using some internal SRAM and accessing cached flash data is as fast as accessing other types of internal memory. + .. _drom: DROM (data stored in flash) diff --git a/docs/zh_CN/api-guides/bootloader.rst b/docs/zh_CN/api-guides/bootloader.rst index 8094562644..903ca26d3c 100644 --- a/docs/zh_CN/api-guides/bootloader.rst +++ b/docs/zh_CN/api-guides/bootloader.rst @@ -150,7 +150,6 @@ ROM 中的 :ref:`first-stage-bootloader` 从 flash 中读取 :ref:`second-stage- 引导加载程序有 :ref:`CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP` 选项,可以减少从深度睡眠中唤醒的时间(有利于降低功耗)。当 :ref:`CONFIG_SECURE_BOOT` 选项禁用时,该选项可用。由于无需镜像校验,唤醒时间减少。在第一次启动时,引导加载程序将启动的应用程序的地址存储在 RTC FAST 存储器中。而在唤醒过程中,这个地址用于启动而无需任何检查,从而实现了快速加载。 - 自定义引导加载程序 ---------------------- diff --git a/docs/zh_CN/api-guides/fatal-errors.rst b/docs/zh_CN/api-guides/fatal-errors.rst index 76410711e2..53d4eea467 100644 --- a/docs/zh_CN/api-guides/fatal-errors.rst +++ b/docs/zh_CN/api-guides/fatal-errors.rst @@ -279,6 +279,27 @@ GDB Stub 在 GDB 会话中,我们可以检查 CPU 寄存器,本地和静态变量以及内存中任意位置的值。但是不支持设置断点,改变 PC 值或者恢复程序的运行。若要复位程序,请退出 GDB 会话,在 IDF 监视器 中连续输入 Ctrl-T Ctrl-R,或者按下开发板上的复位按键也可以重新运行程序。 +.. _RTC-Watchdog-Timeout: + +RTC 看门狗超时 +---------------- + +RTC 看门狗在启动代码中用于跟踪执行时间,也有助于防止由于电源不稳定引起的锁定。RTC 看门狗默认启用,参见 :ref:`CONFIG_BOOTLOADER_WDT_ENABLE`。如果执行时间超时,RTC 看门狗将自动重启系统。此时,ROM 引导加载程序将打印消息 ``RTC Watchdog Timeout`` 说明重启原因。 + +.. only:: esp32 + + :: + + rst:0x10 (RTCWDT_RTC_RESET) + +.. only:: not esp32 + + :: + + rst:0x10 (RTCWDT_RTC_RST) + +RTC 看门狗涵盖了从一级引导程序(ROM 引导程序)到应用程序启动的执行时间,最初在 ROM 引导程序中设置,而后在引导程序中使用 :ref:`CONFIG_BOOTLOADER_WDT_TIME_MS` 选项进行配置(默认 9000 ms)。在应用初始化阶段,由于慢速时钟源可能已更改,RTC 看门狗将被重新配置,最后在调用 ``app_main()`` 之前被禁用。可以使用选项 :ref:`CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE` 以保证 RTC 看门狗在调用 ``app_main`` 之前不被禁用,而是保持运行状态,用户需要在应用代码中定期“喂狗”。 + .. _Guru-Meditation-Errors: Guru Meditation 错误 diff --git a/docs/zh_CN/api-guides/linker-script-generation.rst b/docs/zh_CN/api-guides/linker-script-generation.rst index fac18dc0e4..a86d19f092 100644 --- a/docs/zh_CN/api-guides/linker-script-generation.rst +++ b/docs/zh_CN/api-guides/linker-script-generation.rst @@ -7,13 +7,14 @@ {IDF_TARGET_NAME} 中有多个用于存放代码和数据的 :ref:`内存区域` 。代码和只读数据默认存放在 flash 中,可写数据存放在 RAM 中。不过有时,用户必须更改默认存放区域。 -.. only:: SOC_ULP_SUPPORTED +例如: - 例如为了提高性能,将关键代码存放到 RAM 中,或者将代码存放到 RTC 存储器中以便在 wake up stub 和 ULP 协处理器中使用。 +.. list:: -.. only:: not SOC_ULP_SUPPORTED - - 例如为了提高性能,将关键代码存放到 RAM 中,或者将代码存放到 RTC 存储器中以便在wake up stub 中使用。 + * 将关键代码存放到 RAM 中以提高性能; + * 将可执行代码存放到 IRAM 中,以便在缓存被禁用时运行这些代码; + :SOC_RTC_MEM_SUPPORTED: * 将代码存放到 RTC 存储器中,以便在 wake stub 中使用; + :SOC_ULP_SUPPORTED: * 将代码存放到 RTC 内存中,以便 ULP 协处理器使用。 链接器脚本生成机制可以让用户指定代码和数据在 ESP-IDF 组件中的存放区域。组件包含如何存放符号、目标或完整库的信息。在构建应用程序时,组件中的这些信息会被收集、解析并处理;生成的存放规则用于链接应用程序。 From e6c313b5f0230117c22f0a2d42278951fecbdf8b Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Wed, 10 Aug 2022 13:45:32 +0200 Subject: [PATCH 041/665] Tools: Upgrade pip and setuptools if venv is not able venv upgrades pip and setuptools by the --upgrade-deps option available since Python 3.9. This commit adds manual upgrade for Pythons 3.7 and 3.8. --- tools/idf_tools.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 13073e3e48..eaef2fcee2 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -1977,6 +1977,8 @@ def action_install_python_env(args): # type: ignore warn('Removing the existing Python environment in {}'.format(idf_python_env_path)) shutil.rmtree(idf_python_env_path) + venv_can_upgrade = False + if not os.path.exists(virtualenv_python): try: import venv # noqa: F401 @@ -1986,6 +1988,7 @@ def action_install_python_env(args): # type: ignore if sys.version_info[:2] >= (3, 9): # upgrade pip & setuptools virtualenv_options += ['--upgrade-deps'] + venv_can_upgrade = True info('Creating a new Python environment in {}'.format(idf_python_env_path)) subprocess.check_call([sys.executable, '-m', 'venv', @@ -2000,6 +2003,12 @@ def action_install_python_env(args): # type: ignore if env_copy.get('PIP_USER') == 'yes': warn('Found PIP_USER="yes" in the environment. Disabling PIP_USER in this shell to install packages into a virtual environment.') env_copy['PIP_USER'] = 'no' + + if not venv_can_upgrade: + info('Upgrading pip and setuptools...') + subprocess.check_call([virtualenv_python, '-m', 'pip', 'install', '--upgrade', 'pip', 'setuptools'], + stdout=sys.stdout, stderr=sys.stderr, env=env_copy) + run_args = [virtualenv_python, '-m', 'pip', 'install', '--no-warn-script-location'] requirements_file_list = get_requirements(args.features) for requirement_file in requirements_file_list: From d777b790d0f6d091cd606443edd18a0cb135af19 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Fri, 22 Jul 2022 10:20:21 +0200 Subject: [PATCH 042/665] tinyusb: Add TinyUSB example tests --- .gitlab/ci/dependencies/dependencies.yml | 1 + .gitlab/ci/rules.yml | 301 ++++++++++++++++++ .gitlab/ci/target-test.yml | 8 + .../api-reference/peripherals/usb_device.rst | 35 +- .../usb/device/.build-test-rules.yml | 9 + .../tusb_console/pytest_usb_device_console.py | 35 ++ .../device/tusb_hid/pytest_usb_device_hid.py | 12 + .../device/tusb_midi/main/tusb_midi_main.c | 1 + .../tusb_midi/pytest_usb_device_midi.py | 13 + .../tusb_sample_descriptor/CMakeLists.txt | 6 - .../device/tusb_sample_descriptor/README.md | 123 ------- .../main/CMakeLists.txt | 2 - .../main/Kconfig.projbuild | 10 - .../main/tusb_sample_descriptor_main.c | 70 ---- .../tusb_sample_descriptor/sdkconfig.defaults | 5 - .../pytest_usb_device_serial.py | 29 ++ .../device/tusb_serial_device/sdkconfig.ci | 0 pytest.ini | 1 + tools/ci/check_copyright_config.yaml | 4 +- 19 files changed, 431 insertions(+), 234 deletions(-) create mode 100644 examples/peripherals/usb/device/.build-test-rules.yml create mode 100644 examples/peripherals/usb/device/tusb_console/pytest_usb_device_console.py create mode 100644 examples/peripherals/usb/device/tusb_hid/pytest_usb_device_hid.py create mode 100644 examples/peripherals/usb/device/tusb_midi/pytest_usb_device_midi.py delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/CMakeLists.txt delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/README.md delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/main/CMakeLists.txt delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/main/Kconfig.projbuild delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c delete mode 100644 examples/peripherals/usb/device/tusb_sample_descriptor/sdkconfig.defaults create mode 100644 examples/peripherals/usb/device/tusb_serial_device/pytest_usb_device_serial.py create mode 100644 examples/peripherals/usb/device/tusb_serial_device/sdkconfig.ci diff --git a/.gitlab/ci/dependencies/dependencies.yml b/.gitlab/ci/dependencies/dependencies.yml index 15adcae2d4..e073762912 100644 --- a/.gitlab/ci/dependencies/dependencies.yml +++ b/.gitlab/ci/dependencies/dependencies.yml @@ -167,6 +167,7 @@ build:integration_test: - wifi # example_test_002, example_test*wifi* - ethernet # example_test*ethernet* - sdio # UT_044, UT_045 + - usb # USB Device & Host tests patterns: - "{0}-{1}-{2}" - "{0}-{2}" diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index c356292c50..2e4eff95e6 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -221,6 +221,15 @@ - "components/driver/**/*" - "components/sdmmc/**/*" +# for jobs: example_test_pytest_esp32s3_usb_device and test_app_test_pytest_esp32s2_usb_host: +.patterns-example_test-usb: &patterns-example_test-usb + - "components/hal/usb*.c" + - "components/hal/esp32s*/include/hal/usb*.h" + - "components/tinyusb/**/**/*" + - "components/usb/**/*" + - "examples/peripherals/usb/host/**/**/**/*" + - "examples/peripherals/usb/device/**/**/*" + ############## # if anchors # @@ -765,6 +774,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -791,6 +802,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -811,6 +824,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -836,6 +851,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -860,6 +877,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -884,6 +903,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -908,6 +929,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi @@ -993,6 +1016,8 @@ changes: *patterns-example_test-bt - <<: *if-dev-push changes: *patterns-example_test-ethernet + - <<: *if-dev-push + changes: *patterns-example_test-usb - <<: *if-dev-push changes: *patterns-example_test-wifi - <<: *if-dev-push @@ -1225,6 +1250,17 @@ - <<: *if-label-component_ut_esp32 - <<: *if-label-target_test +.rules:test:component_ut-esp32-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32 + - <<: *if-label-target_test + .rules:test:component_ut-esp32-wifi: rules: - <<: *if-revert-branch @@ -1279,6 +1315,17 @@ - <<: *if-label-component_ut_esp32c2 - <<: *if-label-target_test +.rules:test:component_ut-esp32c2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32c2 + - <<: *if-label-target_test + .rules:test:component_ut-esp32c2-wifi: rules: - <<: *if-revert-branch @@ -1338,6 +1385,17 @@ - <<: *if-label-component_ut_esp32c3 - <<: *if-label-target_test +.rules:test:component_ut-esp32c3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32c3 + - <<: *if-label-target_test + .rules:test:component_ut-esp32c3-wifi: rules: - <<: *if-revert-branch @@ -1397,6 +1455,17 @@ - <<: *if-label-component_ut_esp32h2 - <<: *if-label-target_test +.rules:test:component_ut-esp32h2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32h2 + - <<: *if-label-target_test + .rules:test:component_ut-esp32h2-wifi: rules: - <<: *if-revert-branch @@ -1456,6 +1525,17 @@ - <<: *if-label-component_ut_esp32s2 - <<: *if-label-target_test +.rules:test:component_ut-esp32s2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32s2 + - <<: *if-label-target_test + .rules:test:component_ut-esp32s2-wifi: rules: - <<: *if-revert-branch @@ -1510,6 +1590,17 @@ - <<: *if-label-component_ut_esp32s3 - <<: *if-label-target_test +.rules:test:component_ut-esp32s3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-component_ut + - <<: *if-label-component_ut_esp32s3 + - <<: *if-label-target_test + .rules:test:component_ut-esp32s3-wifi: rules: - <<: *if-revert-branch @@ -1567,6 +1658,17 @@ - <<: *if-label-custom_test_esp32 - <<: *if-label-target_test +.rules:test:custom_test-esp32-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32 + - <<: *if-label-target_test + .rules:test:custom_test-esp32-wifi: rules: - <<: *if-revert-branch @@ -1620,6 +1722,17 @@ - <<: *if-label-custom_test_esp32c2 - <<: *if-label-target_test +.rules:test:custom_test-esp32c2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32c2 + - <<: *if-label-target_test + .rules:test:custom_test-esp32c2-wifi: rules: - <<: *if-revert-branch @@ -1677,6 +1790,17 @@ - <<: *if-label-custom_test_esp32c3 - <<: *if-label-target_test +.rules:test:custom_test-esp32c3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32c3 + - <<: *if-label-target_test + .rules:test:custom_test-esp32c3-wifi: rules: - <<: *if-revert-branch @@ -1734,6 +1858,17 @@ - <<: *if-label-custom_test_esp32h2 - <<: *if-label-target_test +.rules:test:custom_test-esp32h2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32h2 + - <<: *if-label-target_test + .rules:test:custom_test-esp32h2-wifi: rules: - <<: *if-revert-branch @@ -1791,6 +1926,17 @@ - <<: *if-label-custom_test_esp32s2 - <<: *if-label-target_test +.rules:test:custom_test-esp32s2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32s2 + - <<: *if-label-target_test + .rules:test:custom_test-esp32s2-wifi: rules: - <<: *if-revert-branch @@ -1844,6 +1990,17 @@ - <<: *if-label-custom_test_esp32s3 - <<: *if-label-target_test +.rules:test:custom_test-esp32s3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-custom_test + - <<: *if-label-custom_test_esp32s3 + - <<: *if-label-target_test + .rules:test:custom_test-esp32s3-wifi: rules: - <<: *if-revert-branch @@ -1916,6 +2073,19 @@ - <<: *if-label-example_test_esp32 - <<: *if-label-target_test +.rules:test:example_test-esp32-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32-wifi: rules: - <<: *if-revert-branch @@ -1975,6 +2145,19 @@ - <<: *if-label-example_test_esp32c2 - <<: *if-label-target_test +.rules:test:example_test-esp32c2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32c2 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32c2-wifi: rules: - <<: *if-revert-branch @@ -2049,6 +2232,19 @@ - <<: *if-label-example_test_esp32c3 - <<: *if-label-target_test +.rules:test:example_test-esp32c3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32c3 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32c3-wifi: rules: - <<: *if-revert-branch @@ -2114,6 +2310,19 @@ - <<: *if-label-example_test_esp32h2 - <<: *if-label-target_test +.rules:test:example_test-esp32h2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32h2 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32h2-wifi: rules: - <<: *if-revert-branch @@ -2179,6 +2388,19 @@ - <<: *if-label-example_test_esp32s2 - <<: *if-label-target_test +.rules:test:example_test-esp32s2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32s2 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32s2-wifi: rules: - <<: *if-revert-branch @@ -2238,6 +2460,19 @@ - <<: *if-label-example_test_esp32s3 - <<: *if-label-target_test +.rules:test:example_test-esp32s3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-example_test + - <<: *if-label-example_test_esp32s3 + - <<: *if-label-target_test + - <<: *if-dev-push + changes: *patterns-example_test-usb + .rules:test:example_test-esp32s3-wifi: rules: - <<: *if-revert-branch @@ -2333,6 +2568,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32 + .rules:test:unit_test-esp32-wifi: rules: - <<: *if-revert-branch @@ -2388,6 +2634,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32c2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32c2 + .rules:test:unit_test-esp32c2-wifi: rules: - <<: *if-revert-branch @@ -2447,6 +2704,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32c3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32c3 + .rules:test:unit_test-esp32c3-wifi: rules: - <<: *if-revert-branch @@ -2506,6 +2774,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32h2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32h2 + .rules:test:unit_test-esp32h2-wifi: rules: - <<: *if-revert-branch @@ -2565,6 +2844,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32s2-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32s2 + .rules:test:unit_test-esp32s2-wifi: rules: - <<: *if-revert-branch @@ -2620,6 +2910,17 @@ - <<: *if-dev-push changes: *patterns-unit_test-sdio +.rules:test:unit_test-esp32s3-usb: + rules: + - <<: *if-revert-branch + when: never + - <<: *if-protected + - <<: *if-label-build-only + when: never + - <<: *if-label-target_test + - <<: *if-label-unit_test + - <<: *if-label-unit_test_esp32s3 + .rules:test:unit_test-esp32s3-wifi: rules: - <<: *if-revert-branch diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 6ca24aa1d1..4172143173 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -208,6 +208,14 @@ example_test_pytest_esp32c3_flash_encryption: - build_pytest_examples_esp32c3 tags: [ esp32c3, flash_encryption ] +example_test_pytest_esp32s2_usb_device: + extends: + - .pytest_examples_dir_template + - .rules:test:example_test-esp32s2-usb + needs: + - build_pytest_examples_esp32s2 + tags: [ esp32s2, usb_device ] + .pytest_components_dir_template: extends: .pytest_template variables: diff --git a/docs/en/api-reference/peripherals/usb_device.rst b/docs/en/api-reference/peripherals/usb_device.rst index fed107be45..79c4934552 100644 --- a/docs/en/api-reference/peripherals/usb_device.rst +++ b/docs/en/api-reference/peripherals/usb_device.rst @@ -11,7 +11,7 @@ USB Device Driver Overview -------- -The driver allows users to use {IDF_TARGET_NAME} chips to develop USB devices on a top of the TinyUSB stack. TinyUSB is integrated with ESP-IDF to provide USB features of the framework. Using this driver the chip works as a composite device supporting several USB devices simultaneously. Currently, only the Communications Device Class (CDC) type of the device with the Abstract Control Model (ACM) subclass and the Musical Instrument Digital Interface (MIDI) are supported. +The driver allows you to use {IDF_TARGET_NAME} chips to develop USB devices on a top of TinyUSB stack. TinyUSB is integrated with ESP-IDF to provide USB features of the framework. Using this driver the chip works as simple or composite device supporting several USB devices simultaneously. Our USB-OTG implementation is limited to {IDF_TARGET_USB_EP_NUM} number of USB endpoints ({IDF_TARGET_USB_EP_NUM_INOUT} IN/OUT endpoints and {IDF_TARGET_USB_EP_NUM_IN} IN endpoint) - find more information in `technical reference manual <{IDF_TARGET_TRM_EN_URL}>`_. @@ -20,8 +20,8 @@ Features - Configuration of device and string USB descriptors - USB Serial Device (CDC-ACM) -- Input and output through USB Serial Device -- USB MIDI Device +- Input and output streams through USB Serial Device +- Other USB classes (MIDI, MSC, HID...) support directly via TinyUSB Hardware USB Connection @@ -67,9 +67,9 @@ Via Menuconfig options you can specify: Descriptors Configuration ^^^^^^^^^^^^^^^^^^^^^^^^^ -The driver's descriptors are provided by the :cpp:type:`tinyusb_config_t` structure's :cpp:member:`descriptor` and :cpp:member:`string_descriptor` members. Therefore, users should initialize :cpp:type:`tinyusb_config_t` to their desired descriptor before calling :cpp:func:`tinyusb_driver_install` to install driver. +The driver's descriptors are provided by :cpp:type:`tinyusb_config_t` structure's :cpp:member:`device_descriptor`, :cpp:member:`configuration_descriptor` and :cpp:member:`string_descriptor` members. Therefore, you should initialize :cpp:type:`tinyusb_config_t` with your desired descriptors before calling :cpp:func:`tinyusb_driver_install` to install the driver. -However, the driver also provides a default descriptor. The driver can be installed with the default descriptor by setting the :cpp:member:`descriptor` and :cpp:member:`string_descriptor` members of :cpp:type:`tinyusb_config_t` to `NULL` before calling :cpp:func:`tinyusb_driver_install`. The driver's default descriptor is specified using Menuconfig, where the following fields should be configured: +However, the driver also provides default descriptors. You can install the driver with default device and string descriptors by setting the :cpp:member:`device_descriptor` and :cpp:member:`string_descriptor` members of :cpp:type:`tinyusb_config_t` to `NULL` before calling :cpp:func:`tinyusb_driver_install`. To lower your development effort we also provide default configuration descriptor for CDC and MSC class, as these classes rarely require custom configuration. The driver's default device descriptor is specified using Menuconfig, where the following fields should be configured: - PID - VID @@ -79,31 +79,32 @@ However, the driver also provides a default descriptor. The driver can be instal - Name of CDC device if it is On - Serial number -If you want to use own descriptors with extended modification, you can define them during the driver installation process +If you want to use your own descriptors with extended modification, you can define them during the driver installation process. Install Driver -------------- To initialize the driver, users should call :cpp:func:`tinyusb_driver_install`. The driver's configuration is specified in a :cpp:type:`tinyusb_config_t` structure that is passed as an argument to :cpp:func:`tinyusb_driver_install`. - Note that the :cpp:type:`tinyusb_config_t` structure can be zero initialized (e.g. ``tinyusb_config_t tusb_cfg = { 0 }``) or partially (as shown below). For any member that is initialized to `0` or `NULL`, the driver will use its default configuration values for that member (see example below) + Note that the :cpp:type:`tinyusb_config_t` structure can be zero initialized (e.g. ``const tinyusb_config_t tusb_cfg = { 0 };``) or partially (as shown below). For any member that is initialized to `0` or `NULL`, the driver will use its default configuration values for that member (see example below) .. code-block:: c - tinyusb_config_t partial_init = { - .descriptor = NULL; //Uses default descriptor specified in Menuconfig - .string_descriptor = NULL; //Uses default string specified in Menuconfig - .external_phy = false; - } + const tinyusb_config_t partial_init = { + .device_descriptor = NULL, // Use default device descriptor specified in Menuconfig + .string_descriptor = NULL, // Use default string descriptors specified in Menuconfig + .external_phy = false, // Use internal USB PHY + .configuration_descriptor = NULL, // Use default configuration descriptor according to settings in Menuconfig + }; USB Serial Device (CDC-ACM) --------------------------- -If the CDC option is enabled in Menuconfig, the USB Serial Device could be initialized with :cpp:func:`tusb_cdc_acm_init` according to the settings from :cpp:type:`tinyusb_config_cdcacm_t` (see example below). +If the CDC option is enabled in Menuconfig, the USB Serial Device can be initialized with :cpp:func:`tusb_cdc_acm_init` according to the settings from :cpp:type:`tinyusb_config_cdcacm_t` (see example below). .. code-block:: c - tinyusb_config_cdcacm_t acm_cfg = { + const tinyusb_config_cdcacm_t acm_cfg = { .usb_dev = TINYUSB_USBDEV_0, .cdc_port = TINYUSB_CDC_ACM_0, .rx_unread_buf_sz = 64, @@ -119,7 +120,7 @@ To specify callbacks you can either set the pointer to your :cpp:type:`tusb_cdca USB Serial Console ^^^^^^^^^^^^^^^^^^ -The driver allows to redirect all standard application strings (stdin/out/err) to the USB Serial Device and return them to UART using :cpp:func:`esp_tusb_init_console`/:cpp:func:`esp_tusb_deinit_console` functions. +The driver allows to redirect all standard application streams (stdinm stdout, stderr) to the USB Serial Device and return them to UART using :cpp:func:`esp_tusb_init_console`/:cpp:func:`esp_tusb_deinit_console` functions. Application Examples @@ -135,12 +136,12 @@ The table below describes the code examples available in the directory :example: - Description * - :example:`peripherals/usb/device/tusb_console` - How to set up {IDF_TARGET_NAME} chip to get log output via Serial Device connection - * - :example:`peripherals/usb/device/tusb_sample_descriptor` - - How to set up {IDF_TARGET_NAME} chip to work as a Generic USB Device with a user-defined descriptor * - :example:`peripherals/usb/device/tusb_serial_device` - How to set up {IDF_TARGET_NAME} chip to work as a USB Serial Device * - :example:`peripherals/usb/device/tusb_midi` - How to set up {IDF_TARGET_NAME} chip to work as a USB MIDI Device + * - :example:`peripherals/usb/device/tusb_hid` + - How to set up {IDF_TARGET_NAME} chip to work as a USB Human Interface Device API Reference diff --git a/examples/peripherals/usb/device/.build-test-rules.yml b/examples/peripherals/usb/device/.build-test-rules.yml new file mode 100644 index 0000000000..2e88c76571 --- /dev/null +++ b/examples/peripherals/usb/device/.build-test-rules.yml @@ -0,0 +1,9 @@ +# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps + +examples/peripherals/usb/device: + enable: + - if: SOC_USB_OTG_SUPPORTED == 1 + disable_test: + - if: IDF_TARGET == "esp32s3" + temporary: true + reason: lack of runners diff --git a/examples/peripherals/usb/device/tusb_console/pytest_usb_device_console.py b/examples/peripherals/usb/device/tusb_console/pytest_usb_device_console.py new file mode 100644 index 0000000000..0cd523dad9 --- /dev/null +++ b/examples/peripherals/usb/device/tusb_console/pytest_usb_device_console.py @@ -0,0 +1,35 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +from time import sleep + +import pytest +from pytest_embedded import Dut +from serial import Serial +from serial.tools.list_ports import comports + + +@pytest.mark.esp32s2 +@pytest.mark.usb_device +def test_usb_device_console_example(dut: Dut) -> None: + dut.expect_exact('USB initialization DONE') + dut.expect_exact('example: log -> UART') + dut.expect_exact('example: print -> stdout') + dut.expect_exact('example: print -> stderr') + + # Find device with Espressif TinyUSB VID/PID + sleep(2) # Some time for the OS to enumerate our USB device + ports = comports() + for port, _, hwid in ports: + if '303A:4001' in hwid: + with Serial(port) as s: + # Assert TinyUSB output: Read 3 lines and check their content + serial_output = list() + serial_output.append(s.readline()) + serial_output.append(s.readline()) + serial_output.append(s.readline()) + assert any(b'example: log -> USB' in out for out in serial_output) + assert any(b'example: print -> stdout' in out for out in serial_output) + assert any(b'example: print -> stderr' in out for out in serial_output) + return + + raise Exception('TinyUSB COM port not found') diff --git a/examples/peripherals/usb/device/tusb_hid/pytest_usb_device_hid.py b/examples/peripherals/usb/device/tusb_hid/pytest_usb_device_hid.py new file mode 100644 index 0000000000..f38b3a7415 --- /dev/null +++ b/examples/peripherals/usb/device/tusb_hid/pytest_usb_device_hid.py @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32s2 +@pytest.mark.usb_device +def test_usb_device_hid_example(dut: Dut) -> None: + dut.expect_exact('USB initialization DONE') + dut.expect_exact('Sending Keyboard report') + dut.expect_exact('Sending Mouse report') diff --git a/examples/peripherals/usb/device/tusb_midi/main/tusb_midi_main.c b/examples/peripherals/usb/device/tusb_midi/main/tusb_midi_main.c index 231393e5ef..c6dccf8392 100644 --- a/examples/peripherals/usb/device/tusb_midi/main/tusb_midi_main.c +++ b/examples/peripherals/usb/device/tusb_midi/main/tusb_midi_main.c @@ -57,6 +57,7 @@ static void periodic_midi_write_example_cb(void *arg) } // Send Note On for current position at full velocity (127) on channel 1. + ESP_LOGI(TAG, "Writing MIDI data %d", note_sequence[note_pos]); uint8_t note_on[3] = {0x90 | channel, note_sequence[note_pos], 127}; tud_midi_stream_write(cable_num, note_on, 3); diff --git a/examples/peripherals/usb/device/tusb_midi/pytest_usb_device_midi.py b/examples/peripherals/usb/device/tusb_midi/pytest_usb_device_midi.py new file mode 100644 index 0000000000..b0b55a1f28 --- /dev/null +++ b/examples/peripherals/usb/device/tusb_midi/pytest_usb_device_midi.py @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32s2 +@pytest.mark.usb_device +def test_usb_device_midi_example(dut: Dut) -> None: + dut.expect_exact('USB initialization DONE') + dut.expect_exact('MIDI write task init') + dut.expect_exact('MIDI read task init') + dut.expect_exact('Writing MIDI data 74') diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/CMakeLists.txt b/examples/peripherals/usb/device/tusb_sample_descriptor/CMakeLists.txt deleted file mode 100644 index 67cc4b7d05..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# The following five lines of boilerplate have to be in your project's -# CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.16) - -include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(tusb_sample_descriptor) diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/README.md b/examples/peripherals/usb/device/tusb_sample_descriptor/README.md deleted file mode 100644 index 2f0f8cb6aa..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/README.md +++ /dev/null @@ -1,123 +0,0 @@ -| Supported Targets | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | - -# TinyUSB Sample Descriptor - -(See the README.md file in the upper level 'examples' directory for more information about examples.) - -This example is demonstrating how to set up ESP chip to work as a Generic USB Device with a user-defined descriptor. You can specify a manufacturer, device's name, ID and other USB-devices parameters responsible for identification by host. - -As a USB stack, a TinyUSB component is used. - -## How to use example - -### Hardware Required - -Any ESP boards that have USB-OTG supported. - -#### Pin Assignment - -See common pin assignments for USB Device examples from [upper level](../../README.md#common-pin-assignments). - -### Configure the project - -There are two ways to set up a descriptor - using Menuconfig tool and in-code - -#### In-code setting up - -For the manual descriptor configuration use the default example's settings and modify `my_descriptor` in [source code](main/tusb_sample_descriptor_main.c) according to your needs - -#### Menuconfig - -If you want to set up the descriptor using Menuconfig UI: - -1. Execute in the terminal from the example's directory: `idf.py menuconfig` - -2. Turn off `Set up a USB descriptor manually in code` parameter at `Example Configuration` - -3. Follow `Component config -> TinyUSB -> Descriptor configuration` for all available configurations. - -### Build and Flash - -Build the project and flash it to the board, then run monitor tool to view serial output: - -```bash -idf.py -p PORT flash monitor -``` - -(Replace PORT with the name of the serial port to use.) - -(To exit the serial monitor, type ``Ctrl-]``.) - -See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. - -## Example Output - -After the flashing you should see the output: - -``` -I (287) example: USB initialization -I (287) tusb_desc: -┌─────────────────────────────────┐ -│ USB Device Descriptor Summary │ -├───────────────────┬─────────────┤ -│bDeviceClass │ 0 │ -├───────────────────┼─────────────┤ -│bDeviceSubClass │ 0 │ -├───────────────────┼─────────────┤ -│bDeviceProtocol │ 0 │ -├───────────────────┼─────────────┤ -│bMaxPacketSize0 │ 64 │ -├───────────────────┼─────────────┤ -│idVendor │ 0x303a │ -├───────────────────┼─────────────┤ -│idProduct │ 0x3000 │ -├───────────────────┼─────────────┤ -│bcdDevice │ 0x101 │ -├───────────────────┼─────────────┤ -│iManufacturer │ 0x1 │ -├───────────────────┼─────────────┤ -│iProduct │ 0x2 │ -├───────────────────┼─────────────┤ -│iSerialNumber │ 0x3 │ -├───────────────────┼─────────────┤ -│bNumConfigurations │ 0x1 │ -└───────────────────┴─────────────┘ -I (457) TinyUSB: TinyUSB Driver installed -I (467) example: USB initialization DONE -``` - -From PC, running `lsusb -v`, you should find the device's descriptor like: -``` -Bus 001 Device 007: ID 303a:3000 I My Custom Device -Device Descriptor: - bLength 18 - bDescriptorType 1 - bcdUSB 2.00 - bDeviceClass 0 - bDeviceSubClass 0 - bDeviceProtocol 0 - bMaxPacketSize0 64 - idVendor 0x303a - idProduct 0x3000 - bcdDevice 1.01 - iManufacturer 1 I - iProduct 2 My Custom Device - iSerial 3 012-345 - bNumConfigurations 1 - Configuration Descriptor: - bLength 9 - bDescriptorType 2 - wTotalLength 0x0009 - bNumInterfaces 0 - bConfigurationValue 1 - iConfiguration 0 - bmAttributes 0xa0 - (Bus Powered) - Remote Wakeup - MaxPower 100mA -can't get device qualifier: Resource temporarily unavailable -can't get debug descriptor: Resource temporarily unavailable -Device Status: 0x0000 - (Bus Powered) -``` diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/main/CMakeLists.txt b/examples/peripherals/usb/device/tusb_sample_descriptor/main/CMakeLists.txt deleted file mode 100644 index 6581258cb9..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/main/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -idf_component_register(SRCS "tusb_sample_descriptor_main.c" - INCLUDE_DIRS .) diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/main/Kconfig.projbuild b/examples/peripherals/usb/device/tusb_sample_descriptor/main/Kconfig.projbuild deleted file mode 100644 index 49a79fe590..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/main/Kconfig.projbuild +++ /dev/null @@ -1,10 +0,0 @@ -menu "Example Configuration" - - config EXAMPLE_MANUAL_DESC - bool "Set up a USB descriptor manually in code" - default y - help - You can set up a descriptor using Menuconfig or independently of - your project configuration - manually in code - -endmenu diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c b/examples/peripherals/usb/device/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c deleted file mode 100644 index 9bae30a4ff..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Unlicense OR CC0-1.0 - */ - -#include -#include "esp_log.h" -#include "driver/gpio.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "tinyusb.h" -#include "sdkconfig.h" - -static const char *TAG = "example"; - -void app_main(void) -{ - ESP_LOGI(TAG, "USB initialization"); - -#if CONFIG_EXAMPLE_MANUAL_DESC - // Setting of descriptor. You can use descriptor_tinyusb and - // descriptor_str_tinyusb as a reference - tusb_desc_device_t my_descriptor = { - .bLength = sizeof(my_descriptor), - .bDescriptorType = TUSB_DESC_DEVICE, - .bcdUSB = 0x0200, // USB version. 0x0200 means version 2.0 - .bDeviceClass = TUSB_CLASS_UNSPECIFIED, - .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - - .idVendor = 0x303A, - .idProduct = 0x3000, - .bcdDevice = 0x0101, // Device FW version - - .iManufacturer = 0x01, // see string_descriptor[1] bellow - .iProduct = 0x02, // see string_descriptor[2] bellow - .iSerialNumber = 0x03, // see string_descriptor[3] bellow - - .bNumConfigurations = 0x01 - }; - - tusb_desc_strarray_device_t my_string_descriptor = { - // array of pointer to string descriptors - (char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - "I", // 1: Manufacturer - "My Custom Device", // 2: Product - "012-345", // 3: Serials, should use chip ID - }; - - const tinyusb_config_t tusb_cfg = { - .descriptor = &my_descriptor, - .string_descriptor = my_string_descriptor, - .external_phy = false, - .configuration_descriptor = NULL, - }; - -#else - - const tinyusb_config_t tusb_cfg = { - .device_descriptor = NULL, - .string_descriptor = NULL, - .external_phy = false, - .configuration_descriptor = NULL, - }; - -#endif - - ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg)); - ESP_LOGI(TAG, "USB initialization DONE"); -} diff --git a/examples/peripherals/usb/device/tusb_sample_descriptor/sdkconfig.defaults b/examples/peripherals/usb/device/tusb_sample_descriptor/sdkconfig.defaults deleted file mode 100644 index 9e66e7cc08..0000000000 --- a/examples/peripherals/usb/device/tusb_sample_descriptor/sdkconfig.defaults +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG_TINYUSB=y -CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID=n -CONFIG_TINYUSB_DESC_CUSTOM_VID=0x303A -CONFIG_TINYUSB_DESC_USE_DEFAULT_PID=n -CONFIG_TINYUSB_DESC_CUSTOM_PID=0x3000 diff --git a/examples/peripherals/usb/device/tusb_serial_device/pytest_usb_device_serial.py b/examples/peripherals/usb/device/tusb_serial_device/pytest_usb_device_serial.py new file mode 100644 index 0000000000..bcf6c90203 --- /dev/null +++ b/examples/peripherals/usb/device/tusb_serial_device/pytest_usb_device_serial.py @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +from time import sleep + +import pytest +from pytest_embedded import Dut +from serial import Serial +from serial.tools.list_ports import comports + + +@pytest.mark.esp32s2 +@pytest.mark.usb_device +def test_usb_device_serial_example(dut: Dut) -> None: + dut.expect_exact('USB initialization DONE') + sleep(2) # Some time for the OS to enumerate our USB device + + # Find device with Espressif TinyUSB VID/PID + ports = comports() + for port, _, hwid in ports: + if '303A:4001' in hwid: + with Serial(port) as s: + s.write('text\r\n'.encode()) # Write dummy text to COM port + dut.expect_exact('Data from channel 0:') # Check ESP log + dut.expect_exact('|text..|') + res = s.readline() # Check COM echo + assert b'text\r\n' in res + return + + raise Exception('TinyUSB COM port not found') diff --git a/examples/peripherals/usb/device/tusb_serial_device/sdkconfig.ci b/examples/peripherals/usb/device/tusb_serial_device/sdkconfig.ci new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pytest.ini b/pytest.ini index 2433ce2571..b9f404abf1 100644 --- a/pytest.ini +++ b/pytest.ini @@ -37,6 +37,7 @@ markers = quad_psram: runners with quad psram octal_psram: runners with octal psram usb_host: usb host runners + usb_device: usb device runners ethernet_ota: ethernet OTA runners flash_encryption: Flash Encryption runners flash_encryption_f4r8: Flash Encryption runners with 4-line flash and 8-line psram diff --git a/tools/ci/check_copyright_config.yaml b/tools/ci/check_copyright_config.yaml index bb99c7d0b6..2e626652d2 100644 --- a/tools/ci/check_copyright_config.yaml +++ b/tools/ci/check_copyright_config.yaml @@ -143,7 +143,9 @@ tinyusb: - 'examples/peripherals/usb/device/tusb_midi/' allowed_licenses: - Apache-2.0 - - MIT + - MIT # Example derived from TinyUSB code by HaThach + - Unlicense + - CC0-1.0 # files matching this section do not perform the check # file patterns starting with ! are negated, meaning files matching them won't match the section. From bd418e7a76d675ae8857b6dd136610fd35df68bd Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Thu, 4 Mar 2021 16:06:24 +0800 Subject: [PATCH 043/665] ble_mesh: stack: Fix invalid provisioning pdu type check For case MESH/NODE/PROV/BI-15-C --- components/bt/esp_ble_mesh/mesh_core/prov.c | 31 +++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/prov.c b/components/bt/esp_ble_mesh/mesh_core/prov.c index 4e9813f7c6..cb3ddae2e2 100644 --- a/components/bt/esp_ble_mesh/mesh_core/prov.c +++ b/components/bt/esp_ble_mesh/mesh_core/prov.c @@ -1450,18 +1450,22 @@ static void prov_msg_recv(void) return; } - if (type != PROV_FAILED && type != link.expect) { - BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); - prov_send_fail_msg(PROV_ERR_UNEXP_PDU); - return; - } - + /* For case MESH/NODE/PROV/BI-15-C, when the node receive a Provisioning PDU + * with the Type field set to the lowest unsupported or RFU value, it sends a + * Provisioning Failed PDU with the Error Code field set to Invalid PDU(0x01). + */ if (type >= ARRAY_SIZE(prov_handlers)) { BT_ERR("Unknown provisioning PDU type 0x%02x", type); prov_send_fail_msg(PROV_ERR_NVAL_PDU); return; } + if (type != PROV_FAILED && type != link.expect) { + BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); + prov_send_fail_msg(PROV_ERR_UNEXP_PDU); + return; + } + if (1 + prov_handlers[type].len != link.rx.buf->len) { BT_ERR("Invalid length %u for type 0x%02x", link.rx.buf->len, type); @@ -1666,15 +1670,20 @@ int bt_mesh_pb_gatt_recv(struct bt_mesh_conn *conn, struct net_buf_simple *buf) return -EINVAL; } + /* For case MESH/NODE/PROV/BI-15-C, when the node receive a Provisioning PDU + * with the Type field set to the lowest unsupported or RFU value, it sends a + * Provisioning Failed PDU with the Error Code field set to Invalid PDU(0x01). + */ type = net_buf_simple_pull_u8(buf); - if (type != PROV_FAILED && type != link.expect) { - BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); - prov_send_fail_msg(PROV_ERR_UNEXP_PDU); + if (type >= ARRAY_SIZE(prov_handlers)) { + BT_ERR("Unknown provisioning PDU type 0x%02x", type); + prov_send_fail_msg(PROV_ERR_NVAL_PDU); return -EINVAL; } - if (type >= ARRAY_SIZE(prov_handlers)) { - BT_ERR("Unknown provisioning PDU type 0x%02x", type); + if (type != PROV_FAILED && type != link.expect) { + BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); + prov_send_fail_msg(PROV_ERR_UNEXP_PDU); return -EINVAL; } From fc9edce9bc995564c7b12f91d6b5f3c68071aa25 Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Thu, 4 Mar 2021 15:27:21 +0800 Subject: [PATCH 044/665] ble_mesh: stack: Fix PB-GATT not check invalid link flag For case MESH/NODE/PROV/BI-03-C --- components/bt/esp_ble_mesh/mesh_core/prov.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/bt/esp_ble_mesh/mesh_core/prov.c b/components/bt/esp_ble_mesh/mesh_core/prov.c index cb3ddae2e2..f9de1e271c 100644 --- a/components/bt/esp_ble_mesh/mesh_core/prov.c +++ b/components/bt/esp_ble_mesh/mesh_core/prov.c @@ -1670,6 +1670,16 @@ int bt_mesh_pb_gatt_recv(struct bt_mesh_conn *conn, struct net_buf_simple *buf) return -EINVAL; } + /* For case MESH/NODE/PROV/BI-03-C, if the link is closed, when the node receive + * a Provisioning PDU , it will send a Provisioning Failed PDU with the Error Code + * field set to Unexpected PDU(0x03). + */ + if (bt_mesh_atomic_test_bit(link.flags, LINK_INVALID)) { + BT_WARN("Unexpected msg 0x%02x on invalid link", type); + prov_send_fail_msg(PROV_ERR_UNEXP_PDU); + return -EINVAL; + } + /* For case MESH/NODE/PROV/BI-15-C, when the node receive a Provisioning PDU * with the Type field set to the lowest unsupported or RFU value, it sends a * Provisioning Failed PDU with the Error Code field set to Invalid PDU(0x01). From 5830ac8b12954c09f4af89072cf33b5b639729a0 Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Sat, 20 Mar 2021 13:49:36 +0800 Subject: [PATCH 045/665] ble_mesh: stack: Fix ignore connectable PB-ADV PDU containing a Link Open message. For case MESH/NODE/PBADV/BI-04-C --- components/bt/esp_ble_mesh/mesh_core/scan.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/scan.c b/components/bt/esp_ble_mesh/mesh_core/scan.c index 753f19bb9c..b840eff9d0 100644 --- a/components/bt/esp_ble_mesh/mesh_core/scan.c +++ b/components/bt/esp_ble_mesh/mesh_core/scan.c @@ -233,14 +233,11 @@ static void bt_mesh_scan_cb(const bt_mesh_addr_t *addr, buf->len = len - 1; -#if 0 - /* TODO: Check with BLE Mesh BQB test cases */ if ((type == BLE_MESH_DATA_MESH_PROV || type == BLE_MESH_DATA_MESH_MESSAGE || type == BLE_MESH_DATA_MESH_BEACON) && (adv_type != BLE_MESH_ADV_NONCONN_IND)) { BT_DBG("Ignore mesh packet (type 0x%02x) with adv_type 0x%02x", type, adv_type); return; } -#endif switch (type) { case BLE_MESH_DATA_MESH_MESSAGE: From ee7d448e3ce107ffb64757d4271ea9bba80ed989 Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Thu, 21 Jul 2022 20:25:19 +0800 Subject: [PATCH 046/665] ble_mesh: stack: The value of expect_ack_for will be rewrited after send_pub_key(). For case MESH/PVNR/PROV/BV-04-C --- components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c b/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c index 4945e1faee..60ac6c2f03 100644 --- a/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c +++ b/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c @@ -2943,6 +2943,12 @@ static void gen_prov_ack(const uint8_t idx, struct prov_rx *rx, struct net_buf_s case PROV_START: pub_key_oob = link[idx].conf_inputs[13]; send_pub_key(idx, pub_key_oob); + /* For case MESH/PVNR/PROV/BV-04-C, if using OOB public key, + * the value of expect_ack_for shall be PROV_PUB_KEY. + */ + if (pub_key_oob) { + return; + } break; case PROV_PUB_KEY: prov_gen_dh_key(idx); From 0cb883b407da463f49f13a9d691c3e6a7a388bba Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Wed, 7 Apr 2021 17:10:54 +0800 Subject: [PATCH 047/665] ble_mesh: stack: The Heartbeat Publication Period Log value can set to 0x11, range: [0, 0x11] --- components/bt/esp_ble_mesh/mesh_core/cfg_srv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c index 12f910986d..c6606efba8 100644 --- a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c +++ b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c @@ -3049,7 +3049,7 @@ static void heartbeat_pub_set(struct bt_mesh_model *model, goto failed; } - if (param->period_log > 0x10) { + if (param->period_log > 0x11) { status = STATUS_CANNOT_SET; goto failed; } From 59c1e9a25db12fec86d24322e067d448212b6d9b Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Wed, 7 Apr 2021 17:09:58 +0800 Subject: [PATCH 048/665] ble_mesh: stack: the count_log field should be set to 0 when HBS is sent. For MESH/NODE/CFG/HBS/BV-02-C --- components/bt/esp_ble_mesh/mesh_core/cfg_srv.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c index c6606efba8..c49cea5309 100644 --- a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c +++ b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c @@ -3202,19 +3202,18 @@ static void heartbeat_sub_set(struct bt_mesh_model *model, } if (sub_src == BLE_MESH_ADDR_UNASSIGNED || - sub_dst == BLE_MESH_ADDR_UNASSIGNED || - sub_period == 0x00) { + sub_dst == BLE_MESH_ADDR_UNASSIGNED || + sub_period == 0x00) { /* Only an explicit address change to unassigned should * trigger clearing of the values according to * MESH/NODE/CFG/HBS/BV-02-C. */ if (sub_src == BLE_MESH_ADDR_UNASSIGNED || - sub_dst == BLE_MESH_ADDR_UNASSIGNED) { + sub_dst == BLE_MESH_ADDR_UNASSIGNED) { cfg->hb_sub.src = BLE_MESH_ADDR_UNASSIGNED; cfg->hb_sub.dst = BLE_MESH_ADDR_UNASSIGNED; cfg->hb_sub.min_hops = BLE_MESH_TTL_MAX; cfg->hb_sub.max_hops = 0U; - cfg->hb_sub.count = 0U; } period_ms = 0; @@ -3240,6 +3239,11 @@ static void heartbeat_sub_set(struct bt_mesh_model *model, hb_sub_send_status(model, ctx, STATUS_SUCCESS); + /* For case MESH/NODE/CFG/HBS/BV-02-C, set count_log to 0 + * when Heartbeat Subscription Status message is sent. + */ + cfg->hb_sub.count = 0U; + /* MESH/NODE/CFG/HBS/BV-01-C expects the MinHops to be 0x7f after * disabling subscription, but 0x00 for subsequent Get requests. */ From 3632250884c33c3dfb6e30d877df58de25430f95 Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Wed, 3 Aug 2022 21:16:01 +0800 Subject: [PATCH 049/665] ble_mesh: stack: Add a check if the appkey is bound to the model. For case MESH/NODE/CFG/MP/BI-03-C --- .../bt/esp_ble_mesh/mesh_core/cfg_srv.c | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c index c49cea5309..7a0c52a8e7 100644 --- a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c +++ b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c @@ -197,6 +197,21 @@ static bool app_key_is_valid(uint16_t app_idx) return false; } +static bool mod_pub_app_key_bound(struct bt_mesh_model *model, + uint16_t app_idx) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(model->keys); i++) { + if (model->keys[i] == app_idx) { + return true; + } + } + + BT_ERR("Appkey(0x%02x) not bound to this model.", app_idx); + return false; +} + static uint8_t _mod_pub_set(struct bt_mesh_model *model, uint16_t pub_addr, uint16_t app_idx, uint8_t cred_flag, uint8_t ttl, uint8_t period, uint8_t retransmit, bool store) @@ -237,7 +252,11 @@ static uint8_t _mod_pub_set(struct bt_mesh_model *model, uint16_t pub_addr, return STATUS_SUCCESS; } - if (!bt_mesh_app_key_find(app_idx)) { + /* For case MESH/NODE/CFG/MP/BI-03-C, need to check if appkey + * is bound to model identified by the ModelIdentifier. + */ + if (!bt_mesh_app_key_find(app_idx) || + !mod_pub_app_key_bound(model, app_idx)) { return STATUS_INVALID_APPKEY; } From e814f57b0f8f3458769066d0925baa0da7b5ca95 Mon Sep 17 00:00:00 2001 From: wangjialiang Date: Thu, 18 Mar 2021 17:27:19 +0800 Subject: [PATCH 050/665] ble_mesh: stack: Fix kr from non-primary subnet shouldn't ignore For case MESH/NODE/KR/BV-02-C --- components/bt/esp_ble_mesh/mesh_core/beacon.c | 24 ++++++++++++++++--- .../bt/esp_ble_mesh/mesh_core/cfg_srv.c | 2 +- components/bt/esp_ble_mesh/mesh_core/prov.c | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/components/bt/esp_ble_mesh/mesh_core/beacon.c b/components/bt/esp_ble_mesh/mesh_core/beacon.c index 31d09aa05a..981f88edcd 100644 --- a/components/bt/esp_ble_mesh/mesh_core/beacon.c +++ b/components/bt/esp_ble_mesh/mesh_core/beacon.c @@ -374,9 +374,19 @@ static void secure_beacon_recv(struct net_buf_simple *buf) cache_add(data, sub); - /* If we have NetKey0 accept initiation only from it */ + /* Spec v1.0.1, Section 3.8.4: + * If a node on a primary subnet receives an update on + * the primary subnet, it shall propagate the IV update + * to all other subnets. If a node on a primary subnet + * receives an IV update on any other subnet, the update + * shall be ignored. + * If a node on a primary subnet receives an key update + * on any other subnet, the update shall not be ignored. + */ if (bt_mesh_primary_subnet_exist() && - sub->net_idx != BLE_MESH_KEY_PRIMARY) { + sub->net_idx != BLE_MESH_KEY_PRIMARY && + BLE_MESH_IV_UPDATE(flags) && + !BLE_MESH_KEY_REFRESH(flags)) { BT_WARN("Ignoring secure beacon on non-primary subnet"); goto update_stats; } @@ -390,7 +400,15 @@ static void secure_beacon_recv(struct net_buf_simple *buf) bt_mesh_beacon_ivu_initiator(false); } - iv_change = bt_mesh_net_iv_update(iv_index, BLE_MESH_IV_UPDATE(flags)); + /* If a node on a primary subnet receives an IV update on any other subnet, + * the IV update shall be ignored. And if a node on a non-primary subnet + * receives an IV update on primary subnet, the IV update shall be ignored, + * because it doesn't have a primary network key. + */ + if ((bt_mesh_primary_subnet_exist() && sub->net_idx == BLE_MESH_KEY_PRIMARY) || + (!bt_mesh_primary_subnet_exist() && sub->net_idx != BLE_MESH_KEY_PRIMARY)) { + iv_change = bt_mesh_net_iv_update(iv_index, BLE_MESH_IV_UPDATE(flags)); + } kr_change = bt_mesh_kr_update(sub, BLE_MESH_KEY_REFRESH(flags), new_key); if (kr_change) { diff --git a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c index 7a0c52a8e7..2818936d91 100644 --- a/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c +++ b/components/bt/esp_ble_mesh/mesh_core/cfg_srv.c @@ -252,7 +252,7 @@ static uint8_t _mod_pub_set(struct bt_mesh_model *model, uint16_t pub_addr, return STATUS_SUCCESS; } - /* For case MESH/NODE/CFG/MP/BI-03-C, need to check if appkey + /* For case MESH/NODE/CFG/MP/BI-03-C, need to check if appkey * is bound to model identified by the ModelIdentifier. */ if (!bt_mesh_app_key_find(app_idx) || diff --git a/components/bt/esp_ble_mesh/mesh_core/prov.c b/components/bt/esp_ble_mesh/mesh_core/prov.c index f9de1e271c..c18c6949cf 100644 --- a/components/bt/esp_ble_mesh/mesh_core/prov.c +++ b/components/bt/esp_ble_mesh/mesh_core/prov.c @@ -1672,7 +1672,7 @@ int bt_mesh_pb_gatt_recv(struct bt_mesh_conn *conn, struct net_buf_simple *buf) /* For case MESH/NODE/PROV/BI-03-C, if the link is closed, when the node receive * a Provisioning PDU , it will send a Provisioning Failed PDU with the Error Code - * field set to Unexpected PDU(0x03). + * field set to Unexpected PDU(0x03). */ if (bt_mesh_atomic_test_bit(link.flags, LINK_INVALID)) { BT_WARN("Unexpected msg 0x%02x on invalid link", type); From 505d330cdc511123b924bb8318fa002a22df7273 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Wed, 10 Aug 2022 16:11:08 +0200 Subject: [PATCH 051/665] eth_iperf_test: improved regex to properly evaluate IP address --- examples/ethernet/iperf/iperf_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ethernet/iperf/iperf_test.py b/examples/ethernet/iperf/iperf_test.py index 9fe3f9f2be..1233369257 100644 --- a/examples/ethernet/iperf/iperf_test.py +++ b/examples/ethernet/iperf/iperf_test.py @@ -26,7 +26,7 @@ except ImportError: # Only used for type annotations pass -NO_BANDWIDTH_LIMIT = -1 # iperf send bandwith is not limited +NO_BANDWIDTH_LIMIT = -1 # iperf send bandwidth is not limited class IperfTestUtilityEth(IperfUtility.IperfTestUtility): @@ -50,7 +50,7 @@ class IperfTestUtilityEth(IperfUtility.IperfTestUtility): self.dut.write('ethernet start') time.sleep(10) self.dut.write('ethernet info') - dut_ip = self.dut.expect(re.compile(r'ETHIP: (\d+[.]\d+[.]\d+[.]\d+)'))[0] + dut_ip = self.dut.expect(re.compile(r'ETHIP: (\d+[.]\d+[.]\d+[.]\d+)\r'))[0] rssi = 0 return dut_ip, rssi From 677793c28faa09f48edb6c6a5c80132257279e30 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 4 Aug 2022 16:41:33 +0800 Subject: [PATCH 052/665] doc: improve adc migration guide --- docs/en/api-reference/peripherals/adc_continuous.rst | 1 + docs/en/migration-guides/release-5.x/peripherals.rst | 2 +- docs/en/migration-guides/release-5.x/removed-components.rst | 3 +++ docs/zh_CN/migration-guides/release-5.x/removed-components.rst | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/en/api-reference/peripherals/adc_continuous.rst b/docs/en/api-reference/peripherals/adc_continuous.rst index 6f30edafbe..af75f7b460 100644 --- a/docs/en/api-reference/peripherals/adc_continuous.rst +++ b/docs/en/api-reference/peripherals/adc_continuous.rst @@ -18,6 +18,7 @@ Driver Concepts ^^^^^^^^^^^^^^^ ADC continuous mode conversion is made up with multiple Conversion Frames. + - Conversion Frame: One Conversion Frame contains multiple Conversion Results. Conversion Frame size is configured in :cpp:func:`adc_continuous_new_handle`, in bytes. - Conversion Result: One Conversion Result contains multiple bytes (see :c:macro:`SOC_ADC_DIGI_RESULT_BYTES`). Its structure is :cpp:type:`adc_digi_output_data_t`, including ADC unit, ADC channel and raw data. diff --git a/docs/en/migration-guides/release-5.x/peripherals.rst b/docs/en/migration-guides/release-5.x/peripherals.rst index 15c4a742fd..7d2f3e15f8 100644 --- a/docs/en/migration-guides/release-5.x/peripherals.rst +++ b/docs/en/migration-guides/release-5.x/peripherals.rst @@ -18,7 +18,7 @@ ADC - ADC oneshot mode driver has been redesigned. New driver is in ``esp_adc`` component and the include path is ``esp_adc/adc_oneshot.h``. Legacy driver is still available in the previous include path ``driver/adc.h``. However, by default, including ``driver/adc.h`` will bring a build warning like `legacy adc driver is deprecated, please migrate to use esp_adc/adc_oneshot.h and esp_adc/adc_continuous.h for oneshot mode and continuous mode drivers respectively`. The warning can be suppressed by the Kconfig option :ref:`CONFIG_ADC_SUPPRESS_DEPRECATE_WARN`. - ADC continuous mode driver has been moved from ``driver`` component to ``esp_adc`` component. Include path has been changed from ``driver/adc.h`` to ``esp_adc/adc_continuous.h``. Legacy driver is still available in the previous include path ``driver/adc.h``. Similarly, including it will bring a build warning, and it can be suppressed by the Kconfig option :ref:`CONFIG_ADC_SUPPRESS_DEPRECATE_WARN`. -- ADC calibration driver has been redesigned. New driver is in ``esp_adc`` component and the include path is ``esp_adc/adc_cali.h`` and ``esp_adc/adc_cali_scheme.h``. Legacy driver is still available by including ``esp_adc_cal.h``. However, by default, including ``esp_adc_cal.h`` will bring a build warning like `legacy adc calibration driver is deprecated, please migrate to use esp_adc/adc_cali.h and esp_adc/adc_cali_scheme.h`. The warning can be suppressed by the Kconfig option :ref:`CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN`. +- ADC calibration driver has been redesigned. New driver is in ``esp_adc`` component and the include path is ``esp_adc/adc_cali.h`` and ``esp_adc/adc_cali_scheme.h``. Legacy driver is still available by including ``esp_adc_cal.h``. However, you should add ``esp_adc`` component to the list of component requirements in CMakeLists.txt. By default, including ``esp_adc_cal.h`` will bring a build warning like `legacy adc calibration driver is deprecated, please migrate to use esp_adc/adc_cali.h and esp_adc/adc_cali_scheme.h`. The warning can be suppressed by the Kconfig option :ref:`CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN`. - API ``adc_power_acquire`` and ``adc_power_release`` have been deprecated. These two are used by other drivers to maintain ADC power due to hardware limitation. After this change, ADC power will still be handled by the drivers. However, for users who are interested in this, the include path has been changed from ``driver/adc.h`` to ``esp_private/adc_share_hw_ctrl.h``. - Previous ``driver/adc2_wifi_private.h`` has been moved to ``esp_private/adc_share_hw_ctrl.h``. - Enums ``ADC_UNIT_BOTH``, ``ADC_UNIT_ALTER`` and ``ADC_UNIT_MAX`` in ``adc_unit_t`` have been removed. diff --git a/docs/en/migration-guides/release-5.x/removed-components.rst b/docs/en/migration-guides/release-5.x/removed-components.rst index 9a3289dcb2..864a068ea7 100644 --- a/docs/en/migration-guides/release-5.x/removed-components.rst +++ b/docs/en/migration-guides/release-5.x/removed-components.rst @@ -40,6 +40,9 @@ The following components are removed since they were deprecated in IDF v4.x: .. note:: OpenSSL-API component is no longer supported. It is not available in the IDF Component Registry, either. Please use :doc:`ESP-TLS ` or :component:`mbedtls` API directly. +.. note:: + ``esp_adc_cal`` component is no longer supported. New adc calibration driver is in ``esp_adc`` component. Legacy adc calibration driver has been moved into ``esp_adc`` component. To use legacy ``esp_adc_cal`` driver APIs, you should add ``esp_adc`` component to the list of component requirements in CMakeLists.txt. Also check :doc:`Peripherals Migration Guide ` for more details. + The targets components are no longer necessary after refactoring and have been removed: * ``esp32`` diff --git a/docs/zh_CN/migration-guides/release-5.x/removed-components.rst b/docs/zh_CN/migration-guides/release-5.x/removed-components.rst index fe05889c6c..1050593192 100644 --- a/docs/zh_CN/migration-guides/release-5.x/removed-components.rst +++ b/docs/zh_CN/migration-guides/release-5.x/removed-components.rst @@ -40,6 +40,9 @@ IDF v4.x 版本中已不再使用以下组件,这些组件已弃用: .. note:: 不再支持 OpenSSL-API 组件。IDF Component Registry 中也没有该组件。请直接使用 :doc:`ESP-TLS ` 或 :component:`mbedtls` API。 +.. note:: + 不再支持 esp_adc_cal 组件。 新的 adc 校准驱动在 esp_adc 组件中。旧版 adc 校准驱动已被迁移进 esp_adc 组件中。 要使用旧版 esp_adc_cal 驱动接口,你应该在 CMakeLists.txt 文件的组件依赖列表中增加 esp_adc 。更多细节请查看 :doc:`Peripherals Migration Guide `。 + 版本更新后无需目标组件,因此以下目标组件也已经从 ESP-IDF 中删除: * ``esp32`` From d792b49804fb0275682f36a47894a90a27091291 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 4 Aug 2022 16:42:21 +0800 Subject: [PATCH 053/665] idf.py hints: add build error hints when legacy adc calibration driver is used --- tools/idf_py_actions/hints.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/idf_py_actions/hints.yml b/tools/idf_py_actions/hints.yml index f5da043248..53ce4b5640 100644 --- a/tools/idf_py_actions/hints.yml +++ b/tools/idf_py_actions/hints.yml @@ -70,6 +70,10 @@ re: "fatal error: trax.h: No such file or directory" hint: "The Trax API (functions/types/macros prefixed with 'trax_') has been made into a private API. If users still require usage of the Trax API (though this is not recommended), it can be included via '#include \"esp_private/trax.h\"'." +- + re: "fatal error: esp_adc_cal.h: No such file or directory" + hint: "``esp_adc_cal`` component is no longer supported. New adc calibration driver is in ``esp_adc``. Legacy adc calibration driver has been moved into ``esp_adc`` component. To use legacy ``esp_adc_cal`` driver APIs, you should add ``esp_adc`` component to the list of component requirements in CMakeLists.txt. For more information run 'idf.py docs -sp migration-guides/release-5.x/peripherals.html'." + - re: "fatal error: [\\w/]+\\.h: No such file or directory" hint: "Please check if you've specified all component dependencies with 'idf_component_register(REQUIRES ...)'. If the component is not present then it should be added by the IDF Component Manager. For more information run 'idf.py docs -sp api-guides/build-system.html'.\nAlso, please check if the header file has been removed, renamed or relocated - refer to the migration guide for more information." From 49613ab832dba205a2cc244332d709326355375f Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Thu, 11 Aug 2022 10:58:43 +0800 Subject: [PATCH 054/665] Build: add hints for the breaking changes of esp_system related components --- tools/idf_py_actions/hints.yml | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tools/idf_py_actions/hints.yml b/tools/idf_py_actions/hints.yml index d46b191efe..39405f3567 100644 --- a/tools/idf_py_actions/hints.yml +++ b/tools/idf_py_actions/hints.yml @@ -8,6 +8,10 @@ # - Do not use more than one whitespace in a row. The script automatically merges several whitespaces into one when capturing output # - Do not use \n in your regex. They are all automatically deletes by the script when capturing output +- + re: "warning: passing argument 1 of 'esp_secure_boot_read_key_digests' from incompatible pointer type" + hint: "The parameter type of the function esp_secure_boot_read_key_digests() has been changed from ets_secure_boot_key_digests_t* to esp_secure_boot_key_digests_t*." + - re: "error: implicit declaration of function 'bootloader_common_get_reset_reason'" hint: "'bootloader_common_get_reset_reason()' has been removed. Please use the function 'esp_rom_get_reset_reason()' in the ROM component." @@ -25,6 +29,36 @@ hint: "Use esp_cpu_{}et_cycle_count() defined in esp_cpu.h instead." match_to_output: True +- + re: "error: implicit declaration of function 'esp_efuse_get_chip_ver'" + hint: "Function esp_efuse_get_chip_ver() has been removed. Use efuse_hal_get_major_chip_version(), efuse_hal_get_minor_chip_version() or efuse_hal_chip_revision() instead." + +- + re: "error: implicit declaration of function '(esp_random|esp_fill_random)'" + hint: "esp_random.h header file is not included by esp_system.h anymore. It shall then be manually included with #include \"esp_random.h\"" + +- + re: "error: implicit declaration of function '(esp_base_mac_addr_(s|g)et|esp_efuse_mac_get_(custom|default)|esp_read_mac|esp_derive_local_mac)'" + hint: "esp_mac.h header file is not included by esp_system.h anymore. It shall then be manually included with #include \"esp_mac.h\"" + +- + re: "error: (implicit declaration of function 'esp_chip_info'|unknown type name 'esp_chip_info_t')" + hint: "esp_chip_info.h header file is not included by esp_system.h anymore. It shall then be manually included with #include \"esp_chip_info.h\"" + +- + re: "error: implicit declaration of function 'esp_int_wdt_\\w+'" + hint: "The Interrupt Watchdog API has been made private, it shall not be used anymore. You can still force its inclusion with #include \"esp_private/esp_int_wdt.h\" (not recommended)" + +- + re: "error: implicit declaration of function '(esp_spiram_get_chip_size|esp_spiram_get_size)'" + hint: "{}() has been deleted, please use esp_psram_get_size() instead." + match_to_output: True + +- + re: "fatal error: (spiram.h|esp_spiram.h): No such file or directory" + hint: "{} was removed. Include esp_psram.h instead. Make sure to also add esp_psram as a dependency in your CMakeLists.txt file." + match_to_output: True + - re: "fatal error: (soc/cpu.h|compare_set.h): No such file or directory" hint: "{} was removed. Include and use the API function provided by esp_cpu.h instead." @@ -50,10 +84,15 @@ hint: "{} was renamed and made private. Consider using the logging APIs provided under esp_log.h instead." match_to_output: True +- + re: "fatal error: eh_frame_parser.h: No such file or directory" + hint: "Backtrace Parser API (eh_frame_parser.h) has been made private, it shall not be used anymore. You can still force its inclusion with #include \"esp_private/eh_frame_parser.h\" (not recommended)" + - re: "error: implicit declaration of function '(\\w+)'" hint: "Maybe you forgot to import {} library(s) in header file or add the necessary REQURIES component. Try to add missing libraries to your project header file or check idf_component_register(REQUIRES ...) section in your component CmakeList.txt file. For more information run 'idf.py docs -sp api-guides/build-system.html'." match_to_output: True + - re: "fatal error: esp32\\w*\\/clk.h: No such file or directory" hint: "The ESP Clock API (functions/types/macros prefixed with 'esp_clk') has been made into a private API. If users still require usage of the ESP Clock API (though this is not recommended), it can be included via '#include \"esp_private/esp_clk.h\"'." From b250589f2fb972951c6216f941a632739147c45c Mon Sep 17 00:00:00 2001 From: "chaijie@espressif.com" Date: Mon, 25 Jul 2022 17:18:18 +0800 Subject: [PATCH 055/665] set fosc div to 1 to make chip run stablly for C2 --- components/soc/esp32c2/include/soc/rtc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/soc/esp32c2/include/soc/rtc.h b/components/soc/esp32c2/include/soc/rtc.h index 093c920594..f8a9c045ae 100644 --- a/components/soc/esp32c2/include/soc/rtc.h +++ b/components/soc/esp32c2/include/soc/rtc.h @@ -179,7 +179,7 @@ typedef struct { .fast_clk_src = SOC_RTC_FAST_CLK_SRC_RC_FAST, \ .slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW, \ .clk_rtc_clk_div = 0, \ - .clk_8m_clk_div = 0, \ + .clk_8m_clk_div = 1, \ .slow_clk_dcap = RTC_CNTL_SCK_DCAP_DEFAULT, \ .clk_8m_dfreq = RTC_CNTL_CK8M_DFREQ_DEFAULT, \ } From 0fd305da2de6c5792ad534b105749f718847981d Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Fri, 29 Jul 2022 19:31:24 +0800 Subject: [PATCH 056/665] freertos: Add new macro to check for yielding When a FreeRTOS function unblocks a task, that function will check whether the unblocked task requires a yield to be called. This is currently done by having each function individually check if the unblocked task has a higher priority than the both cores, and yielding the appropriate core. This commit adds the macros list below to abstract away the yielding checking procedure. This will allow the code to match upstream more closely. - prvCheckForYield() - prvCheckForYieldUsingPriority() --- components/freertos/FreeRTOS-Kernel/tasks.c | 94 +++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/components/freertos/FreeRTOS-Kernel/tasks.c b/components/freertos/FreeRTOS-Kernel/tasks.c index 6b2252071e..a98b8931b4 100644 --- a/components/freertos/FreeRTOS-Kernel/tasks.c +++ b/components/freertos/FreeRTOS-Kernel/tasks.c @@ -249,6 +249,15 @@ extern void esp_vApplicationIdleHook(void); tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) /*-----------------------------------------------------------*/ +#if ( configNUM_CORES > 1 ) + #define prvCheckForYield( pxTCB, xCurCoreID, xYieldEqualPriority ) ( prvCheckForYieldUsingPrioritySMP( ( pxTCB )->uxPriority, ( pxTCB )->xCoreID, xCurCoreID, xYieldEqualPriority ) == pdTRUE ) + #define prvCheckForYieldUsingPriority( uxTaskPriority, xTaskCoreID, xCurCoreID, xYieldEqualPriority ) ( prvCheckForYieldUsingPrioritySMP( uxTaskPriority, xTaskCoreID, xCurCoreID, xYieldEqualPriority ) == pdTRUE ) +#else + #define prvCheckForYield( pxTargetTCB, xCurCoreID, xYieldEqualPriority ) ( ( ( pxTargetTCB )->uxPriority + ( ( xYieldEqualPriority == pdTRUE ) ? 1 : 0 ) ) > pxCurrentTCB[ 0 ]->uxPriority ) + #define prvCheckForYieldUsingPriority( uxTaskPriority, xTaskCoreID, xCurCoreID, xYieldEqualPriority ) ( ( uxTaskPriority + ( ( xYieldEqualPriority == pdTRUE ) ? 1 : 0 ) ) >= pxCurrentTCB[ 0 ]->uxPriority ) +#endif /* configNUM_CORES > 1 */ +/*-----------------------------------------------------------*/ + #define tskCAN_RUN_HERE( cpuid ) ( cpuid==xPortGetCoreID() || cpuid==tskNO_AFFINITY ) /* @@ -625,6 +634,49 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, TaskFunction_t pxTaskCode, BaseType_t xCoreID ) PRIVILEGED_FUNCTION; + +#if ( configNUM_CORES > 1 ) + +/* + * Check whether a yield (on either core) is required after unblocking (or + * changing the priority of) a particular task. + * + * - This function is the SMP replacement for checking if an unblocked task has + * a higher (or equal) priority than the current task. + * - It should be called before calling taskYIELD_IF_USING_PREEMPTION() or + * before setting xYieldRequired + * - If it is the other core that requires a yield, this function will + * internally trigger the other core to yield + * + * Note: In some special instances, a yield is triggered if the unblocked task + * has an equal priority (such as in xTaskResumeAll). Thus the + * xYieldEqualPriority parameter specifies whether to yield if the current + * task has equal priority. + * + * Scheduling Algorithm: + * This function will bias towards yielding the current core. + * - If the unblocked task has a higher (or equal) priority than then current + * core, the current core is yielded regardless of the current priority of the + * other core. + * - A core (current or other) will only yield if their schedulers are not + * suspended. + * + * Todo: This can be optimized (IDF-5772) + * + * Entry: + * - This function must be called in a critical section + * - A task must just have been unblocked, or its priority raised + * Exit: + * - Returns pdTRUE if the current core requires yielding + * - The other core will be triggered to yield if required + */ +static BaseType_t prvCheckForYieldUsingPrioritySMP( UBaseType_t uxTaskPriority, + BaseType_t xTaskCoreID, + BaseType_t xCurCoreID, + BaseType_t xYieldEqualPriority ) PRIVILEGED_FUNCTION; + +#endif /* configNUM_CORES > 1 */ + /* * freertos_tasks_c_additions_init() should only be called if the user definable * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro @@ -1326,6 +1378,48 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, } /*-----------------------------------------------------------*/ +#if ( configNUM_CORES > 1 ) + + static BaseType_t prvCheckForYieldUsingPrioritySMP( UBaseType_t uxTaskPriority, + BaseType_t xTaskCoreID, + BaseType_t xCurCoreID, + BaseType_t xYieldEqualPriority ) + { + if( xYieldEqualPriority == pdTRUE ) + { + /* Increment the task priority to achieve the same affect as if( uxTaskPriority >= pxCurrentTCB->uxPriority ) */ + uxTaskPriority++; + } + + /* Indicate whether the current core needs to yield */ + BaseType_t xYieldRequiredCurrentCore; + + /* If the target task can run on the current core, and has a higher priority than the current core, then yield the current core */ + if( ( ( xTaskCoreID == xCurCoreID ) || ( xTaskCoreID == tskNO_AFFINITY ) ) && ( uxTaskPriority > pxCurrentTCB[ xCurCoreID ]->uxPriority ) ) + { + /* Return true for the caller to yield the current core */ + xYieldRequiredCurrentCore = pdTRUE; + } + /* If the target task can run on the other core, and has a higher priority then the other core, and the other core has not suspended scheduling, the yield the other core */ + else if( ( ( xTaskCoreID == !xCurCoreID ) || ( xTaskCoreID == tskNO_AFFINITY ) ) + && ( uxTaskPriority > pxCurrentTCB[ !xCurCoreID ]->uxPriority ) + && ( uxSchedulerSuspended[ !xCurCoreID ] == ( UBaseType_t ) pdFALSE ) ) + { + /* Signal the other core to yield */ + vPortYieldOtherCore( !xCurCoreID ); + xYieldRequiredCurrentCore = pdFALSE; + } + else + { + xYieldRequiredCurrentCore = pdFALSE; + } + + return xYieldRequiredCurrentCore; + } + +#endif /* configNUM_CORES > 1 */ +/*-----------------------------------------------------------*/ + #if ( INCLUDE_vTaskDelete == 1 ) void vTaskDelete( TaskHandle_t xTaskToDelete ) From 287ab7566b9dd8b974a6a530431dc6ac5dc7aa7c Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Mon, 1 Aug 2022 15:57:51 +0800 Subject: [PATCH 057/665] freertos: Use check yielding macros This commit updates various FreeRTOS functions to call the newly added prvCheckForYield() and prvCheckForYieldUsingPriority() when checking for yielding. This allows the source code to match upstream more closely. --- components/freertos/FreeRTOS-Kernel/tasks.c | 135 ++++++++------------ 1 file changed, 50 insertions(+), 85 deletions(-) diff --git a/components/freertos/FreeRTOS-Kernel/tasks.c b/components/freertos/FreeRTOS-Kernel/tasks.c index a98b8931b4..eb01826a2b 100644 --- a/components/freertos/FreeRTOS-Kernel/tasks.c +++ b/components/freertos/FreeRTOS-Kernel/tasks.c @@ -1244,7 +1244,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, TaskFunction_t pxTaskCode, BaseType_t xCoreID ) { - TCB_t *curTCB, *tcb0, *tcb1; + TCB_t *tcb0, *tcb1; #if (configNUM_CORES < 2) xCoreID = 0; @@ -1354,21 +1354,17 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, * then it should run now. */ taskENTER_CRITICAL(); - curTCB = pxCurrentTCB[ xCoreID ]; - if( curTCB == NULL || curTCB->uxPriority < pxNewTCB->uxPriority ) + /* If the created task is of a higher priority than the current task + * then it should run now. */ + if( pxCurrentTCB[ xPortGetCoreID() ] == NULL || prvCheckForYield( pxNewTCB, xPortGetCoreID(), pdTRUE ) ) { - if( xCoreID == xPortGetCoreID() ) - { - taskYIELD_IF_USING_PREEMPTION(); - } - else { - taskYIELD_OTHER_CORE(xCoreID, pxNewTCB->uxPriority); - } + taskYIELD_IF_USING_PREEMPTION(); } else { mtCOVERAGE_TEST_MARKER(); } + taskEXIT_CRITICAL(); } else @@ -1909,19 +1905,15 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, * priority than the calling task. */ if( uxNewPriority > uxCurrentBasePriority ) { - if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) + if( pxTCB != pxCurrentTCB[ xPortGetCoreID() ] ) { /* The priority of a task other than the currently * running task is being raised. Is the priority being * raised above that of the running task? */ - if ( tskCAN_RUN_HERE(pxTCB->xCoreID) && uxNewPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + if ( prvCheckForYieldUsingPriority( uxNewPriority, pxTCB->xCoreID, xPortGetCoreID(), pdTRUE ) ) { xYieldRequired = pdTRUE; } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); - } else { mtCOVERAGE_TEST_MARKER(); @@ -1934,31 +1926,13 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, * priority task able to run so no yield is required. */ } } - else if( pxTCB == pxCurrentTCB[xPortGetCoreID()] ) + else if( pxTCB == pxCurrentTCB[ xPortGetCoreID() ] ) { /* Setting the priority of the running task down means * there may now be another task of higher priority that * is ready to execute. */ xYieldRequired = pdTRUE; } - else if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) - { - /* The priority of a task other than the currently - * running task is being raised. Is the priority being - * raised above that of the running task? */ - if( uxNewPriority >= pxCurrentTCB[xPortGetCoreID()]->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) //Need to check if not currently running on other core - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } else { /* Setting the priority of any other task down does not @@ -2236,12 +2210,12 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, /* It does not make sense to resume the calling task. */ configASSERT( xTaskToResume ); - taskENTER_CRITICAL(); - /* The parameter cannot be NULL as it is impossible to resume the - * currently executing task. */ - if( ( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) && ( pxTCB != NULL ) ) + taskENTER_CRITICAL(); { + /* The parameter cannot be NULL as it is impossible to resume the + * currently executing task. */ + if( ( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) && ( pxTCB != NULL ) ) { if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) { @@ -2252,18 +2226,14 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); prvAddTaskToReadyList( pxTCB ); - /* We may have just resumed a higher priority task. */ - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + /* A higher priority task may have just been resumed. */ + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdTRUE ) ) { /* This yield may not cause the task just resumed to run, * but will leave the lists in the correct state for the * next yield. */ taskYIELD_IF_USING_PREEMPTION(); } - else if( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); - } else { mtCOVERAGE_TEST_MARKER(); @@ -2274,10 +2244,10 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, mtCOVERAGE_TEST_MARKER(); } } - } - else - { - mtCOVERAGE_TEST_MARKER(); + else + { + mtCOVERAGE_TEST_MARKER(); + } } taskEXIT_CRITICAL(); } @@ -2311,7 +2281,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, * simple as possible. More information (albeit Cortex-M specific) is * provided on the following link: * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - //portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); taskENTER_CRITICAL_ISR(); { @@ -2320,32 +2290,33 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, traceTASK_RESUME_FROM_ISR( pxTCB ); /* Check the ready lists can be accessed. */ - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + if( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) pdFALSE ) { - - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - - if( tskCAN_RUN_HERE( pxTCB->xCoreID ) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + /* Ready lists can be accessed so move the task from the + * suspended list to the ready list directly. */ + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdTRUE ) ) { xYieldRequired = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority); + + /* Mark that a yield is pending in case the user is not + * using the return value to initiate a context switch + * from the ISR using portYIELD_FROM_ISR. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; } else { mtCOVERAGE_TEST_MARKER(); } + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); } else { /* The delayed or ready lists cannot be accessed so the task * is held in the pending ready list until the scheduler is * unsuspended. */ - vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); + vListInsertEnd( &( xPendingReadyList[ xPortGetCoreID() ] ), &( pxTCB->xEventListItem ) ); } } else @@ -2377,7 +2348,7 @@ void vTaskStartScheduler( void ) uint32_t ulIdleTaskStackSize; /* The Idle task is created using user provided RAM - obtain the - address of the RAM then create the idle task. */ + * address of the RAM then create the idle task. */ vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); xIdleTaskHandle[ xCoreID ] = xTaskCreateStaticPinnedToCore( prvIdleTask, configIDLE_TASK_NAME, @@ -2643,7 +2614,7 @@ BaseType_t xTaskResumeAll( void ) /* If the moved task has a priority higher than the current * task then a yield must be performed. */ - if( pxTCB->uxPriority >= pxCurrentTCB[ xCoreID ]->uxPriority ) + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdTRUE ) ) { xYieldPending[ xCoreID ] = pdTRUE; } @@ -3144,15 +3115,11 @@ BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* Preemption is on, but a context switch should only be * performed if the unblocked task has a priority that is * equal to or higher than the currently executing task. */ - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdFALSE ) ) { /* Pend the yield to be performed when the scheduler * is unsuspended. */ - xYieldPending[xPortGetCoreID()] = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + xYieldPending[ xPortGetCoreID() ] = pdTRUE; } else { @@ -5885,15 +5852,11 @@ TickType_t uxTaskResetEventItemValue( void ) } #endif - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdFALSE ) ) { /* The notified task has a priority above the currently * executing task so a yield is required. */ - portYIELD_WITHIN_API(); - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE(pxTCB->xCoreID, pxTCB->uxPriority); + taskYIELD_IF_USING_PREEMPTION(); } else { @@ -6023,7 +5986,7 @@ TickType_t uxTaskResetEventItemValue( void ) vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); } - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdFALSE ) ) { /* The notified task has a priority above the currently * executing task so a yield is required. */ @@ -6031,10 +5994,11 @@ TickType_t uxTaskResetEventItemValue( void ) { *pxHigherPriorityTaskWoken = pdTRUE; } - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter to an ISR + * safe FreeRTOS function. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; } else { @@ -6113,7 +6077,7 @@ TickType_t uxTaskResetEventItemValue( void ) vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); } - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + if( prvCheckForYield( pxTCB, xPortGetCoreID(), pdFALSE ) ) { /* The notified task has a priority above the currently * executing task so a yield is required. */ @@ -6121,10 +6085,11 @@ TickType_t uxTaskResetEventItemValue( void ) { *pxHigherPriorityTaskWoken = pdTRUE; } - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter in an ISR + * safe FreeRTOS function. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; } else { From 85c009eb67c0c4966ec115ad34f816f878d65294 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 11 Aug 2022 15:56:49 +0800 Subject: [PATCH 058/665] esp_event: Fix flakey esp_event example test The execution order of the "task_event_source" and "application_task" tasks on startup can vary. This will result a different order of logs, thus leading to the example test failing. This commit synchronizes both tasks on startup. --- .../esp_event/user_event_loops/main/main.c | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/examples/system/esp_event/user_event_loops/main/main.c b/examples/system/esp_event/user_event_loops/main/main.c index fe83df2d12..f99d2d1def 100644 --- a/examples/system/esp_event/user_event_loops/main/main.c +++ b/examples/system/esp_event/user_event_loops/main/main.c @@ -23,6 +23,9 @@ esp_event_loop_handle_t loop_without_task; static void application_task(void* args) { + // Wait to be started by the main task + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + while(1) { ESP_LOGI(TAG, "application_task: running application task"); esp_event_loop_run(loop_without_task, 100); @@ -58,6 +61,9 @@ static void task_iteration_handler(void* handler_args, esp_event_base_t base, in static void task_event_source(void* args) { + // Wait to be started by the main task + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + for(int iteration = 1; iteration <= TASK_ITERATIONS_COUNT; iteration++) { esp_event_loop_handle_t loop_to_post_to; @@ -112,12 +118,19 @@ void app_main(void) ESP_ERROR_CHECK(esp_event_handler_instance_register_with(loop_with_task, TASK_EVENTS, TASK_ITERATION_EVENT, task_iteration_handler, loop_with_task, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register_with(loop_without_task, TASK_EVENTS, TASK_ITERATION_EVENT, task_iteration_handler, loop_without_task, NULL)); + // Create the event source task + TaskHandle_t task_event_source_hdl; ESP_LOGI(TAG, "starting event source"); + xTaskCreate(task_event_source, "task_event_source", 3072, NULL, uxTaskPriorityGet(NULL) + 1, &task_event_source_hdl); - // Create the event source task with the same priority as the current task - xTaskCreate(task_event_source, "task_event_source", 3072, NULL, uxTaskPriorityGet(NULL), NULL); - + // Create the application task + TaskHandle_t application_task_hdl; ESP_LOGI(TAG, "starting application task"); - // Create the application task with the same priority as the current task - xTaskCreate(application_task, "application_task", 3072, NULL, uxTaskPriorityGet(NULL), NULL); + xTaskCreate(application_task, "application_task", 3072, NULL, uxTaskPriorityGet(NULL) + 1, &application_task_hdl); + + // Start the event source task first to post an event + xTaskNotifyGive(task_event_source_hdl); + + // Start the application task to run the event handlers + xTaskNotifyGive(application_task_hdl); } From 9a6101bfed294cdc338c7a59e14e952bb7df85a7 Mon Sep 17 00:00:00 2001 From: wangmengyang Date: Thu, 11 Aug 2022 16:08:44 +0800 Subject: [PATCH 059/665] components/bt: fixed the invalid workqueue number for BTU thread in Bluedroid There should be only one workqueue for BTU task. The queue length for the second workqueue of BTU can be uninitialized and caused memory overflow and corruption. Closes https://github.com/espressif/esp-idf/issues/9507 --- components/bt/host/bluedroid/stack/btu/btu_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/bluedroid/stack/btu/btu_init.c b/components/bt/host/bluedroid/stack/btu/btu_init.c index aff092dc35..615fbf8019 100644 --- a/components/bt/host/bluedroid/stack/btu/btu_init.c +++ b/components/bt/host/bluedroid/stack/btu/btu_init.c @@ -48,7 +48,7 @@ #define BTU_TASK_STACK_SIZE (BT_BTU_TASK_STACK_SIZE + BT_TASK_EXTRA_STACK_SIZE) #define BTU_TASK_PRIO (BT_TASK_MAX_PRIORITIES - 5) #define BTU_TASK_NAME "BTU_TASK" -#define BTU_TASK_WORKQUEUE_NUM (2) +#define BTU_TASK_WORKQUEUE_NUM (1) #define BTU_TASK_WORKQUEUE0_LEN (0) hash_map_t *btu_general_alarm_hash_map; From 587ecc6fe8ccbb59bc5658e5b31400d03d9f21f9 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Tue, 2 Aug 2022 23:06:23 +0200 Subject: [PATCH 060/665] examples/sysview: add missing supported targets to readme --- examples/system/.build-test-rules.yml | 12 ++---------- examples/system/sysview_tracing/README.md | 6 +++--- examples/system/sysview_tracing_heap_log/README.md | 4 ++-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index 6235efcdea..26179c8764 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -143,22 +143,14 @@ examples/system/startup_time: reason: lack of runners examples/system/sysview_tracing: - enable: - - if: IDF_TARGET in ["esp32", "esp32c3", "esp32s2"] - temporary: true - reason: the other targets are not tested yet disable_test: - - if: IDF_TARGET == "esp32s2" or IDF_TARGET == "esp32c3" + - if: IDF_TARGET != "esp32" temporary: true reason: lack of runners examples/system/sysview_tracing_heap_log: - enable: - - if: IDF_TARGET in ["esp32", "esp32c3", "esp32s2"] - temporary: true - reason: the other targets are not tested yet disable_test: - - if: IDF_TARGET == "esp32s2" or IDF_TARGET == "esp32c3" + - if: IDF_TARGET != "esp32" temporary: true reason: lack of runners diff --git a/examples/system/sysview_tracing/README.md b/examples/system/sysview_tracing/README.md index fff1141ebc..04dd0f3288 100644 --- a/examples/system/sysview_tracing/README.md +++ b/examples/system/sysview_tracing/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-S2 | -| ----------------- | ----- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | # Example: Application Level Tracing - SystemView Tracing (sysview_tracing) This test code shows how to perform system-wide behavioral analysis of the program using [SEGGER SystemView tool](https://www.segger.com/products/development-tools/systemview/). @@ -127,7 +127,7 @@ NOTE: In order to run this example you need OpenOCD version `v0.10.0-esp32-20181 xtensa-esp32-elf-gdb -x gdbinit build/sysview_tracing.elf ``` - **Note:** Replace `xtensa-esp32-elf-gdb` with `xtensa-esp32s2-elf-gdb` if running the example on ESP32-S2. + **Note:** Replace `xtensa-esp32-elf-gdb` with the related gdb tool (e.g. `xtensa-esp32s2-elf-gdb`, `xtensa-esp32s3-elf-gdb` or `riscv32-esp-elf-gdb`) if running the example on different chip. 7. When program prints the last message, interrupt its execution (e.g. by pressing `CTRL+C`) and type the following command in GDB console to stop tracing: diff --git a/examples/system/sysview_tracing_heap_log/README.md b/examples/system/sysview_tracing_heap_log/README.md index 63b8cb17c5..590e3b56cc 100644 --- a/examples/system/sysview_tracing_heap_log/README.md +++ b/examples/system/sysview_tracing_heap_log/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-S2 | -| ----------------- | ----- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | # SystemView Heap and Log Tracing Example From f8d439dee308cf7b3a61e7f7698a68bb1a2f3c35 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 3 Aug 2022 15:22:49 +0200 Subject: [PATCH 061/665] replace CAN with TWAI in the esp_isr_names table --- components/soc/esp32/interrupts.c | 20 ++++++-------------- components/soc/esp32s2/interrupts.c | 20 ++++++-------------- tools/ci/check_copyright_ignore.txt | 2 -- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/components/soc/esp32/interrupts.c b/components/soc/esp32/interrupts.c index ed23bbd42b..76b3032a19 100644 --- a/components/soc/esp32/interrupts.c +++ b/components/soc/esp32/interrupts.c @@ -1,16 +1,8 @@ -// 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. +/* + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/interrupts.h" @@ -60,7 +52,7 @@ const char * const esp_isr_names[ETS_MAX_INTR_SOURCE] = { [42] = "PWM3", [43] = "LEDC", [44] = "EFUSE", - [45] = "CAN", + [45] = "TWAI", [46] = "RTC_CORE", [47] = "RMT", [48] = "PCNT", diff --git a/components/soc/esp32s2/interrupts.c b/components/soc/esp32s2/interrupts.c index d84a9dac57..460c907ef0 100644 --- a/components/soc/esp32s2/interrupts.c +++ b/components/soc/esp32s2/interrupts.c @@ -1,16 +1,8 @@ -// 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. +/* + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/interrupts.h" @@ -62,7 +54,7 @@ const char * const esp_isr_names[ETS_MAX_INTR_SOURCE] = { [44] = "PWM3", [45] = "LEDC", [46] = "EFUSE", - [47] = "CAN", + [47] = "TWAI", [48] = "USB", [49] = "RTC_CORE", [50] = "RMT", diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 2de1bea9a5..5dbddc2771 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1032,7 +1032,6 @@ components/soc/esp32/include/soc/uart_struct.h components/soc/esp32/include/soc/uhci_reg.h components/soc/esp32/include/soc/uhci_struct.h components/soc/esp32/include/soc/wdev_reg.h -components/soc/esp32/interrupts.c components/soc/esp32/ledc_periph.c components/soc/esp32/sdio_slave_periph.c components/soc/esp32/sdmmc_periph.c @@ -1174,7 +1173,6 @@ components/soc/esp32s2/include/soc/usb_wrap_reg.h components/soc/esp32s2/include/soc/usb_wrap_struct.h components/soc/esp32s2/include/soc/usbh_struct.h components/soc/esp32s2/include/soc/wdev_reg.h -components/soc/esp32s2/interrupts.c components/soc/esp32s2/ledc_periph.c components/soc/esp32s2/spi_periph.c components/soc/esp32s2/uart_periph.c From 66e3a6f6a343cc0d73c2d74491e0e9e3efadef85 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 3 Aug 2022 14:55:11 +0200 Subject: [PATCH 062/665] esp32s3: fix interrupt names used by SystemView --- .../soc/esp32s3/include/soc/periph_defs.h | 2 +- components/soc/esp32s3/interrupts.c | 178 ++++++++++-------- tools/ci/check_copyright_ignore.txt | 1 - 3 files changed, 99 insertions(+), 82 deletions(-) diff --git a/components/soc/esp32s3/include/soc/periph_defs.h b/components/soc/esp32s3/include/soc/periph_defs.h index 78510ca83f..0d16f7fda7 100644 --- a/components/soc/esp32s3/include/soc/periph_defs.h +++ b/components/soc/esp32s3/include/soc/periph_defs.h @@ -151,7 +151,7 @@ typedef enum { ETS_CACHE_CORE0_ACS_INTR_SOURCE, ETS_CACHE_CORE1_ACS_INTR_SOURCE, ETS_USB_SERIAL_JTAG_INTR_SOURCE, - ETS_PREI_BACKUP_INTR_SOURCE, + ETS_PERI_BACKUP_INTR_SOURCE, ETS_DMA_EXTMEM_REJECT_SOURCE, ETS_MAX_INTR_SOURCE, /**< number of interrupt sources */ } periph_interrput_t; diff --git a/components/soc/esp32s3/interrupts.c b/components/soc/esp32s3/interrupts.c index 1de9d9057b..3f074b00b9 100644 --- a/components/soc/esp32s3/interrupts.c +++ b/components/soc/esp32s3/interrupts.c @@ -1,87 +1,105 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/interrupts.h" const char *const esp_isr_names[ETS_MAX_INTR_SOURCE] = { [0] = "WIFI_MAC", [1] = "WIFI_NMI", - [2] = "WIFI_BB", - [3] = "BT_MAC", - [4] = "BT_BB", - [5] = "BT_BB_NMI", - [6] = "RWBT", - [7] = "RWBLE", - [8] = "RWBT_NMI", - [9] = "RWBLE_NMI", - [10] = "SLC0", - [11] = "SLC1", - [12] = "UHCI0", - [13] = "UHCI1", - [14] = "TG0_T0_LEVEL", - [15] = "TG0_T1_LEVEL", - [16] = "TG0_WDT_LEVEL", - [17] = "TG0_LACT_LEVEL", - [18] = "TG1_T0_LEVEL", - [19] = "TG1_T1_LEVEL", - [20] = "TG1_WDT_LEVEL", - [21] = "TG1_LACT_LEVEL", - [22] = "GPIO", - [23] = "GPIO_NMI", - [24] = "FROM_CPU0", - [25] = "FROM_CPU1", - [26] = "FROM_CPU2", - [27] = "FROM_CPU3", - [28] = "SPI0", - [29] = "SPI1", - [30] = "SPI2", - [31] = "SPI3", - [32] = "I2S0", - [33] = "I2S1", - [34] = "UART0", - [35] = "UART1", - [36] = "UART2", - [37] = "SDIO_HOST", - [38] = "ETH_MAC", - [39] = "PWM0", - [40] = "PWM1", - [41] = "PWM2", - [42] = "PWM3", - [43] = "LEDC", - [44] = "EFUSE", - [45] = "TWAI", - [46] = "RTC_CORE", - [47] = "RMT", - [48] = "PCNT", - [49] = "I2C_EXT0", - [50] = "I2C_EXT1", - [51] = "RSA", - [52] = "SPI1_DMA", - [53] = "SPI2_DMA", - [54] = "SPI3_DMA", - [55] = "WDT", - [56] = "TIMER1", - [57] = "TIMER2", - [58] = "TG0_T0_EDGE", - [59] = "TG0_T1_EDGE", - [60] = "TG0_WDT_EDGE", - [61] = "TG0_LACT_EDGE", - [62] = "TG1_T0_EDGE", - [63] = "TG1_T1_EDGE", - [64] = "TG1_WDT_EDGE", - [65] = "TG1_LACT_EDGE", - [66] = "MMU_IA", - [67] = "MPU_IA", - [68] = "CACHE_IA", + [2] = "WIFI_PWR", + [3] = "WIFI_BB", + [4] = "BT_MAC", + [5] = "BT_BB", + [6] = "BT_BB_NMI", + [7] = "RWBT", + [8] = "RWBLE", + [9] = "RWBT_NMI", + [10] = "RWBLE_NMI", + [11] = "I2C_MASTER", + [12] = "SLC0", + [13] = "SLC1", + [14] = "UHCI0", + [15] = "UHCI1", + [16] = "GPIO", + [17] = "GPIO_NMI", + [18] = "GPIO_INTR_2", + [19] = "GPIO_NMI_2", + [20] = "SPI1", + [21] = "SPI2", + [22] = "SPI3", + [24] = "LCD_CAM", + [25] = "I2S0", + [26] = "I2S1", + [27] = "UART0", + [28] = "UART1", + [29] = "UART2", + [30] = "SDIO_HOST", + [31] = "PWM0", + [32] = "PWM1", + [35] = "LEDC", + [36] = "EFUSE", + [37] = "TWAI", + [38] = "USB", + [39] = "RTC_CORE", + [40] = "RMT", + [41] = "PCNT", + [42] = "I2C_EXT0", + [43] = "I2C_EXT1", + [44] = "SPI2_DMA", + [45] = "SPI3_DMA", + [47] = "WDT", + [48] = "TIMER1", + [49] = "TIMER2", + [50] = "TG0_T0_LEVEL", + [51] = "TG0_T1_LEVEL", + [52] = "TG0_WDT_LEVEL", + [53] = "TG1_T0_LEVEL", + [54] = "TG1_T1_LEVEL", + [55] = "TG1_WDT_LEVEL", + [56] = "CACHE_IA", + [57] = "SYSTIMER_TARGET0", + [58] = "SYSTIMER_TARGET1", + [59] = "SYSTIMER_TARGET2", + [60] = "SPI_MEM_REJECT_CACHE", + [61] = "DCACHE_PRELOAD0", + [62] = "ICACHE_PRELOAD0", + [63] = "DCACHE_SYNC0", + [64] = "ICACHE_SYNC0", + [65] = "APB_ADC", + [66] = "DMA_IN_CH0", + [67] = "DMA_IN_CH1", + [68] = "DMA_IN_CH2", + [69] = "DMA_IN_CH3", + [70] = "DMA_IN_CH4", + [71] = "DMA_OUT_CH0", + [72] = "DMA_OUT_CH1", + [73] = "DMA_OUT_CH2", + [74] = "DMA_OUT_CH3", + [75] = "DMA_OUT_CH4", + [76] = "RSA", + [77] = "SHA", + [78] = "AES", + [79] = "FROM_CPU_INTR0", + [80] = "FROM_CPU_INTR1", + [81] = "FROM_CPU_INTR2", + [82] = "FROM_CPU_INTR3", + [83] = "ASSIST_DEBUG", + [84] = "DMA_APBPERI_PMS", + [85] = "CORE0_IRAM0_PMS", + [86] = "CORE0_DRAM0_PMS", + [87] = "CORE0_PIF_PMS", + [88] = "CORE0_PIF_PMS_SIZE", + [89] = "CORE1_IRAM0_PMS", + [90] = "CORE1_DRAM0_PMS", + [91] = "CORE1_PIF_PMS", + [92] = "CORE1_PIF_PMS_SIZE", + [93] = "BACKUP_PMS_VIOLATE", + [94] = "CACHE_CORE0_ACS", + [95] = "CACHE_CORE1_ACS", + [96] = "USB_SERIAL_JTAG", + [97] = "PERI_BACKUP", + [98] = "DMA_EXTMEM_REJECT", }; diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 5dbddc2771..2a4e8c7192 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1256,7 +1256,6 @@ components/soc/esp32s3/include/soc/usb_wrap_reg.h components/soc/esp32s3/include/soc/usb_wrap_struct.h components/soc/esp32s3/include/soc/usbh_struct.h components/soc/esp32s3/include/soc/wdev_reg.h -components/soc/esp32s3/interrupts.c components/soc/esp32s3/ledc_periph.c components/soc/esp32s3/rtc_io_periph.c components/soc/esp32s3/sdio_slave_periph.c From 8b756f071c903211af401913a76b12257838bd69 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 11 Aug 2022 18:08:00 +0800 Subject: [PATCH 063/665] docs: remove C2 datasheet from link check ignore --- docs/conf_common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf_common.py b/docs/conf_common.py index a752816949..2d6b7033ca 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -223,7 +223,6 @@ linkcheck_exclude_documents = ['index', # several false positives due to the wa linkcheck_ignore = ['https://webhome.phy.duke.edu/~rgb/General/dieharder.php', # Certificate error 'https://dl.espressif.com/dl/esp32s3_rom.elf', # Not published 'https://docs.espressif.com/projects/esptool/en/latest/esp32c2/espefuse/index.html', # Not published - 'https://www.espressif.com/sites/default/files/documentation/esp32-c2_datasheet_en.pdf', # Not published ] From f5f66b9f1ddea549f0610fff5f6272f4779581cc Mon Sep 17 00:00:00 2001 From: wangziyan Date: Thu, 11 Aug 2022 19:11:02 +0800 Subject: [PATCH 064/665] docs: update user-guide-devkitm-1.rst --- docs/_static/ESP32_DevKitM-1_pinlayout.png | Bin 0 -> 410187 bytes .../esp32/user-guide-devkitm-1.rst | 25 +++++++++++---- .../esp32/user-guide-devkitm-1.rst | 29 +++++++++++++----- 3 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 docs/_static/ESP32_DevKitM-1_pinlayout.png diff --git a/docs/_static/ESP32_DevKitM-1_pinlayout.png b/docs/_static/ESP32_DevKitM-1_pinlayout.png new file mode 100644 index 0000000000000000000000000000000000000000..359251737f67c43414a6d19563185214095782b5 GIT binary patch literal 410187 zcmeAS@N?(olHy`uVBq!ia0y~yU~^z#U`gO$V_;y|Xg_NQ0|NtRfk$L91A}@T2s55P z7}3YTz#v)T8c`CQpH@mmtT}V`<;yx1A_vCr;B4q#hf>H zD{Dfo{sxRelJ(Z3@vUvdfvBEV8# zFD>Eu=d0E1(_Qjm5B}^p%=N&&A&=!rsbJ;F>zDrgam z=sf%GAAW`>%Zm0fy>|I{yW{-M{}V!A-#hu?OGk$WD^CO5^vVkRfSM(*Ux+r;a365g zjC;mZ!F3_Pu{73~ZMnOPiziY}{oQ-)r0eAer*gSmTsFvcmA-oQ>X4#x_`+3MZ%WTb zU+z0`{=Vgt?1nmd2Zf^xLqg>`o>*M(jr`ePe)+qofMDP%2?j-IA+e}#;li9hKJ#DA zUYuoSBYl6{&m)|RP2SvNI%>|)as27+&@EgO(giZ>Hf;FzRd-(U6tP%_iLOjNzL`Ny z{SRNgX}T4j$DV&gP%u>#QE*&&ZaPi$JVSwfgIM5P!(GeXeZ02qY~y3Km5*(h78o3T z7sX)1Jn_DWOOd>5ZtiKjwT%wv(w4vUVr^n@TXJckhFtE+i}}5gk=sp=S_%jTnj-~h zZB+8jALki=sk?Ab%P+rb`}D!A@Hn=Hv#CepLmz}Qu$64B=BV4b{O145hvVyh9^S^A zFI)eI@#nt}N*w!`-^Z%{4oFz6d~W9A@b%T3yNeZ-7WpMGv~)nhuQg}Y{Uny^{xVv? z&YV#u5})JScs0W6UrxtAMokv=NrDfYHS+RKN^VLyb871D?=zhvFHRRJ5^tEOS#tG7 z$2`-l(!0Cfo$KuAusX)T0V{F8`YQP)XI>0uIM*Y)W6gr9zw4uCOM7+i*KDf3Z1bu< z#BlwFZSVGNGqqjRDDhp7A>LYUlzot1^-Cyq2u6GM3dZ_HT{@Zb) zee2e(|Gl2x$-KPmXZhP(r5P47a`)yMGS+NKJ3Gr<=*;n%7KM*K-hH!wZS3vs`S-UJ zK0dZA#E*}K>FBCiv)c-zqoShzZLa(KEBEe86#)*OVwrTG_?mgK*YE!ObXq_E%^6c+ zH6Mwm-+yy6JSj=f5sZwNp8rozO@Kq@<*s*)a=!1^#_s;MSLC_niTB^-*%A`WpYPnf zZQHl4@4j4||FgP^36`T=VlM`SnFO1N{Ry}e9q`%ngK{&U=)t|csjkMglaI&R6@~tF zW03fJY1enfPfw3+dh~kXE)LoER+c9OzrXyhEuTHC$QhsGl$2CeRsSzuWiK?* zlc7fG?rnv|tNNKOwl6OB^7ifzyK1@dGoQ!d8UD-`$5+3d66|;K?#5*I-0f@~#yK}O z%x!ddU>F*^A?@s}@X2%jE$NV%)>l|uT&&#a@ZkNbs>`!Xv*&qywGy1zDXf03K<0Tn zgWAq@uS>pH^F0t`h=2K_#dETntZ1jpGX@L(%!+xncK0_k*v)^l$3ekB;J{Rdbtg`q zwA>ZlT=yt}fj5pRqL1wI2)KZ8K$xEFcnPf z*b@^KRaGf={43)OEv5eHQ>NUB4hfl3lI|H87?|hjdGfK+r-oJY8g%Y5>uGB4)Dh}j z!(5=b>4%Mc{hyD?j8_SFPIhixT-?2TkESR+IycMo z_2PMRgh83_YmnbNC5FR{4lMREd-GyT% zF?JEzpP?aJzv;40_?B}EH!OR%@NBBEUC0i8=8W(2mh}cp-LJ~cV>GbmE%wYh-Y2_X zV4{9{@|v)vOPBsyz0(fBvjyIP>PkoKfrBCY ztv#d6l%)@+NhSM)>utH#$6UbL@REVg^Xo1Tm8M_6e%W5T#mlgY!G`;RYqHO#sT^^| zJJ=j5yOwJ&GXGwFTy8ewmF^R(`yQ{+(bxC)o_Bh7-mc6O^K7gA!mn-?Jo~d!fmKNM2;PkjL=8`^5gxuchbU-Fsd zmn@EjFz_>FY!7mE5o2pUIKLuRywfGm`OEVRdF%3bHjD>Wm7HC#y=Lov*DufScpEpI zUuL~v=AriwUiTW7FDpJHXRv?e%9ppy=Kp7(`^VM`RJQ!R|IAakZ-W25<2Hs>U)$98 zp6gz^{L>ow3l@csJieOF*Lmc_{KdpYd}di^N8E~?Rd;?jK3dh1@928r0c@6NxU zCR%%ry;91-@zLt7iwcV_I3MRcQjx2fx=G@p7Dr1<%l$6=Dbif+ zhq+ysTxYjWI)8e5Rh8UtWj2RJQRN&dhZ~+Of1@q-BckiYwH515u?I+1$M7d?-};S{ z;d_s?`Mds=@Aw2KGOoHc^L=Q|!o~V4w3H@ttl9ciX;Vz-bgATRWsCe74*dD~xxYB} zdpm<3i@}b~*S8m1EV@7WeY?}b+5NWPZm`DQ)ZLtLuxaB&k0)6S@$Sc0TTimo{I+8I zwYa1n&+K!jcrx!MUQS)hxbjB!V|xZU@rlQ|xVYxcw=7;2@Fs*w9b;tBiQQ$we_*TU zu{U9kyW^DRwsLiLbabqkA5^;D`AhAJF73~|F1a7PwN;*>LgSmm<0p#>17GS9H+%IotUY737%F5csaX^2w?S_t+-WN*g`jPeXii?W$7!9m$KlYntlG)M`Gwp5R zZjIOHxm^tzE_JVs*mx*BK0aSyZ{swR{qgF&35xY`|ieJ|g|I}=|Td4y`ee*IcqKW@*D?76->g*sjI9JkyE+SSAS;d_9_ zm;DD53|`m!RNq+0uy6gU`}r9eH)Ob4^W-cF9{e|a8h9TZAq?{x%Rf9`ck0xs)w_3S z>Zz`(l52Q>Og4^DL6&hs%DO!tk4fjxv912Lt)ygI>FaCxOd3A!@q4c}v2ypZ8mwLZ z+!2)e_eMKEc+q_1zJBE02MHOhBoepdYc_JRHJt5-Igb&r%K zgd`p7`8oUkn)wTriWx;pi>eM^E&O*SBC00O@od|3#)OiyyLKHr=_-C;>T<>>syp62 zIh*PlFTq>!F6HIA8(e=U3!7*+Ja>6=HjiiHxz`Ii=3I63d0xt(-{lb=yzP4F$6eNp zf6R{-|Lxf4KJ&#@iPLVAKG{l#)}AYzypNi7|cUk{e-I_c9Ze2g)gt${tv-uyCGn_krsK8dX(>@?HpXtL< z*KV=e)N^wzSN;<`HD&X+H#a}u=n~cTd(B!J{AX3w?yY6p4WHeUo9FE>xpvj|H+Ob^ zuF8J9r*6W%^!JL61pM~jlUH?IXFjt+_~sol7rRef)WiDe{(-QtK|uyv7!tj zYgVn!($U^0ap14V2mAF-rzS3B@TjZ%r#R6=rI3vx~yM6cU9CbQ1jBr zFfU!TGVb5@ZQH(m%Q=@`e|R>}-V0r#+BF@^x?gJi_^8$}pJ~UD!Z|1V9*ZzqTq>ON zk-<-7VmE_?%m0Ej`=JkNr?%n$llxy5AWF8i5s+WkYFZ;sO!(~pJfzol6p@MXVsHosSqye;Tj zpm=09Khp>G1I4$02)DMjihplnNH+U(AnNv9ky-`@K}&Im_}{V~PS84v0RRLEIU41RDTkyG?<%i&s;P=U&AD&9)o!rH|mYr*rxsJOD z>vr?2p1h5VR?d}BPMzqX^6>YhJ9qA+&Xh1dRvaVv)7PKHepk}ZPfrD}m)6f;u+v)e z!sH^E=j&W@?dGq)dqdXtysob9%$R^#8F#9UME`ggy^F8*{-CUO@%0hb0(Ud@P4%v-Qi?0`=4nfOU1n>T%J7S#^>5m)_o>&bPm;}{+&rKqXj z|9ET$zp!akHanArmy2J})%6S(ss~pdWvJtRz&%&yKI?~cm+gjjw;Vry_%5hh_f4k3 z_1Z0c<{i=pI(`U;e%+<&J?&1_*Q??0-#v+G$T;xaRdAwQxYl#x ziSSvoX7z2mR(DV0bKEX9@0Z1wea(3pKbS0H+*fg)amK`~Sn=b9&vvc5z0S>}uCDIX z>e5X<8{eOQ&ms7euOaWMW#H8x=AIuPf2s1GrX#tb_V>5RE-5Xm`WOlX7JZFewj#^_ zy^D&HlF}l(q|Zw@-5F-EFbLeazAeq|@DfgS&M%xAZKa!TKjf-mF4%uDBJ4|>kJi52 z?+5zdTkLst)|R2+)~#t551hZJFa5uTd#}7hWY=Fl!K1R+;}a)bMxJOSCTjp61gxlhfAdej_vcyE_||zw-FW z+MJKrUst=odY<)_phX~l+^Ui`k?(ymu>sXVj7-kz=BBwWh#Dt?~aQTRBmwCrlh zn?KVT_H4UHJdb#Cua@X3PlK6by@7(h1U97AANmkpiJ`l^!-PbWke)mJ^_&vL>7Ba+bxHj*I zg2#Iy@B7~+8XDX`pK@$wn_K>N>-Be@TlaT$bxpr)w)0Je(8alN)hl21uia{Ier(B~ z((R(ZWlb$_TI{|1?d|P;h7ZU8&HdT~>OUEsw-sG$9(^_TV%3+ummc?(%RJXqi4&YB zbu?XMhi?7z2d|~Qj_YgKJepy>v8IxR!7X(C{g%wjemQrxE|uxxS~4v%HRZ@x+l{54 zZfttE+ANQqq2=%Ww*9HHHd%i-4IaKO`)yF3d%b{exrquh&}1XS#Rp+&P(Xjc0*Z<)H~*)mO&9fyjc5S zzgh80_6-+S`-ZBQE?Rw^q2{2(=bz`;>~C?gHQT#CVmfA|$TFYe$Xs{G}>9-;T*SFT)VJ`jDm??kywy5*MH2m5P#1uy>3u6ccR|Nii*J0Gk2 z!$MoR!}3>%T+L_jFm1hj@oe6|xocl;<+`@+uY+t1*ZY!(&b9CQChxMYR8s0nVp#Is z^8Di)#~JG8oO28bZ9e#5y+CZ@{E1A_C(q0@e!kys{`=P-?(vo9q^72Nx?h)0&Rf4? zMTMsC<(>KmKN_wqOX%5oUgC3zmD*#Ad#-mF-kASqIU2XP-l1f9(4tt2R0gA<1Kn2Y zVjK2wAJ{2(_AA4=Ii}gy+;7ee?avHf;1{~So3+F0XjF8|x0Ubfo`3)S|L)b3pkAKf z*Ho?Q`{MTZXZ_QvzrH};!PeMkiStTjzpu|OJ=!U7vsym4#P{yszDL~*L1+C3 zhOV72vhLOgb=JJkHkU)!yQaFhTw(QTyxOf3wIzdP&+B5F)SjF3It`OwHt(C+xi2^{ zF7Ds1t>5ez!jEk4JdxRP&F18eQ>RXqYinzlGfN0upK>uNtW&1=jN$56uV34{{a(A9 z)z)zSyp*1w5ia}UA|rQ7UX%^`xNe4h{l8jKQBnOR#WC4$85#J>WYU+s-lgoi#544N zcZTdt-(wQyb02>#ojP@@J!`>6_sjbk<|Ovqob*)lt3>jd`D?ajGi>2~B-fb1yR6#! z=H1d8=F?Zb{`~V6Ys9anIdkUZ>gwvA?9%pYDgR{x9^1>AXOJlHsX&6kA^AJEi_8{I zos^DvR&HtUZa+SM&0QI1PVHLDV6ZCf@aEp7uFIXDSTZHYlnvo~isM_*p<-ye}J&Ct`EEp=7+^UF-BwOOUUsi{vFGU#<=i(N0x-+s;SMP9(6 zsNaz;`H$xFK9FE2h}~Ywm+OBwY3*8}iSB*2-)=lzxop|yYtuSCc2BjjoBzJC^7FH$ zsjmCCemkus6kk)5Z6L8nS@v%=XR8z20e+iV_ZSPR%3p1X$UfeE;$~s{cJ}6j@hTSe zJ36-ftu5MfJo9*q)56G=J^D(kwY0SU&3aUFJ8pYK==9^V^K#ej)xUcE<)Kz?e%6A- zI}hDYpFSNQyQARYax3fQ^UTWM-C<+6|MJD00F97^s~{t`6PFjnrL5tS>&)wd9|GmA5 z3}1EaeBrAaC)w7=EQr-wbVq*0s;F#zb_3S8+($(je<(E^-+k#jw1=q9aL(uBq-F-6 z@T)Jse*G$X?bgm?Gu(rB3ne9C>XTAiTU%#8tleB6u3Ev;5; zZ--&p?hcixo%O!yzl8-iUW)mM&+aH4OBV4*S>UUf{=y5{gvsA*#23-g(NtaQI@cD(SMj=p}qt?=V-tQ%wH-e&z=@#;>< zy6xBa*gw48arnGc@}@~*6F_y@if|#G{J$GCA7%H{J&~FA#;EiwcdO}ZeXSL7^<|D< z+x%DGw&7ATX4uKz)NgIg%gXmL^U2LNhl}?%a<4MiY4=)GHLozfP3MMHWsb?yZ=aqD zuGkVSuzcskCGp|$YD(hgW*8p6e);o)GeQ%)m-xP&lM{G#HoJ7u)^9q=XN*19{gr!^#n8!7UJsfux%ki5aK~5K6A#&C1h`{%{7ac_ zIZMg%cgj4CHMO+VXPixZ^x)=pe<}N)8^o{WGdDCH zRDNdq?v@d2*GkWIvR5DR?cj4@We~ZtrheDPH9zthzFqq#u;b<`Ppw7=g{2|~Ic>tC zqkl)SzrD>M^QN%o)-vDOVbiBgvs<}p_heorrLzqGCQqLHdHPiC@OS3j&e2g(m!^p> zTe9TIF9(GOTNx}hL)S)bPCFZKWsxe)uztZ^OI1}>ZEtVy`JPWJ*(PW!yt6q>e0ytajK)kB zW(82XUA=Xi+=0SEU*_4fXXi5(MDqJ+gJN)|#?{bcuk(+DMcTK0d%5l2xwB{AmU%5& zCp7W=(W`SZY~$`SUw#?dW0;uz)|TN>_$BU!Vum|2lfu0p$o>gn@b5UWc-1eVhVMOw z^3mDsziak6D@{Dn$*_;@0Z)JS{_M522PHo5c4_95xBIhjZS?kkJa5Z?)NtSBXgJc8 zHoxCqPbu^MUqPY@0oSekS@Tl8j9T!`3XzW~WP^}-h|G|j^5&t@D zSFGYjSfw`ghs!?uKbv(M3pewxTASaIFTFSKt{=mG7lnfF;K`+D%pQh66x^Sh zy{;AbDHIYL654uq)1z*g2cjyPUF$AnOEJ0s*AeSs44Lj^r&+hI>&}&D7jl_EQ6Crb zRhL1Q)gjLH_wSgsULjjmjutX7oIQK?A!uCu{`>jcv#zdMb2V2~aJ}m)h6`(>mYjTZ zb90S2M})6lsS7F14J<>ytp=0@?_rAwFg zw;X;bzyHst)A^+a?^efsKcD2b>Q#S`Y`DvURU9l#`m0}U^<=Vp`N-Y8?w`!@pMnf* z4wDiXmVE!oyyw3`OxD`cPoF;3nN)v!<8tw=-O19}^HT+tKCSoZ&0PDn`$Rb7orZ6M zuXOt!&oNIwH%IRD)|IQKSICyjJl~mfe(Cfoskh7u3?R%XEa@=->IM-*XI~)vn*Te%Gs2%OV(_A20MxkIFtSk$lh7 z>_3YhtHA!+AGM*iOS=D7Zo0-Mz$^9axT$IP3D$!NAAXkfU5|YF^yz=6*>{7l-HK=U zk#{GvUotr@CDZFP!U=NR&^6vsXPpZQBWlFWr-_xnE#qCtHz7ey zJ#B68O!n?oV#>ejE^WT~{Bz~K@)w-zUfT)nK0i%w(W>~5KWo&dPn%Y^aM`kB#f~2y z9Blr-DfxIGKcmcqV;lR$C#Ewu9w^+yC~rJ%^jms_3Rgddyn?A*8MCqP4)t|mW3_D|AO zQW9rvKDhj{X;{7BZQC#Z8CY)1mB*IrHEe!-K7M0TtAFU@=44Pq*k2;q$RZfjoLyw+ za94KY_Q0KAU0ruRe)VeB(#U_yDtB>TynFwo2v@+0CgU2Z$Qu!1d)z|BMX&Aq#1Rt9 zV6kG`K1QW<(`j<)3@aVHj$YdO=6J6Kxqp_+$#B51-Q&=bn(^TJyT}|L=2C zG|l@XcNUqiT6HKYs)n6qD#L|G-1RdKUBCQVw(yAHY4hA$A$$ojvv%8EDZQ({+-GLc zrJGYC`X1j24GNkR6viNU^7P4*nvPA^r+1W?#Rlzsz3b`RJ;zS}x^?T;nk9YyM<=?= z{d};@clIj=k)=CdH-~)v=%7$glbf5nTQ(*%G_;zj@j&m3V|raIG7Q_NOq;eZHaPfm z!mQuRbdm+X9O)8V%RTYkaZOoXtNeR=$|pamv==yFy6*M5RqNN^Pg?tT^VV-+*>8`2 zetv%bgg&QJH&fQyN*;)m^L@|Sd~oaCH+6Gf@7lWV^);pyj33-X_sU)jasGI)|38xf z1Cy;}N{8sheXMf!vz3aXzolQXK0C*9Gi$?jzJ-g|Y?Wmzi;jvqb+In>fISQ+PuG5vUBUU%loIV-MXCNN6DQ;@rw@LQ93a@ zJ_Jwnc;cV2|M5}Qf=UC48jaZGug=~V?VetX{QUfU{`RZ8_wD<~#NfWoR!zw~i@mxE zG`QOFO`PlIy_ZTWBpP8rA zGjqb$Z|)4sDoxggUcH}QZMSz$ID?A5y87|#bbf{h$E5RZ1THc}M6Y{nVZ46tw_73E zPH!F`VCLT={r2_Mo-&!`TNb|-y7J6|>EisCex3n;{zN99S$6K*)2D6Hc@naG?ekd; z)ao)A!X=a6`5w3UJJm3a+a_r9(Xz%P-TW(ZADy=Y*R4~S)8BIy6wclIat-S_CWg6D z7sQrF$UZ;X=6RIcF!$EIYK_*brR5zj${ST&-4=P7?f?1eUdc7k>XFq4PNj&id@y^h zynIOX{f2^bGcI10Ubbl4wxyfnUGhVNgM*)2oIA;I&!_yp(x`X?{g-(yBs_foBa3s-Cp12nJYde$*pRNUYSk*OIkRV1%Qf6jOSscKd-m+} z=Naph_F;&eB0JGUkr{JNAKrfq|E=dd8Gq4fSP^>$iWm>s_a8toZ7)52vobtUY7mgstBg z7~(ta=dFA6{Ms$%sHmuUj0V>hS9Tgc`&QC(`Tozp|K>Av)H4^)+gkSC>_dP?iPWO~ zlW*<1DRKGcp)ydt=JGe_#=(0%ymp0sS$`|OyeiFSnsutLyYGjq;r7Dk?EU#OtIpi} zK6P>U^}C!e{)AWsI6jTO+;?O4s+*0^tN&EY&$fB^<8ZXSX2fo@*IzwCzcL*!Jon<1 zvby^7pCQLqtXuc*_yk4gV~jr*u3G2vohdAr*YZIFGgIcP)y8EVC$5`Lv(oLp_WSR@ z;_Tf53c*+NOTJcq`&pxTH#y_CP4|iWjBnn(u@RPFP)Jn#3Tor7Tf6pe+hdF69Vgyj ztXr5>UQ)F%OFbie{^T2vAM%`Ad;i5$Yi5p)r*HSGh;Z4iT(x~c?ZS8GBsyO3zh23Z zxAmIc3yX7$y1Ke}U(U#0l~l?V)od)TD7B_joU!2O)$sVa>*6Pze8OPi80yc_e)#j+ zt@~LMdJOZ^Giw+QfT|IO4;*{;t8;5>X@#X1+tnU99>*?w+*5*~@wmLM;LC4ZjDkOR zuZj~aw|FR@rtr%+Z|z^xTkC(=*I!)Zs{HKC%+L2l+V^w3ZMJ&9@|Cb=-24e!%M=>a z8EVW9Y8tQE>b)y)N9}&Y{Cj);AF10PbL-g#<^;2bZbpaD$MM{~40UsRe}eLf;8)i6 zHF5v*k~1%sF*u7BmE7Le^lH~_>C;{P3fl=bTdAPRf#Hr=b;747C!NdR-g@d?7VGEd$Jj8x!(+Eq7sG>HdE3Od?0dQEUC-9+ z>t);ixtITCaVWUDDm0c$Zsn`)t5>i7_xn8OR%iXZ<$iOmQhtAX>-paC_uqd`#|!gV z3zmiNUZoa$B{nwpZ#Y9eYs1Fmj13+&>U))yHYdyf z4lU(qSlIFGx;|TgM0p+GB6Icg+^tU2*_sa?zhu(S7n$v@7}Zcc#r^Z;$H#iTGnaZs zFAT`owMy^(wgcQ}K>zpqc9@-bXbyuYZb zQdd{^ena`fGX3e*GP|{TceB+n$gvn~Z7x2>P?7cV(NXoYvrJcC7m0tpw#M$h??jI$ zNpF7N+FNk2iPbHXpW(yL9p2MYv~=fh{Z_~j|0>N~UozRMsut8a6jGjOAFYOj*r(CW&hwmllb- z)G>y(u3D7yr?#POQcZ07Vs>T)+tjP8LRVhvzF}7S>dN|eH#aXAl>2HSbNuA@9cp*C zF-5Fj#m^^e^<~`+-+${Wcn)N9-fCmE5bWeWChn>4+cnL%=xG`;2+T*XTl1CUklGaNnUkY>B zVV$&F@f~BqdC&-1uZz<1)vq!c)RbmTTc&+}vHXG3=NvVNWWw%uiq`EE5-OAlHquj z$#upZ8Na@~TqzQBTb}om)r-$RZQ@T~yXC*QHXy0LV~z+{>7V@>Myslp9Dn%md@g}33%eEWK)Tg!dA6l`}ourq#$i4|U6aekgHe{}ZwzPB-pSwM}J zt=H_>7Ucd5s8>z)fg3sXLm#k$?KD_`v}&Azs0R$FFi>YMv(BR4NQ%(_}t zRW-fygltB9`)8l|=fB_Cl6iSqnKHxW)oY`+W>qT)RB#_Kv^A(%F19xK{y_#0d1FxN z#PB2Z4P$ohzQ-2Fcdm=>d9kjobK~&~BD?2oOFuvFe%FcVn?g$NcrWgVk>gZ4iae*_Oy^grumIA?II;@VCH zh65bynE9O2ct=<1{+omMm1~do-Y{oiVwkSD>+!O+^W*FPeqFh45_k#f zt$vGowk=Fu2YGK8uN0^-{MR#a^(%9x9WU;B9`7r7z|CR6s3pwk(_H?I)t@P5>&~1* zj~B1L{#TO0jo<3Uw_|go>o^`p6hWoD@SEhRR+niTA6fN~vq~XZEX0=*Zi&t%Yn-o`>W&`{_#Hea)VFI>&$EUbGgSP z&R^fXO6~5%iD{Z^je@Qoe-Jxo_2Hx!*KXA?#P@?65rx;DK7Cr7_~XMvapo0X1?R47 zYisA9IB?^ym(Gf>({~)Myix9W$ZyF!re4qxV#fYYAGh6I&GJKl;Yi`WYZrI6uc`aG zzjgKNe-RsYy<67wiZ@<+#Y*jf7dM&qOnFqWsGz=2(s&W~v{kDPY3;Cl8QN70YT5n& z==$+_%Jdy~{VVv^IyyEI2X?-w(7s-(bm?N*nUajovk&zcE;Gtx^{jlsyLwKqA^)M@@(Z|=TNhk@ zHZ3|&a!d91clHOWzaFpdV6)#8)v|Ye=iNW{hZbi#vrkX8W|%Z7;?|1zN|V~R)1vb} z`g|5Gmb+E&``_-{jpWO7x8)}L`JJ1&IsN>-va6xtrca+gpWlDv{_~p)174gm>A(NJ z<3z8g-%jH|g?@0r)PJAZD?Pj6+T1@?iM4@&uQb<%Y~8Ty-OP)orRpnRUG2EH+~e7c zW833?Kf8Bcsq#CMN11%G%i(ov=d+l|^v1JX?PHklo2a)%-tyB4WqFnl``jnrfBw02 zN5-TMyMrPTzZ+*7r*C7ZsJXc*)!*F2BqQo3^Mx7cK# zW&76G#u-S|T#Jh4R(Npn&YSPQ>nF8l#!Q($efs6Od@{#5muDM+Tc>jsCsd2f;7s`O zp|MD=;oMTQu&YiFmh+|_&FB8Wuqbnbb&+mEJhMY$?%Q?8HZ5vr*tumfw@m4BrV2)e zGX6U|jq0C2NGqA5>Cnn3a0}eAYII0YUBs>M*!SeOnvP#uY!2U)jnmKNL~hHuDay;s zoBBaxm#&ifqSuTQp8u}e%O$wdcf#xU5=$Pc{RCA)yzPh2Ge|tY_(!V2`101z%G*{i zxG%OO>}v6zzU~vko$CZA=E|L4FO|F}D=KBGVcO)a-z*vC=U3Z=@$8LdNO^dubv{!; z)SZXZ=FFM1`;x`lG=}suv(4Y%m-}3+F2+*Hc!06+tR2Jm^YiWhU+L=Vx|%u1zkajC z0j~bX-;ZY5riSG6dw>_2mZpUG-n}pF-EF22#a${kiN!(cbf2|f$T8;+8}-fq{BhLZ zw~d*BYqhz}9gCGKWVE`iwV~9Yla}R+*>B~p`oJU%LG+HiEbt+(RG}VjmuqC6|wF4<=Gt_ z*S9$>5N5q3wDDRWcl%-egTLp`y>;i#oyjx5X_=m$rhA(4gKz(`wX1$Pu}{zYYB4Q; zt?Zn6GfQWOzwHwi*NM2G7a_^luJ8Q&{{8;*bFH^4_I|#Z+*7F=xY%&nxxzW01@5{E z=P!7@%ReI9e)6%OU(ETLD{SA*c>Vcj-mA`&;3m&k%~e{f)|zstn@tg&`?T~HyQ^!n z`E)URCW}(7Pu8tAa(U-|mM2Gkyw_U5dUgGsCcaIaZ=UY@fB9FUx86Ul1&{B3Z+cW~ zpZop)|9y8?pGo`B{K&E|c=CeG5AO1{M`E2_G!qz7>{XPua?avA^U9@4Qm|0ig!iT2 z{?E_P+cRFA`swW@R>mKv8yK1W<{GD;W4|kzTz~1tjUTxTi*0AUGdrdd^K-$f|GpQl zXfxHfwzm2+WQZT=a8dgG!u{uCS=pZ71u9!QG_t-3J`Ph53lTVRmV@Qi(v4j_Q>sI5t(|8t za3KG_zINZc3jw8}rGcA1x};>iKHk1}L!ER(-{o-aV|xtC-rT!#HqYdf4u9RBj>DLF+De;s{3B= zI)89C!*}Jw?fmx3%|#mDYp>bLzH-&qjI58p|87^^`G=R`ZBas}M~&7>IlP`d$8h%WQwR)x!*ic+Y~Z_gl|o{Y|-@ zXT#`O64sz za^q!c$Z(?WMCn}@?M>fbi}ztV=zvA^0r$nlxeH#V z2;O{tZ{6!%ob#W1s077@giM*eVy`&|3)6H43k%23?lYyzKRr2_{9s}(GlNUY{y2ks z@*6m+^o6)u^%yTm@UZ=#ak9{5iOIpem%h%F*}gsas=i9btB}MWH+p}~X83a>TY_Qg z)TvWHSAS|NjThcsS!dp0Y&+{dyMg)9b@P}$H19~BKi|IoUrSe4SLxjuNl_BX_cmSo zCwSmyZvXMFh4x!O^M)Dmf7WQ4n{SU@_(iTjcG3Tyx~q%dp8opvt2blK`Ng`I_xuxl zCu;2g&NwT6A1PcHRO-)Y;PYo6y8y?Wo?ExXT0aN2b8i>@y=0NtiQBVM7M6SGPL2OZ*Td6*zM8QJ}yrb1ZPfIakuntecAH=_xwV$8EOtM&aBAHe7TV! zF4OkI$K&$mJkn-4;x=NByH2qF{Q2`e8&l(wgS%Z^o?M+ZYgSolBy;0|{Lrn@rX{W^ zEDbHCzAjI${z%?<;D+m6NpXk14i*NUPgxcYS0OI9_`9s8UgxKBt$i za|{E^f#>3SF%=mWGIsKB^Y7W;kV)@QAcC)ED|P zq&z;>>)Yt?z&~Su#ipx{9v_S+E^_(qyR6GYEql$s&D*wJ(|&trqEb;6+ws=N7XE3Q z>QC7$JMgMjhGFxz{QLV9MY!f_zn#Wja{k)d=;;g+uP>I&H&k1^^UI}^QNMo&Xqec_ z-k-nJd-^lQSyd;pcRznDD|#*OHE0hC%ZKm^cKdA>eZ^G<5_|T)Hom(*BKz;PTc>Bw zo_$@>@dNXLNeKo&euw;Cvtq>$>jtU*Wyadt+Ttat^FB_~jh>dgcI}pH^R6D%o5%7Y z?~Y--h0H!4xtHr@j-Rah_}L{%^X@tKN3p@?Elvy9rx$t!T>bH0l|g1>!9%C>YcGR} z6PGLBMXu%i;8h6=4tz4J?b4#v$JfN{jAoh6m{Fb_*EqG~iSEtk3oJa#HC}riQ8ZCe(|n%Whs?{^Ey&W9iz-vygD>*p7SzZX|p$}47!}NZeL|A zlzGnfW%Dl4RaX1k+v+y%+VyL_t%=!EPG*I@*C(#}m64kIbXI^yN#Yx|+Ub$m>`~e8 z84H%We}1-S&z{-4F4yy0_=Qdn4-4Cuves66TG^`0YqmCT&%67}nnAtF#Qb;7zA67E zL}hnJMMZ@%a#Wb?fA;yOT6jo^%4u~khBaGR7Y4krW{6`g5Epv#!)439Q(t2xlFFJM z7q8vQy>@HtElG7HA+FYaS1w!#;62dM@%-A!lq5#;^+_+TGj!bl^gGKy;!kw=v6CXn zXWBd7B~%_?92xR8FZ=Dv$T>l4uiG4YSn$VB0n~|CdUg2FKE?msooU+yCPtf07mKw3 zZ4|j$>c_A_=71W5Dbvi$CNCae=E}}4-?}$$0cWtz)-H>4_oNoCOYpelx%1(Zt;~ z7jA9MuD{LfoL?&Qe3G2R^h-UO8-%2j*8VMF`}Nl#tj99+`07{hx8>da6`%dKh@qdk z;-182^{L&-FPrsP4A?m@?dv$vpMHMc-nGKTuYCO&KA1FYU%Pexr=K+2}Dp*n0K7er09l|I6+B_e&N&?lqTtu`4gn+xxTu zLwo0miL0tq8ZsHYLQHR-o5#+@&8y`eVRa?9F`nK=cP75#GZ#wuuUMO}qXd-`i*;^^o z{Cj)!p1Z4pB5TnbiOoe%-{m$Q5T8AF*>lk!Yr6iVeO|K2v2|-{`Jvrm598iX6_tO* z@OU!M#^f{iukYRd-T0!v;>qai9Y5^ftf=))h)LYB<%OrNbbWT>*I#SyJox)%xxH=n zDOB@<(#Hut4W?)dZSFu(ntP3HU5&#{EA6`a^9=iBZx%j9Lp)z#tqZ+?3)%QXAh z)G1Rq7IC}(e)DeZ{WH`(Z=GB7K2#tKv~xqbG=T5YZ-6DbjCf3pamT63^Ia}i&iN!%Jja-`Y3$y`+qv!nEqLY<@l;on~r(99_9|aUOMCJA@-RoFZA8Nu9hl`A`P~!YVY=#Smme7kb;8NKYc;*2(pH_lIN|G4pZ|6}P*TRtR6TJbfkdGRD~(;DMrHu7Ap zdVyE(FRY!A!PBr@Oh2yX(wfN4cBh`${HgnYsldWU_-*+`j--R{^!~{$Jtw(zRqRPi z8=cnI+aCSjT>kuH;MMQ{j^DpO)8|{Qx&%k}re>WcrY6lD*P_0Pt-N<@RcQ3rUz@vg zMW+hf(#op7z3O||#cpREF zq2g1Oom}OFnZ@V6|F)d$>2dCN&HngK1{MYe2Cul?TYpUEK7O9#^R4S^O`NaUR3*IH zk=c7zG5&ni_H~atdS0(9j!xcRb4OITr*iw(%ZoA>PrAcpS;mmGrT#~s?7eelQ+;I1 z*Lwfjnk#9TpStydPm6r++SuJ@@t3|%GO7FXqvgYg50|+dYwY5~#k<|jO-<*1^KEW) zSWtO+neXxWL2o*g#n)HoK5?$A`}g2o&iSa{PQk&K=Ud$tla;;uwDs4YKYzAP`WHJ% z&2Nsx`;QfV+ANt_S+Bm>>SosD*UUY9=ulluc=&bQ%e!*#?D%+L;)540Po6%V`=R$_ zWo6~-FOqVdpCjEFE^Ytg7t|H?kGbpZ!MZZ(z8@Bh?h_vtoX=~XIUPh7eC^XE_7s>9Ls6X(yrzvl8EskPah4E>h6w^zPe zyZ-a4(A82`jGWmnsERqhcP=U_+V^6#obHlUz+GIl1trhnC2J~a;1X3 zMSkt;@;9%SeLJOkS2vUIq5FDnk0{NT?0MU(Q~dnSeR;=cANBOf6O(68p4@p_v{NtS zbd~7x)lQd$^`^hR0}87;E8erS&Cjo&=K8>T^TUPha=#vw+_IlsR8;gY_|o}ZH~v_9 z?l(O4CBtB2!NWt-dkwF9ta^E}j)8%J;R`SGr_cP$*Wdf0D*4;glh@7a_O2LtnHgs9 zTA3%SE!}dr{6ZIR=u7$BKf4Ue*7f}K&<(!5#U*;yC z@qYR8W&N(d-){H+^Z&CXBHLSKt>v$u9UUD1Uv8=1R8&+{=2dk;;`4<^N4wASvM^2e z+U26VKJW~u+2g5G(tCc|XTQxaE-Lb?=(u~a$ME;st+H{`<+eQkv3pKn_SL$B@79@k zuL}0Iy1!!D_vPW2;*!tsC7(I>;>C-(=~cfrw#!vzEL{?5|K}mUIvZ2t`W30U{S(y- zR`>@sE~)pb%Kh@;?{gyU>V(`}q<$j+0tgK(#mPo6}W_uKETw;1`#`pe>=hrRH zw%#<&qu= zaBAsdr&;#(39o*{|8QdRpSv|HxFGA{mVUFp-j{yaSKwizLx};zA>GLN~Wbz%AzXb2xx$~pm^z1oX%_4QV zTUA%3K76CKl}A#yr?)rue3aq**qu9fHuvdN%uDI{=&{P+*c4W###&2D%UUxJP+~6N z>M5K$$NXKG^6w3HbGNO!=5_w$i|x#Iw`SarjeR@c&dl&g`m^Yl(r&XpycGMrE##=m7 z2g2Id^R{op0}+ZY%u`d&$y&*?0AC-Ij57mMQ=D zGFgzM-EVLq{b6QmkLR?K^!)3M?~;3Nsz7=@2QrhnbU>;=7`5D*!2~k9Pee#)(T*KE zE@vHnTXy>K#}zAAdNw*dm~#8$@4u_ot+RXic+sLoeml>fld-FbxOQu@m71oeXWsVT zTYl%|<%NZYUd`Oj3^H523tY8;jk|K?$~`^jNmp*%sJO(~ar^DH1&+jSdf%T-$GO?8MVwU+NZ4 zw%uoa?d*%}HCsPb?N#4XUr|xP9|m^EaW_zP*HE``*RH6gOP8wesZUB;bm`KirhacP zuaMy2;zP&#Wh{e^&6vFEV+5bP-I_;_9!<7NJJ7&*ch`hn_upR!ojp_WKX9>IY4m-N za|$+rgSX*)gM-3?XV0EZwga8K$nZ=1+Mupu75B!1T>qftn8ePz?Gn z3Ll0q8#Zh(m|J|#a&K%~8^63>_FGTc$3=!2G7Jn12hxSXv2wv*APuDDh5rw3Xv2wt z0kyzib^z42sB$PQEZn~B`RAX0zh=C8m38&{_3~)mMu!ErZ-Jy6=7Hmc;Y-7;S+nlx zIhK}|?u`XWFnp1M7yz<`Zsq3!_a8O;9y~vL_UzsWP6h^shJTPIT%YK}m6vZYW|xHh znHOwjr?$q;S!lcFq2e90wO`A7d3%d;usr$vGbAwZ;_as(2fs*nssgva7A*IX-4e6$ zVd$hKU8`1V>DqowR(6_gQv6~!SD|TkL{a0n8l#=QzkvjxS}JAQOHm zx`Enk2PWFQb1?WbVab&ntCHW`4Xmn}>J+1U+03=#)f9=?`)j{`6>pITsjuP&$BWF$ zcLkeY?b&$n_|d6}>ZLVL70W*qXUDFxxstmS-0VBY01nm$<;d)>&-vS49oi_WWht@J zcelSDgQiYl=Gl3hO?B4Byyj+KvFqBmfTbX_8|FEH6UK3^l?AW)-!Gf{>0|!-&a1b( zZ2y5y6J=0HAO{54_EExE0OO%epy6LZr{e8J9qBfo^2UgxBq@{bhNdBvGM1vM~)ns z|L0x#{@WLCn}WRYR}kb|2m24-_y4zjv-9~pYkhtF_wrMxPMs(zDQUO;_S?R`zJEUd zjb==ll5*FM#=@$vG8W@Kb6Sh(<^@$Y+E zuC3a$=Z-{j4LhIAhnR|ot@~rQ<=nhpwOfyYfnmXZaMSq(`?}rlb}7E!_xs&8Md!9F zZf&qqY>WxZs*0i;;)qdZ7f9n1B(^YoH=()PM zd?^aOt8Qbnr|9Xash!5@=W2e*|Nn7(?%r5_P{(lo1~v``1_%3qprB8;TUuD+U0hm{ z5A~lra^%RDGENImK|#Sjxs8`^+?Zif`|C@ye9ec0=KDTPU4P_TnJohYgG0R&D6%f_ zzqz-!`qYDi&9Sz&zszlHVh*?QPCk8f{Y;0|%a$!u*?xQNu3fvk+zin-%26 z=duBpnu+Io6^ldfF3vSiUBCEK4*CR^3~DCqynT_YBeEy}^- zQ(5_Qy6WFG+h2p?+bzs)U*=k3iCo#x^->C)xPe=lCVINNV^1t`6$w}R@M z1@mVbt@5(mE;=Vn`v14)%vCG+Cad&HoBOr4w*LCMzFzjuzNDjEq9P(M7PiY-t*vW# z_wDNXx=>$V-(Sz||F3-YDr;`(wa8fpiA{OCUaHyt`|n*zF)NTvGxt& z#rb+OH9R+6n{`c_)&QEBPbvu4eTTl3+J!7-kRUs|H-{vCaBtB#wGW?f9>7+ zE#fz*1hoa%x?il1&GQBF7eqs`|Wf8g}vu{926EPI=5vU zY+`*o&wSa_rNujAKK=f?H&E)rxfV`gD_)CNuU|JWcHEY8^Ah*ext7Ofy!Wc|Q5UN! zQFGEw^avMH;hk90y5x3`;q|C&{&`99ph_YWoKgOE89w_wsZRam)G1SzL~c&gR8@8T z`t|FreYLwkeg53MSoECrdmCYKarNxA_iDf2ec<}%^LhLDix)3OZO@ylrL8@6>eQtV z54W@b*3j1v4-A~BrKP3vk}LVl>1($t)BmKLpYZ2T&DAScwn)FdC{?%PZXPRB?SHlp z4hjm>PphuKzM9|ehl8)LZ&z1WP*v3~Hh#G^69npV%b1dT9zA|s`u%SCcIlZZJ%KJR zE+1-Nha8(xKl#fJ72}i>09?E8@;@zhbOl3>C}UEQqt0)K|zbAYKOo2@bK_vmAxrF zJC7Lg@Gvki>}}Zpgn_|fe`3!^kE&A=kE=c$WZ#-_km+(+VS(qZ-R0|-`OZ%B_VzwI z+23wu=H+FcllFa{`~F3`{qLD7FK4FDyZGbdFzxe3)AOSE^{sl2@YNiDg?i6 zJT5m|`K6ZU`gx6?L5;Rskfe0d$Fq6=-?#bMA0Hh(7PWf${JN<1dp>pXvM_fB$>dF&H-EiX{XX;4lap!J z*TsJK-nH`hxi#XhuCAI!Mn*q&eAWB4(7FBFO;ZQ6oErpwm|HqE%OAbDGKVBkXMcD~Yzx)&D~8Xa4) zaG@hRpUevbEl?A(tEVR6&n*BtZ( zI99A!;ou1YLk=-lp=#o5`_-EF-^P+EHRlqn)tuU%WUWlPA) zl`Fe?d*5z4-_gO5nvzoTuW4@L*|TTgzRLc6uViOTR$kt_wU?^q7(SEn^!)t%{Pn~9 z_Bx(buU0Pq@_GLMn5$Q>&N9oLC8is7@{(3gQE_nZ+r~3UjkAHc2Ik%!> z$G#s&^=IvVzc0Gq?$?Ty>(*`ap02mo4LlI^f)zw9u$O#Twi}d=l|A?Wy1KsPxNJGg z`ZN1KpR+D|d1mDKf0kZb z8@*gm+3m%@-|w%l-G0yNsD$xO_j9jUO3DH^?_LwJ(MdaO%>5x6)c zB4WkU)6>82)ZD-)XS3qMg#cA`b!{7)n2j4Zu3Eo7JTh|Ts@1DiJzHB_tqLAAEc2VY zYQ+kT+`GF%XPe~))zs`sN=~-UEx*67Hfn!e?eg23Hf_3c=gyj^r>CEO{<-vqoUriX z6DK@G#l=^zSh3==nVR366^+d7t2S&fh)9nHrGv7vZB9;3Q|8aV|1zWP%9Rja34;Zv zqhj^K4HzQ#R&CYN*0z3QT=5}c>5?TYmMwFO-kvx0_~XEwoHd_5eF}+-yO;QX%9JT~ z!VNq!76Hk}dR`htX(}o@`uh6b+Etppe0^?tW?o*O;W3`K8~OU)c26ofZ~NV2(!HwJ zYaej%d;Yq8|KBq6`!&IahHt04X=!L&SP{7R%ZtVRuX@ezS?uy%Z1%cwP4srZ-rnA- z=X1+*JUlvfzFxO`OTs~>%_T1{-Lpyu%_I~5w_WuI8#dI!wd3jkivuDYlJnPAJ zY0u8goMo8Y78De;rSfx{?Vk^a*JdyHVp;v|&BYysk3+)3mi_(x{dCmo88ak6_3$wX zQ4x_9d-lZi_Vz|?&6>K*clNTx!)=+@*Tvr2Rl0ha-`rc7yH!G78p2j)v8rfX3SWzX_JwwyL~vN|f-{k@5)>B>!;f(i=@rR?i! zcAGglJ6q4$egA!UW#!JKb~Z$+`0D z>+7whudmH}b1yb5%*;P%{W|t5yVf1I|Nqn9^U_)K`)dT1-B`Bo|8z?G)cOBk+^^36 z|0i8kOzhRC)B4vh``fR5^yrcBtLMGu_coN@EuAiDQ?cRFrAt+MjiBaO-@^BQOqm!M z3fQ*9PF_^HYxewqUzV#`T3Y`2b84z~ZfI!ehr-OvmHYnxegFDq`uwYp`|a=P$yiRi z_N{+j`u)sj=jX2nRjG07!$HANQL*FM+3cOiUYG6udjJ35`?YBz9tr{h3IYMCsY|b| zi4?Bcw`7US?d|#DK|zy_^-3@Q^r z*jj*6NhXh=sHmvrwcGRjJv;(pV(u8e?&;{@U=v>Jc;ce6`>kz);^NB}EmHbfv+qH+ ztgP(aRQt7Cmn>UWw(CRr>u)n=%y@k5R@wjLuQ$V0)YV_FTD|VlkB^T*m1yeeX_;47 zh3<{LCVBanT~=*-S^;l}o72be+C?M3tOr7R2#FC^Q!xw%V!d`R@Xq&ht&N#&(?{I5xSe?FVtU)lKX z`u=}gK{eHl8#f+EaUFkDw6o;r)9K!mK7IPMWZFgf&b>b_CVzW(clFxn?OEU7-Tn0Y zFBc2b!TR5~ZpnZB`n9XK_v*X5yH&UL_+?l>^-oP*dawGut*e{ct2@Q#r(Q9VO8Wcj z>%oZv?EG>zYo&g9NvO!~pLQ+bu%_OQ2TXU%@7K<EQjX*W*@Cm>_U=zI}XWXXmPwD_?H3ox*)93d)xAV=tXU@yOz);X7!N|nG@N4qgxb@-Z?S8L$ zxAVDN?eE+7!%9oH#?}3N`uN=M{Iyrj_kHAD8^3?w-MMFTLAmAKot<5sofmVr-(9vc zcsZz16SXO&Q)TVeYhk5T4gQ)?xi~p5{(iq-Ke%RVP58LIpRomp;Fj%@|3Cn$RR#w)7rFJoT(;q#4Y+Cc*!kt&1e{*tIax$XN@`8&(^FFqUew9k9?i_o7vkpD=H%?0+7p*8O=b4{8X_&6Bq(SplvS z9>2Z4{q?uo`PY~E&R(;mefMXVUz6Uv$pIy$s{en#KP}r`de-zhs3Ovv?mcnh#Hj6g zvGX|{ot&JWeEvCQ+O%c6c3FjnhQ8eU{a&z(OUto7+0{>;q&$84R8xQ>(Vo`b@I)YH?pzCQl=qlTj5!r1-p*Dpo={_yZ{Xk_HghwJ`dx)cOz zi0SG1DZBTDI66AEw_aGidbMfww>N(0?>_%r`eL(wVW4m!J5i=~4IEx8E(B9kxF1 z?$cd*{L9!P z6qUb!p4(qPF;TgBeP}+Y4fybIyJ_8@3edQMcu8JHMnGNNzGMCJ>o+DJ&pO=3o0X9f z;OW`P#xJ*Ku5~#m56Sf}Kg{&peYSOZ-g0HR7`^Gsd}phzzb?&V3aYpdvdgb{JIgr8 z`^Lp>y+3|b@XA_kxoZa+8@OV0Y4NI6UeD(g_c=K`H#d5Fd3jCe-gf-hu~(0}_4)kR z)wlYjZp*%|7aAI>si)_6xQ+MngM-b@$^lXC$F5wvR%U4$78P~tqB6^`DI1fIzgjjs z@6z7y_q08$9yGEyDa+f)^@AFkzy7`t`K(g=<59Q%uK3!op|J%AS*2_$He_XIZ_U4N zSNrGV@lREICoMTHUmx@Tv;F_YlO|1iaPalDwU>W1KYz|LO7$`j z{Zh3T)WDQpVw1A=?ZvB485tNF)`4at8|scm{hnr+Hg8G%`qP?dy%czP$Ch8G zHWAHV+V>+9vW<}P`@cI*8&eYbwEa!^?C<41+3Zh7bW zh>cE@nu4{zPQ55Usp)e3&KN!4Stg#3kM#y;X0GJo;(GG6YHQ|YwX^eVqXPp2L5|`uEqKLNznvvtR!sW%__(}rM&ZsFDbuWw4x%9PX&5yHd*Y*9o?toghx3=fUw?F6R;#y*6Z=9W- zeYJ=+InAvzPoSSP6YDvtPAt9NZvi7ZU zcBG81scC3CpKOq;YwM&*ld5*lu{-_z^H%O!v)o%EfA;L$`E$qO>NyWQIOb@)te&)P z(v&sAzjr>H8lslDIqFdFIup-ZYA^Gz-AdM92bz8SVgUA*zU)qe@28dJEqH%_dwcnP z{r~FN+OJoCz4WiwT7P}@h7AUxVPUUY#p7PQ{bY6G%$X~%uCAUsXU>}3+uJ-RvGGbR znK47+>a}aHE-ZBR^7rR|_x@`YDEUp9BC>Sp($bsjjz6BL^7h8Y#fOz1&YU?DG%D6^ zsus0eI?MK3$kx7lE7q(D$;w*QV`x?KVgeU8cXM{9M^Ht@j!Ty=g+xWII(F<>S?-p; z9u8jKspp?_>s`5bDr)tsS6PzDyJDCZtv`MG^kvcTn1$Bwb~t-a*Sq@pyuE&M4`?9j z=+UE@KR-R)8~aEyaqU;HUl%8WMhy>aw3}VOlYxQZ!IZT(rPlwis5z9mwQz;rmb;I) zW?#>Gdu!{dGiN}({%v`8Z#_*qReNxTVe*#D%WA!{)?sz~L8C6Qey>w{0?W#_Nl8hi ztj!hI*a8}W*|cfXgObSH)RdGJixw@q+tD1Bw>{dqjmL8B=S*G)J~8F>jS)=pz z=H}(j^(RlB^z!z;{O;~<>(~$0R#s7&nVDI6dDo8hN?X6p{_){q>^`>I*xcM)gEiG} zHXeWSwMtY@PA_}yG~MWHiHzUx@0qvMeqZsc;CZGMKZ`+AP%nJ{xbZPCTsSYY>T|~9 zb35cRcdssG{xxgG3XNU~L#Nx@axcHQxcKS!-_7D*g@uGvw)ULr=<5rMh?wE!?fvzn z`uvPTEu06p`u0tmGiQxu@v{}%wrxASZNdbBrOTIVTUqToyluve84q?T9B$_iPfJUi zUhARDUHQ9aU)lNA*4CGQKA-2GcX)+ zdedX{rk}I_|A()(y}h0NyrQbAt8v4ySlqCKRG%1X;JCc5TEW18#a`6&)F_2Cs%jJR4pkfNkmw< z_)Kk-d$o+NrRC3-+g;t(Wem@Xc3N#I-*Vx?g)+ypA8)+7qfs~hU+=~T-j zXU^Ok3%ZJoVZm&fY94!#8W28^E}#rrD6-%M$NY2h_^KGc%1r<%Ip;m;OqfJb)rPphhjpeEcW*@tE!@-O^7fAS)!U%bpCO|eH2V7`{@4yPugFP4ecNAiX+9O! zyjahqoDm!3+5F|7@U^Pli_gq^!pZsKnf{xrTW=oi;`m&CqwcTj?~p13pYwa?E#1G~ z>-Cmi%i?DlH#Q{R+L}Fm--lNH6B3K(|9PSga+>M&7-t41_Y)qOSN_l5AN;)ER^zg# z+z;Qk7mwe5{N;%E;jP*KU$QG6o8hghYw_trV)oljm-Dvd{x(XxqC4xwWVeX@eY;Qe zs)v<&P7Zn0Ic>f5Ym3Nt4Sd&khwR9jmuqpYZs*RO>7HI+fA>$k_f2T~?YC3Ec>4MI zo!$8D_Sebtm+boUkC8F^_tX1t^^$A;IV`C7@%Q`m@}0r!3UehFa@I{}JAJB{?euRS zW4)g-K^N09&+e(*_PG8Z1A~Rf{y(l<3=CiLt$R5?d)=R0vfSIt{@%YZqs@Ms`lC+% zn{N1X_mb>?mv1c!UcDv#sN2skm-BNkST?`v+Zi9VDExbE?rgO=v1^alSv$F3Mcm0Sx6(4tPlP=SZ zEb2Xdt5q*q&Es#yy{zn~W^UEfbWU!+rYBYP|8ITv?#j#ZXG+ti$W6VNFkR*A&K0Zk zH&1f&W;ffPBGxxEzy9j&uM7+qf`7ezAH=}0pgt8RChZETnaN$8>!eZSvb{_^s&b*(SkQu8?hKQ3xr5x&s8J?H9; z#N&H*?)N@6L%?%?xc85V^-m5fzid^$?RRs^(qo&`rB&rWGy-H|t!ujc=6uU)_MT;t1TIhkyk{>XhbJEf$o&MlcdckbF1D>OnwLNX4w@qYSQ zV|47q>#tf`T3*6xJ^@Kdi%y+7HD&sAaT`4wn;7Rdo{Jk2536|I-kyIQR40gusb#NS zvlTRK5EK;U#-4L;Ph@LrD;Gci^z+YyGcr~z^O?D5#*7)s*Zy9M&ev2?aVdUwCbPW# zx4V4pl2fO=&dxIR-nen&tsRAnA$>Lxaq;CZFE7^?;K;bSDb?uMi$&dfK_MZhOMFdD zO+mwRdb{5kMP_eJI?82gW~Qa0;xcpQOexc>D~0jr4;^xPdw+ktar!x%f8F=FK_i@j zfeS%1c-`Xq*VO0NECO}$MMYn3JT4bpS$TYB*}vp_>xB92qbi-&>?{52clY0iC49=u z{0`W7I;)y`&#Hg2bFKTl*~_ODJel(2+l%v_!q)o}a(cYO`S!+&^Y05}PChs7{;!b2 ziv4yPb+PN;SGiriXH=VeMrrQ+!qg8Fb}h?#yZY{`{cmbc)dlSieZDO1we(~8eDS^< z>lw@EuityvE6Ay0R-Vk(3qH~Xt&405SLLs})~=fWVtcgM?X3LY*X_>8t~{QmYrOCs zM{W7f=WiZ9^Q()KRAs$WrTV+l_?eRKuHZ}4+4<$xL~c%-+1AFk_tPougA=u`$5pTG z?CQGo`~Cj>X!oB!^K2p~tNWXM{P=Oz+O=2Pc%|Q*nyTBJ1DdUsxO_7veNx%`d%1V> zwzKie<-B_J>dULu>u)(IEVytX0Mt@d)6wzCzP@hjZ1enUyykZjqV~HpH#WR_{d#Np z`?%eepPyZGFpatNA2gh?IIpv7RzgqYja&W|Y0Dlh^EFPClr++tUSn!%wWoObD*GP? zsvbR_`se3)X-}=Xe?R$@i-gk7n+ZC%t=PBVfZVSai_6ac%*qP+cPsl^nb40?wX#bp zuKn`)Hl3Z5?(4sAWVZTp(S6&(4FQv$bae#$`t#Fm(y4!6)L*a8{28TsW>%_F8{gH3 zxwmuvetYZn^N{#1o^x4tzfM$ndx_X*Pvi9VpKfgxwQZ$m@6n^H>fYPl4hc-`*~3HS!f8}5KIPn_ZyYnn~_vg$uTo+(!{^t5RbM=U=(qB@hnEcUG?fo(D zqYK|871o-st8{;^?)sd!k@5e-$NQE!+igG9aCei%gFG+ z06ge^U&A1+VM%n9yn5~X>SM*%BC~GojV{_PT6)p7Yu5`U<&$A{pL-^rU;g5>e)xk6 z3;me|rhA|Keoy;+Wctcy=j*4bEWJ}c|Bj|+)~&7HY9=9pH*a>GIybGxF4Xq_o@3sg z-=&LBD_{G!Ox$mG@b$F$x7NhuO}`qtx$El@@59aK!Bfxq&ri>_`F^K(`IYlCO)5X7 z@JbjgIQ;qS*|VokpT0c9FnP+%nVQKxvu4lUnty*^nX>AkLx)O0s{sT!R&3f7lznZ@ z#N&@IE^urXk(OTl=1q>Po7<_V)lE%Ixi>etZcaZx4K&veYCM5Tq^)7u*VbH|rWZa(u&zWtgXIt{Gd)8b_{~+&-z?%_^iiOl(FWcC?b$!|H zdw0K2y0myxiQl1=(CX8nkJny!@Z{pGDQ51|Q)E{N7iC=l{O2#65N8t>|UCQ{^*U9#!tD`ca>8t3mrrY`*{I_C2DLmQ*kQ zbIQkO?&2>ibUY{hzEOUipR=>%zQW7jlSE`?*DiE!FOvu~&A6a&^ytx-kNfSXsr1U* z$A!mLF8%nkMoUNM$^yq`lk#^l$|u*w>m*IHrtryFEXcjRZL3Im%B`)pZbe0AiwX-b<`h<&@$&NW z*RA4l8@6uUI!Wa1$BK7mm%d!9TI|*n@ak%~w4`!kZbFxbI)qn_% z@QNKuZ9IW4Vbe70|CUB?PwnnGExP7tOHEbh!mVuig&PfzMTA%EP&p|prx#waW6gQ> z`xDns=Hv|YNLsYWy+7>p!RAk5;@T#Wb^x%%h&c8=4HR1?0xjvi5xM# z@Evy+a(*%oU;QwlZo~U!yQXEn>(LH*cVSxUzDei)^;z!tynhX^iFVdjwte6tnHRq@K=Ew5NIl+JBLUW>%E}ySGw4^UO zDU1Kl;VLCIjnpIGQ`g3;zJ9mq+I@}3eG{xr9PRRFzB)bawD8Q8FRq-|w8~xA>2ory z@Skqjq(ez=Cq#u-zuLQha!+8)vr;dKqV8Gz?*o5Mli#|B@6z@wMowZ34DOK8OgD#F zy0yD*CN5d^e17;D@qG(soUf02_oL$H z>eZsA+0$&&=c>N``szZrzSkr#`3eWq`k&o@u3nwAWX<+_L0|6d%OQlxv_dT@kW0U5596^QpTdrgEJ(eg%)o-dSj8&HX6LP2QI{@X_IzdHpxJUD#pvSCb)Tk8nKI#P zVPT<&sOUxcn>TODSe0~~Ipbp@#p~WLr)q7z`~LO16B873?(CR&?3kO9a)0#%JC~9Y zlg(*o7j4-xWz(k1o1XAKsQMc9`MhY zvj0O9w>o8SRWgxUQg3xtM^od?t$mvd?Ok6#`+8Bl^PWk=i7iJ>rtWq3 z`PQGQpK&=f<=0iF0~a?4Cx5X}GF~U9YnrY4gIQ_g;dfkTG=3^y{r!$pCRkwdU*RR+ zf4qt{72B&L%{9+GyCdxe>sP0Y-WFG$!*`>6?mkrCpfa~zHIs3rr9M||g%Jm@>F;;b za=%79-zqeF$A2zqqsm<8UtjoLO0Mx|YDKygU-f$P^!??45Be`Zv+Vo5)ZZmFrqeKM z4@V3~%5sJ|i!{0x{m~C(6mSg`aShyOtfEpT_iDr5KSqZV6rQz7UvO~~s(Uu`$E?{K z_kL(%Y5CjC|KZxzg}uG1j~;brR{X0}(%&z`@cZ|Bc4l>6{e2w=vTeC|v87+W zfBQzk+o$!}`=2&^bm~aocknWAqEYFRHC~b(AZ|1A01FM{*yeraw_ zKcDvH#l=4#+U<|zZ4V9!IdZI5+Opum0Z-ZYufrlEZ@zu^|I3$>HDTISd*{uyE}t}U zqGL)*%7#3b_^7C;j?T`PWj)7^xvg5gTGDvg_bdNQO-=vKa}<=7?Y)_^Y|EA@H*Q4C znl($pJTGQHvx3{=iD%CEeERh1m+9jr`c52Qs{X!=DUfQ|S^Rv`j2S0_{cVq4TN$;ml*)icu)}nRm@@^U0vAaExpSYIQtSo9D z;L?jVPbW8t?<_iEJ7?w>+j+NY*%|gnna3ZK zm|Rhu==wja*W+d_*LA}!``x|0y;U7NJvkWy0|PU*-m1I0>E`Zo{bqK4P;j1^Zy(Q4 z^Xa7ersW}7Z(qHB{qxP{^G}{mkJoGCk!-q{@#VbE$N9}{2LwDASrekS`)y;lS#sR@ z?<`XxhxCnKidq70eJBvp+vUMAx9`{0)v2!^9{zia|9}X`x2iW~x0>Y{e51FYI?*ZI zdM!ms$5OJ~*?Ir%H{HuO3i>B2AKPNm!_1a&=9Cb_wzIQuH_I!yNCX{Ge48b84Yn4* zDOvW|3PT>7>gW$&le8=RuF2P0?YMVw1NUCb$uktUbN4EGW$|v@60-i-oPsb9Yc_AQ zXFpz6-0hw6eupF9oZX==%lWVs!v9Tz{U+@SiET z=}d;o&zb3en$?1Wz8?{`;FtYmU$S$<-fvPH&F}j>c{)A0`l+ar`0wB&CVPG)d00oS zo;oF+>G3Q(`K|r7ZQ2G0xE?e_JZM}0a7*9pt558{xz%3CIFR)%VRQMFfNxcM*F(?_4lidn#Ui4eP@Y|NCxx7*)9eb<4U%GJNz=1~Qmuu4;^VxW%j=Z|MdgbcX&g<>V zeBWHUbZJ6KdSqne!Pg&hHxxbfvitYrao*|hH4z7|t&N^&R1$DC%Wh}k0T1sJ|D@Uv z8;VHW>W}qaI_02Xh2~O!j=&~+hEMe+oDC1w=U#b!_x8MJ_pZCLU-~=6{C9l5dEam8 z&qnL`*8Tt8Cmk7kXJTcx&mWz-iJxVh7Z-OJswI}2Zdmwdf9<@0mV@zZE0?Xcc%pQD z+f)w+7s>u?CU=gThtq#=+``^^JN|rQl?;a>2S5M&X-=!nSBI^gwAigz$cf`knKkGN z$Y*w2xBd%>m+EEfK6+_hly(K*EkDNW@`SX9ott`OI2*oHW!e@!+41eFL@(2U+agxd z$6x#3X8rN|S17B)ElFcz*OCQ&6L#;D3$Ls^k?qE{tM(G-Lhfa|m;|DdPgKp{-r9CZ zyhFOkn$3G#!Hu%ZQM==237_N2)Y5vK<&dCX-M{TuuEp#k&Ta`umshPfy5gM|e`jB@ z^nCB}(obL4PC90*H|dxy-;dYjAvyaUt7JqEex0|i=*`sm0#oZ)8NPM>_j%KMjf*^QGGGNQ3f774a33Ew#9_koJ|InzQITtFrKl=nQG`_?t9ZCcv; zr&D<8u@t3;3)@}ZoHbwE+bg=%dm2MR^-I;H{C$$2=UBSLm&@LIkzq4+s!9DPPY>&R zZESshb2^UYsJ*=C-nsj&*_Ob-DY4J>Err<3{BrZ&9)0_N!}fW1{2k`=ztO#WTfoVn z_E*WV9?8QEjLa8amOOd>eEyY<`#2>fC2g-UFm`lwJUC-~-o?waxY*d#)KtcEjSB}L6;o3C}m3IDp~-7n!+b)=x?(&=}v&j0*5I)bQcI<8Qy(`?UzjimtkSUq80F@ooR@>)W?(O*EQmAi=|M@O#elDEYsJ z)!*JEY%E!Q_0*M>!IAsxYUlsnvV6|uAh!GdP9;8>A4;wE=@|)?-|ghzQvIfEkFIWu zs_MjohpmhLJe~eK_W$AM1s)C=Yp+dsddqLK|DLsLFIX1b__=F4yL;;XO)0FVdG~bQ zT9+l9Iic{diQDDS_x<`_^DEt|q@@40H{@L|z9qFSctcv%eD*AhPyCYRKf)GXbq_54 zGCfG%Zoz4>rV~BdtPT-RG%l&_SG>inIZ-m4JNjex!3QlDUT|*aIhJW(5%c`o)V+_C zTP`GcMm2odb}>l$*R72zx(Zr^S^V>XC#mHVN{`;zcu0R#3?)%^V_LgBw-mR9*Pbr6(ny)hC-roNB#&-V4D*{z)KXEW@3y)t~%ix*3 zb&Y1N<$4CU z9*Ki@b{3yJapJ(!qQIb_L#L){|NQg${L5MF|8IM7G+xa*nzi-Pty^Bn2?~6Fn3vm% z3cc^VnsxMP(Zi1wP0Z_BTU$XX`Q&8va_@Rmy9xFC^_AUv4m>UTYPoxfeq>~%h=@o) zWMt);-1gEc-+JkpK5El+BAd>pB_C*Dba8Q+Fn6wRcDA;(d0xu*cNcCrrrtfdH+E>)5Bp9lQEy zt#kdOt}Kx(3OIQj8KeMr7pW@%`KVxoY;=wv#DJ zmX-TPRY7o0tN_V2$tQkF$3$;bPSJ}lT!_BLu~!a*j(>}xuOPfiHly!~6##%9jV z&FS0?%Ic|xywhUEqE9KazQ29_ zeQTy=g~0D^xkgWKWw$CSHs1L8+4XIg=-;Yyx45`E=9zNGy09!e*qrGczy8J@acFF$DQn3+Cp2`2!yv*bE_U1|N`XDmt*dO1JcY6#?Ruu4j+q69; z`J>UMXLXuA6BkPwRPNM>sh&2)&ivK}i=g5-0fiNJDkpDQ7Neo#`Fz5x&yzI%)Pz0v zOmd8>RVh6DUhLS3i$C_{-r$O7a#(CU+2&uS;M79ZTwZI9yI*QwW@+-=jSSdYQOMt` z)wM|D)b=@C4H}^Q@@cN(gYE-50=;^6^Bk+ccWslkE_ipl-As?~bQ3GXmNikLo94eg zD(+eJM9?Iy_(P#}tru5wadGDDZM?_-{e2-Myz$KZ`)lV$ajace!xef}T2sS(;?zr3 zZ+fdYWaj6bczoqb$gNwqBDUp7-ez`O@Sim_G}Oe*Y|_k`l6$=GyetWdj`ntQbK8GQ zLt9(f($aE<+Nvc>ST^63;i;3cC}=o!%4?bL>^92}zpUa43k%h^#9OZoJN@8bGpL79 zxctJeZIZ@mJiflZcgpYA_Q+UHn*aaLb5O&{{9eW4<8RI1bv`_HwDxZ1-R-{B$$fhR z?L9SRojODhs2=F&U~%}c{KzGSsXww?zi8wcyswJ&Si7+L>hr0t>o+KTj&eJG{=veT z^EYj-GEF_}zCmKw^7D)ZzvtMp*|!~?b5hm0PH|1+7HfNnqV^LV5}NVn_V$PK-O*pZ zG)^N(=cdi}g!MP#cTb#H80=}18gM=ATy|wW*S6B*E%jaBw!|>(pYx+>MV9Up`Q3SM z3l;9JF5T0=zoI55G*tBK*RMy894WY4dcE_}qohlhE?vklF)=Y=VXm$I_GY4{re@Nw zFE5p>tY$5A{yX#JF1CYJ!h(VaE1%C5U-Nro_I15WmoH1&)mVtfRV=J{xAVCZ*TVC& z&HaDW*gbmu*ieGU#LR4yl8L}ZwgRTfORszXon>nD?oM%Q>Jg4ZK|w9Mw~09?DOs(a zI&IIM39l!7n>@e8X8GHr$8PV;HOsR9<)Ic+GI7JaLbh|4g5LaHA^K#^nj`zF&950I zd+d0jbg}G<#;gwoJ(-ydCTrqk=lEVK`k-*_;^I#G_cn=ghD^07Ds4L~mK=Akf895u zjZbu9`n=B7%h>X>wU3GXf1^0-uVp(jdt!8&uP4bD(bKA3k^6MZ z^0hL1Erk_JLf*Z~{1kS-=AN0Cd8`uqyuH3N9xa<(aqRG-qU&poQvVn`rTZ+~nWg&G zeg4t7j}v9KB+NHB>Z_dhLVxAS-^Is&9zUP(!?kST#h=WzmtHTZdA;@0)kpJNXPSI7 z1Z6OWhZi49*5o;Uh?4zf5WFk8+o9l5pa-a5ZP~k$p##(m)3`6Wc!|zU{UfUngvRZj zJMFyvag$W8hmE_x@7=ofiv4dL)9-iH7bZ`*@a@&=BmaM0UvTlkjqUvI%XjDRHIvqT zeJyd8&CCyTWEgBrO|RI06*2vOpWi|5hTMctC-dL=^uOJEK6uC5uE(d@`5%1dy!T(p zB=*XwsS9WB-4dnCEw1Hzu&o?Pf$*-&u{tSty`xu zGP6yXI`!)MZJ$4XzPY#BJZ-b&_S?MzN-5hs3JVSG=C6-FHD}J8IeD#D{Eyt*TfK74 znj_CYZ%jQccFyMW8M*DJPn=M&x3`aAcl0{>>+9>xyu4>8CMxfU(PQJ6yYss6)$7+c z_t)F&P3N9|`lxt(jblyCpG@=QBPm7?i*`zwpZ@Gw+P8OiPhVK*d@*aQh=>Tw z`xERMYx&Zv<3xnpWb0+ynu?5f^Sjqgy~|!NwZ^;Qrc;OKfw~9B4(wW9wMW$^;q3X8 z&o_1-eRad|%-db(9v6RHUHW-v&5hVIp8IE~ zM;jQKC5+Q}bai##+}_@Qb#*vCzx*=g^fcX?e?OluJjlF# zc3WFpUgpNMb8|Fh_}Jb1WD>8hi)8?9Y&mx97+3Sb11+4wKR%t-&&P2PMkkqzx>UOi#xvs%)b4$?vA+FHb>@s<{RJN9K3x?OIh7lsO^YLNn~V2j#AKJY6;OnD-K~9gKo!zuGxOdSmf4hlsvw1&v2p*a;xA*+ZC0}0z=17})l-Jf~ z+@CeOFf8m+>CVktLaf+%1b)59I3y(eaod&)d+P0Z<7)(Yws2_5U;BCE^~EA)ftNXU zF3Bfn-~Dyh?!)^$-Gv*U_|EyZC-1h!>~BA>o4%X$HvVU?YJQUTkMNASvz+<8vroA? zE$$X*$kD2v{wFm3)C@;+&g3f*Ef*5?fAfFaRK8^U{FQg!gwB7Eacb#ai=CI}x!=5& zo$7K+)hXRaQR!{ck}sDcKB@ezaHAY z`{#x&qWX)Abp_KO$K8zhl-4hp_cGVDiCLfj+v?BYic?p4m)Ngh$ap|}nM((U`WmLD z#TRa!@K`eC$1ahosU`b^cj@0+p|Rw8_xj+*8(IbX`7i%ddwOm1n_r%Wv(FaY+LC#& zX@6AjlatovhB}w)dTgEdevH)mUtw&WGV^NI)A0SjL=6oMpFDdeBr4i^HA_`Tr^k1; z+1IM_zu^a;e{SW8h%Y{C>NEFNy6y{s+}zx|T=C8JzP`V6INA?8Mn_9KbxgP^{b0T3 z!=jy_e(-0BwQJYDD6v`-mhExz!@8r_Z%g(bv+M5OzICghnAo*kX-(DK+}wkI=lZF~ zt*`glvv)`FZ?n1Cy$lDh#JoLi{oQx@W!ChAUyi)~+9u-8Uazob`7Tx4onNm-H=keZ zw)o}es(C$|&slZ5c8e{%n#K5`!sbQEu7vveHJ?1cm3rz=nR@Be<^A_MFJAb6#vpF~ zgKzui9bD%u%Q)fGDX;vrv}fM)Yd)RqTy}uTfny`*|D5(_2e|^q3p^>Fn!jag=l%*8 zeD`%yzNh-jlwS|td;AZIuRS}f#_n8X@ya`UN?r!Z{+n6$y!_q*`;`y3MCE>{E#j(Z zSp9zQ_j}hFx&Hlm?%r^F|GQ?X%a@$8DoY-Jy>#jPOzHa~ym#goUXR_+d}Dje8F8t5 zhvo~t+mh%vqu27|9J_k!EAqd(zgVpPee20=)k3d>TNjI+e!6^@HaO}_17Jg^#oM?O zx!Ui0{V@Eu=y0voJqL~k;U{J%&bD^TP5v~cU#XP0fx*Rn$Ishucc1im7q7ME{PyFU zzwAu>v1`ht{|EW&4y*`VT=Dno^~g;roQa8vcPgLHZE0=&_@J4;=(O(knx)S#-8{+W zFy-=Lb5RD%z{ze`i|_Xr8%p)XCLet)YV+ljfZfeG5}W>L^EB|VZDX3de0q%X(l;CT zxraZu(>rwPbft9?$NkH*U)r9!magts`QfnkgJk(XNnevB*Eq>?H2q=P(JQ<{u#hX~ zQ`O%6yWa2n?G!X!_V4BS>#lKqwAMUw;9i+cWa0BU$~`k@?p^oYQfA8jACFen&ATo8 z?cn=O?{{gZG}L`BGIUw~^t*=`llnC0587fg>m&nbUjP1c_QIOmUoYK_`r})=GF(VT z>IX}NRno>grK^4~1~ok6#YGuFLlYuTt+RIvR59}~3;n)zjyuVANvPAB{$zd$FO94g z|M^okJ=A{v#`BdX15<)Y#m(05~=$2a!1NZp(RuH ze7luBr}&&@kDTqScKJGqhWmftmD~LP^Lfg&X?0JZvuH7V+W)A8zkwk|WqZ+YQFjUJ zCErUT*t^&KDZQz{ClaxH?eA4g3JgviFAvQB$nH3ALXchYo?M@ruottp8N?qDc<5Ze z=Iz(8S&Q0&vw98|uF2i+7j)rK$>i@xMfcY4iz_;*dTXMxJD+Mm$e-D-WA|Ie=v}`E z+At?tn>(fc|KDcQsN639j$}Lg|J^1*yKLj~UoNPA_j0$u`JjcC2D4oF=hVr|EZ3Yb zp6+ZDx;fqZ{KoBJBCdf`^36k;q2oAfID>XI?rr@4%jDbZ_vbVp7G(bX{mF69r$DRV z^DB}=%7iZp=Ix1d46T*e&F{V`GhfFq{C#qV-t_J-UrHE?ii<%*ChI;|?Nw1xsmWy& zaQ(SVBy`4(rx%SSY!=Ksx%l--uT0fbua4bYw0Om(BiHU^e3R?^;r2^uX$-%Q{YGY{pM3tFk8R>7c>jD~Yx-ecH6Qcx8n%a-@8e!d^VPCVhLnr%f}j~i zr1h5?v-}$WXU$(v9>2GvyZm0Idd2a&!a~ENM`c&qURxLIotXGA{Hm|3_Jk@0 zrLwL?8tSglL0g1M5!avd7ej{&psK+7{+tgqg$(cpPFe85KtC|dJZ}AgYio`_4f}pt z!^?lsnmivj{ailYUR}1DeZhB?!S;%{2JV7+bIRo&fh3U$JZmNgS?z!K*mZ_&jK%Ib zmcm&lyfPg*{uga`pAao@&|P}+j~s8Ny#61%b}!OczV*!(vATjV$;s~5g@qq->E&l# z+-z#zwLN_KCVTrw+LqG`wDRDvM6TRoo$wvwU4AS8S-%0 zU;S%&cFV)hvKL;~tk17V$qKwa)%)n|X$DVJ7n~FnDAuy7sG3+d!Me0!`h7+H^>255 zn`7?U6J5k9b&Pr9@&(Oxb|$%@OLoobm@L=x_tsJ8)yL1trE`Cm`?cJrz@}Z;$%f~T z(gy>74#Qxt$l^VB->uI~ezoKEEN7P)ckf<%SvtwESz6L~$3*XQdZ{n%+k+z#f9=|} zNMrdFzva%$FF!1>*tPz$*T45oOnS59rFaChMl&6l_Bv^1^RV%WJ~_w=!cm*y43 zw+K`{*nhyX(N&&XQOr|w_x?ct14rCl=Pd8Df315)z)ER?jPWkbEfrf5P1=tJt-Scy z>e{z>W%fzVK^t7z*tA7*l1T)rup;jg5`o8IfKYi^$E{w+WG`q%Vo#UnxwrXFzS|2I3-j``XA zH+S!+ZI1MtZN|HNbF$OPo{d}Ye1FWGVe&V7*Gkv(XZibIim`b5`W{U%2nYyZIKXRu z$HB>o$!vD-_j}d-mo8nJ{IY6(jh#HG5Dl{--4+uh(v8oA2K1=3MdP zx^Vn_%VM?1$NQhRipMS3xG`C$^v{ovHUEF#e}2~de#-TAv5LPr7|UaeCloIW`TEHYnO-oEru43CU_dG^einwOLP?RNf)_|2^-$M}xnmT-1v!+sCV_b= zf7I5o&}OA^p^%`I-%t68PD)E3%sj@HceAY7-e60~%S$&8810L_zg4?I`~BYUancSC znfZApJMCfSvEF*u>g^Se2%`_{cH3EBl?7+mr?(;bcS_yNlHbp6n{>FV^KtGK+`sXv zb6ur&-unN)Q(W3uyEi^Jocb%x-2GG(;{^^0+Y6@-94WAgJ2|l{?2}iN#k}>Z&3=bx zxy+5b>!+@&V2dbKYhzMaoNIFoBG&&=p6KAR77 zH-srmn4j=+tFg#ipAtWD?w>BRT~brBl2UfD&iCJBeBUp#_y4=Z#`oXO*3bR4o&Ct{ zV3wk-4lP^X3yUpO|LOBzWkTEGGO6w;>vN|UDW?`4_g(!?jNkX@+8d{L$x9zdxH_@2 zOzD}6^1Cp7(dgGJtuKgd>NPy(aOp?Jt*p5rZ#T*Qe)LVDFh|5wc+tfdrY2(B0`_cU z^PerAyrppo=S7eCOEOAJ3w|&8cu^vm=SH7dvUY}IL7>NcN&h=1JZy5~xWYp(hTQ3L z@#@_1<$BS_=yZMY=ia>UAIg7FzBc2GQw*E`Ymeqn$Zb$sot{O@7UMSj;XziY}dqvFg&A;bQ zuz&aZ7ndTBgWUwKJ#2e8YGiisaW9=B|KY$|$>i zBX)CN)3LpK=U%(KTI}?E-Pm1UcoH6ONIdKlwRYO0M@etWtQkIj{HUU$a^cb?r^Lj> zg5zJllmrC_PYeo*iSendtSpFib7K?hR{e3~VZnt97aVH${@;B##c1NxsjQ&cV_#q2 zyVJzQ#1>tD?dj{w`e%N)uCDHloNW)jF|Ka>89wW5p;Ujm^}qLw42Ob(43;fvaBE(^ zapJZ`N;Q1!w>}i~NJ=tndGfS$w?^X1l`qzW-QnfkvFgu3>)IThwjUJ?QT=kRyMCK5 z^mtLylAgM-zmsu3f4VDcpI>9{!pn(LCL9gh{?ydyg>QJjtAoSFOge9N?}syI;`$%1 zT6O5|g@$WM2WL!cJC}9zdC@~1?Zctcb5ve^IN0-M_q$hSpWVU5!%}lC)@h40x{7=z z=l?Yl?ETRkxBTJ9`8==9GA`YC^w3;ie%ft5)57Dfl1U+LOP8npsL8i2x2um>cC7W| z1^)I9N6m%h6Z35n9&bzM|EA4iROrFtz5aw);lzcL1GS{*#QdKAchka~XKTGTxdxR) zocMK1&HVfRdHUwE8wx-FWOnhJ-f*t8|LyeO+_NPoBs`h;x~=2PkqeGHrdq$=@qTN~ z%TGVpd+W>MX6<&f2p%IeztJs}5d#yfgii(WN!cO}E#asPA*% z{ znkiz>{MS8N+$+1j{nxLmMT-_OboBNaO&xb?Y40r1P|5Z^@35boon_S)X$#>Pd zb|i1a_EyxX)>*`Z*^5VE@O?^y2SN!aKRVIU?VEv)uW+yESKh z)XCQ7yp+0Urf*lXG`MWq_JsG}m#0&UBF@bGQ}#((@$LH+QAgj++A8$m*2M3f+U@sy z1!Rqr^JHE>oyz?E^z?842@emoCjI&GQ89OI^!7f}>}wtk zFE20ec5HO~d+yu&`{#GR-={6h$8Kq9sidsj{OD0qT+K&U&81KNd_FIJxSfCbh7A*# z+4)W!Y-TS$$SPi9J^#_8B)dN!oF#wc*qna;Id)ay?&S(DS`EiCR30AUcD=r!@k@n9 z?YGF4o1;8;d~jk6`0(7m{C8ac3NW!u(;oZQ^smVUXJzEod8r3-9I-;&JZe6z~m zPkVd&%aVVa&!=2o7rW$sN$?A^pi3Ld)^5qY$CGfy<7aq6TK%te;MPA=qqVlEYoN$d zeLF>cHzA?56<_Wu?fkNJagl%HT#wCt@%rb481&b#n^0f3*}?92;mS9A-p;?TGvR&C znrTwK4<5e$bFlwX6nlNdH2wOIe-wYd?2AfL{$=iAqHyqp@^yaE!ij9#WOAN-d(L-i z{=df!HUBOfDfwC*>RlM0ufJC7`NHj7Pv3rC!@?bKSsxV-h4HNO_L7qtjg1hoBw29 zz5K-b+Vvh;CQZ>|OS!Xm@O2uvhi<>i)AO>5Z}Ga59RC{U*X9{LEKH0wXMAutd)uk0 z=I^Gou3qIKBYpHye|pCgng3@d{s^3?QPDD*;Is7c`Ywqr+pMJi6(zbMGPzLL+xU}D2QjVm) zG|lG=2SK>3vKzeH#AXeUmAShk>wbtw9M5#TmFB) zv$syM{?{k3Suv$4EulID3bQoi5qd)0V0 z3#Qs`+$5dICV%<3%>Ca!91B^evB=q}E&bx9x%a?*=F`(S6#ZVPZR6Z8EPQBk)jIpB zNhhE2U%scTrPC-II=}GuteY{vFB-`G_@t#3#kE1osr+`#KgRNP(FacN^j1CahH<)) z@!O=b(De_O&-b0u>-S&w_y0SewSV3?H{Y|tl3DNRD#87(N|i;|*M8dN?{;c=`F%yk zb#jI4XH5N8%OGIUt-GN-a5Mf|KI$bRbR6-m!>>9F_A~sN@V`| zxr_7EuwZC^1pA&pIbLI~jzE^gCL&Ela>RJ=O+3nYzyq0%A z;+UKkD?V)E1{En^PYAwZcAS^|Zu#}eKbqw^VqI8rTU)36|9yYctF_yg+)g`ek-$*+ zeBSN%A`|B=Q+s9iFXCG5pN%=TH4+Trxw!?A(TNM~+cR8Qw`zx-=n9XYdUoed1(v|e z%egQ9`zMlA^{<(Knf!HD@YuyuYu~frQLa8u1X!vv*){tcN28hd|GbvGbz7WW>(s} z@Or(O^E3|eN`2D4z2ohC_ND3*E@d5`sP^;Wwy2zM7q+-mbIpGGtCm+rCwt=mU8zet zHoh{HE|t;ARMa+%VOn(cW$J0idb=Mhl^31x`LKNNudk=wQ`Vjp-NARFdi@D8aX-%| z^72!R>JnI-4*WZm7WVD~e^IQhd27V#c@t-fnaOWxywGwlj!UJdQz_9$gwNrp2*(^SYzctfrlhR&S4;rFQJk{R4He_s=O^^5xlk;=fJZugkKZ z4!r)y$|#awracIac)tZw(6P_!#S`0b25^ZerH|({BGiL&+UAR z7cFgIE|qTj{qjtYu+x{Y%PO<_tfQuvM(yL%V7=79-MGK>ZXib@OW#cW6DhAc64RD$ zN#OkcWn<}mH-0YPjo0qnIkPGCG^k7S;b+Z@603K6zsCs)3;+CdT7UOak)SETsaIA6 z#uT454G9VP@M3X)P-NuEBb~xKA2f0A_*I=>zBL>6 zC2s?rWb^uQF++lsK>Pl0$ED{^+t2q$bwi%jhsx`+tpaHau1m!pt~=GVBJP^*nSY#a zb7!8K=JYOdKgaUx|L?{m*`E+!nqTg%93kw{yLIiS;KH(BQNMwFa5MLDz~M5R z#;CWVx<9Af;%D5T@jIO*v=OvA1fghyj!0BZe(v+|LsKIn>`hHFcBahWU%POqq5k z=4G+fMLG9bJ6>28w;0;WhL@U}{{OrFP5!>X&leVE=!z{l?tHfXpYq;DlhRAiCwoqh zQSxbKU)<}?W+ID zwE;y7`nU3dR`ObZ{=4%?FB@;>$HXI1rA!NUZA_k>HM=`vwcQPQO_RHy8hiKLvj468 z{;W{eHUv^V+u^f{{ae|1?d@*;zPsR>$o~Z2YF**} z!`|6zg|o9PrX8^A^`F6Lq|_$7?5qCoMPFhMZFzX+{0^-fVY9clHXW-~d^`K=M3vd> zM#^8=nI5dj^`HOT%%Et?eqDd#cIh&f>EfnOFTGf!YNXTmW`*IK)v^2zITc+0qc-#x z%w?Tmv-LG!S;*Q$_wNfbq`3D!o&UL<{dQF7AF29VZ}!i;ebs@lV2yd#WIyKFL0+0I zHyC2L?zm28=nzN}*)aR@oU78}Pp!VW)pGEEPBN;>EG=Q#xh?nhv2D4xC2XrqZr;2p z(d%}v;&HFsWiHKAD<6IS`Qv^4|I^~}HG(nQa&McJy}fnx>-Bj5kdP1$29<9r_q8`p zJa>+N>(r@Jy`EKGFAT#-1OkN4cbAWUn7x(ywsWs%K(haI>i+-?jYLpIa^|w=qu$ z-*5S3_dAEbYL@DMjV}JPy!Gzf9C6p`U2B`aMpqWRHr-q2?)9WlwAXOXv8XMhGRaftxGe>6T#EFVMZpym4x-yoR3J)K8cXzj>Q3{8$TaUx~>zj+8`xO=c z=D5a?w|%yAJD*|ZC6%C{rcA}==LsG!Je;phn=ij<{qo@XzYkBD+iPbf_3~@b*KfBs z?X`2Sf06um|Li+ozgAdZjVdZz^*^zr`*37rWlZfW{mTaRw?f@LIqlMyf1e}}?>|ui zJk{rNLh)cD@* zur5vC7hA?xaHsz2f`oWkJ$e59u{WL{WIkK|dhzbd$-Qn1uKqHAQ=`0;$L2ytRUdOk zNz=seAI9cSboHl}R{H8xR56{jG(6JVvA}Hm_uaj)Jp08uIiZ^4 z73Y?Oe|oCS-rV0FKg}=2&Har}hV`viH&&i5ytV!96#0AFwk@yM+_8E%^MTve+|+~C zEw^pW>-`IAC$H|Sf3t7t`{$Md#vi=;_dlpqe_O7f?RuPH|LNPuj(z$sAUo~EktIK4 zEFa|+y*8T|y}h$ya{aV3$2R@{;PvirkGDa zW3Z9qKX3EdXZzE=HB-Jv^G9y|mF>-c`r8BkhB+4x@9OsZ;UVyc=L(D6=d>lUXDXTN zMPlwhSiz;~WM}@D>)En+!8_mAI@j}Rmi!C75wz3kRxEE)%%Mo0-jfff3(pq^4G`?E zi<{4(cx(Uu{=3&MEOeH%Dp|phk(v3hRXlFO+O=yHZ@>5|Yo6%h>Z;iCBK-E=Z|_^a zzwwioV<|MtpO=_x+{7Fx6L%K@u2o{7ThkBTi;{QdEG{rh(C zqGyf&pCPNBE!8?p%KjGrnSNe=((|5v(c{Pb6%sq1NF;M-EQp2t0NFzWy}MKsLFZc^>`st@)=m2ZlXga_`-=`EOP% zHo4HA{MAtRT!(3l_#9oMq=x!uoyWB`R~H7PfA?@W5@pS1m!$mXrhC@xKjjfz^Yx!3 zL~>6uP?uzk`16scaZ1J?VNZ$5(zb}|>-XaRpEz%)@5wMF|D(Us3hNB@pJyc4&h$8E zuw1&nakZ(bjm70hDOY59?qq5y)P~u(Tc2g(?B_mw_l{u3r%IK%zvr76MwRe2n1uiM zo$U8*{{CwV6m8B4Y&xg@=lbe1brS2pED*I)Q#<$ga8v!q)1{xE9BHY1bSZKFtBvdb z+x`++`%Xz+07ZoJI(Mg2-=tyE?#Q@uFFvFGCaP0Kc{e5@C@dv#;` zwm$+5_kHT7?tB?uQ1^}Z$+g@?N8kFFUV5`FFz5W@8}p9;@2z8)Y}a(-gGk1WKD(yB z2TZ@{O_RHHi@~3{o1tN${e876>gu55K=#Dxzu*7gZhqabm!7izf%~*ho;;b7n)|C)*#fZ(eN9w82Bu{(a)z{Dz|rO9Ya7rWBd8yl(U1$@$Fi?|gHf&P<(y@deU~Tzcp4OFAECPygld zP-Mf)hF+`Pvm;i|v;SYPq2f=o(9J8a65q{;P~-0v`2RiPo#E{t=ck)~x-+K&l-=_6 zP71AGw|2^Ju36Q0|E=Y{TJ(3{JJ%VHmA)K__|qI+HMi}`4uhu1200q0TEEUH{&^$*js3F~KHSR2I!D}Ic=i}Q`0U9yjpcIXTlRB# z^#)oK{;kSM);0b8XS1!&NjElKpTsAVc&^=*opnvKw#>#!S)!(Jl|)^nm0f?z<-hDI z2j)HJda^>>*yYiVjC0kR?m5+OI!%+1 zw9bRwK{x*0NHlt`w#Yc^IR`00$!hA^EwkZ4Q z@+FaMUuT`lj=VQNwKV(tlm~?mSGu$vWnLg$HR&w#%JPs6>&uv1dw-wokvTcnQorkX z*&m;(rPJs4S37aAEdA#EX5GIzKR%e`&HZ7b%^kmNh352%%M9l_W5}_|G)bQw_qzP6nwzWa%x^E9@^>EBB|op1Voqxq^w{+j1sDXKR2Yq! zX4{sp*>;lY`$IDdTrfq`RVI^OZOhTCHzx{VM36c zppy(k+vEQ_8Rxf~vv(YiH-EyZnOf=pyMJFSM-^v7O~DsQJ&6+Kj}J5dR33BRQ}v*K ziuv=$hp%6LCbRMFldpT&9b5d4Z+NlTV`Iu<;eYS1rF=e+(D3uFa{uW<&h*a6%9akz>b{ zmh!C2eqLhr^k6eP=!nWW#_4@O?tR~>Ds~KpRBz0 z=g%2zd@5!CY8DzwELpv4)`ll3i;^^K4yd_GtGjC0$A;++|PK6$U~ z?r{;9?A*OgEIe1&L(|r7{;9PqK*fpIerRhhC+}?aizm$`KksFfRs4Lb?f%5ryjP(3 z__3nMMC0}A-~L`#-G2J``gkiH`F{@u46QDo+HBs-(dY11^F@5zYule?a<$6??v*9B zMVMGNx=t2u%Jty1i~oP@N&SA6=qEg#EDE;wPFR=si(a?g7XMB^=h-=N{?qR3*hD7h1|)g$8ap_3NcjnlgNJe9@&r$@O*Eq@ed_xq<_uJ^fY7&Ggef;cosn z&*}RMY8PL7@lU%zSK#}1S@TmXHn2>byrto`nvJwk(94fs|L0x$y=f1c*dnP1{O6$Pr^ z$Ijw1n+I|1?Z$`=_ zPkz@6w)3BVoVfG*o#OL%W}caA`QGyR-=pPyOxa@mYxmx;=5|d_a5=QI$HU_K`g?a? zG1rtmU}XqP*?auRl+zM28Q#KbrE_Rd!Ip7x+@_se^G zt^JlyR(9_Th>i6P37HbVeAA*iUTTv&o z?A*4q624wrv5mXz%` z#n*kF?|Ybk**r~$J89pyx0jc&uijmI@&Wr1zl3`$RQH{~^!m50BHQt~XYbnkP0KE_ zf7<)@`{~tH=Y_9-tMrMv{oL@t@5+DA`u3kJb+>2V^K;HQpSefB^xUrbYGGp*cgM(m z+lQO$D|xn=H{>0dGF3bL)RHAC6KBjgQF=Z0`D$f#^>$uqGlmIMryiZA8!cgwzz`l& z*t-7AuF}_0f7V28%@Wnr)GT>dzPMoOOnwbFSIh_i~jP2b*oaG)H!fLzU0-w7Z10cL2lWBIrx+v9Ff&1mZU&j~U4qXUd9L1&3m!2C0 z+OS)H{DZamKWF~(c!NXMlm6|W?Y&}SwRMZz7any*C5G+pn{tu`XSFD7p0}B;(zucbn0vRk8cb{A2`NvwA!&?oOKP zp7rF`+*FeqEi1;yzuYcqt9oS2O8I6TjQ)iOpT?ti#)7{(92! zV+yvD_Im%B{=s9eM7QcGmy_?jwE81n)`acJpMQL1;M{cO|Idx~r>=X|vW(@@(>W|o zlXMRSzMHi3wbzNrU>>2SM`u;~dozoCF7|PGm2F?|%)Mu)x7B=E|2qdbO57Ar8E2EDuX%v6Y_R>SF%y2|CxIXmHKv<2kPQJmK1gzP!uUf_JT5cI3{o`Qyu2 zXYoJ{8^sWqEeqrt}ZkFtUq{bkG{sn%HN#5R>H}XmQ57970!?n`gTfok^SL^ z8yj6XSR@6TUr3rZaTLqQo%Jodns@C<-81nHK@K;ydH&Zs8ZGXGZ4;?|?#&gmqwoB7 zdu9EM@2vSQ7456uGgL9oe<*wOFZaFFjqj!h>1C|$Td+XEvg%95eIbLDoMHd|Zugb= zBKuo!MtDxzH)rR9U9TofpP6Ghxub(4uJWm9)t48J*Vo1VeAKPaQ1Rg)`_EUa*WcLk zat7Pp?VguSa(E|wjw`(y+9PH9YRMdL%gSeGW|;w-9De?*B30=BpAFsb3+w9ksq5;#ef#wE^!V!!Pi1i`DmCUPaJ&zS zvS-l#aIR;z*3v(_rXGIzG2Ku(QAYk%&)M@!j9)TKikNpUd9cpHwv21-%{N++{!1@Q zi+FIq^z3RIyFWko%FGwi#%(_igg7xN)uu*8T?;s1tetkk`v14>`@fn<@VsuE(9pne>GEYx zet!4MCS6@!79}fQX5ZLZoGv6RTx)DEb?%>sudk|w#f(FToL;3Bv9PjE46|N+Fl(!j z#EaNx9}hG#?>m2O!UTb!pglYHZQ8WSK!Qg_Rh9AH9m%lOQ@gsjPM!Lbwyf^!1%BPv zs<5>H&ir$?|K509$@hb>(~_%i4VEuS=<0WWQL;l@YlECsOWO9u+anB?FEgw5&HDD{ z;FKvXiYhGOk&@?_@|miWQ@Wa=FO6N!@F*$od!p7QPJky0#WhD8d|FymrGBr zd%ySgY~3ZGwo2C}9>{v-Td9Zkyyv~vb>R8LPv_M?+wjL+iY)Qx$}0T-?2OmE-#Wj| z3qA|!v$sX(|IK?>VSeCo(nlTHPpSfqxw1dAUzYo(v)#M0^y-_X^L^sAwKw~J3%Y%Y z_tE?BrzH3J{qdCVvV0N2z_O+2!Fp%8YP+bFjwjQ?@~WFoZYmVJ$tUC#!=ZEV_QgoP z7UoEYdd*bV=;P*m4Gcc>C!Efmp0;f_Z`ty`+wW*I+GzJUxh*9>%%FJQ zyZ)=|zUNvCG72y#9*KFNxW_y0DuZIhXLjEyZ+{eCe_U0V{ia}^S=*xg)j6+uEg5f~ z=8P znzW)N;-ZsYcf9wd7b^}dnHZ?+KD*&MULE_Tj|->VUwv_1e~ri~_P7L{>yk*XNedTdI?hFZ*(Ow?(jo|7<0R z+zkS44%e?4I`w4u%A36YW!r~G3)m`9`kv7c$`>jH8+oE z!hx4N-)t7W!Cqrk{_f6J-*0+xYwRl?959(HknZ)OWy&(O)V|<^>3R=;UAQpq^;MI# zS+B1x68rvNs^tTR;-@9c)*4#Rl~*}4clD(C;LQ)05+P#%8eN~Hm0Bd4%hg!~` zee=B_1{MXwW5-g{pB5ZjkaVaiw(fVISY*UDwLbrS{!5OP{ralBis8ij!!P9+RvND< zmo!#?Zm=Ml)y=u~!iB}0WpX@EA5ZoCv%zxL&7X1VS`1A46i!%Hq&L;xn-`e?UW}{J z^=bc$FTX`sgHy+%EgoJwr7RYDH^}I2`f#OM(&n=x+uWpFmllhU8BI+=!mg?6H4io} z`jeJ>NAlpYxq>s8O{|XI4X{wdL<1>$Slx z6sT_&Y3#R#1tyaCsrP+eO^~H2ixT)QNL*RmbMNI;m$qF6J6T`pdvn+MXO?N4%G9;GbI{kA&!{fI&?@$_eXeHW-#(AHh&!#ytjFa!1f6t9xv13Zn)xz*w9`~bN#j7pn-U>ET5UGB{;l- zP{-`XxaAu^SLX&%$D4=DDU^9qfY+*d2R*9%Mb5;T;XX_vWD^5*%zweW_Px}b-s9f zLGr#SKCUv4U$5A*EQI6U<(D(>KVJ0h?qP7wvb0?(13I3;Yj@AiRNqCHb7J&W%U3*b zKfOf7?a*Ath->{jQ+<^V*nHf3&}V%=>m%2Y4~sXNG*(=3xp1oT(cXXt?tKD{svqK6 z{0mlDZ%}y@(In5XjDu&RvV^?d1m)QD&UJ5X-l*<5*q@Y8`F5Llt3cuLOKsOU82SIF zrtfZ+XSl2`llsjv(s$eZ+HW`S6dsoa?HA{fxBKH_793b-3ObrC`}(r_Rh@=qVt4i| zjy=fF(0%f-^Y!-GR)U`;%YxfS`w(m?|cJ(Y@_x{=I zFBeQamtH+Pt@-Mw%cZRqCMV}!4t9--`K(;NU4GrP^>tI351g3y@K0jM8jtSH559Tu zJ&F8TlRWXxhUJTHCQD!Dw8*c}nf%MWV~K{b-*&gKg>$Fg_Ii3scWH&m$v=^?E-o7` zUcYupOMJHR>L=m$;*Y<1U<@6s^$M{b(87G9udCq9ua?hx&C|p!)+eycKzV-rKF6qT z84iiWV_%pIRv$Z6%yEp-B~s|8^YzwvWv&TCU+| zXxA?Lbh7dJQ~lPj&AIw7ikJ@zpI5ar;N5%9q3&#=-T9iCraR{|ft0(c&Aa|)YxS$= zuXWe0I=s4}<=VQ!x0k}juiNcm%x6f+e_Obnfqz?Bjr&~NMGXgSZ^bmO>5P1yviZ~V zi2bT{Ccep^pPijDWlF)rR&k@$QzBt&qmG`MsvW)3GqA4Kw)$Jjr6rzqw_5}1ch7yu`CK5a>)5MRN~?>+@5@G>ST#qL!N#mi(k-^({f{DdLF=yY z&tDgs7gppvIu%zx^>6aA->lAd_x`VmnZKQjXp^jHb+yvqLL*9GZM z`y;+BGU7pQ(4D$d#0hZ!WAZa-H`7RlU=T9rZ8jU0N*rmYc=uf6nG( zF1h?=54(@Rq@O~|xE7{oJeuvKekNtwUvIIie_pI!T>WLP%Z&DJr`KGS8@`0{>`J(# z{LiE0f#ji-j)M>NmL1wR_06g8DN~c>W0mq1)C!v3|FpC{8e;kV)S6G_g;ic1TX+^m zU$Lz_zyH+E=yy7Eyq!*1E@_L^&6+baM}N=#@_d;|KiUjlINb>U)S|QXug~%e-7iI~ zf*Cws9(t#_bN%6%4G`m6y4@N z8CTn9;?AQ|_#vBV!JiASH<^5XdMi6qA@$95CwYOs#YOx(rPt?t*y}LC>YMjM^P>+6 zr%m4aN~iNny>PS=oAA}Yae@-2Obg8)ZjxK5l`pAUJ%7rq-Mb2l{~Y;JHDSUL?r5F` zqB(nGkA1CoV|bFgFYuO^c~$@GLV3lxdSdHl9e%QAf5<7bu;oThF`B9X?(j#;+oe*cdkL3`#v51lp!} zUjf=hGWpZjo7`yJ(vW!f5QBzB`J(Hbi=2Dsm}*3ocym4Z=-QqVwWf96+$I4l#|<~F z1Gb)e#>S~SRgdw+>Er4Jx3`Ee1_V7_bn98#rv{Cnq_atf=XIG`KQCpHn|U|XN9utu zccI4pw!2FWmz7%x|90={-n9M1;-h@O%J~%S4z-+p=*ZNlX8W9{SFm|^+oucFGmS2+ zSspxP<`E5HzUjvn)<{?F{l5KE=w#uYAMd0vZqVP}wn0JpId6Aj(0`A@%crZKoI89^ z{>Nqa^x%V-lRrAIue1KGb40eczVZ9+eVaXIzmdHnKTS$y+rGkp zYpiBWO}tm$uC_@!DkJCM(9x*4J+-5D{OJo~rreoXeE;hjcQ`&=;@hSC{CLv+ZH4{c1Y^(nDs0Q+Z!9?O`7pHw2kM&Oi2-Q z$p)ip#>Qg;KEE86mF#oVx%XQ{KYzD3o20WR*GUCE1JUKj&pkXf_eJTw12?XmyI%18 z!Sz-Ft4*uFDJ(tqVhOk8R1;sD-7nepov2}L@UFV!yhXKh@l|#M=_U!OdNb!o=abHz zDtx06=Nl8iB`Mfkd)`(53yaj=_nh5|Gd8?Cl72=g{7wDxt2J`wkLS+aEgqq?^h%4s zdFFn`dO@c%(}S$6|1fQP@W^xL@sc?g6=s$l3;ehBM18~7DU+6ZPv4Yt)99S-_n2iq zGY|dv`1t3?&)d^4@}+yF~}soIl%lKU(~z=Usiy>iZ@B zYnO#T_bN+iEBkWccGmy>E?zsu9XK|!oa69N?Yi`^YTo^2e#?+XYc50Sx_=Z z&YJzyb_Ic+mnDMfD(4eEDai_*JaD6v<;B@4H$Dq+D4qT2>6TP~leao%?r%2w#DJog!xIOmP+~t1%aMu~fODp)5FB#2nNak{q*sz;>LIsOLGqaHg z-)zT~Z`Cs<$m$q=Ve%I0iiw`sJ_-K=#@Nn<@Pd~1UyDwShxl5hB@a2siWx6X3Q$0*3v$-tHoV5Gj zUjKDBU&pQT|TAoBXqAO5uXD(j2VrsM10X&w9C`()nB%th;Rw!3tD zbeJs66q>s(^RsW+cOAyM;G~|$s;V@)BTv0T! zuFU4LSg*)kJ)fi-bMHp}@3;N3SF3l+$wH6*Cyz6;Q=V(@z z$XN3H#K( zsEU5D^@`rb%I_EIy9o%Exm)?68 z7H+q;*nWC`Mdj^Sn|+1TY?goCddKn!@5FrDGrZbu9t{&3IP#=E_$#*b@qf2Dxcc_{ zsSM%Y=c%WC{bg;=S1~KpQa<>h#U8ZWS$GuN(g5kM{L%wJm#QH9rY?%YH!QrD zUG(SHw*32kb#->ug71FRF}bfcX6)efdA5x4yqV>< zk6*(-c|Y_z=lNf`oUgJsku$i{Nd3dHZ|px-KFI!g=7)TXn(e;x;ff_^B)@Djc)|3; z?02nL&KzCSmx)fFRBbGh7S5PgsC_@>Z+mU(>>o=DRPU$l*Dqf6O|hk~-Y-HI)Iy8+ z6SC3jyD;YjnM=VLYoEmVZz@n_D!%*pO;>qJ(G8!85=C}Zu?li$y=p$(l=%A4;!f+6 zaD8>vH$jKa{@t*f`$tiI`pb(s9El2+C2Uo(3*!H>pN>nveDQVaj!Fh$tMy`H&Ppc} zr*GK*WPZ)g{oOX(qqlLGsBKpLA6B^}DbPJ$ih*lY_=n_cGcV5=6kAIi%;(0ng8L+&3lo8 z+hTgAsT>MQ?|#)Jy0w&Bh;5%ji(bR4CQ+Hl>WNqGTz&DS@yM5X>PxPb_3SG+&b+DM zI5R_uy?wmInZhTz`y9irvF&E~WOiSHd9gcpaEAV)Uv`R3kI%btFuU%4=9&F*mf87> zHx7z6FFhXlYP;`?vvvK+zipJXitTehN^#BTfSkg1Dt{7$k$X9%#(TF*?)d=6%HM3u z`rpX41?sQZR$Wmz)BFeHhVLG{pYPenC(@W!~DTU#hh7 zJKex!(gcaB2!nW*!a*+hX`rQ53#s4teh~GBT-8|;ro2`?A9v3|2m&w_)e&K-wzxehpk@#I$`by2^=7rZPa%ZDE&!#!A&!06b;pV1Po#nS^p0sDR(Z21!4dXvBFE~-v(thpV z!lTEYUSlg^oHJ|h(W1GBe+kG>VLQ-XJ%7TiFX!z3ygShzbNhLqQ1fmBrH3)!rsgI^ z2mTcb4a&;c`tg2|``;~{yUza+6|Zg)@Vy){i&w?0W={NGnfBcRlNF~Onef>nXk*8d z4c@E{Wk=aPUViKSU@n~`c`#S?(8~+-H)2Z=7;aB<>o7AY-{);cG@J(Q00R1 zv$*@odo${0Ua%@FXPo^xZ^Fid!Y&04Y?%)?-;Deba5rypnnK+545pTYBF={%gxAb} zwe3;pCY#r>_v@zXvd^`fu%gGh<@797-HFZ{r{^D*xp#iO+}wLk8J~O{ioQI5o$~6& zde@9gC7*cA7wuea*!oRH;l^zB?3X$A_y0}(elhEs{`0azx@{%AiB9`H7{cD_9DbQ+$s`mS zU0*kIa+|P>)HO+2F$d4k+nj|LJ+?| z?#h1Y)X+CdCJJ5R>iJ(v-%Yv6y(9Ih#(wh)skZNg8H6Y4GbW^dI}~sp1l>!3eUL}Tc&)i?{(^U-QazD#pccn3%;oq=XLtA zD>~+#TD_-U+k3j6?YdtgPp?mzJNIn%`n}guem^?eJv)b+_g%!h{$q!n|MXqInX|3V zVZT_H`INf_bLBOcx^qlyHD~xFF2(B5@VsGJ;9RyjsrUY~OCL6Tx%Yejn^m?9d&;hb z=^Xp@`$cK|_k#~t^52^?yUzCU*u2ftKa^cbm2$bYESW-qTDAtc1?Y9!TadNRr)DOCw?-d zgziyhEYh-5QvPIi=q$4b&(4M;6S!F%R^}?dF4oJoc->S`TwitMj`xzv9UNR9?vwdG zt=g9rep~05-?WF$8A;kes2G;Lu(J=YPo#_jttmqBk+Z`&#ha{W8@z^=Bxv3Eg_h zKSjPyx_PG^+k-V$7bY&hl6aL>d&Rl`Z4Z8IX3)6zxnlRUeOZ1Lw?g;T-#)#)V^Qos z$G$&n%TGP{p{b`O%EWPE)3eS^!)j<@oCx1Sx95p=lzS@`DWA0C^xUXkSv znEYP0^!17lWl8NNS+yoFKW?}_&-n$*K~6EP{)lLu*M(Vo?tRX_|JnBa+(f0!kdotm z8m%lV@-A!?6TZ=@9Qu1j(KJCR0oR%UDYv;RPc9TM*~$2U&0yM_`o8Pi@8AFR`puVf za$KApF8VwbS=M1JO&1vQ>t?pe)};11<^4$GXgn71jHj+M`?p<_%j3Uy`+uMM(kXZL z$duC)f*vnjTmECNzr2Ix2Vd^98yRXF>diL4w|r1_fP;tC%wlsQsUd`95;U(|y&GnqD78n(EYWMqn-Ips51x?pDRrvbO zPUGZbJqPo)Z!UQmB*T|q@O$0vcaJ9f+bJ4vu5)t<^}RgPS2i&6@%M5iW+o;+X8Y|$ z9x4;~?%X}IFT8PjLxiHsiYc2m9o)BW>;L=wIhpH{oCTO0*O{*Kvboe7C(*H0g?U20 ztbbwY{x{dS=0!e$tp)Hpu4ne_+_$TxZm+l!ue5KkoO4oux#9BT`neZo*@dT{ zRpeVIaYy07!;F}gP0jizSG+6lYIv}2%A4wG&n8W6zp7WSY8#eRb*FoIS%E{vtDL~P zAGt3xKkSlf4*FoxuWRpD&2qF)eTUg`afh7ytc!Mih}N{#J#UkB@}K_hAGh>UFE^^? zxihv}%T3^HjuQ%u&ClB>6pNlaawj=WF@1GB{U1Afs#}l(_qtO8(|f!V-oE29dzWj? zvB~oC?Ra6yq$g(_18X+l{QdZ*(1PS!CnCiDUHG=?*=(cLPd2lXegI`I3)o`v`JNc~LZ z`{XsNOwYvqxnNx|%deQ3T`PRI*uC3mSNHaaeY~w{qS|{wmwN{&VjA-l;!L+gB8b{GK*9>+H2f^0jjt(wClnwAwkJ$w2d|(U~>{ zlb4Cv7x`!KIv!zPR=A@`{r9Oovgz$wWfNpB&3!WA-M(Kf7YZ*QcrL*4Z}wNdYVW_l zExtDXQCd3Z=EZEKrFS%2ZZPpM=q)j02%2sFtE${BG!oOdy2S-MpysIjr0-b9<9&SJ5I@clYAY zXU!jftSGRW+aqDv6dqUETKoGO=ot3dfB&2Hea~0je?&iG_0c0oYSfqRc_*>@H~$9_ z0S+HVF-8u>M-7TwQ~xO~jk$T}ptGFdcjo?`ChWJn>QWNkxTKZs?>2R}f1JO1`93BCJzFa|Os*^R=U6fS zFQb6GO{>;(xlP()lVUdpF!6X*c$Rej;ZAG*pXI)D>ikW+e+a((G$r`4)twymD(^c{ zz4|Yh7F_)HwVPMU-{*k@LtmKb32()VU*x(PE%q}nX9vkWZ?%*Xc`LsoTGL&)L_(RUbkR z1+7;y$a4A2s-muc3w(0mDbJ;lRUx;Rq}!f7^XGq_x90p5k%EgWES|;RbdC9Wg)j1s zo8E-KJHz(M^)VfD&8UsV3?)JQq^ebFCxz+y3_MeBpEe`!T$6jZa-^H|h z`**MZQRdC*DypmhGC1aGmRUmK&mSyq-?_ve#LjyCZ|2;ix3&9EG4Bl9cQ543l!F&- z{vOXu`nfFWP;+n3``2?lKRwzcb6?3tyuVXf*)V`*=AOkZ>u1eS;5s$eCe-@$k<3pu zj6RFMF@2jiSBW9)-oDUx@w2!cT--Q}_seNtTCO4>@!EcK;;;0@E$3D!Cwiz26w=iT^#P1J!mB${}9-RKwIaV|1?oQur@fSZcvK^nRdSLgPt8bg*1?AsXN6D?cb=v*+yoZzCl^6eh z5PtN)49|)s?VVed=h|C;Q2J@w-ofwn_^amao8h}U4^Or3;P+Wv|E7Y$OuXi`_4z4V zvR{Z9O0*w8C4E~y;}T!_)k0POzbyF-Dcb}dDQYei&S%e1-?MqaEH&lKqZgHoZ~kmt za%8*B;^n5V%Uyoi%GuReSeL(hGBrHz;j7i_)$Hu%J)c+2*8sXHcdp;^Nei@>w;pU} z4~~sJduL}cJ+_b0lmn8($;Ir!x3ZROi~SNwv!RtqFq76{(6 zQ7FB+ZT->ee$8XEwU*=-FTG!T(rb2R_(HAJ)7=`SnY%h^y=t$6**y!Wpw>I=@Ay!;R`^XhBIMY<;!=~Z5Q6IblI z@vVk_&Q4z@ksCim@*8gCpYkg^YQ4$-P4b}?{O*e;#{Qd^A7Ao7!qDoeG1sc_fV}%n zQ}TqI&aoqLSpIKCY z?)TGYzjAw-6dtY&S7>3({wP&se(ik3OOvF98(jEQZA!&lcgrtLxP8|s^F_3hPNmwk zj>biL(>)vt*i7&9SSW5*0rkat8c$vk`Rj0T-tmpo^CxO1?-RIq_uT@k_r+OVQ8ly8 zwcqwkUG(r%blxyij~!wZqrNBiuTbXNb{>z{RL_x^P`kN+rszHhJ5KkdfR zEfWiSUJEliT%KubzHcV_nI|;I}^fAN00| zrj~A>k)4t-UErdv<^-+P(u_W@L3g6ugqr(2aurTx@R>4AML99`y@lik$gD}z@w${AY) zZrk4Vjm3fCn*NREwI>wY?_Bgf!r!S<=b>WCT2@zSDIDF|eBp}2n^Zp=zW;oA;ajDv zX9|}$&s2E%Tty%(T27%h%jT+k?w^ADWh!g_J+F`dmvHG(_&P?l{}VnNUR}NH#Of+r zl`1!0b=58EdS?$V?2=t`>T8)_X2w20OU>Eu6XZp#BbT&){XErr@nxQ{l>MhCuG+h2 z+uOLvEc;VmdMuNIUWqoCbAC`~|EDSbwl<34$_}lYK|f^oE^@nMd&&C5t^>1%rM-*$M^^CO!6hOz&3S-R|R6 zxni+s-9D|x*=Z@;VmAo-HlGjw+21GT^q{Qz|Gn<+ZcndO=N|@zg}L?1+1}Wi9o~L^ zsfKz~WTd23Y^_86!$Yk%-j=1EpVuqkt3F-!9Cym?MuT6ax%Z9wc~hT9-`KVP?b1H0 z7p!|2C!BQZXgnadAn)wF@F?#|9}ZtF`u{=w=(z_WRqyq0pE-NK@5wAXeq)O~qhPD} z=EKR41CH{UiPkhnf39&nKL!?Hf-+T^-^4aOj_lYnB|NQi|;Mv-*5Lv zEUbL#o<+x-lRW-Jaz2^qJNIKIi|8?ya=s&w(Hn$3GbOQ$7m-&FP= z`yDu4(C~ygv;P6U>AkH%2A&@4@^0)~^XdBw+20&YvaY80lS{Aa8%HKZt82^dc5ymk zsnRlsx#8~I^WP5rell;7dQ=Ug6c^u#58egyM67xlYImH_sa<-wk)hkLbIOO)g*&=6 zHm-dh@KgFz!Oh!ssU|0bXC2F1_}J>ei^A~7Yxb7?YT$_9xl46}Nxy9RS;v@b%T8x! zt@D~=%3gT=-g=$DOWX`r(QpPg_T(sY`$)GZ+?94h>)p_`&GNXeOvO=EfE;jkB z+VuFm+Oq30iLs`kUTeQHngB5^uQtwV( zsbp6IFRA+^t&;LMP7|~eF!R_6%h&DR2e~>qtO8597!}2s<$Qk?HGlEpR6260sAk`q zTSx!h`4#xOYOaFG1&7|dm$Q;SCodHi5KB4o@>)%94u9hs!AU1y&y(Gl*jQojln}%E z#p)q%&H3(C4VcPSzFWDID1m1-jNyX zPkWq&r*-&Q@n<(Y*|pbgF6U;&4Of@!KCXR1f~(=`)r82}m-_|k7AUgxmu$Zwc|#`L zH0q<(vNu(}+ot?q9NQw0|3LO-EY}{+JCVDy_e}ZJF2=t`R76C@yGA{B};2 zr?WU7B}cPm5k@ArnY)OI}oY4>N#>V3gh_V)KDPn-7b+oz|e z`%5`>7+M5oH#i>XyY*j>HOFDslucJlRoeGzJYp_+WA6Is`$PE*p0EGkWQRN7nlF5C zfpO9W)`ar%H=mdJP7->V_~+E=C+CjNc9BS{TTtuythPjnVX~rFe_HOW{KsED9qPIF zNvz>*_tE(*do*Uvo>$Gq%Ca=^Ri-?<_0yN_kd28T}{tA9S5my|I5g4p-}I~Mos zzJH^<>i(XV2z8Un!@ttoe^*_6*6Dv(*JAz^fz7SvGrww@fBBZz^DFv%+ULwGmDMk{ zZ?f5(x#)_p2eX~%i|2Qgm;Y{y_KVPYR5~eLAjW60s&8FsZHn%(xeF!1lELU%lThU_BPBS3+MiGh}o|mRqOvWXGhE} zufF%wX4rgEPVAGo@u)8StK+6Ro6kG$Exzzr5H=J>VvJ^zyN&eq=6de>3;Q=gA4f2j6`+2P2aS-IA>okq;Za?4M4 z&r(^x*7zZ_pf1bb)(1y)m(=svl<_>>?OA%8BPYC){pqDMn{3a|yWuCS=%T;J`#}lw zG=}nP&zLiVix~wP6uM_er^!88Bgp!q^lZKUnvIeb-&d!I)lEM0a@r|pR);!yzjg+X zXroE1cUE7k+qFDwYlND%{)FZC-=CUR>pOj)RUmlL{mcWC9V9;JYd#H@U7P%dNicBM zQCA61(M4|^I{f;rcNkkvi-_9Cu%Bt=;tLrG-#>Mybbs$F-`1%xc^+esP`k}h$1lk$ zB{x)4-oHHiZReH^$CNkxPM-L%?6PP^t=IBPc~*`a1>U?fUHnxtv5q_c^!N5pkM#|&-0(YZ=OW7Rv-XEBi^HogucHoj z>|0vmw?8d^H z!?Vb6k)^7)`C2xvA`+!Wg!cX zz!49VdRp!d9>7Ntbp3fZkP&k0smRge853MuEjjrM6_2dU>s>Tw-x)@^BxMh} zX@bKML&d{QW!2CP}5xcIc2{7iAN9rY^>~&4{`Z^C9A}Wv*GT_ zi1lIJ^lyFV<*<^F`D?-y~+Q^ z&lUk@#wAns&)MJwUMCwU^0Xd0Cn#(5Y?^6j-r_{INjxjxDc7;=5PVbaeR$FQ`I2+4 zSNu0l+IY0njQ2>vfg-M16;Tsk$O!H9WtYFJogQLx&pvG>hoR+<<_1QOGs_qCG6XrN z+j?zU+{5zn;Ei+1G4G_dRot=J@>{iXhw^h_r!(wwEG!#*ISd`WB5!@1w*CBtxYR#i zZ|!wyG3nhrgW06*t6p-%dn3KGT#5f)+n&(;Gr#_|*8k=btCLrsry6HxZPRzS5m2&Y z^2)`ZW*QmIKVRqbr1j`ai`e6KH{(DHXPNZY)c(;d*f`}=i;ubF_hlU`?T*yMG9-UV zJM^LM-WI?1W#)m&T}vF&50on1D)eDFn(@Yn<6g9#vs~7m-+$jK9a`|XC}BoJ1k11B z3#T5dZ&W_v_;_|~?T;M2pzN5GdwVKtO?+oByZmyJzpL==l|h%cgzheX|F7ucB3Ivg z`+wUBT=cUQ=Xjx~@Fv9M!*&m@7!R(N2fyQtpS%jbD+fwfmUB5ZXV*1`gVwM;b>_LuTW7cB(dGb}GwKdPzZZE}S7`)Nt}tGP3`c+Amf zS?}FpIaQb0VcX*54Xk<6n_j5L-TA6tSzLXJTQQBHJ4-&RV!HNUE{kxv=hL@Ax1!1L zwddb{@lVy}&-B0aEvnxCb) zvidC*A{7iPem@pDz@+)~@7p{V?lxPsJZ_(7ntNYbFflh>e(1hLxZ=fa$s)(QZLZcw ze=^-;QSy)7?8kI4t$%X2zU%|u73XK0pXb@b5aV0j6u!J&HgEgyN$v7=72ER`xQDVHZgrXb!Lz3JmMfAui_?xer+d$B3a8! z&Q{xdc5hBFGqr!U_0}`RB9R-LgW!dS2WNy5I~GmEeBZ9Ta_{EHvAn&zdJ zvr7xN+&Fk|j@12sdYz3DykGw^T{Yu(_m1&|4(^(dxPcPW}Q-|UnP8s zrpI~?>)xCi`!>6NE<hx&Q~@_eE%>KcAU z@-Qm03AMX32JBkjb?VKp=W+r$3WY9H-WU2d&V6NLz3tJjzU=+46E04+F>AXp#X;t& z-zW3wfpr^>t?#i^YWQ(b@J5%cNRDRy<5On(o2ofDos}<2vWT{?eX>sX*yAfTrQW`i zwr;u*ZdVt;^6Uh|DdW|e_D^#AE$?{znc(3xN$1AtIWl(xynGvF9WE#Q`df7DQfK#( zn@%5CE3BU%^11k>N6In6K}7VNkkRSwK`CGV9W#Hy?_4RXH?uM<`a#C{t$9QG< zpZVpm-^eob_l8}oYx;M)@u=8t;dkQT3w@Ike^c#!->nDjj_FIHk0c~92OGZVky(2# zrTisZN;Bh5rx!2ei`hOpW?I;ml}*o4SpQ6c;phF&f6j?NUAs0mUa>{cf?>%6*`I&S zHi+auzZRnT^m^_dm$g|k44s_?AKv|$Z@_LM8FFV8v*p2<|1TW&KivR2^JI!<@QJf$ zRaI46SFO@wVq((J(^J#b?A-l+pLGB8Cr>;Bz|9nGh9r}J_SMg2zTLAfK0W7s<^AyUdn!MF`2OAIw3fDZ zdF=63E@z#azzI3WzZ{0HKYJ#I@19?j-B`Zc|AxmUr}jlxUudp4pBVkI{6@^$>uUt0 zs@nNf6*q`8{u1z#`g|j3kIe4XUn`}vx|Zet&`|ob>*9kIimQ{9kH6kz`}X0!_sdU< z+uhPuli2bsU-y`at%L97xI3G^?v%{%ab3>2dHp+WZv7iq$H_SEU~z1-fE#fi@Q8~&6;1i%h#4@ z7Rk@bdCLdG@U8{b{SY zeJ4(M%un7JwKgO?{IXHJfS6d@#f&A!F?!;vs;UjofA#kEsu~yw?7r)lnyMNa8mb$5 zx?y3z%_on0^NuF8VeUvXM2D>l;kdi~RpUQw=Ar-eUS7dcJW5aDWlG=*o@-{h9K^opqUmp`1d zt+ifbqO-pA!vpK~C+n0;|J+|c+2#JbxyS9}_b#7gzrWPOtzGKpXe|X!znv)*5Gv)IZDEC&x)CFl?IsAlBgr@T0S zRr^?}#d%g~?TFg{c{BI#`?@{%)RYLlI185<$~FDPmoKwNd_Ewz@?tiJCuhQwJNK0S z-g@^$M?2-@m9NXU{yLa(vG}C5v+JuZ7W4o1rkaT@tJhZk#a8&WtME{2@#i_2o!j4k zJpVP6_$)*5ax5$6xRM?{g#I-HXb(70)jGHu|r!yoyck<6*`- z%1h6PJJs<1;o8Cf!;{IQI&Y83_bo^H8>alIQsdWsy8Gt@e1 zPB%(9AuzAv5$CGat1F*ObnocwRJ8w}(!MU>Px=g-N~0jJXXoa2pG`~t_U7i9na1s` z++rnB@yn;)F?xGLvbXfC>(829R?}{^>A9ZEJ}v*DLw@H0%DVf z?t6Ai{lsPdKbzieKbh(tcRXJH$YN!C!RAG3zo$%({9IXbc^$IE9|@77P5FB8)+#is0H(8q^o_x`Z<`1|9X zc59sUk!OG6Pw$!4&v1c*S-3h!h%J}n^=G}wVeX2OfuCK^Z@8J^^7`{p-P{}-J7=+L zwFf8MFn8Ti+0*~FESxoRDgWs?r>4J@v+3?xkzV`8F6gJ#@6+?AOrC6We(8I@^b@m| z*|yAdH&iU#%5Y=j;0VuXgq6XJ@INNi*&i)1CDD`+Ic*g9(wF(>gmk z!j_-v>f*Xr`#m-?I@;UAgJb)>s_gcS*;!c;n^HP$>i$?vk16W(@bb!vXKi@(Dl4w) zrRvNH6Ao<2yzJuP(cxcNR%Rw&`(@&h$5(&8xz~TRS&H{_)G1}q;zZ$fFE8XjeHgBJ z>!Y>gETia_@Bf4uSfkTUzPj_Bk>j0R_YK8-u7*ps{lU||Zul<4a?Eex?Gvg@3l`?+ z9uMpPUisbdhq|EsBj<e!Wk9D4JoyqH9uEB{`5C=?dlJ4|JCC6 z{kdAWvnIOr3P;7WW%CyKJ24y$HJkVI$&8v0cV%{_`Ktyhvh8w;*)frI`!^xOg>GeX z>z+22^PRNcGf($^e5gmr21fhI?;q!W>_58aL*}|W)5HCJR!pqCuEO2husuxVRR8rV zr&&`%ZdZP|D^s~=3umv}hdaJ2l}yjgudV!g=leCspVM94Q*#$j_HK7A_^tZ!o@bNQ z>dEH&PEIerXQ^`i-CC#hqG#sKQZQkfz~VBkSlwX7U&AHw_wU|zKecq@3@2;*Z&T|} zOj-Tzrt0VGQ-#fqdS+@L?_SY3ud{W-y~dbr87&6x5+|c$Pdzs_JE@7)C7QdU z<}y#^mNfl_@IM+W&Ohw*4L^O{%y0Vf*PC8S+qJp7>n}__wDw};ad-A-#`%X!;_j45 zmwwX0iF>sR8e^oOESBKQ3XN zeDLUtf1=B;x>elKU6+6F&+I9eG?$hz=_-n*n?7f^%CtsOWS^U2FQ|sI9 zUJTnyKJI?seqt-DH{*`<3#*d?uB4n=^V4Qe;;cQ{S2cES{UNRN=TT+R8KcB&(F_GU z=hn>o%r6&F-dU6Lxa6jiR{XT0_6$2snKgIL72nRA^nKkth3n7in*^llCjV=>z@f`= z#`eq^wqHB$gni1ky(scn*Ld&wn=cx;4KtiKSf18c7w?yJg7*v8e);y*({x#{pDeB1 zKdIX5pN_O_rNowlcE{(%@18Q(wfxkgUF!`q4oe7pHcvGCws1q9WHeV=rTVGz>3=-s zR@TLuS$$fuxpGhNp)<;i9iQy)XM4B&v|$u@_g*ku>W%x#?azPo?A-iAZ|C-sbvZ?1 zf@yLG7t9E^J@0vP>jB>7pLa6PDZf{#q@>i;)Wl@>;{o%`>C@dKA|xiO`@d7Ds`-4@ zyy)krr<;~6X<4v9VVUo2HHNZxcQnJ-#b}1Fk9%wT%y+ig#-gWQI};DHt-P8w)3SIO z2PbFZ=Vxd4e7{%y>GOH}>DAxgeXWWyH9q@_XAi5@vnyFT@%}I8S#Ek7ANw#}wxwgk zyzgeWbvRyEp65JV&#D^pUiWjqMEAk{p?d_SY&nzniPSATToCbD^V}R=?rkyZ*`KE; zaClh$JejjB=l|qQCFf-#Cw?w}zwgrC;#82aYTt7s=YD52t&~@6>D!_BUqouIeWCMx zQK_{vS1ryDEUww;UmxmzZ%N8^`P8!?T_u>Sg{)H+a=fmbzTHOavE;;>gL#QOUiJ%p zg9_emtnb=9&DeKgfQCp{vFKCAMIgqy3(NoZy)O%!5P!|ZcX6$$8t^YeMZmBObpGUEPP$+vqO zz23R^(p8zD)eG*Z9skNJn6_BVe(|(6HE|BhEqnh8);4#@$vD*p3P1gwyl&T*RDdP!XS~w@^6)=#chk@+oSCI!Y67~(W}Uki~W~U zKhJ5em49+_MdLiqIg{pw*4QOa_SvcPtjA@-feQOe>%N`Yy?#gX@-tQT;tg|BTZ`UX z?=%Vh>BlqcR!2nC-t_{Z;R#RQ{?lHPV;7${eG2DeDxAFn)ny((N;e!acMeT(|(FNDn|**#P~sdfK=?0x?4eaRPQ z?NIv4&m!ftCoyi1qLa_Y2%f|z*WNKNShbR6^=3JSSO(e9*=a2Tjt6!;JIjAd){-INXL&Qgff>>+m%Z2c7wCk2JAzZ@B%o=EFhuJEhlSO-xM# zgM*!YecNTea~+LLyt}K^XQojrBQx8CnKL;Lyk5WmTu;5tD=(e) zRCC3GInRQvaOuH42XWJdq zm1U7;=VaKudQ#MF##L*qHCFwe)hw#-HCOGz^Bb$z%ue-tYHtzrwQY~mT1SqBhm(Ai z_m^?@_C4n5uI6u;^h-3vJhke-e8wBs8JSBg4!t%qN-z>KXL4NfzmlQlXRjE8D)0UB zA8Y!;_O_nB+i^KopWS7@N|Vpo^@&Xpy$er1+cy86OnFg}5yNb=+)3?xvQDe7o@!}f zxwvV+?#!7pZ{(Q0Dcim0&8E{X-WI#|R@-v3^RO`stNAb_TwfQvX~&Jt6I5($?nv)i zw`!Hwv**u~x8FW_=FF70M_g;y>K5&|c_C0Df7MOz==E&npFeMAeYq`>OR}T>iA&3| z215paVA^$ zUorb({%bPJo7a~dK^avD`qNqP|@uEhhfQul7P~vJ@$M$ zc78Y4NzJs-^!l=Q-)>O(BitS{VZ;CC$3}%gQ#$0I&J^jAdm{P%Mwd|35q^f3(?s&W z*U0f6^_7XJne#xU{-mUeSFe=BqukOTr=8|+>iWCY?snATHv5pcvO|VTZh!wUY55V3 zhC5SL?-});F5b5*`d7lG%6;0aKifO5H#D-!TeUqmc=nHvx*09g41#%-lb3TfB%4-S z`#jpJy7XrEl9M+b%ASV3|EGL)_sY%TLKz&Ysuc{8Po)|Bd4BEpi}IhLDb{=8!>@Pt zo45XmX0WsQVDeY_*kp+*=MHs$3wpm|*`k#lzr*|wJ^XfL!S+ytAdbRS8>Gq-rhcE} z2|E6jbsgKY3w{iOPG6WdJ-BkR=j^j z+qb@!yK;QCb&CJbs`vlc+}>vHk7?_ZxH?c@`f;?l#KQ2a4`?mhkE$Nj|_ zc6(pH@Z`&r*8;hdGNzlZS$c6|cjW!K7N<@6uIngWdsJEX*JW$N8K zW6l;|iEpBxN3T;XRW)VleW*1$YqKxd=swR@|&l=Xh~wL59jXSmYMF0uCobe zNr8seSfZMIC4an3;xzAPTd*b3b@}nkORmB<-&h7+zG5|h?Zq2^@0P?e2s%~logH=L z#kBo(b#*UF_60N9R(&~;VPaJCqriX0xi@e0dV@nlU44Cd9UUD(=j%Rd;?`TRW5*28 zWnE`yoBzI2y6An$QSXdTxh-nD${1qGm=O{On!4drG*|@~z_+pRL~^>|7PK=V|!)`?}Iy(dsAW@3*{~z54FUXFt#T<*g2Tyz*T} zdUEvaQmOlv%M@3NL!US!pqmcQI<75+x`yB}@r|D1aCUzA=&s=!9&LmY2K zJyO4QI)q_4DG2v6EuC`>VE3t`~Jqh;QuvpDMCrY!{&ul~(!@RfyX#|%jzr&k zu;Ss<*za?`6kjuOpIEr#t!&GrX-{_VE3>eO*eTonQG!`X&A|3+oRN3<#Mqs^47CP+ zFBj~1sG-WcGsUG(-9i4$8^`+R=d<;`%=EBf-5GRhS=n#1$AS(?EdmRJPMtDKz5KH2 z$3?l`XJ^*$7b}UnZ|CLhT|4Q6+3~*r+g0tuHO@`>_Q;)EZ#uVP&HJ~v=1UkvthRle zt-E=0ZDa+@1inPkk9U-JsT6IucWba_-{<1(q17O|^ZnzZt@pOe$^6^*{eSN{t9kdU zw1ejTn0di0zI}JBZRc)hS%%Ge6OOypsxk2{Tyy4kgV_3s+x}?16w~wG*=$vLn&CJ47R8>EovwlBk z)BI(#_L_v{e8{twDy}^xd(A29v%TU9%lAGn_Z|Pp{jS22rF6d|!DzadCXQ9(cLn zRp+BULE5#u*$p&q8b^MniBgdGpP6@fWa!v7v*tAxgsFF|edn!}s zefm)#oVIw{v9!j8<$KZ_SDx0@)YxA6dcL{Bl;i7s#rT%bX1{lGV&w5C+enkV%SFQ&<|F@}j!7d}Gg+EOSQAd zRsn(JMf+C#wfXfjxblMX365TcIv*DI{o3EA&2-|iSi5%e?Y!krZr|Qk-Mi!0@4`jR z3`z-4=9nC_y%}yIV*c^ul&_moc^IaDn6tj=m-CLL+`Si!G>Vk&%T%}jzCKUC-DRHs zx;(zSm*!2al)vy|#nLlXF?Ho{?oM9k$7T^%F3{lM%(0R2q{y{urwOh(kb2aR-y7Z53nXq&_M>S3Q%G_33@(wohvBjt zqOhch>CCl9?=RTCq5s;Ae{%)dOJb^c^qKn^87qVq?Z3WkjcWDpx*exO+%AQFg|~CJ zUtH|Y|EA3P_O{%|-TF4#XViUWIFy!d^*^z#Yu0?TpAm6yi`VWvbm-8&L&di9Id}zh zm&RQ4yczSLNFjpbqQBQp_C1x(Y-ZPI^6R`?qT6`#4BNW(o5KV1bQSLC_az#NZ{GPL z``yn(o0A8be_Yk?z~gugI#vTI~D&L1}5sJy!)lO z>Fr<1&VKLAytCCtx=HIgKFx0l`%$@vH~ZfAZ!0ge6l{5w+ZVQ1_wSdFF2DMh$3Llg zxV&Fk?}Jz2p0tVE^IA)dO|Ql7STgm|ul1>gf6LWv%NW{sPvd%>cIfQlm!fvdEw5bV z;+z!s@O$T#4Zm9jthClfZ`^J5tkW{;t5}fL#$BJDPCR9vStM3@`i|b-?|TpBecv%pO+M;EzvFNs^PuBO(Oc(|?e%a;-%VPV7BXHCqi?9_DiqSI?lrmS0H@%i0kF4d{+ z|Mi-M>U5XfcDy?A`jYz#uGjFGL|yvGEy?2$a;#Ws)BX4h8Mbm0967Idw{4PNx>(Vj z=}^YY-fIF~r|<1rx8UzLf5(iTBfQn|9KC|=rt*8^Z9pRc?qPgWFO@zj-_nrL@7`Tv znz-8XY(`j=mF;#=132K%q(ILLqFk*`g7Qg-e)+*{asH9N6T2|%q+c3QiV?jzdPg~irFq?oaf23*Uvd-hhVec;bXN|L#|nVFwUq*a9h;D zV|YRP-u&ImN`x6!mxW%+C|)R7aQo=TNBY;li|9>%^3%UKHMF_;9_PQ7=vm?7kG^$I zzWAN3|GAH6n(6T{k>WSMh5FWiRhi7hNZ0(?3!U39tq#}c zleIdsulBcueVxtr`*puLU&~wlyS(UR%JW}tzYJ&kJYBvcZ2LTiKMr0yXMzX3UqRGQ#G)oOhQkzWl=QweA_|uPb*L{w+)_z4p2Ao3W9e z!c5M)%P!x2bh0<_aYA`?_3NCQAyL~ETKYKt7kb=z61Kf+BTr{-Fi+3V-5loqhhDB) zx};9Ex6g**)!X)(zP%gDR^Ev#nSDlQ-);9l7r2Dke6tUg?7h|$c3CQG!Ph_YzR@y=B~i0n$oNMoV?g1L)R?|329qe`C}$3*$B{J(C1-CRI?j3JY0-q+ z`|?4vG8%O+HTVTUtT{s4FMpjGw!C&$*}}3c>A5z4>iTM)e$RZg=-|UQc2VaieN|O| zdpfK5ZhJull;}@M_ymew`KDlH90yH_peGU_-kFDIU!@q3(vXFR{lS`_IBz=v-4ce z&I|f>doAPgZkpM`DQGfno8G3%fU0^YgU|mdSTQm#&$)*}boN)%q9p z-a>!#GiB{R_bM}#NXwu6vi^9*_wxA?Cv)5N1?}y&gy&U!dSZAcI-=}snq}?J2*FuW zCq(D>fBW{dY)7HBzwD`ntxLKWzpM?ldGJwg=a03D_x6R|-RzwgIU!cP^{p$Txfe%e z=JEHbJL2b@=#V%*zir>+&yu@SuOHU3HG5@zQM-hLVI$+oJ@qFO3-8bJEJ}Z=^(=Rf z*T2*^MHlUpZ1Ur`+_!df4Ho=t=6C#M*@CMtB&6$ElOM1D@N)Z(hZ^%`Y6Khjzu6z1 z^YDF9=&QXk6DpX~Vil}<8+lvfH*C+5&0~+quH1Iot^7&+0iFjziY{GKjM#tJE@1b1 zai{o6i^)yXoV((uZZOVmXR;E_E^qmr!_Lk=dG6e^i(I=iva%M1uaApZ8&*_Ql#!F8 zqN38WYSp@@oIx7@=C-u921Z1jIMm9`_~YB{{GH$LRqyprgu-Rhvk6*SI z74K$!ZFJZ__T!fy3^Um8=(YUtEY1^Q^!{YT?tVCvP8tPD4L$eY^c+Lh=$&fL>1C z|M6b@>RDbDC67Zl?W;^GcY9TQu%~Y~&xe+izy3C` z-uqPk{p{rTDYmyl0uFm0F=TylHE3G&=XpF|rJs5F-Tk24+qdoWp{6MptUWmQ9)5l^ zDD|#i+0o6hRzId}us+#Qb?tVY(<7B0`Q&-;D&H4b&0Q0>ch}{QuV26Z`Q@_z)6(m)>c76ec6W4SeEYd#%kj5m z!otFbr-sM9EcTP-V~?--*g9pcetPzw-l^}I&9}clEL3heZO7@oZ?*aNdtL0iU%FxA zuN%AP-co3pw&2}$rhr|~&u`jh*)vPPDrmU~$6Uin2X-qh?pUzLB` z-Td`)r)-E^UF#*=wF}QLGMXp2P_w+^wfpz_K$q|J6Ax?uI=w8b|DXDU_PXmHUpIhz zPK#un%1WnsfVximGurNM{^>f`?N8z>j`J!<%dNHcbnbKi%BiMxqv5XR&#G+6pr-wv zr&*hAPVU-&Bjnj+9T|li@yCBMAATX0DC9R?W%q)>b$6p%znXlCJmNlM#s&SB83N5K zHt*6{x9PNQdzMBHpMUAY2L)%`c%}KT1jO7lR66kDOM+5!jWgrgd$CV>Pm8`;|G4Sk zLzNck*1M`FPi0S7T^?H1uXtJK4}( zvi0<{X+K||IvE?qufxD_bZevEE|q^PMrHKe#6G5Nw!zZ?G@7hlwMLQ)NZy}&$?Dl+q{wL?WlYQ?$+Z}lIMq^QL=k7TZ zo}Jt(W+qbW>H7Ip;N)}jKYk3KBy#2cWShNZ>tkwbHZIqH*{L^K&TP__4T3Gdk0zDh zw1_KjFg-3_z1N1}5mS|sTAq~Pv%D+Tt8CaM?O|&HZiH{_Tc|ZPlH&!>sI%s^T4?3mpceQ>0{{1qxRVHS$pGSH0WIkEjzJ0On*&2nV zp>AomHZ5w^tL3bUpZPE`Ggm(DHTUrLUYve@-n|V@{I*{N?$>kF9(CVqc`nx7 zTK#^nc=ypmhg!K$p8Dk5Rr7cKryZ5AHeQx{z1ei*o*#}~<-2$6xG{Ccj34K=->6zdxb@p2ZVgzYVPj*{XzD} z%g2Mm_Rr$VK7R6l!2U!RwmHu?ufMgc`_Zp_o8x*VU%37&GfeHBt(hCa>(KH);?S9S z)mILFV%_3$%H);OOTkaGpZ(Q;FpY2iKGi3$w({Kk`*CsU0k&IDnmoO{lg($R zJIK#pZ?vhJ{zNR<2t&?f190ix(dJ zU1`pkELZttqHJXMQ6U?}yC3@JbQmu98kKo4Z2SDSP4XYPrTgLo>StwryAZMQ;&MNS zFRl`2I3reD?kGMG9a^Tl@dM|rppBDxcmI*lmbdgg_CQaeWd`4tlxMo^hZ>m_ z7RM%i@ypb2U^uf!VgCKt$|a}GZpcdg+p$1?cX3nAw`d))s_*a4PScIH+OqS{r_(og zm1_U|seb-s(J~FjC-u$$r!X*qjyK+ve4OvpsZ)D?|M~Oh$J_k+)0dWd?>*$fT{U<1 z^M4zrGp@WEEBClypMAOQ_4#bsuXW!%7jR%`5%6c?XYyOX$H91wIXP9l?oR3*{ds(E z&(Gh|HoqXBSs=DV_-DCdA(Q{QSqGCh-TYo0IBiFehnUiaIg7s5i#P3+Iyg0a*-2-H z;^*gj4JCNI8y}|M+;n;2t+!?I*7^7LJY~2U-{G*lx4*Ib+@@IBjyInT>K-QhSJZk; zpStI3@cFsrfu6DjvA=rG9e%DU!qw{Z(c2v|nPs8dc6WE?Cbq)8Ep{G~HLt{$AHO0v zk@2G9F=4-|=Tprr_uY)UR_Uz*YB6d>t0IrDwH==ygpy_Yu>lk=k+?5?ljF7mia?5N%>ha+fTdw{I`79x{iOl1w^uHZUaFX+_q`D4qWD7~d`HvK-<$s*A3&an5-ucpU6(h+_8=dZsP8khTI z_1D0fO-6mU+Jw)s&o!OG@M-_Soq7#h4ALA}FRMSDJTa(ynePva?b3YDST{Xsx7c@I zsB^b){rdUd42di8Ghq ze|dEC`=yg4ZhJ&bklpPZ5SF@R!J9jCI>I#0vAs4r95G$8ZU6kqM`pPF`5P0F8}+H{ z?~0ZG&vUi}d8yBn^0OcaMi=g)XIls`x0VeUHH1F5U1BmgcN5bUyagMp? z^gra>F4TKi67{<5PifB0m9K2o?|sfcB(l<3`=4;x+|@TWOtV*7zt%Q%uVH+LgT1=o zf6m!{ZqABrr+f~@d<))hpV@3t@*scH2cKhtPAW|N%z+1-G@o8Fez|;ghRLMWYGNN= zbARUCS~9QWSHV8}{F-acz12?t=PsKg=)_?n_4LZ0{ViduZEvfUcy$~-m^)oQ@zaK& zFT47>7To5|E^qsMYLZHqwvTwU zzWZ+8b~&q(6(tuJxi0s)w>f_!M}ei^-@ic>8=^Px?h7%Smun3U`XBL59$V-5gW@JO z<$>+$=H4G?T?_V3d46xnAxkICrt-I!eqA{yt{$@e%^dY-nLc0kg)Z6|?C|TR$p@Lo z8XwwbHi*BUBz`-p>|BHn&(uk~mpmv_`1xk$^`0kNj%r1Vp1bAz$3Z##eO+W&>C#>S zC6*g(DwXbSl0m2Z{mTD*`|5GfqlQ&oT8>=;UFMoF;so?#q$y;*FTn@S4Kl=IA zr6s}FLN)$Lcl7lw+qZAtuV2CEUw(fTcm8tuJKKdGH>RsDZ6Qx;Ezi$OU_mQ`FQ;McHJA_7kW&udZx5fg2T%C*?H7kCleV67xq1A+)AZXb zif8mPJ$9|16#RNwo#vU|uziyZ{^dxQsvUB#mg34>antqw-~7|b%U5Z)RLJiTTftPu zDBKXG;ObTB^?uRhi*XEsOwaD`oc^#@+kf@^>(jnHXwKjLS0q@ZYxAk8;c+KVOjI_U zeKx~HYRQx*Po8`@CY>J;efy%OuGW^$>+*Lz3l=Osog9%H^{%Fj!SeXuy}x&9HE<}J zRIK~I&*AiuBB=?iDIS`4W6hSxCff@rZfes>mM~1e<-U61^A>?mi`R8}@0+VCE%siR z(PQ7Y%g6gU&HG)vJnP;HWhAHNJP6q$r7YSTol)|HN#K=vk3w+#7AfPflSoQN)(RrtBf|&GVgC0EPt{h zSSGWzblnJ0E?fSjB2xJN`&Cm`mxn$o@|K%DRmX|RCQv*k&(n2nvuyk8C+4?L74B3m z_kF1r^!RV>uiCoIbv9v1tO+^y1@z=4HHDOH%-)?{`*^Q>S885yWrOEw-pR?X_m40f z(q&syCjPtV_0Q+0lp7Mt?o zylXzsw|UQ(X<3)DhVkiZPugieW!v1-j@cIsK730FTHhtySeW*vl&@=B=)|9=5+nEQ zz4~&&@5+fi6&to|+zC0@|9^Vvt;u15%+3;3`Tl~oDk8mM0mW+?=cKwCecpPwWoe|v z`<*-w%XUQ8oV3cnFFfz0Kp=DT&EMx^W`12C;}pas@#}bq;7q}m`YrO?qS$}FK6UfQ zk-D1!mrO48zLh`lmDg8iLF69}a~QRK zzVLy6@AFd+w*}t}IWq0h`ltOr=POM-Blm;;Ci8hwL1UKZl~z6P~!NdsV8x z@tk<0_-{Ag@W$6|_m+rg%^UKT2FR!nc7Zen{@wO~0JNx9RQ;!z++x^<<6Q)sT zY!s z&dQ3`bYE4zS?PQ2w`uDSgZ6POj+%S^O`i1BYf9Uu)*Qd}N7dt{SUFFO!=j_tSAIOZ zm;cn8Q)?NPwD&(cHD$MJ|ARUXmddTaf4=!(|D^XWzNiI;4zr9M)9Af{5!e9YrzQpKHiCk|bE8Cm7i z($|><5?-8q(Q=;EW1rm=m9MuH+)97@xcu_}AnE-m?dinCO{aFvRos}*u~_fY@;fir zDR2HESGgri(evPbQO||@ziQr(E!ux(Tk7J=Ka6euDGN$htn}Y`HuBW5Ka!i)B=S0J z3ES{x{&AQ4i}USkX1Xn|WKgiPnC=;MZ*Lb`$fP|u+%8wO;{BOAf3_{6 z_K({3s<$jlj+^s|+5hCSS3Zl__o$RClZg4o)m8TAT=krTch@T`q^)AmxNGcwOZwIx z<p_EpRC#cJPkB?XK_Gk6mtw6C4)a;|4}$baV-a%}UV;v9dk?Te?KsQbM4uSd8t zU$$MT>**z151CJztC^x8xL01}*a4F}>)2j(Pd~kh*qPry6tM0oxWV3 zpbc&`Fie50`O!1@b5A$9@uSm$4I%z2&6BdM-S)O6)XR$Vaf$DJbjD`yj~Q$lD!fgJICH&&bz?6N57a&m(S6<#8L6*mxy7dg9O9Q zrD1dQPR{s}p!SVlbh`aaP43gVU)~FPlynHLJ}bQF*7+4rFC_{lW%zUV|9ic`WcHRL z?K3-gjgyLZSVrZz-kvip`P!0*cYC(XW;mglb0q1SVQPiSWcHTM`}>O=-kn~nZgb3%G05tsma>NRI9Bm6TD9GqtF>wRv(HDb&R%j`^WqDZ@LEeZm3i-1MwhOT zOWx4<&-}YX`jrmQ){cj@Iz00)M=$Z|JSwv0c&2UYj(2=2|FzmqPwx|oYG#Y>ZN9a~ z?a}eJ$rW`|EWSiGe&IHqU}4EM{cL$)(Uk=WLh7y)_ivN=&|$}%@4sy08MoNRsT=M! zy6|$SZK|K}BjHXK=cik{)$jgO+x}U);oUU5Jq8ci1#^0iJj;5LaW;;LccG8xzPXNp zlaGEqUG3F;?8t%@CmBpEvMywPk=UB1_pWer#FW1>>)-B+|Mgn;2p+Wzcn-ce|5_K)k>k$63^oZWNv`}go2ICHOF?T&umqBi9j zrHwrOJ6jSB#f!hMDtx0GfBeJ^O&hys#c$TB)t!kyv|z=_JLV;dg3t2y%r@;`5O?I; zuDCO2>cZ#w@a_=4z+`zqNpq<;$4CALh7b4@j|2yux;(qpmeW{Gd`_VCUO%JK7(xB| zOS@iGzPPZEN8WDE*VorK*Zwa1_v5(zrnL z=X+~zW@r(Z&m7LM+0vOY<|Fo&y>$~>G^?FVH+$kTjpYc@t zXS7Uf`Xv*S$G-USGDEF*MjyY=EkAj_=pUoQ`U{FNGmExMNScdo)|)Wtn2n?K%6gA4 ztTwi3I}3Ka{WD{K3**G+h2I}scUiL2n)~~?sX}=*1xqW^6GS!(TzI0hXvxFsMa+6j zW~VOG$dA!y6lz+>wqQ-7F7LNwo{l&LrN8O{nRkz!TV%cDh-XKpf$iaUVp0!hZ&KR* zCvw&7vQsS!vR!>1td|h^yh&rl-;j6u^1IS-ba zSbE=xELomY^5mlSpYuxhidYx#u2q}%{L3V>bWNs7e_rp1TYT})!c?2?qfS*-RqY>g zR<2wLx`%e|+m8k>@9s9gyxd&3OT(w&{1PRlQ!%)Py>((Zew@X;F^lNmE| za*pI}7Zw+H&&gSHV^eCkkH39k$T{EHW|hYUoC2bvx&)fy_Et@tHcgFB#zJBB>eY-) zU#tGwO7TA2)cgGS|IOw19|nfLWInz>y~^|bQ~?g%mV1szn-ZL3MUQS>_wLoI*SDl! zop+7B{peIwcuux^;D+^G3ql-U?rr|tcDqL;wKFO(`vpe*c7Cx}sYGp4-~XT+ll@o@Jl8pr;d^wN0iz<%qNKy~ z`F~k2yC>pa@@$LVck9(+k5|N~7#}|?94PsmGyQGW%T<3TehFO9S$)aVWLizf?mFdZ zHxd`tG3~1=Y4d2gFxlckTwweMwx!v1>JuG(zRgRSzr*DP&%_F;?TKA)yp!%^ByM>g z@ayo>TM?|D9C=S9?z1ceou9H_4SEUXtOry2I`!7o*X`C>SycRViOD)^<6s{tsq@L7 zxpq`-+qO$V`Qo8=<2H_l&hoz+cjI!4Y!pwO_?n)^(Xf5L_Vb(m-Kho|k{1r2b3MMi zMEmZAOl9F2CMNR|0*anz?|!;T_m)@t4i9DXxtE<;tX0@|zF)hy=;t)6W&S=7rxkBL zGUee%8@qh@{`1-smiPK3JX784>bZ5c_P>3uOe)7`{doNHmPGnl{Ry9^y*<7_+@>m3 zzR)R7r+nW1;FzD^bvG@%dA`T|TT9rSFK0J=ewJIQWPP;DPo0BJ)y@9{mq23uU+Fbf zzx+=-u&KPW(l4x4_LLX*fBD^%-R63D(f&#E)a3X2`#*iNGud_jXCsN)Z2K_Vjm>*b zS6}*kB_+kd=>MImMd#C_&c3~uzHCxqO%uZg)mbNJOkg;ud^%*2@v9l19&s!*e|h7# ztL6NdEnZc#|3(O(nPXJlF`@lp{?}=4_h$Z>s}r{>wdhr?o0fP@-5d{@6|7fToH*7$ z&Dx^CP~KA$dSu4r8`1kGR!^I+m>qNL^J{VQN!-8h)g7pQ`aPb1TIf2Vb<%&9SnPj) zcFxt`QE_)l*!%w#%(PMdt(7PJvuj0xSixO$WmSh3!#3$QTiuomAMc&pZ)pD8{7QDWyzk5Ty4U>qanLl8al)KAGS}9}pKoI2W+fTuUyUfq}t%;i7oQ~UXm!+Sdww2 zN!#yuwt-2(sl(;Lk7@1tTW)`4x|M!})2Ty6lRwsFw{keE`0Xg6_`7zmQXlEA6fwzp z`Yv^O@KYT&1@$zI=}+#JAJ}+ZSH^W_vi^SgFC3SD-#eIqCrQs7Y z&Z?Lv%EYFA+qK~QS|<+K&twx)`o$b97|i zhJ}`?tvjE)sPey(hY*5zTNhv zOUecJi(Q*ji;qrMC^?c6+jX+;#Uz7ux8!eF`Fk`hY2@!ba_4u3*8e$+o~F0{-4q=E z!OGBfy+ZAi>_rPd@Mij3an9d7W7F2_G9SDzuJgaVgy&bsDU1Fsf&YaJZS{}GepfcF zo~Nqz`@2(m$C1d-w!g*vCtUk+@rzaE)Q*>hhQH14_T7(VbO4IDqJE(nk&ZAN`&;yU+5J$HVPYLvphcp7_>E zR8&sW_`7e}=Z)T=0?7W{y`wF^izO>ur$u}{!gure9h2PFQ|YN&*z6g;)y18=cmA}h z!^KHjac};%%2bEftJ#^o*s%O#ko!@=nd_EX{d(8ud+GKX-?AO6Y-`F^mR(PciO((a zPZvmh-f@<5{+HEvmWbXuH)DdsqX!wk<}B{5f4jNbDYqmp*vetjT6X3~#~BRLKhItG zfc?O^Tc$Q!vZ|J^pE||yn`z#p1`ZbfeGy3+mppIqO!QF6&#l(Da^KooZld`2{n0bN znzgC>Kf1kWXHDz}wzR!dJtL=2N_p+*<|3aJle$LZYTgmQEolrF-dvvd_}#8jh8w*X zRc;!sED%wszXxpuT*QsbIw|LgC3t9eqVc;x$m!ULuyLJWdVdw6a%9%{CYpS@O> zZ~DY1R;xVkesM9knyVsl#cJiMRga!b_CJ=kSx{cyzof*(Z@F;$;l`6GPRlO~zLA(2 zGG)GFVWFY-biJo%jL#p*+rGK>cUjolDAoh#=31{@$;t1MuClxDRn5$Y$GdOcx;2sg zrwoHcj~GiH!?Z28|H%e0A7Kt>@^2~CapCzO6~J8*rJwP@cTTQ%YlOE^v(Q$F)2C;@ z=VY~K_;w{f;n^u}E7=)S96!C@`XIpJmt{oWddJS=!kL$tnDcY%Jx)#At#R+}M+@=q z^BW`cQ$tRP?9-~4`*bOHMBFZiIO`wzj}Fysm%kAH`uXa^;rfhaSJ$x~NZK$t>-@4E znd((1GU|OYAG`kup1nb0lIN!REw}g2&-m=X=YU;EV?_BUD z=xxlobFcQF?0Tku_*jCWig4m9=l3_HSsL^&IBZVmkL@)1zO+=-b8E6|Mzz9=Md$X; zo6@1_63Kju4Yn3w<|ilZ*d;vj_2oy8XKN>Nb8)4d4rh4u=+TAOU%$M+FR#eL%gej) z0egl$`_ZFE+e_1re0X?xV}#D46)QZRJ%9fB?e_a+Hg=&7IqAobrTurjF?snGn@J&g z`_$h={~W@oTmK1PlC-nq>o zo-da#{86j3QQ7lFIlH0ldLh&5c~hUA_{U(eY8r!3_*s4yX1|gu>1QYQEoA6;aN?dk z_&B-@$l-UEDvB3M=RB`?R9@TS$FV7RO+}64yq{~T>pj%nW;1B4Equ%`b8}V8H9Ib? zyFw4vW!k#trA6ObTYc|_?&(#w3y&}7=@UI%?Ot?hf(660{I!Q)zppYfQ}mj>WyOlm zZMt(Z?x#C#>71pO+f;j~K_bu6+?zopeCN+M$6s9t+>~nST+OV1p6lwr6?Y=epP2ot zgHb$n(~D=k>`NwQtxwBd%;Hiq&1|CV#AU2%S!FUm=l*FInz<}>(*#G)x9ghcyT4#f ze*dcegdKa#9L=`-6PO*I9;+(T*U0sbS6nKmu<-8P`K`RSJ4}v#Ji-~@zUr-C4<;mv#54%FQZ){LIzD zGO1n9=NaBo>9&9Ibg}LEiw`aaJXcgq7E0QJH zWQFXa;+-+g7n@|-gKpS8ojc`{ev5`1cf%czb_R|QCI#;fT7B7eM}I^p z?NYNN$$s^=>*cQ{+M{Q$@#rv;{a86W`d3H4Nz1!=S6(j2-(@D4VAOK9x!~9e7ltOs zlhIl*9J$g>>HrpP@IJpn0FMiJZ`YdCjo!!HRveol%XqxX2bNKc| z#IHidKjzQf&PT0s^S%8S^DmiJwWw5;)uBmu?xbaR8^l^XHhy1nt2E(n*XHVY_6GeI ziT~a$uiSZ9cA2bc_10n+iR6pi&1LS!QC3qlCYOch{w};yskJljp~stJ8F_LanZo&h zX$P@YmLE^H+5FCJk{ebyKmNM z?3bzk_j&%$KcCOv++CiZ5xx2Ii@LB`a}w>Qh=`&1NN zTBdBOZS0scZN2J&zH?S)5t1w_+v~nHit(&0&eoPy_T9MTR`tafwg$3~Blm7`y8my% zbpLPr4$SE-mwTeQrM4`JS8&D`u|1935*(*^?$+BPfBfK{4IjfKvpvNY2m7Z--M@V! zYO~OVu!V2Rv$*f4s6SoXC3SC#ZSpz+$-w8WO>%2ru4l+O=EL>+{*n#;sm%I;f*O~l$T9=5l&*M5l}cw5%aq$DUf_j=mv zzS`g4K7P6Ee|pazn@yWGxrBv@na%EMzfxY_KvqK1+b@(XTr)ztUWm&1*HyQ(1S*l--)A*)=*q_CuEA!3F-+@ryRM9Mg_s zs&S0}US|hBk=4@V?!wvNVS%!sj$M7X-__)9uPIm;wxjwNr)JM9@!AKCb0g-jzndv9 zpZR1;;>U$=#U}S<9#=14-M_VZmdb%A4>^|{nORvA*ZAl0=GgmhzrXnX`$=W}T?PML z>AidYpWVCZWaS6zs_XBr{%i2-G&SB*9xb)p*gdP%RO^+^lx76H{NvSCw8no2dPNq1gQ3*^yGE(f7A~^^HF?X+Or4^jjobR>e%_kUZ+WZ3)-^g)$lzBNL)YxG zpr@C<#ou|K_wb8p(Oq-pr_#6OUVQppb9wvm(=X?zo?6Mh=xMQZ-lTaB*AGfH^j*b5FkTubK04VXyAhs8f@5uWCD$|CY*GGcjo1t)u%NFP*Y7=#;xvU$ECsxf^#r zeVB7$yTfcw>(x&m9%g^}J4Ey8%D2DQtS~G#$&&K<@#kTFcsFP$&g$&hvrCpN`SAPx z|9QseZ9cC!w^-wNl#2@sGdrJ(zJC9nJ$p9%S65X{+!%4_R`|8ZT`yKve{280hIR6! zN&9S$oPVXEnL2CAr_X-7sznPJ)fSk}56Hed;i4{o{q@lM7yr&+4|sUPeW$W~!^^+# z4~c&%xO-^go;{j>*8TaG_y3)U-ano0mE4Pd9>4Xv@aOE^Ioum|R zmcKi`+!x5~a#f0~@0ca9cFsSwchQC0Z2mg0wn^USo44jtkbds^$lm>`R}&p%W_(+{ z>1TAzJ|Ul97H^j2*!=U-nzf(nt^EDR$%aO6Qzwd5nuR4x?MtwAT*=BKWjp)OI#XBP z{8MMAem`;7^gjo8-Ho0|mzlS{%8x{~B^s&-Pm$}Ay2qFh@aeIV?x&n29cPJ||7LBF z2>QVKN^?!UbxBOXrENZJ897(#_%}wajaYljmoIIz<(5Z_7cNwMlN}TkbR)d|aO3&s zi&w1h*p_$x+&R9l`6g15wpAu~4fF0;Ff}r)4qyN5@Av!DH>aPU=C{18Hg|rM;0m|u zdbtD7^^U(j!T*1qW9gxrTZ^QzFE>&5vcO)-~2Mctd$=b zAFPO4we{>Cj^?Fr%e@xsPJVHwd)L>R-O7arcyc~I{$TQU!M+E)E$2Lby)bX}yZ@C} zlPz0na5S8cWNA>%)%WMk zIMs4Tf-x#;ZMEJRvGw|TldHYv)@)rjOY^XB#Vh{5N2X`5?%XPES-4@E)9Y4!uO(9q z_SN&4`<)ee{oO3^=7UrhKM||B3l2U^_n&EIDPZzZv%pN(Ty_ha<+O7*l)l%lUCP#V za$E7aJ%x*|XKLPc_uC-5Z;~?X>0DWi|VSj&%4s z>(DoU*YL~@bboIgbn|B-r*zz@>7A7qdG;H+tMFd@x4=(E=I|78_YPb6=_mKbPmzDM z^w{MGkAJssKP@bGQdl|vmGiG16@h!#PP`JhQH7@`?fdc6yZa6o{g_|m@}JvC-ZSB=h|wMq`PIHjxZRB7=6M9_fD699uvAsIT?R{jcSHUYAR6@2!dC@t@@qz~-bG zXLs+n&C|Y`pf|RaU$?A%v*z!_L&tJeqKqY`ty$V08NYI=hiCVTv-#|IoO@T#nR6qt z$J3VC|G-i2+3)yz4_`mBfA{aG(j-O$jvX-^hQVGh-J>r~Y%RO~qUrFT`j)1`unq&%jerI`mAwkqgmOT zh;ufdeM+p}+HLq&eubThT~9e;uj(}WdF4-@NAER#ccFKer`JmXCmomF%VJn-Zftt( zwME2oYs+BPoTK^dXC54Tc)rt-Q~d#NmBrHI`HVlx z|7nYuW^#uXJw9%<^!a<2ygLyLpM=y3PIrhOJ#@(Y>9ki*Rc;yWRQj&J=vJuL`WFX# z{AYLRzeqgy%-Z?7eEak&A)6Pc-ki7$_KrmZFd<2Id+}s+dJ#cjn%Hd zlfPa2H~CQ;|E?O{ThbE@oWFGKR{Qc}$(yH1m;YHmIrl0uN8|tIEfPVlUPn^YzWlH# z;hVm{=c?-ErREpP>RawT_|5i$e+k2z`}^lFTc)O@th^I+tc;^0V`OCHLea9PPj7v# zzP&BiNLAHUru2xHYT&@ZJ)ib_V=Tr zoj)G7%kx$8%G=lNvH17n@y+e|@}{PyM~)mx*cw&1Gv>`r;V|}8)(gxtZfxv-aQ zG5_{nlc~{Z9^tt^79Bk{>8HuGGuOi$J3eG`?KPZrqD1#!{GLxXH>E5(JglQtp8k`+ z7&*Or)!Y74vtl==_*_#xl;FAS`;)VaR(??~Ii{g>d0Ei(|6IIB-^+eoC6N6`La6Ay zco3V$?~mn|F7J@7{-k+G=H~n*j{TioyymTQm21C5JEiv=60_%^v*b!rSrW{U0B|#>&NZ2^YyjIx%ci~>wNNivFvuxQT2ajtz_s}q|sI6ac;(n z^KZWP{tUXby7a5d2Gz}%gXKj}{gW)4D3||i-RJ7A-EntSn}crOzqKv-*2|gs&rffX z>bFSG5fWz4ob3E`tK7br%dUbS_-4h_t*fk>{pYi#?U5sng>#I) z7HOFm@6(yceLZusSZk=>DyiC@^Szmsz6r^7!v3`}8n*is6h5Ec{Pac>Cs!&s&WchCjS7z{F|o;<^g`6u;!0l9 zF_V3oRo#!4&E2!(C12!Yy~ls-%)32x%O`~G_KMu_JoD$hzDTA6FSC<^p9--Z>0erZ z`iaZb%`?82pG!(?3==+*w4u0aTUgg&@h=;;B`L1YnRjrV)!K;ln`P2p#r?atR(wyf zKI8WVzIwi(tA;XeexEv}C_kLN?CEFGm480&IrsjEt%T;o&rdZIZ~NJNbm{8uuKaXT zedp6@(H*_LPuJJ~)n@Rw`>Ep8p?uDMy~goNkB)X*{(LgI^6l2^d@KBmPwQ@%xnQ^d z%DHW|flt!R<-YAawQ9|p`;x^+lHVTsoWVHZa;rddL+pY1(cku}Sc^={c)w(?PSgyi zotD$Ch%S{cetzj>jO7PMwj=!u-RJ-N(QMZ>t8Bxfkk$Q46BnL8n~-j~tYKlNdgq)O ziHY;qdwV_GxIU44ecn$0Yn56%7QD}WG-X<7nd!SCyPN;!)TFydXYEOe785pJ#(3e$ zTIFMNjvVR9%vl|IaN4V^=6L z^I5z4Gf(r+uf-`#KhNHf`!#QEz#jb@CpI0@G`eTjr}F#c6IELs6-Tjml1jFXW!!cu zy~h$hq;5%4>}U8=g*N_GA8E4HZrj=Hy*fb{6idsR#B zHJ`l4{U*0|+qxo-Us9YEuO}R24u8hxbiK@eVrIG`b6yN@bcRlD_xIm1sz!Ft*%A%Z zlRG85cGofg7L!+>-2NxlMa5rf+jV({&eeIgeShQSuDN=!-8Fi!R`_7q>bWiVoL*g6 z?t0<6%iDY68NRPW_r2>ks=Xqur1m;U%KM)3i+sM``}0bKj2;}iyrXy7CH~a2^PXqE zy&Sl;<@0Pz8*6wy!SGbjTzTsEn>bv3%5*_d8BsQbl!eKI4|zq7J1?n#kA`#OO- z5uJ@{HGKAr`QPK(U(72@D(0IfzNaL$RD)Hl;ovIw{41@m`eis5iqBZwvrvJ*p@r*$ zeED`8{rXce6D2QfbmB6K`ab(>*qJJ6-+Q;3#qQZk2_BPZ5m?x{XIf)tUv7<~{@kV4 zjb7)@_>v~G@7RWuPV<`|{9EdC_vfrXk1~#_w^T6i;90@+jN$vXH?vfh#+0mh{I+cO z9D_tB4fQ=21)fa(eQn~@st+NFvb7tPT94mB8slZDd@$ z@b`S%phLFjpML!NY@4WpsHkY;JlpDh|E`9|$JQ=M&iAa{&bW5Muc`#$0@eqNRi2us z`O5yZguBc;cp$2IYJj5NEVeZdK)}_LN^+Y<4C* zJ2R8*LGZ1m=FAsfmfUz-Cd0?Rmi4%`kp$0;w`Ftu)Yl%I*cbKtmY^zgvrttG`;`|2^!d2W=!7`5V%#Qn+8#+ZUfzE<cfM4@@Jug|XRzI1q-d^ZC}gFq6;2BD1jhKE&} zPr2_});;Q8)PMY7`nQr_au1i^PGq&OQ*un$XLsOiynjCTuQT^mjF_s@lr63pLROx_L(`Bms#%c-(iudeERACoTdbWitA@) z8b9BfE0lEFCXfA{=!LKPCHBpCxN8;nI%e=@S3; zPjN6|_@d04Zx_QRW&Nqy_1ARg z&k4Ew&Zmz&?{b3WX>t4Soqd>p?v;NQVc&h*h|G{rsTFXL;a*y6d!Z`RD94OBDHKbuP>-a7_!&IKSXsKyJNP(1i?>P5)Nk zKXGc^tv$P4RbI0?r+%1j%E+%!vg4~`*?fDCvY)#Tt=)bvtGA;=LbJu=<*KviJ(pkp z$<*kuFmC<*9|xHEOLplz{atxTN^xexwpo|2L`pw(*ro8UAtgSS>;C+TMIqvTu7M)1 zmTZt55Ge9Ae8Fl4kJWOTdVUgNu5s_(l9X$IFgLxbGJaj|wz;(*=Q6xcd-`@g%7pUbr^ z`m@NB(>|~J>G9l+_TK}*<9UH1t}ol-L*ha}P6BoGVWNRkk{ww=J$|?VnDKM|VkQMp z1_m{wLF0g6_Mh{Cut0=18B=hO)&60J$kXZW z>nFS1`Xlk>({nknIUoaL4gTC=hB~e;PAquB6&0FQT6&WtPEIBjJc6NfnkIOcUu9iN9g@rtlMlJGnKN?@W z$T(;FJ!aPI*)z@a<@BbnzMNcQ_2cc7q&oAh3oeVwXLjnHoBQI?o5!bTY}aU>Zg=X~ zb8&YYH^mmd3ho^{o_>sZAf)-!@TcP}%itIH);|f`+q?OTn^1!@U)YO}lFBPKE)QN| z{LohHv4xOOOwgv=3O`@Ge!1z*0WqhXS*K63$sS*Lm+}*#WKly0h_S2lgY7ahcIs3QgMf~x{=6RfJ ze^^X;RV8e0V>qR2)(3?XuHvyr8W@>1bah#8HOVhvb%?9^==v|Z{`sC)t5!>xWC-;3 z_8wnizy0>veYL;)JmZgd2{hIH{q=GB{y$Hj%boH+mtyqsgmS+^i^KZs!SV6^*Iyrf z{~dHhLXV`emF>Ip;%}e+ne4s0cAlv8 zw;i5Vy?2Jl-TD1Fnm77)2p`mc$bO60W=Dlo|LJL8Go$Yb?``cXZ=7iV{=&cISB0MV zGwV+(jy6AYSLxVm)_kU$_K$b)c{(K;9C&(}{dB7R_XtQXIu9956LI}{b>?p0o{O)4 zoXUHZYWOnQ`8Knod0xHbJqK9NCLJ|=xqjouiK(aSDvR^K->ZIq-nQj`hp@lR#9zOvg{@= zKFl7y z@1J}@zd%yol(}oGUd-F``pAnT7i%&%EM_-&b>>UAwC5gE-sS5%7rpu0UjkbTaO~}y z@@=;N?-@E@;C}1x*16=|-uY7HmO*T+Ofz#%E8UtSP}Zjv&RP0yTWkKuYbL*r_a0ke z9Q5wS@pZdOOJYt4<$Er5zrvv8YZ$WA>t^8Z)8JdBA6JGj@AlRCz0F z#gi$O5i^f5-+ta5vhcCB!rhFs2NFEh9;`k5`b2(ZVrfKj8{>n_JAMWirX4yXV=55r zqMvf1{d{1<^33Cm>*s1JvF|mM^1rOt^l#bWy0^U3LUb^V?&qp40wIA6xhQl6bTxcccFL{cOwkv-I!hVqlD{l8rxmSIuwMJniuE zUyHOsrQ#=h*cE&~rwTgh&ul(mr13IvqGWC2je85eY+U~?^xD+>3@jI3uj%poFD`je zT;W3Nt)I=lI(MwQ3?=ggvt{qSocZdm^pC3Z25xhX$nM`Ae5UR#XXM9VyUm9SkIrnp zp>tQivJ2ol2iy+54HEPk(ZK z(xNjdMy+9=b>jEUF-$(z@@?vrDFz7#8a6O=IO^|wX3pwfvd-II|Iy^7D@`on*!3&>1nJ?^*MDAVZc>2ZC zo7XqAwuk#pXYGwe%;X#`gPYW`DD9DeSIU#g_mc(%-Z6{@Fv#6 zXV+`_U2d1GgQp}zUlXU%UgwQ96A>(Q~LgUNa&mt(XsTj(%S#}TeeM61FQ%`J}sLvhk^kYfA!GlFr z&vjO9`xmd#C42id{}P^gswHokv>5YwpT1r1}-ytJp@@Tm6r zsgCu=f|`?0N_>9DxLW@2yP~qXS!x&eMV`<3;ZftsSIm%IcIK**^|!23v-c%bUYxnm z@Tsb;(xxQ6r3>E0hggT7I`blv$N%qggO`Ulr-+*GIlgMrOC#G?F>T9iY7hK4HG5x5 z>C2;+R&+mVS<{;MyY`@)-7PuYWSwUI8|(pZV-6ncnw`2fo0mhU>SVV<+r`vWZE*GT zZ#t~0v0v+bZt4;~wypQK?XOf+^_4&2ahc(w`oHsE`gTv#dLGpE>b|1>OGTr_`b!RO zo~rx%J-f=rX^CI@cJnoF*tq+fq)uB(&#nwMm8{Q`tXIh$mR@uG@%48rdVAc``x4l0 z9eH-%Z~5do7K?s$^v^fhrKQ8Lsp8`!=37smJbCc>C*O|Q|Mp*n+%cTHo3>P% z@0b5FgQ242t7?(^T`7jT`QJNc-1^;bQQNy`-&@AWr#jF6*lq7>_5bXuPyS0C)1RDbvLxaYU5ZsfMEyv07%?wM?2ue@{c&E;2~{ttfDYZxKyCveeL zk8A5mnf(qfD*je?);WW6M9li^50>0F_rKJWsy`Ddlv0`5c+b>FR_-! zC41Ug9nQW>=h)$$y5KNZ|FKE@1#jXtbU!|J$vLm>d1|kG`qdbIe}A zqVQnt(zNHo3l$s>+`nTc;kd`RNm_u1StF++IPG|x?j&Wuqf7daORsQTzj=~eDc{=P zXWLxdmhaasIdlTF;5PNM(wk*DLCVXx7Tf(vKmYJ-y7$$;Mu(<2|NpVuCF{w{FWvit zbJkaR=;_*o^7+&R9Jzfg@QT6o+EV>CR-+|6ADmyNUdr)MF@BXaF=6(BBlGTe<$rQN zrFP!0;o$q+)F-aYKR&0BwWUg_cY@D7(7q%5L+C@z(4P%iQN_zgaeK z#@DE*=@G9v81C#dlDZR}@$KEREgzN3Le4u0EjYJVj$yT-vIxV?;NMJs@qsrim69Yr zPPW^4_=5Ib&ytq+9sTl`mfOAg2uj>%&OCWKJ)Z5sA#VLAKOXlVPcYb!cX!wSPR{zp z7dx(I*}kgtQM+s?(Oa|xG$8t7VLJl{3)7UTTT>@jy;`}PFT;Mx`-@lWBrk1$xPeLG zfP?~T?$zVgZ@2B|wYjz_UuVOog5yF3#yhv#oPWCWf4jqn+MCO5HayxBFng)0{D;VY z-9MTinx3m)^P}tiX}i?WpXqySQjN`$MNV$hDZ92tFv#oY?`ac0O`632k=1s_SF>{` zcQQ6iH@~lIfA2RF!)vYmQ{T_o=&urGY_atC(VAKI?fu_uj#pc!x2kRUeY7tv=-N`1 zC}V~jFa0DbKbC&8OlvXZ;47A#bwFx$txolop9uL)XY zEbt}sz2QRR$y2@?Fz~jn_YS{%i}_d4)pe7${w!AbuPS-@agt(5+84FAQKI+1moYXS zyTlrjvm=tpWNNLF@3(u0=9MUYtj!lb_kMY6ocsRm({BB-F3WTC&aw|zgot-@E6xc$;~G^tor}#n(onS!Q8ATw0!*xt>fiKZXa7H ze9KF&egS9u_J*kIQeD!|JQwTP@Xjy~a1Y%3O<5pS$|LPdtILcc4iEF+v-c~izjI@d zxmO!vwePiok!RrH-3)J5*2c}7v)AcJr2A$2#I_$Bzi@FXs5Co3I+0JWJCwgr11D6C z|JEw(V*j?z-sI71Gr6&opKG^f_ku407ypPdT;*FE=UjAT<(!M<;=#YC8(IA|Rr0yX z(sZsbwsd8g{o_`FPtSi{uhaQ>(S3T`$voZ!)9p*od-?nGi`s3!{kBKaxb0}S_~$#t z=M7U%2$;TH|0f)DVcN%!4`0rEw0LjqmUr`7K0N-qbm`J?*+pBHoz;A z>rH0mkLi8S1)XAaS~z6Zygzky55od+wqM(P{?tb=xw=tqy4lpunU`nGuT zKP+wU)Q_3B?*5tA(9PxUIQ{(Y^b$R_y{rver*=Etp1o)5n|0Cb4t{3}F5U{iZJER4 zWh2+%d(~UT!QmI9h52)~dv?n4XY4XpYUJKK9KX-rev5#cQ*>ib*&?HJ=?_da+59Fa z9jH9Vd`Zi4_10TFZ`?#XF{*M z^SLQ&7u~;7G|}!^ZepLL2v=Rn^o#f0U6#%BJau7t%Y~VozoZJobQup^3c7zJaHqzb z&-Vg<_Ofg^(zZOy#P!Rv>q|@*otON1D8X+@-hFM8_y5)Q^x9f~`Nca&&Gq<|$e;^) zN-COb>bV=vym-0j@AXB$wohbPS)PC7?e$lOdAw`==G@)y<#Y0;8k^c*R?iAAH$|Qq zUp5}OeM~6-@*^GIdA{v)H+gy4tM1Mr$F7E+ z72I2Pmo)pX(Xetit1RPcSR2YOG$pR;czpZS32j#=xShYDeX?ifxkY;)uPD#|QORD< z@@3az|LVL8+rK_6u<-ElVR^7-^SMPkcg|$x7Gro&v=ekr*n$NQR-9j{ar}_(_B&2t zVPbXr=krRNeYh5VYsuRcfr~YCb(bz%rgkN4z4fkJ8f=FJ<@Yb0oNL`+cVLCzw^%px z{JhJrc^1x+S$nWO+HIf59#zvT&-U~SXJ&-2fA;XP9p_(r4dy*NKJwW#u46t>bun!H z;me8z7k)+DU$?Bitfz6e`+mhqxsf?5L*a-Y-A-e)UbASc~Ja?>i$Ua%~MFf;wJ)j9z4{FVgDmZ@Z>Ssc`Rl)pg&u-r9O9 z*70K3%1iGvH9y?_RCS8)zWB{gRosIAs+5^o_LQ>xJuBh!@km;H@BK)Zr`y<_eVgjo zeV@j+$nAc8P3Fs^z#AW?$xNtN@3F;K<ts+xBZR{yCVo?{4`XnHgUecy!xv zH|sTNd}b&TmKWGK?V^spmGYJPo>Y$KU)J-o#$?6XZ`%FrW!}D^hfTWLt+%c(0*^U8 zz3vPtCR~4pP88~YQ6OL7`ItS#q+Zi~$yq_RSe3Bks*L$@5jVoV8r)tbr*`R1f68x_ zwk7AB^mUfF&b#`S!6U`Qy3tLU-$AwSV~3ht__FI%{I$@G%I`E!(Fe} zDXXiut9nms*?Rr;SNBpoSIaQaP0LkPR;Q=yFWVDuqO{r5Z8WlV-n9Wk0u%{Z>|O5VEk%<{qFb5`5ZKS@8R z%0J+{baRJFG=H0lZ%XA$rg>4tx-%#K-BEVpzLo5ie$n`i_ai%QzfUN*$%UVT+7zg*9?4 zbZ470W$n(WY3qM0Pn(hGk{+k?==Z&zi_=<7^F-Q(=e+1Tm#{qTdhnGuRbI1{iaI>3 zW-d9{&%M{M?ZlS*9PUrc@Ai3Ie^)CwKY6{6+@F>UvxP58-+q-=F}p0eQ?|{rYDU9# zr`lQ3VYez~m$!d?S}GE-<4Xvq!1dQsLGF7r9{swfrM2Dm#x%9l!ID*ftyB-ke^)!t zmlbO-kS=@n#h2@?ap_CXZJp+J-i)E=m&BZXPGQqybXpArk|llqw@4}}zp4pRQfn9O zEdQ;ov7%bG!R>umSl;tdrHm{%+I zroEqc&hO&Ngoe_fQ~7*%KP^w(zCHDymd56XUtbzX_P=@e zq_%&v+IOA*`nyFR9_N}x-<(*-=b>rNt@w?>@&K#D>$Sgx8$!11@%8u6?6$JD`(AaC zCx-un>%Y@6GrudOf8RIn)3X{e(Y?+~H(x%?u$JT3_tg1v8}8<8@Lau7cXGfI&1q@z zwqNIIg-xwJwqwi6KZze6C+*)H5N6fA)8;$l#Ei2CqzgX#P7J%RsI4`9f6s4+FC9_` zro9q9bF*f;PxlL6hq}XRYU#0lYg9Y0ipB>$UzOnW%ko8wSV-=djMb$~O>bEwJ6}XR zT$ybZth3iIQg>Ckjh5_G?}F=Vozpj*{;|)TdqTzRt=_HY1R5_$I%gg%Y4iB9EQ0A? z)ve{HUU@zH@$*pV?zUx{eqOq~Vd}C^=R02)8&@Us*d4!jII8b?@tbK^t>+&RxjFyF zo7EojpZiYyPiy&N*}YQ#&vc(oS+%6<*xt=qhG&0^3r;ngdadc*SJw4ybG={q%y_f+ zf~4}s<#VnDEnlMZrp9WnWr#YfgO~ifU%t7uKW;L%gm&oXR0JQ3bnm{lC3Nj-dxlAG zCreEEv*JeJ-xX^L*ByJRz4+$pSov9db{}Gr(Tmrdt^MBa!B@dU4QFpK@4c`tQ>|8~ zEZAS>UemX=9(^-f9Mjc}UkObVGHh)q*}VCe;mvDIrHMhH1#y=t7g=r7B}jQJ;i$jNUic(3urO1je1_@wtN$!pt|e01)TeqQ=|PMy5T zRhcjA-v8H_?tZ@icG66PCC@JOT5n8=J;ZqXUiJIE%;z5$eLTR-FLTjSD|ZW>*rX%-!pl~jvdUm{% zB>v^YcGLZn*D_AO&s*d1r9+CrA?^^%Jj=?|6>qor2d7S2%Rc?-zxg|~-cQ_6Tp#|& zuC@2pDW>&La#CcyEuFb8v$T)A^wWdPNwYgo=_mVw6-M`4G9P~>wZ-(?MeGOZe8ATE^ zzj@vGVe?Px+LV9mqVug*D^4~3wWW7=`5pO}f}f*5Ui|iA+k>_X#ZK1_1xUA>&)@pA ze#+N8-3sM}mn08vdN;=(lxC*5F2t-hC5C~g&}n^)t0t@>Kv>noR%JR}oJ zPv)nFy-8(onO%Hz(Vve?TznKS-QnMC$G3g|B(38?tLC0Q{Oc>L)Qv6w-%a~}z5Q+U z{weSOnR>7L%Wtzc?|1#Tch)wmv}zyx_`WxIvgdow%n28q-YbZ05Dz$blx@?xT`RKR zr-nz~-MaSc_T4*_cI{fU`oyUwR-GFg8kFW<$Yy%E*VpLnpMNtZq zMn;o5h1HD`4lsa<#XWKP(pxicZ43|$X49@cFFyQe;j1lAykCf#2CZr9-E%AV)#^JtMXs67KY!FRf7RKi_S+)s z=PsXB8U5eO@vYxg)g`-IZYHf*p`TRya(hwSF6=eHK3lM490ZP4L~Uh^Yn>8f>Ks2|K9oBZyjr&T7COx5E=TWLel-v&ZJFl57+81TJ}IWG_(lxlkX!KW!^zEyk^!v8XIZ%_VxE&5x4g!r!nQ)@dr z+x+t8bbl`|uOGi&umAaO_xrvpi89647xdR{CU8VE%wjt5M>Cd%~0~%bvxuweKe^PiimfPqf^VEq$r; zkH7oO1L|So({<;pS;cT|ueP}KA?X7TpX$9{G9~bRXCh~I`QFVXlCC%TWxszeS<-1> z99{T%iRUS9gYvm|R`Sf7BK)7xdwtXW_*?FOpH`T=fC6qy@^hE}%&s7&$=ek>w)Fox zeOvm8^5#cuBFA_?onCwc?q#hu(cIdzZhw%}VN2_l@8w$K&IwBKDT0MAtpp z^D$7%Zhpbp*4+lB20}|V9Xs@R{ns4PKMWE^DIAuTmNx(YeD;}RG4ZmWb??sN=bzqg zzrQVTa+%UB`+B>L8*}Se_)Z4<+m;@AWpz&~hVA?Rz54vIyE_GIPh08C->cm7QvW+2 zN1aR}Ka+Ap@CSDLt_IJ!oOKLq>f`QS|E^YfTjW^$+lya}*#+;++-dCcp>rl%vB1@~ zslOhJ{S(L%G}F{C-nXOYzt*hzFJ70goVCAj-j^?xKjv~Q*K%c&W!cH!zWL4Zg2OU* z-tEj@aqpE|VD*-7^*WsajY(^dAJ6`)AAUb&YlQjA`Bi!6sv=V)?kq@{5p+a$d)qcg zk)s^;l`YfPod~*le7Ef^P?D65wqjTWN}9L+uQ}E?A-b>Jx^KC;_|gqIwIadi&OTi7 zZ|RM1vtKV*b?wlh_m5_NjxfQNah$lqUI55Fu43JY^{b!Gkg>#MU%#O|`( z*|#&*`PvU3oS^7zrFWxou66mQl9!j_V@_>;Wo7*R?_T}o{JPIB8GpZEymr>#=RWsm zK7U|8Uwz|?-zrsMU!JW}7GE>Aysvm|8~F6` zeD$X-6Ks;ojb+iVcF9J*7vz`BTb$194v^gS?|AO%(htWY_il`;Nm08lAo}ju zYf-M#Id4vtKY0CMXVLcCzDY?+lhyr?8Sw0h(+^(eLg!BH_q#u=R=HTOQ&Lj$ z@b|ZWQL5bFFxq*5QdXu*~ zgLAft@9&wH7zH3~UWVzn6AqvI_W9=a^m}_M&&)P|ud&7BvY*e>P_a|1qn0;=)3NVm zleb5bWZtu7fMW#|Auxt)W)({Z*n6{mA7Zx;5(kH;(T5p2t&JV>MT9 zko)$}Wr=-3_~Z5GwU%C!D_i~KXPOD0q1yG&l1_&NRc?|%IH zbu~Px&(86ktUdeRZ9ykXuKw!XJAbFQ>IvDVzY$wrMr@d|V(yfsF~@hyfEpmFunuf7LnrrjbO^%NWC{KX>>^`WPoPTrHY&xlF76!s6R4 z=kkj#-9Hk!x7oFA=F04OVOwSM8I^>XYS>at^>(?q9MfJZCYRD}eKhOi#}iw6=UmzU zrQzwXlGTrP-oF0nS9|84*NeCKUA4`)py1LnRXbd+b6M6c!Bn%^v!5kzyqQz-@=~j; zb=j8aec3^}{&zRc`>~>}>~zGLuFrm2DIxof~ZBRAOHM*91{E4YvR}U zMv*PiNutghOJp`&`?G2Dhf^^>{WRyjEnfL+!P8wkwN+wn?u>q*b;#qdYj1IoLHXVk z=Jiv|KRnu^c&c{K>?NQ?eQV-UW`$YHGNYFB?E5-9V)xBok{9If&M#oNFfWz);#)8P(E@!x6j4&bu$&1co=@pp8JTi|3tgEU-;u!=i*hivCU{dSb2PR z?{6mgb|sB@3l>zUU3*gCb}jT$_2HbU_dC!2Q>3y_-1s`L8ta(*SJpdcan+Ao4$ zviI#SAHKReTz}G}NqoEK#qKVfID2+AOVkosuEPcuPbRv1`1pXfrhUIx-LDzEOh8J? z%h8ds{?B9i=v-mphmU67z9uMqacBDxWv9C~mBnWJtFsh#f8w{Rozubbf$!ggT6> zZN|zuC)S4M*FAjCEH^>$RLjJ|NpkWn*O%Xz7JmHDe6K6BWUtQ6>gVW@6*xMRdC?N@ zEpyqn_urXRWfvd3Y+CM`1Ir)Wi(l&9a=3nVutVh5*;B1oUA>-t>VxKvcXv{D9lg!m z_gudF+lo6%^=Z8eZ4b>b(DDmPe!F9D*Vo-yKfYgQUA17%SK$K(&4kP2C#jWnA6ztb z>8shLPnp-Kz24vOIXA^t!C-0X&mWExdukReXULg5f4SKo>*blT5ncw#^WWaTqF26l z`l>rt+v;bm|5VTOhFN^_h4ZTBw5 za)pPiNcGQsb;UAIb62>AbKYA$PG@C99k!{vvupbM}gP3w!3xQ?=XvsQIM5 zNohxKokjPIeTkbg&&h55x!2aWRCT_L^Z)GKUM24Xcs3vW*7~#Ncfq%pWv}8HmYIfp zHhIKf*AlsSr@>=3wqtYk_`EGl*A;CGTl47iob6Y>b(wO*Dx>8d8fu>wU=V|)x_7@d81nP0Caqn=^Zm*u5fA$d zmSPh_9;`YRpU-Z`V8(dy0Plgv?6>|U%r)E563jkT=1bXi{~IT_uU@RFll^ZFzqDD; z!^7>t(b3%<3Q7?=VmyZ*JelmD_V7@v{ci@3v^2H9zrWkRsnQYSo?rLtrC`RyG7Ue= zry@LuAIz(M_pnVm@4@x`|4e`W{Au&?i13}_^R{2!-=DuVo7vd+u0f&u@@Dzp7ELyH z>W-S_)xVo?&-giGGo!o#XMOm;qJ)6QyPV|(!w&84^Qr%!d`0Tyj~;1Bp?WnwZ;R4- zS=*+rf7Cr^`^}JV%4M6ItK0Wp+p^LrFfRVYsY6F~&i-atIwj`rcfqMrx2zx7S*4$j zzw&I;e1;P}GDnV_iB?svVNhb*d3AQghQF>`w^ewqUdG#JKe;e=`N>_ARA24C{ZDQ~ zUc@2Gp7&*oRocsz-wQrH?UU%9%|G>5Ehu~LaQKY$fuFCdi}!2Pe^6Gc)l%eqyky@W z_Rvi~BN>itxRm;1HdDZscX3Zw-DP#icvRW4{IA;@#k&Fb*zS~CUJ z=KosTHrx|gw>SD~_?nkrH2J$^d`iy$o_%iOr)v*a-S+)@?|VqC>+3aX2MyH)r&jJ} z2zguS9{P4BdqX0pa^?x`w{4|apTt*m-Oc~me>G+K=?m9c3?Ht#>2~oK`)s`fYS|*4 z&GA{A<W>O=zvg-$`tW3d$S${@9`w9CEBa>lj=fXoOfiZ-({{LC??b?Q z%_U3TNpIc#$hT%yW1Qi4q30Ib3ul~e>&!2{YERb({L{-P z7amS#)L2yz`25o)ecQIe!^x?Kl2?buc``5FtmM(LJ#fsnw8q(z>zwTG+xf@maDRVW&%?Z|bZXq>Acl^Y!g|vG=3Xwj zv#o&p_qD6xJ2tjQJ0yH@j@(rDEl(_NZ;a-AC!WMZ)r*(>cKx^fWA>*xGuAk&^!F)R z98;5z`?|R6mE@@j(MC(JFV$o@e#_vtFBALsD|x>pKgN7Im|@61^TUb+CiZLc5HXJNfpZRvyD4<8RcdA7ju(@Mihb#6AQuUFmpGq3*U2J5PVUz?d(7Nj_< zzO&N5xcA%AjPUD!-mSU+Z}R;jW{2q$eCEl1UV4O0_3_7@Cs*HeONp>)etiDP6FuRS zSBu`AO5=L8Wr`=mm0j8!XUonwaz@oQZ~9H?e@9;5sck?%Ftx*-+>-qYp^v;UU*;)S>{l5A( zu-;%j6XsRv@)t-npfZRz^DB~zkU6_mIe3wvMl zX)+YOi|OR@eXi8-EEK9eI>uhmXd&b!wB)H?IcqG_?a(5fL^FCGNWne}buj9!5~`>e9=?(X1}^Q}2CGbrZ!)=$5rI`}`z&-Qq|t}h@u zzmwl`vQ_yy2CZ|2R?R~Hv>5I`>j}?`7uBe*v>28-CXfUtjm=zfh!@#^g*#|~s1x)Ggf-jm+Zwxf!vXn< z6PiUvAJ4D8dTnp%k(S6EUk`-{Htw&Vv0Ck4MsrI!prAP zJfc~vd~;s>^{o5fq~4o4IJ}>JGjGxNR85Wfi}u}d^$C;UbY6VR=Gyd2c0vBp{}+qJ zZ1dUqde4`=TD^+fQ)$=itF)DrTMX-8>f81A zTc+y=uK)HoWUt|$;;j!ZrT)IB-F8*7#P(6W!{d1i|4+HGAf+rk_ra_F>Xr9vCN0(b zZ{T|O=T(WVs|&xld0(%+6+hSh{6f2oHzBic{0(D}`}Z&D>#JSAMIGYamMzmc6Cmw1 zT_}h1ai5}ox91t18)nU??Y%<7Yo;uFmRBd{>~qKLiK~;e^{#t&|CmhQH~+{|`I5v( zezjVkhX)pcHR@eE}qhh)_YeyZh9-RH~!X|udlBg*ZwNu;^Nxz{a*DGZy{we{@?09)`wYIi0KJ|YU-&H7ae})_XiiW)#9Eo*~7u=kf zdhuNN&PR()Oe+)3zaDFIpQ7+5?*X?^u0M-{p2gIKoav9x|G9dr;|RBlz`ono^N-i< z2)g_4=}NDK9eiF&dN=-WaG3Hz`bmPijrgMKJE{ynwbzAP?~_=$P4Cq@v-&BEPHj7% zqa`X*yeYzYckzyo>FZZF`EoD1a;);8R{l|wrBkNQnD<>^T8(G0>fEm`4YszsZyED6>>Oi)$0Hv@X~ikmbRRF)&3rXExAsbV^sW`Msrr{| zZoiq6;H{-R`M#i_@oMh(0j#F-zr#7&7}MoLQo)7H+zXIFr?tsRDi{2I&6-s;pJ~aG zRmH__^QMS4o=pn4{@`irPs>wpzh2*66fLT~J+w3{<TQj(zl&* zLV)|JXv&$A}veWB6&Meju% zQkL28OP-;cAU|Sdt&2>jru6tv39NtNdp1tp-fpw2=(v*Q?N-CIX z%&gn^@87?f+3y2?Zaq6$c)jMoS*Azhw^y#Su@jd*J#E!TN%M|Z2@6gy*s;+<=b?tk z|Cs;mOQ-NRT;C)gCR}|-?clQjw&U|pUf)?9x#6wrw_dZ(P3i*jbKFv$IZuDG%USjQ zm0iDq%0r!Ze~NU<`D$m*Sa6`ys3woC(_{5ThhCw^yx#xwx92Ym((-qyJ7O<>!t_A+ z?|coV^NeN+>HkZ0S=r6^n@@f`xBcqM*Z1Qdem32|bWfaq{=T1T-qUm*p3+{gqNmp< zsvRct%g^MkM#Szi-PhOFDjOS5K0DjoIQyDT-u}O3zrMUYye@Y4jZLZE4nL>-xYqc# zd7{*gy&)kXU+fQ*G9+;Pd!G?{KwNiPJzofe;E&*^dj$eEdKmm`$P~Pgmbd#|xS`&j zcKfXlF8tWcP*Hlf`OVs!w?fjAU-JL?cl%?m*_qWgIax9vp9S0TmGr(9HlD>X`~SfX zQ26XS_TXT&wEW{sa^=b9))EsdJND!CteEYY zMNywrY!2U@6udW(^HBKC;v3PM&)zrl$XqSE?Zdt!U#o-uJkR*Qe&4E>5|4h_>TTO4!JUs7SU$r64aCX=HtnGWBo(uK;|6MlW-$#LLwTIv87}jX-iZ`wJ zn_mo>>-z1!@5Zk!yKBAG4xd{w<$uRnnbX@gN#8aI$boOVvn@>a4c+U_$8ZJDLMN+PI?ut*v#h2ePEOCRFfUI@0aH!OMgBs_2K6%{_OjA z6c`Ex!*ar!?PI5E&R?VR^sXwaO-<_duu?_0)z!K4SFU8*ka*n^f=3eWvmJ8xKU1 znrGb>OzVC2Fz`LoKZnzAc$j~$qPAnzXe1lXKvL~S8rFJUo)xr zyzTU+rl!NU`j^S_ZcabX_v3G?cwEME6_*ydd+Dl5CJUUeuUNZQmW$`@k!6-%E0=Y; zPYKEsyxD8dP{jV5)!{?Gz|2#OSIq771%&Ug3f8lfq(807S*8$Y@ptyJB0qoL@;Xbk zgxlP^V%x(jEsd|*PkQisFZT!81Q(Z_0HFu_=S{Pk?ap0QlgIVCY_iz2t6Cm+<{h>C zzbyXD%AV6Z<{4jJ#^90a%=!L(#mb*@3k+cxRU z`u2DEj&IRfvDSqVyDzEcFvZOm-u!UEu0-Rde)S1C!6%cot`&Ag_+DJn7Vnt#LzJoO z&Z+Xqec!X5hMui=U)uWLEvfmuf@Mxp^56Rb?@#7`-_fLV_Wkr%ZO!vfuUR@}gJ;K# zz*DEUZQ8%>-|x^_{n4N~lr8h^Wf?A-_+IAo?6~VPJ;S=~z-@1?h)wHCU#;9`5&KX7 z`o)FUobQ$A?%m&aLSQq4){Qi!JBezBr{*i)%HpfpvbS)Z0OJp}-E)rLyIFZ4!8f*f z|Gy0n4%|+evH0irTWtE`j&1v1Roa@BBI8i{h6|3EO$)&{Nen_ScRG<}bg! z^B+6++lgUGzuO+?eh?H%R(|})W!stjxmGKmZeuui>_Ok^TlY7LO}g-H$!GVb)yMAt zRBwCGu|0V2^_zK->rWro-fN#{b+2%9yZ7|TNwcm+JO6#2b@`5MP0d~ZQ&L&aj@=dS zu)XAUeY0@H|6_Uqix^(rIlIzm(HqVu*WV~yk@B2i*}@SWGh1`nx)-JP59V|HeLQ#l z$49Sj^Z&5AzUwdJTmf&Ewi!%TpPi(FpKA3Ot*P-prZ~xf855Koc&r{Zz1PSlo;*xhBOx~og&?xinPE2vI2o9*3rm;Hu{NC%@_ zZt~rn1O@?prGs88rycg*W&TembA8=mFD`-b*I9hC+;0kNthwvD!c=JYNyjC&^PJI0R_3P)qop<(r_`RwI=Z0CwvX@^KX}SAm!M)2ilBF}Q&Of+%?cXh_LH*Ve z(+h3mpYA)YzB@jA@~-=;&5zGN&|hAobiMAD|J#-Km@a)Qm@=!W|73jST!-MTwN>6h?4v(P!I zro)t}jX6^lPq%zl5| z@tMji+g5gs+Jv~LORi0I-m#WndDkA@_;)h00&_rF$>i;HS7ZS8{J=^O4-RSSxx2F=#KOPl!zU}kz%b_Njtu@)IOQ+_Y%C_>mx^>k@3!%k1 zUp%=LtGCxLI#-Nvof*u|e=h&`Tu)Q6)JJBfc$uP(>FiZ9 z_3;q}YkJo`SDEnlS>vx8R_gzc8`*q~J5wgyoOf!1D!-Y3(Eai(tK0TjhWs5(U9xBA z#^j|xn7m}F^(zqt!MlHyBVw+~Nv*QEp}e+2>U7nbc}5L$UinVBDlU-fpAhuj`sqe_ z_0^i(##by~2JbAtvHw=h-2C64L_%MkS$rz=*2=!ErKZaU?2rF= zp(ie!!soa!B6<(YY|RdiXqnd1-JpSUhULrS92YH?mK0=mXi?Z)&vI!;-esn5hB^;p zu8HY`a%P0n4@XVYY0XQf{Bm?LV~9N9>TsIj#ExV0>w~KI)W` z^4fFF)Sx5Bk3TN3V45aARrX%`Qi~6ppLO^5*T-v?zEun}7ye)x@QhD^Y|B;rpY*Hmz5cB4{oh|X zpR%?E-wg1XyZmu=ZQ0516*YQi+NK%@uYYn_b~A&-tOB!%-zpfw#Ov>_Y_>E18^stA zx54A@jQt(*pT$>h*T11#cyQ&HPPwD=Ug^$gowUtK!OmZI-7%4_HcgF$xruy=N?*NB zmGATVcubvP%GHZg-#vdXAmFo2VhxB83X1%pZ~;0>8+O3{HqH4{$FPN zzVpMDl|jKfb{zKDWSgY$t>fR1*R!2mZcSNMr4*#Myx?rC#{Bw(z=-MH9G(`^Pm8zD z>Zp}hW${Vcyt`=Isjg~|N3!XQJ}`CNotkg9_Pt!K^zKvf$?iXO%BGwTYKyQiFYdNj z^D@Fmkg@dtl=5D!RevW{`3uIyA7A-QOZwX72f7E-x)hCnm3=%f{3yRH>xbwR%jom5 zm*?3|eZO(zlfu%pWBx*tCNmg0^-t{E>A_HAXZ1a#A2RmN4IO*;SXej7tjJp@ChpJ& zxrcMiP1=qxOFI>MeoeS6tAyFJE1!JJESG=jd~$O2?$eJ#mxf%ev{>q|a`mg6n2zqN z58VIm-6PBkDshnVo|UNzRx(wNY6t>!>SS>NKh8$Jtk#Q!dwkOV}j!WycQg z+jb|Ef1kapwJKfXZ{1`)Pvt+8*SLS@d%Q*c_sMnsTvy-eTl1M+oxc0W!NL6o z`M;=Tx@?(}5lyXr1GYH*pe`3sb0~( zPuq_Qhx}$VxVU`JnW*aZyYhcX8<~AAn&f1Z;`%UMr8Q++bbVkfpKIybs5Cw- zd``T9BU)$w+wV(iwiHi0wfg3{-?!r*Ejn|*@coACOY7fc{+KfT^R8dN)$H&6^#67( zNA=*ub8kLx-?;2Yc3F6?f|*9^rPekyh8@b7}u_xHO`8m#t+wz=r&Sy7W` zX2!Pkb>hM%ZdNPX-4kcLQQ@1ZX}GuEKlkMJ9oglAB2VQ*t_SR8O`loMxA;Wf^~A!I zu8R^c`rcUi%6xntwC5lHs|2-sW@q?<+|G(l*6n-nVq!<)(rquePi@=J;t~97b(3lN zs$Gv%8Ezc@J<;TiDd%gWi8Y_!f2hpj+tI&FB&u3GVADtcf4?_#WG=7KQH$nT*!eto zYq?$0jgI&K*Dy@Ut)JNT>aVdrQ^0HE9}+tf?l(zY5A%9GO;FZG=%7#GTcNDj-LuS2 zbnFTIb;Q=I@U74)X*1yzPo*2Px{inY#(n+GIQ4op7t^-8>b9SIujC`u*z; z&GVL?-1G0L{qB(cUj#h+Hhz9Fg=c5(GqtC$7kK|!XufUb?BmN%?08t{yIB2H_MJWd zohz4HUDnRF_4$39t@L_}iRH?2mg)1SaVYpr@1MUdBq;LoPQFfKcDIuoq-n?Pu{!AcyS1W%ZZOE73tC^BDv~B z?`ls0WnWd^H8q9O=YswR&tTO)E%`G+|4>lV%eqAIZ+hBG_ubjA_jOCe9$vds+e0^h z-Cy}?`To463ops1tkTYVur_#KNctXwfL-$@A2@LT*Y88#W+5BjHrM=bS)h54XU?J1IK~wmp6wx@0^`j{%yjR%a1**ZTZ4`+j;+=Te$B|>-D#v z|L1VLc~Ew}VugOWY45ugHv&)Z>E0il{>~j2dy_C)Lf@gp?lTWjOu+-_JAV z=XU&in%xj=ch`1yRsPypv%YqG>5+0fzao)A$3UA1W81kStpQ@M@vSQgw0J-2)I{KT?t_RPJPgAZT(6w1>h zeR{!;%gm>0_PpNexAkD8$KLY?H_y#0$==*h{gK^9jj6bCxAgVei^ujT%0_K5Y0TEY zQ|i$h`K8wBz>xznKj=JcskC(fM7G2OXknJj;|xPIE38yolh`}JBx z)HI%XYS5js+qr8`<)7tE^!DSh4dTD^@y@hEM$-1VJuh}VIQWzOAH#_X!I!K#?0NYy z-?L6vI)D5AwKVJTiS*Rj%B^SKe>?a5V7}f1^VdN0g+_nJoE4A|8pxjH{s&G7WflhX^HPl#mN zusu!M`1-xYMXSu3lG@qt2}p3qFfQ2Rw`W~Zjc!oBrpUcxWsCM``0GBkj#oDM7^4)l z{)_zb<Mzuj-n!z0+f^PsXLAL0ilBb-nr)?Q>1z zPN}6xe#Mrv`}evSUQT-2TgA`MX>#`8zSW;hMYCRO{{DBrXm;$>^{c;pSgoq~L}rrH z@rR*bMXuKPm0fgRwd-I#f5C69fFHN!ey}-Z7n3Br{Nblx=Oc@5tk)>lTfX9(_qOS0 zk33!-XqzlI;lzT2E^NHV-mX?!{^?1CxT{~6CoEuU_C^sN8d+iTe_CW^g!RXf)!zjT9+ znxfvNuH(1w96Kkl&~b`Y{>#tG`>WjkNk2dO*VaRN^AdSUwb_lz_xzk&XSc07H@E#m z3H!vEitIX@zyB7xQ+if5{@_M4o^Hq3K-+!a*zcB{kV|!~3=KA54_T?8et)%Eu3h%L zlFyYtDQlU=j^W9d^wpD(YfL1qfoh1 zudU}--wEzN^}EY^`@i5)yR6G;(obdo2rqojT+jOL=~SzD&8;gIzm?@{m$I!g;pP43 zXFL1q@z?z86*RZ~t&F|(>E|a4xmwkNO}`D3k6l>o&L3CzGxbfGHD7!4rJ(v}Q|$l$ zJg*b6q2cN2>Dxo^a=yQnyosInB_83v6XA0L-5 zvweMi{qw)y??2!B{odnA-g=fyy4IgShf}ff%bj`LZ!fpu&%$=ONA~}J@=KfN@kHFy z-`w?ocQ&uu;?LJ@mOgkmGg2q=>Kvtw3l_5OB0p9BOaDE>>-zUh#kAi05S zhhPEoOs|#K4nK&J_}EjjwQci7se3j0{6_5pdEE=I%rO73$vlL*rGR`7Ph7#yJv0kzNV$0URSvDSK{g0LXXWp%3d;&_gdbWc-Y|P z$FichNwqQ?mn*g{z58`uo6sxmu8xcrHE9c>8$i z?CR4CdN!0@*N==pXS+Vna$$a)(i-;}+uqz1JpE1gGrQxSdgfA2_KAxgXGncb$p6-R zB;)*=dGf0_>AGujRw=X2pZVeMJGs)E-)c{vo1varQ7LHge#N^z#v#%_?^~@@Yu|Lr z*XQ1su3tY2W-BUj9`I7wc=S=d_ENR-wBLW36&Owy`u!_AFSY2=S7{@yP_rKPgZ|KC5JwRO_;>DRR?3O6`8Ijvav z^3RIC&+g&{=cnjO%&mF7f0M%8o7}<7(_}jtI2t;77^X4k7OUM`JLT0Cjm?h!Ub|TB zINy5pJMY_7YV@OUO0B+J-S!_`Tg&b@>E?U)96!Qs_wZA*XM5?2s@M>vWyd`4-VU1k zoze1sY=zRC)#r*9SGczP-lVp28UKknTa7Lm%xE-tQDOE@aF1-~QlpT4&;o{x5cUb2e@~Y*cjO?nU?MpMJhF^pUQs zsQbaSl*zjNU6^oJ!)dwcm7PuH5-Tb!&$)m4`&jztzmI+AzXyi!EHnMSx^u0SwB7s_ zWz6Dp4E--1Ijj)heNo}~oQBnt9<0hO`FusFZ~bFG)A`f)K6?7Nck`8S_f?W!E13jm zGVI|hVgJYd=Uc(6JHaAHO6%p$+zsAV5cGdj+3B6OhxX|2Hps5C$~%AXtLDEs&GNS{ ziVF%J?2$As*l8u+^7`Up_QUP`_HX{m`Fvnbcv#LUGUe9J^i$WE`(|ma-0xRZSL@4jAL+W6mNWPwfpa?-&ge(JU_5|iMumzxP;iHDU1Fl^7Q&RUSUz) zWUeyx+*5y>sG2Df8|pr$t_qFYD;K^(DB;wt|EK1*bw89iqHQ3%c3DnD!I!w_$(|x| zOHUj>y{RsIRhV!?{Iz&p=C(b19e>SOXdc&h=ZV?znfzS3X<`0v)|Sb?-v(Y|UseKH zvRW4KNA~yOdZs$7d%2d0vJ0eNIhq>ESM2{Q6y@F9C~#NvqKD>J<_qC2F0u;~_bijhR zX-JnjbJjQG;w4S;y18e06SLnnK5zLMzb)}FTUU2C|L%FV)!$?qul@NHp(EDR+{_Mg2TOxcf_pN@h z!lSAA4ZDu8sAOSJ)MC(r?pez+Z|NVsIDa8*M*&RhWs|oOmtmT98*VNUu)MeS!WQBA zN7p=8xDHXZMR=xP<5I9OWle&D#sX`mtg;gOZ9H2foku(A&4r|2C9BoWJUsTid6Jj( zYV-EZ8JSGl=6~~-%NJS5+{oE>c-`_zfso%ovu292Q&+uGCF@FaK+YC97k0pQi5I zcc^ZY(=UysPJQLoekw{q$}4iJUH)#5_mh8|x%y1-r!x80N{JOelJD*l?$;E5KmwvQMH0RcqmmFJOOkcWeS=){qH<+hc&O4|qIKv=K z-`wX;=h;`>5$T4%Px!1CU(M z(BCh6J=-*AXr%=SSp7+u{r1X@MH)Pw$@-VRnf{hoDRLtw@ZffP-{5!KxYpFW2Tkb= zZeS6amV9U5d|APoMH)hhmDg0ZF5DYbyh*aFe;-rf@olZ{6CG!ANS{o5xx_Q~{`%|Z zC-U(4ISH;mP_kzBkNrL(r3d^DKUlrSbJeo9PS;%o(#W!aa8!gYuCCI86vUjP5&f4ACw`FAIO^4pbA z#d>D>@AI?l%1yp4uswQbYTUzJ>{pju{e5lDzinRxjn^j`#Qf}*v*+4)yy@?O+ReE$ zcP($I|FXw#-TgmZv+mC1bxC3QAZ1eO7RM&Syj|wYJ?q4Tey(}@N^Qfs*B{<=c+;tw zKM!c-{W|Tyb(+cDDPnDykD9RGa{CUWloJAN{PKR0k&?yF&R9zMUaw1>GO9Kgjy~+F85(+7b*-H#F`)p>m5WL@fGw-UMm&)Rp?* zbnh923yGW&Y5vI2QD-e%+^c?vJ@oanQ;YwqeY7#*W1r%FX2N$4iSmX`#b@-qoi6W7 zxmEsPFW=W!&yu$kgZ4fNKyuAB&BN~^%I0~dIC@Oj`SRYwuUfC9nB=E%Z<}c_^VYwr z7az6e=$>M~=~L3V@!@C9ZzARoKFQSh2WCu|*`lGX*S~1Nnnt$rVp+v9;iMn8AAQ!$ zdTpJT9lKY2y+7-fi>lZ9j<3EE`hX{5d;b628tHdokH6?h)jhw&U0;)T<+%UJJ0S+O z{3>s>71R!jJ*(Ha8vFd`^NoOEQQ{*lyM%4eZ8l$`3zB)adT`R)*tV9}f|K;xG_qr`l zwA{S+ta);?^s2k}ZS;!$ssm!T6}^#pnLXnt8^`@{&;lfmXq~5DTc=!m{y4kFBlw8I zkxL;w+t0i1U2eAEQ-ZgI8t0w-xx1y-XW8+a1sj}PcvrB+)--zd>wvTC*WG=iU}wSW z>?3mhY0%?!8FuDLYBz*#y*l6&6f!|~*Q4Hh`=>7G-F)SA?z|grN=gTO{v7O=Z}`vT z&t%?x;l2xm^*2V4?5)wMJdc9oP{I%b>r%#{mUKMqV@pR7ZZEq#Es$F>L+-)uTC*x&L zqHE4A(Nnv-cguYF=b|Dr60c=+&8^m0uWz%&YRUwiuK#lk-Pis8WAyb_ z+fJdRMtu<;k;%M=WqN|*YTiAY=&a^#(b0H5xcigo{q;vSB$h5=WXns}+xPdKGDDjt zhvChSm9GN!ol92{HcX5-G^_6WE^SBI7rV4)tob*k*>1h?)3x~*|8cGSbqQe z=acD1@9&l0ul&BZ^8LNycb3mNf_5FtR+TP4E3C{Gr`dnjTA}UrmbR%?z6&G|JY4tn zcKmuyM-E-Re$jsOpxJH`hOZ}I$nv={XX%Z*p=-ZxUD#n3CepsUZ(CRP+G9OoKcsKo zotJiJ(^mPG3qmR%MH|pYVXKN?5_I-88I=waj{&PK>b#5(gJMS~toO4T={n7QbsrA2K zbJnb3?bQ=VF31;PYF8ECzIfZ=D%p!g`?nYT*{i)p&EysX!=1isuN6$HOm-=}|7oJ& ze{f=GcE=HcE6gtoA8mN@02T;^L+HHhSEb9)Fp;`+|gn*PU~_1Q_+@ zX7~p^D|zS0!DwF3Ry1q<#2W$~{LQD>G}ea8m@+sqElAyyU)r#@xv=22mF^X}?{B>O z8#g#;tZ#3Udhcc_Wg;!Gz0Ymm>RsilR;*a@$19LmK??-bQ(vsTeb&nOy>yAx-LB>B zKhE;qkvrL^%xm-aXkcVi?(^Q;)!lU`W!;bc%FO5GKX-B>qnqyc*m){?GE%+wtZ#0x zw$+IUKll2+Sc&ICA@Rf~2QxL3T;3b(G2@fbM~# zlRNXhYQOHU%~@a|eOvph`k&O@=aNe648B}@`||RG+>6J4Fkbk+N@dxf&oYb~e*d+Z zc5lz!@_T``PCE+UtHj%TZ$A>0rd%G#DLwz(G~U*=!kb>yE%d2M-|)h0m#Nc~wbu^b za{qQ(Hed6U(?ZdnI-TI2DwWB~_ose%dgbf#C0nv?*59y|lxW)P%+BfhdUZs>Nh?Wn zi#giibJg#Z@$1jp_hoDC&qIMqPn#mH+3t#8SO1AYS?-mtoBgbt4-KEiZm=?_4?XJM z-(O#|;Txabl(@&oSv~hZK33=7z2iVg{9UVR*6yP8&kz6YKcx}O^jS~y%Wn0x>)f_Y zsXKpr_xq`#XOHfwc;|IdJ88xJkMH7Z8}CGJSZzyj`c&-7#c8O7!Q@-ImDc+6-D(=gg?+ob%ROOBuYQ+Oh0fBGl?*7={GEYns!@Zm@I&f*8z zN`@`=Gpg^4~lrO#!D5{oK#G<>T6` z8yguO+NKHGzwk|5ecScjC&zuYRep8~C5)URd2{rnyTlYs*phzl*Em#t=SeV&vaQMW zcMA1qU0!~Z+GV;cVbb|nwKEfyHE)(pUSoT!bn!Yxjk)v0<#KA5dyDHuOZKXEuRK-f zX0?{J?rZZSwMjN*GZ`{8{>%PR# zDWG#+R^fGy*A@A_W>fBe(GreId~|$qa_ZDl+nI*_69fzAU&xL=9xmq2_nKR8I`6l? zK3=z#&-_w}pXqM3GWXuGd7tc0YQ3)7l=M&UlJfg+lS}K5#y@R5wVdIFWTE=Zi~XF7 z*Im`!d~aJnZ)>F)QFs}AckCvZu7+&VIsX~Dh(IoH|s&v#F2I}mb7|D32oK}6AspZligWG@kn65bej zzPn>fw7{%s8`msZnPmDiTkX^~w`u1*X7BNT!Te|MYnf>>r^@c@OMCA-n&7wSc#Evl zV(uk5-}i3%^+B7VMEc`S4$nPvmYp(vvfggLH-Fq*!&yHLzVDcDs zH2ddo8Q<9%#MjI|x#peSWB2`e2EU~ap4f7Y?X>iRXZ|Yp-!@JC&egVT%d}9lL*IWt z`1oF>a_XsVru9NRFYYZ{9Fwpoc4BdaR?UxU$NMeUK7Dn6u**{ScYAX>pHt7jP?gm| zfq{X6neAB&AUe=eQ)=_)qRx)|-MJ6jiss~<{P9na=QPLDm#?e3q~mYuUw^lHs=L=3 zr3*_^A1&};*mpao@iw!iY8dB-D_b*@eC`*#@#BxrTeaZetE4{-9BpYOHY@GtU2u?n zfA6aMkyh!ID~dndea5whuU}@GoYFD=jt5^|StD*$ROg&ow|LjVlO6XGdrt8v>mAal z`+i66=hDP)B;}R}@0XQ5 zZ983!bG!Q~{cBTxp8WE6o0k21;pL~BU5>a%>6mlwc=4n7MRn|^e5Je9RpnuK_Hu_8 z{}wH~egDKkfi>!-K|0L&zRG_uxqSS%L3Go`6*CW52#2q;@}IG|*F+@Z=66rKsOGkP z;p!6&jGW$7aL+VSoTj}`QuoWV`SP27?b)B+`LO;~>lY8cbJ`2C>KFS+2r6D$cI0>E zsyRKM-fk_r{>J8hCA*8{i_%sj!|(H|_j~1@Tr1SZ;N!P*9(!A@3d6Rke-C`?l3x-j zu5_$){>dLpw0{=-kNtItp87yVaskI)xH8aw9De$;+}QMOnG?@Mo1KMf3?~=P%+ZZL zw(wRi%PZ#}zPECHJodHeF1^2b(*xuAJYnI=tGS;2+GlPp&1m4dXg%Lk#Rn6GOD^i( zJD(bKYVW=O@l1B?%QzL^O$rJt-+9=-!A*H*Ld4Va_v#N>KCNRDVAy=qr=r3_QBm>A zH7)HBZ!fPED^@6|s4P69~WB4)cknZzT@t{^AG>ozV7VZP&JIBPuaMLMe?EZkJ~HskNTe8^km|$yJt?<_08P-uSGyAOswYE zv`a^Y6tt^!{QLg7WwiG7s@~tYziO|{)Pj{KdSp&^KVK`fT~A)+^xB{Ml1;3#B4bVV zpZzXn<>b`hSF~B=jMdc-E*t;Gi%fj^zy0teXWw_XgBBYmbV(>W2`y9F!uVj#=W9Eq z7h3+U-u3K6G{@YT4{mt6EV=9D@hDX(|Ea;tE!(8{oF}jUKG&__&(Rk>7k9il^?BE~ z8}1xyIrnNdK4|fFs9It9%Z}mOE?K*y*&c^NQeABqTx1oz^p@*Y-`~sSJjGWeCLOEO zXUO_|?{L_5=T|+3J95@0OLGbf$=*pYotRhnBp~;$%aTf!yH4vwO1IexDH#4R+H%Nc zvU0!H>#9r2?-%8N5kB;8Rf7Ld=1a=5Et2eA?-m*xzFd@Y=lo|~?Gn)}6L`3uofc?Nc^c?%YKc6v<}E7Wd&^k0#|OIkem?jFZBiC-XN z3|{X}yyRN!x4oWIGgf9z4cqM15p0rG-7}r0ErhKFc(>4)!$jlM$A263yEHy$yvnJz zi26S7jp$GHi4sMUd*9ZJ{nq}cCFsIxYQTN+%j5O)FGqPK-~7Jsec!P+WvAYCeA(?< zdhT_Qm-xh&^>4mRPwT7J2y|E$I5 z#T_>aJ1k}{zb4O@RV06>TiMay&K$a)$N+*k(X?R&2+R@b6=?2@KmX;Wf9j?c zmyX^0qc(4knr}&ekl2*EEsIzj%DT-A3j>xgRD4`rlUb~Btnr>_W6w)zz5{>dWu`^* zX->4c7aw+J$-#-SlhTjfuy}N+H^kg(=d+`GH|_JB$x^p#RY>1iuH#j66cZ2r;@X)P zuj_otx#D%7-6HoGhJ$Icr^`bYU*)hY3|O*atHsZViF4~T9eZBLwz(g&-Ml%~Z=-6Z-_4yG8vEPks#O1u2S0KZ@19keFWP<;FiXP<;$5jJbPGMbh+5>ecenu z(}zyd9)Tzo$7EQSSwQF-U8{1|l3RrgQde*e;@ z`G1}qnC#=RZ&mDXdHEl+*K80gD16m>$NUTPMg1%uhSPnuJz*J7civsr$>wfayjS>T z-a*Nj2{on+=W}+t<>~z7Yp@N?u6%gsX;RF0$(l|7Ir~iCJYOfOymE8+kG`wsMJ9Wd z+8){Y8D2#t{;W{Zh+v#t$0{rCI*^Tp?XYTsf@`|~CvxZzW@r6_ZU zfD(5`1ulnZw_tWk;_gI4by#0^Cgjr@?AJ)9s zc;)u$Kdnn<{%h$Z`kc!q^pR<3f_v)3t z1?vL#r1^C&hi5D z`3GhcvZ%)>Eh!1S z*7NgcZnzWvlSA&My_?pW`P$sCo==SaZ6^Nhj2K(4h2k;0DbZmGrD7-J0>5)M%$aq4 z$>G>$2j{de$xI6C)68yr*FM+nzp|(AaIpLK3HOyQTzI3Uy8WB(OWt19@1Zt5p35yB zsj)980DB9%aorqc1;dj!PY8XwscH^Uz zJ;RU8eBE-Nmwpu!<{ilpZWUd-x=GyL%)`XmMn)^^(cVqkT0uAIJ+`LN6W*OQJMteo5azsO|Qjjwt0=KSb)R4NV9VYqutL;H4LO}JC{ zN9HMW6x+qMK5oe7Gu`xS;ohPn&3iqi#EVbuv=%5v`rtL(k|@js`E_UV57z0Nda zhw1mE`-V-Ata%On-z+F#JLAR5x%%B*-RMPj8FRhP^gNm1bIA8pW!>!W+pcivZhUsF zK+IaZ?$w6a#s$#@`HWsWrU+j&FH&J@yqug~{8H%tH`%A!8+J(UopNEHj_ohS?CyPEvW@i&rcO0h5lff-z3STMfAj2%x5O1bE4X6l z#4+)9r$w5AL;67w^;3 zIM90X!LernQ>==gpG$prXQ%A7+OJo`GjrbD`t11h&Bl_KL1sA_^2gpzcUo<`bNVd5 z@?XK?(@(b^UZ|0zzvBT@R(5vfub0a&W^J|k{buu*cXwyMd2`L+U0~u{-rLI$74A3n zt*rbRqIhJR@S97Iaw8R%=4`d_t_7MQ16(g@y>^Qv5wyC3Uo3yjh-o!SM zE%&~Aac}$eSHjt-^F<|l;>qhA*u)qRX=xKAwD? zwZ!bbtfc*qTtSiNn+*kSa!CQl}vtC1FvC>kr-Aa6ej0^QM{iGT&R;Ooyia zUi9q+yNQVIi=yApPF!RzG$B;8-}hFrrBFPC;wV?A6Oz z6EC}7Sae!zWxJJj%gn^nhnt*JKU`Lvu{Ug!^8UN~8iek>nrk|#a4(Da7t4(f&zES- z@BaRyXnk_=p;gTVZ#^v3BMs7XPydy;6(|fE&ecknzsj%(1U_x9_}yo>kMqI1#l1G4 ze_qt{J;%(`HEH#}m(SPRnOFA8_MY`h`*3{yOU<@r+izv0*=={1)6V`@TVLU}s^G6# z>kR{D2KjXwmWeI*8m4_)`_FAs+p=r#)81F6h?@mQWgmY!jmM8WF`+*pZq`-rm~T(? zBC`uG1#Y`E?L+v@`Qj%}?Je!8UTD8^@*|Ee^F+6>&zkC6I zNS~tZCH;ey>08z&_nDQ&cphL~&nMudZDFy#;Zbkymv2s74Gggh@`IcA&Ju7|nZGSC zDb!TlxH!;!|LPyNer!FofLGy+MDG+iJIfD0INy6t4m0F1v6Qayyc(TRbS3c`YjT!y zyWe7U%O(7byAn(?JUG0Rl@#WAWhZ&E0$%oGtgBc5aU=|E0K!x2p3k%k~z( z<%gdZ{XCSoa>bmEZEU;Faq#fiWX@feU?SDo*{P_eb}W5P@$S1%o;{m1Y0{%~hKsNL z=FNWMBC~ye!OoaKhY<>E*F0|=? zFZszVSxEo;RQpYNTDoyX4C2e~o!IftxWjb$g3B*%hHvegE4tb$H(q&*#2(Kjy2n)u z^GdFGIBYqQP;S0?agFNJYsoK6-OhFH?=b9~K3VFPf6V?Z+o!1eDAe7t^qwAnDWle* zJY%!e{+#ErK^b3^R1&qMYB?MWCv$eq)=|3r-{IY-gO~1l-dJngc=~nd;)|@mw{5Lp zH4!;CnOF7xqzBss1?*UoJ?@)vy%rXpR$}V(B10p(W${amX`i059FO;j_+%O)SHrf} z?uxkF>Wx3Lvx?#-f^%R-yinU7{l2ww@2ed>I^XYoT@W68YsZWu6HdPrGYXEF)4o)| zYSmiljTS`=C)WMjZSq3NHS0%jMr)_XXAh;b%AWmuqW@In^sL#w^_irU#P?Ye0^hsN z8$b5=Dt#m7>D+nK{VxCdy?wX!K0Vdm?i;~%``^fZO;5bwCX{tb>Bs3UKaia)+j zNxf_pAG_T=vAR3GD=gWK(^GZf9%L@#h5ba&ECI9ZhGsk#qvTk3;CB_(2+Vl zEou7`ftncW#Cxw};(xH7-FkbYx!f^{IgTEOLSAw2cX%vYt-*QFzrIJ@{)g^;Nz1iA zMe^n--d2k(zp1t1>f4W%E;nD7&%dOw&^7M5&=JTQjS?o7BZjR=uO=oQl>g+A~q;RQA-)&u{bPzHsJT$^P+hrQ)HK3llD$J@f2M)r3pu zFHJVEnRMdbsgQ~v&3jvpzdZQ%!vf>Xm(`_4v*X{`_&eR%P{0^a>hN(+rp5*#bCo$a z8sCa*WqpydId?huPNR?$w?hWY#lMF&ZeP1q?xg)Ek9+&!!^fS&e{4GwQ@GA!=YjgI zx(@Rt@4l?dGtrwp`zrri+jmXe>JF8`uUGB8C+K`LX4jPO-|bYY+jzwu?>he?;F?;x zZRpvfZ&v-7xW4$m;`gw1Z#TqoKfO0~!@^@4PQ8Kq1oRt!1t>9130;=^bj8N0g=Zg` zur#F~(|b1ONB53h=MV4M^|!3=+WV)CSJzsd+_Hi3%)Bk#8O7yEXFR8vJzdDXgrQ=W zaN!mQu@C)xr{=i^=1BzzEv>)3EN990V(Aa}IQ=E=<^Ej0?O?&8D)pl;FI~vUm34bn zVwJc1tr-(D^UbZ<;+&kEJyND!$Bwy)=|mKS*>Z=3^r@SfO>390lQ^Jn?(5*dkeK-I z{N-7f|EvwU{`2j7PCmYS9Dg=Xezl;YIrT!}z6JXk?HL1|Iz%*|ZZu2XyJvnp^Zm<= z%Oup8E?a4>-XJzX%&g(dhl30{_TM(@jV=&M$4`CeJQph~$u%J|^-ycg1@UDuDV7w>d@*&>~6 z_1W!Zfxx2-8=re!3-@iSiVe~!VO-nU6Z?&e%REM}^jOB3z+{fD`AUa^(=`)&g!Gqw zd(l33-sP7<0(L$OH>9T&6t*1*VOo5iRbkC>T_u&5SxZWk3kdiCu=VPwj7!TH?5HyHMB+w#D??d1CZE^2Kt zdb`@s9e5N_RQ2?F{iDgJ-)5$zznoi?|C8Bemb*~$JO!gg?;O|js%k!w+Iaojg!Svr zhW4Ee_1l^*?8+N|qUl%PUXJJuR^1aS1Tr|xc^6%r_cmOwg-r<^;j8OUb~Gfq z%sf6puyVe^%cPfrb+a|HA~d3J8DuGEDDgLk70PYeeJay<#mf(Mo37<7Ot?EmIIexx z9rM(bUw54{e6PqvuMHW$g9rH~PF^aJ5}Z4U_ zljDr`Jig7e-}31B_`6HNMNqzL@ix`~(6qzPugXhxEbDF`@}2tWVSoP#wb`>1B^TZ? z(Ol@gdY+lgio@@|2qawi@ZgKc#YbliH~CAPzc=CDQnRo(>n1WJ|7t7#xk4iB&6>1# z{!8axtA9G1>F4k1-%tLwx2Oqv?B3mD*5015xldYMjYCo4z>25WxOa0l$nNC5V!HFi z%#3HB0u5PaO}V;c=1E71FQCyMRvykkeq+2&0Q z%}BkSz4G){27{Mt9hG!KBcF=T6+Jao`<&>(PR8X|=G|M9dWZWj>w#<2`Ge=@f7LFZ zk#n43RqoO)M|$^LzOKAzYtg*(=J}0Fa|)Lm|7*VaVJ%Vw&Z)-k+U^JAh_ zH7nD>+`sWcR=sj-FBC@q7jF%Fkx_DG!{Qp&#A6xj&elxXA*MRXu#02zrlhM+=U(Z5 zZ8uqvb9%xRHiedB;(o_oZVbK|vqUCfgR__A?#cVNFP&2Ep~)|!zucU&==7ym+ELrM z6`3+)Isbj)yfsgE>72XU&i>iNFlXKT`tB!Ute38JXFWR7siLA15EpmuNT=}2`}^(t z?S5%|es(tb)s>a@zb&-1(r3xn|Cw0*e(&_^cRSlbc>Ddj+u>%_-*Wc-xn#d4Ht*ug z%DGRbvTXgUub+-ZLQjGPv?K?zgqo6294XH?8>=yBwD@R#*M{ zhgZoWQA;jdnD;2R=Kb3JUv`MBU+_5m`+UwVzYI!_Whh6}_^p#AN=l8uAmHCCx0 z$%}7`1#{(2H{6(hq~XSNmj=DYtk-UQp?hC=FUTvNrnvNUxpd%~Q`?<^RxO z*xr{cdvd|WS%xg%KKy;@^YQH~3mtcj+kf37D<5!XYDQmMXJe756;-Q|mu?%h>w?sw zLQ`$89}9MzeBravBy`QOr)RCF8GLbGXs-Qm=b6C89(xluznGNnB0WoM+UZAY_fJ2& z)%t?u;+J+s`vmS?C_VPz-Vwfvz=kCShx1dDUnZGE8FL=C6LTub-J9clG2G*&TXu&^ z;)&f(tNEQdbPsX{d&=!TlfOan*4M;2@zK}1L^owz_R+j+#=FE(}aO88m+~oc< zKBAk|%9C%+ut+q@FnDEpC2Ee%{s%KyIykOh^_z5J#XUndZ~ z;G3<8Yv_(^D-=I_xt`qc>--Icxo#y@IP( zPZUU2+5i5#1qhpk3%kvgY+P_NH8F7AqmYZ*NgBpgcl+IU6?#wCSNmuG-M;bkV+XGS zlMiLfo#xHaZ{Ti}bn0MVGDY+NuY*7Wqu6|}WZ$z^Whw2(d+wj-4&Ruzyq;zLg$n^i zMMXbeEbgCSmMdjj^<}}9EmJOC3R>nj*DD}EK&<;|x~#YB)9H&=uKa7Aarqv{9KEyW zxms0K*W8t?RCD>fP2JY1gZ03F#&QnDdmoN9?>Zfw8t?9QMQqdkl*%W&EqWeqDb9`z zHJE;Iqwo%cuWavRzDSv;*t*Vqs=?;_eCHenfq$njs4tH>{+2mTR5wo9zxSu#8ofE^ zyKkqR?B}ylV|SUaUe(6`XfgL@*R^Zsc&s-+_UqC5pZ8wpPLwnZin;aKFGfyX?&Y`E zbHAQ9?mzkXu;{jguOC>YE;asB7rP;!?4jnlc)y?r|G8&MCC4OMuC*+E!>;r6G-HSC zhe;g%I~jY+r`FwBaNRZMzqrM&tSMW})8?=ES+?b@d()SInSW(UkN@kOB=S3oF<{$c zzMGT2J1#c8oSoHrfn7yNqMC8qCV9Ub`}AAFK8B0r?z&W-yQ@D+!%0YA+2p5H;@W#E z+I%)@yZe7Q9pSC;Y$=(&?#Y}9a$5X$7r#|Sm8jiwGU8sSGv|wkb?evplf??H8J6~T z7w(8Y95Jh8Badf=KaXbx|LoNwd(}kN9`o6otAG5J-K!w^)T1`qmz46q*Y3Bl4VPI{ zV1(c=rZe{cQ0O1M}^RaoFhqyW|El<9-*H%{0nAR3<1;$XCc5FPggh-L%fb_M%d2XU^JlGvd_r z));JKff-7ZSUT6w|>gU=KErSd*3bJS!K(6^!|@itU7Erc~yBd&d9JC zw{z;0sj7tKbW9R|(wh43`m@Q>(e?Fmoac30^|xu=ziy)-F{^3)Ue8+A!ta`%m;Y~- zTqnnO`=8Q^Z4OJWZ}@vgDC%<$hxCo`Ia@Y^dYK{TxK@G3%Uz!?$*Icy@$KRFyq~w; zPMlu5H!yPIwJU2h6sP5_Rx&%IAgt7rl#n&y#-vzv+aS&Sm9NWwpSRz4FXG@sq1AJ$ z{HAzxaUOX2X+m&P>d9@Z^nQN!=JY>zcJk`)SBvWYa|p^O9=Y@;DcX}j)Kpg5z3iFUsabBz@1NSlmVdARXtb7P)IA-2SvlQF$vzgblWKp8iLKF| zezo^h*Nr(!+VAzXr`ZZKxvYqEFI_y@_vY84k7B8g@m+FM|ohF^R@p|r*oHY}5*(NMAlD_%*w!X*ebMLBxUM>0>dgkT#<~Q}h zt2$(5+T4~e)VqG@;rgyr=ZT_oBTuipSy>VDkL%E$qp6$pwtG%_8}Mj-_7|z1g;ix| z&ncG&t}HS6L)98l0`Y_(V}e zo?h^zX}9nA>YNImBRwltR{KVI$eIbR(`5F)j!6&xRiAw`DDPil!<<=VvpqOpwhJ^Z z{`xy&j(N10Mwf12vi9SxZ_6i0nocrE=E>`yeCU{SP4N?5uh~;xZ?X9=%plZ!$?)Zw zkf`p6$Pbd%r>5>KcpJy}tVYFu%}y)B;>P{V8xJ%)b?j&SUU~YNho-dE?Ty9-MLxG+ zYXR({rW~=X&9*ubRGgG0{iSB_t@^90{gyi~4%{=psHmvsKeNSLKhW8D*Vab+hq_Gt zulVhqy~q81Gu77=8|==07;#QzTAD0(nChq9o~_IGy#J)TQ6zNEtm!f06|y^+k3N1} z?$qIXVC%h2;eJ~dyPT?HKeBq`;>rchMsYW)l(W0{J=yc_awoUX(N|e1@n5UHg{(^q zKibcbqZ{iLT5Q;!W%bWiJo-~atjYcSXur2+oC&371>gG@KRvo~vxJOwAj`|cH^R5h z<5i76J+<|7jpCMRa=!zrmbf2bUnaDGd(oX)=RY<1Kk554RaP$ez%~xvcu)SbP9J!g z64&4N_q~@BbGEhaao4Ut{ud<<6;#c?`!ieZow1f_>&^ z1a7=8JMnALf---v?W?obRlR1*{r|q=_*EC*dpWN@|9@G2&(w0g*Yv$kJLcXK znB^Kj>HA|1$$3@X7uZ#T%HJes_3u-^t+wIY0prQ+C+~89>$Vii%epx){CA&7#_iVq zOgCamdVP3y_6RsHGkBr2aktjW%zGOBS8JP&&n{lP;GHqgEsl7hPmfn_em|wP^z)zN zX=SQDGmcI?&A;<+YSs@OB_=nHxoQHd7dLELrn>3UuC}V*bvGZ}a9>e4f#ZVugOcl) z6Ygt&&a(d?nZ@<$`J;mCCzf1T-Rddce>L*N#$Df2r(Ts_6}Tbgm%`4f`+^@=d}y1t zC2Z|tqu)ErHd)OU>5qxNo2RvT{^6T5?&is4uZ>aFw&hD)e_yxtLelEnjce=pzaF>y zv^sj@`$S0r%czPyarV7S?@!*XqXlZ%=73MuKt@B`QG%IY53a7Q*WN%`dijgw_Vl2_guD6Z=i+F zsr=1q-(_3O9I|>h9+J4jexzK%R$=9Zot2_n9zOV~JNq-!&PTZ?f5bH{;ZSw_*=Tff zx4q-e@8-J-rl+_!7QOkErja|LW;=J^mcFBrbpb^iwuJ7RX1I1r!CUr8uGI;z7#vFs zM6Mosep|&mdT*PG8DF{Y76}W5eI< zvTfSG=j!y{YUMxM++AG_6Amzht;<=z;LqLnb;pnON?Vq_iJ0F1IXmgvn#d{BrY*Xd z@#6mfDPq&hPkeiOyYll{^YaZU>CDmUPtT^eI!P?hFnJvWwf6 zb92q*iS8U9H497w`h|p6n|pDrunRghIZKP(PDRX>FX_}v+nX8B{}xWOSWsMiag%nc z;(>cVAH^}A?~d2FQd~0MezEcLl3SDWqGztT@&AUt;;EUgAL{P^y>l%2l5zcF4uux| zz&!&0cTdc5J3Qs(OfQaI%<&!ROCBuTtb6Tai%Ohd!kt$2Kdj+zDjl{-?D1oR{6=~Ba1dR=+{iyN-KuCA`GPuDDd z23axsQYibrRB-g;Rg&zV>R75B=2ht|(n~PQa4Be*cJ5!)A)mii6Zu%G1wQRtw&6ix z_I;_vJM283G#CA{RnVWbA;Rfuq}Z41PPQMEE7ny_cxenu0gQDr>ap7C1#74Hu!nK1 zuw5PWk4JU>?Y1pXf}{6M+a6SY>1|1`d|aHPXTcgr!#ajDuev@iHoo`UYO4SK_kGK` zFV@bQwbkZh-Tbm+{0*yCt>WvIXDEJt?r*Ul5i`_fpfC;SoQeZEz~p1~;nL_4bwgBYW|e%g{#FBJiLCLw`<-*tgeb&eh}>U{G|?`M|EgQ{nHm^K;4V5YPx8 z82`+7Im-wd`UBxl@=a4NvF)i@cKhyh=|j!=Uz80FxXz#ArsO2E!?x*?mat{(L5tYs z(%R4M#W&yd@$%wwZsW03etY%WwSQW?3hCUNZ=L~fvyM?;YhC!rMMy}fqa)*e>lg0_ zA34Oj{wM~}CzVhgQMJ;XZlV{GP{Q2=QeTnV#(??eXE$zda{c?NIlmUW_ixI-zps9=OYGt;r(80x{-5VQ1!N`|pQ@LFwt+!8$aSgk zv$M0yx4Hgsy^wLvFYAE6{ogNZWWvF6VB%>#vnl5;uvQG>RJ|;+Szz@r;^}@q=%g+v zoKf+o`1V=ME-;m>iVC_Ho$haOJJc+@!?x*Dmh$dmC(ZSNlWkY8*pgsW@nU+If4__N z!8G-0X|kJ|j%Hn+m-`W1{zHgc;EAMv>=O0Q{T=mIUY?(8S*QD=<@C?TvmfiE zNArPdjbK*}L6$q*OPJ$5HO1$3mZ|gVKfl$@?a`I}ZbOZGnZ*10$%p>!nP6OKAv*QH z#~C&A>#=jrUn%zH$$qC(>1O+^l8SFH+FH)vXO_Xs z->`?t!%^wnq$$h$53nV%%iWXx_v@K|=I0CZ^`B+;A9&Atho`8)LE`+f75n*?h#pbn z%(qin{#$bz{~2*M{yTaPsuY9`=EzF^@1AgDX@dBq?|fW#^Xy`OnRNBr>zS;sF7CZh zz-=I5v0IO0`45>7I}U{PEj66K{*7GT$;#MU{^2Z&Eo?vJW?V`8tfTpK&bl}95)vBj z{c^o`?`d_#saHNZmUE1ErOnHKa{US4uCF{3d+n`=YIxw!uM4kcN!r)hxGkP|>Xa9s zj77uIOFwUQEZLDZZ*R7I=S5j*&f7t;`41*;|6TMTW5fM#n>HDhdwHEYetMej?9xqU zEdnPGlqp==y;4j=`S{&;7>#f&_b zO$?uJ3U2cDSRfL?XY>6=a{o_BzU}%#X^W@cHf_4^<>4xOUehCoqsaC{t5{mP-}JuC zx|6`scxt8-Xm#ozaic%?e6K4XtzHoqr|$k>TF||{Pp1mzGw1BA{=v}irXzUb$7bDI zlI|U?R;yp1Qhc9RY^P^uB+2nC~1)zVvyy{a;N34UHGs51KaX zUO#`}*~f}?^?yDdf6n}7rhd@Y4Jg9Xnb5$W z`pzH!2y8x{*82L`7tYVKZ-rg6elqE8=#-F~o_)LzR(*bCHTPHDmQ60x!fqSBGL5m* zYI`WTP)WzbJ+yi9TX(4^+h=QSytRAT87}@y#<@N^k(!Q57nUsDcJbu8J#ITo(oI84 z`F<^9G5k6wW4=ya|B^+16Spq9=IAtK;_LJNA10gbKcr^=+f#BfyTn!>dEwI=dISW8 z7A#(K?%b-oTR*kShHeQJ?0GGJu+>?~)n&uHKcCX<{;u?SHr+hCRbYMpj`Yv>ruTe* zdoAlnShm4Yb-#TZFYn7db64{XfdZ%AoNxv9ILz)TxUv9_HIHcyO|a*w`0UJjYGfZYL_@Z+>z^RA}TZC z>h0-|Hkk>P-}CvR7`Q0!f7Hzx+ubd{-$+?>Zl{aK^kA`C``g$3u1q-DvV>n)s=4#o zB$>!<&$#cDy?&~<`JLngf44LGviW~Jtn_Eug{yKlFwYk|acJw>UAJDW31GW__40Lf zz1g#mHKkQnBnp;R)^Y1!lrl-VJHe~J`>{(wQ|B@+YgOs&C-W@bH%{5IZqD1Evsr${ z%~t8Fi`V;JQ?X_9yLVG&FedWsS=-)mj*FGk)UsD5E!ruI!ed(!`tzqPO&R#tM@0aD5MC$r3%uKSLay!#fX*J*83%9oK zm3I=Kp*11zRM}rgul~#7ViU`>k8L=(Xl2dL9F3@gQ?()z#`7i|$vh-*g}GOcCB0aY zw{`yMwxspN-4_HdJ{DtAa_8P_DcQey-m_V}o2;Jm+UTXKmOxs;9mf{wFIifn$}my# zdjiKhV1|n;sZP-l*tEaJDc{wS9fPZ13JlYoDHea_`hu zhM2q06O+!ItSc3hsf!ddlVegaHR<-g{7zuy!oLg_*9sc)i|-pDqa}x{2 zg~Vqx`MuE0JeBHskNwT+DE5X(`9t|tcf8z=1St7_G_lCK5wxr2eg8Q{i=(11H*FAn zakKUGHAN>5W3Lz54bK~wH{88v_MY{f#Z@zR{uOqqkJ%5%UjB4rgZiXZyRNxzem=Kc z?rlViHDe8%!!}R=bt~;EB*7| z@As0HMJmQ=XA(|N)3tjX%e_6W@XM4Qc?QKsy?1-9+NESs-e4Og;8w#}CaGsl^+2&eq5|@$C4a^Cwr{WjyefIsVuZ z?k{iS^VdId_^M_$UC+_0f5x1uxo3K0-hQu%jWvmXrxDNS(4yJrefgcpUZu9gOS3d{ zPbEkGJ6;riwEu0&Yq2>8zx4ce$qZgMXZqhg@sTZ>eJ>@ycg8(*F07Jyv+|dxp2Z)j zvh7>@TlCYefIP3WV6{VGAu_H z{d@Me>Z8)rG z-m3<6^Utf*>l?zZ-il10>+0jfBVYSv z;+mB!857>z*!bnu)zz0v%QQri?(Qlr`tsr;Q^Ltfs#mUEV=}1vl3`?QymI~e=bO*l zO@8>+!(Ohxebp+hZ8)gNU;I{Yy-_t+{L8ds+qP^x+NWUk zImu^R+=&U(8>+YG==^r6$iALb_-(S`&G2nI^L&jS-1APpd0gqq`b^EY6NL;iKQu2& zjau?b`H8j0UH0jZvfoHt_0v!jVm~L$(Ym0zf6dL$PATy*^Q8@M8ClJ@zV8^h_i^Wm zvYc-*KId#01GbjV3vphXU66eyVNvzm_LCE}dDO%i^EG?f?@jf6dTX)kfe!&4n>&ARy=$a>@z%|VBXfc;{Wu!TdMQPq=asngq|-eo z6;|YOeeg}(%dq5b(u3C7Y+d^@%l zny>CUZhM=Z^lXNTpRJ-}%+DucJC~oyb|~oIX!%34iRWmF;@c^fvGXo7wye0l%S+9F zj_ zSKR)!)kWh;T-kgN3B%akeXF_xM1t$RUQ(ylXd&gPCfW+S^WR>BeMAiIIqi8 z#VyW%t6y~f!kS&OC&f1AyQV%_tfzMR;D+oXtC+=;YsE+u1gfo*VgDT-axsiC zsn@jlUDHRUZT=z*t@&>jr&TL6{mXxQe^U6(Nzt}~cS28l%6&3$GUVQ0-M>crpExJ; zJ2B3`dB@)0JABZ0`y`tuh9-_)?lz&?u2;XgFENW>slxYbvVc>y>~4O&WeZCZm#kCH zoYnEJR4!{lpvjy1-yOQSkAMG-vj|RanJOt%eW>$DN{q(0_4{0|P5&eAx^Y6)p<*T# z#duRTZ>DowW*!o=Z=5tW-Gd?hmQG@~bnpH`X#P z%X#E!$&RNUQWe`ZqRV4nAK&}r*7N&<>p2dtSDlb^{?W#h-ma^Z*)>D?s=QA0oJ)?m zHPh$h9+xwbSHh!s`O?ZReP7D_PDDR{r}w^nZ_m$}U=qsHA>Vv7!F{UYokli0{mQwu zy|*Rj+jUnT+o##nHIuF0G{}oh)#t&MH`+&;SL;7LT|3M4hpDri+R=%=i}$m2A3XQq zNavhMm74qGjQV7^zJ4Kkb$WK2osS3GM;58VS;>;~> +h_Ct?%E^ICf|O~WmtTC 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

h)^|V)*Vb>3UhscQ{nFL* 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