diff --git a/components/console/CMakeLists.txt b/components/console/CMakeLists.txt index 31fb1ed9..2913d64d 100644 --- a/components/console/CMakeLists.txt +++ b/components/console/CMakeLists.txt @@ -1,8 +1,13 @@ +if(CONFIG_USING_ESP_CONSOLE) set(COMPONENT_ADD_INCLUDEDIRS .) set(COMPONENT_SRCS "commands.c" "split_argv.c" "argtable3/argtable3.c" "linenoise/linenoise.c") +else() +set(COMPONENT_ADD_INCLUDEDIRS "") +set(COMPONENT_SRCS "") +endif() set(COMPONENT_REQUIRES) diff --git a/components/console/Kconfig b/components/console/Kconfig new file mode 100644 index 00000000..6337b74a --- /dev/null +++ b/components/console/Kconfig @@ -0,0 +1,10 @@ +menu "Console" + +config USING_ESP_CONSOLE + bool "Using Espressif Console" + default n + select USING_ESP_VFS + help + Enable this option, espressif console can be used. + +endmenu diff --git a/components/console/component.mk b/components/console/component.mk index 0a6d4945..6b58f146 100644 --- a/components/console/component.mk +++ b/components/console/component.mk @@ -1,2 +1,8 @@ + +ifdef CONFIG_USING_ESP_CONSOLE COMPONENT_ADD_INCLUDEDIRS := . COMPONENT_SRCDIRS := linenoise argtable3 . +else +COMPONENT_ADD_INCLUDEDIRS := +COMPONENT_SRCDIRS := +endif diff --git a/components/esp8266/include/esp_system.h b/components/esp8266/include/esp_system.h index 6c03be6a..9cd348a7 100644 --- a/components/esp8266/include/esp_system.h +++ b/components/esp8266/include/esp_system.h @@ -208,13 +208,17 @@ typedef enum { * @brief Chip models */ typedef enum { - CHIP_ESP8266 = 1, //!< ESP8266 + CHIP_ESP8266 = 0, //!< ESP8266 + CHIP_ESP32 = 1, //!< ESP32 } esp_chip_model_t; /** * Chip feature flags, used in esp_chip_info_t */ -#define CHIP_FEATURE_WIFI_BGN (1 << 0) +#define CHIP_FEATURE_EMB_FLASH BIT(0) //!< Chip has embedded flash memory +#define CHIP_FEATURE_WIFI_BGN BIT(1) //!< Chip has 2.4GHz WiFi +#define CHIP_FEATURE_BLE BIT(4) //!< Chip has Bluetooth LE +#define CHIP_FEATURE_BT BIT(5) //!< Chip has Bluetooth Classic /** * @brief The structure represents information about the chip diff --git a/components/log/include/esp_log.h b/components/log/include/esp_log.h index f5e214c8..c0aa87cc 100644 --- a/components/log/include/esp_log.h +++ b/components/log/include/esp_log.h @@ -231,6 +231,31 @@ void esp_early_log_write(esp_log_level_t level, const char* tag, const char* for #define esp_log_buffer_hex ESP_LOG_BUFFER_HEX #define esp_log_buffer_char ESP_LOG_BUFFER_CHAR +#if CONFIG_LOG_COLORS +#define LOG_COLOR_BLACK "30" +#define LOG_COLOR_RED "31" +#define LOG_COLOR_GREEN "32" +#define LOG_COLOR_BROWN "33" +#define LOG_COLOR_BLUE "34" +#define LOG_COLOR_PURPLE "35" +#define LOG_COLOR_CYAN "36" +#define LOG_COLOR(COLOR) "\033[0;" COLOR "m" +#define LOG_BOLD(COLOR) "\033[1;" COLOR "m" +#define LOG_RESET_COLOR "\033[0m" +#define LOG_COLOR_E LOG_COLOR(LOG_COLOR_RED) +#define LOG_COLOR_W LOG_COLOR(LOG_COLOR_BROWN) +#define LOG_COLOR_I LOG_COLOR(LOG_COLOR_GREEN) +#define LOG_COLOR_D +#define LOG_COLOR_V +#else //CONFIG_LOG_COLORS +#define LOG_COLOR_E +#define LOG_COLOR_W +#define LOG_COLOR_I +#define LOG_COLOR_D +#define LOG_COLOR_V +#define LOG_RESET_COLOR +#endif //CONFIG_LOG_COLORS + /** @endcond */ /// macro to output logs in startup code, before heap allocator and syscalls have been initialized. log at ``ESP_LOG_ERROR`` level. @see ``printf``,``ESP_LOGE`` diff --git a/components/log/log.c b/components/log/log.c index 6d039efc..1b52d487 100644 --- a/components/log/log.c +++ b/components/log/log.c @@ -30,9 +30,9 @@ #include "esp_system.h" #ifdef CONFIG_LOG_COLORS -#define LOG_COLOR "\033[0;%dm" -#define LOG_BOLD "\033[1;%dm" -#define LOG_RESET_COLOR "\033[0m" +#define LOG_COLOR_HEAD "\033[0;%dm" +#define LOG_BOLD_HEAD "\033[1;%dm" +#define LOG_COLOR_END "\033[0m" static const uint32_t s_log_color[ESP_LOG_MAX] = { 0, // ESP_LOG_NONE @@ -214,7 +214,7 @@ void IRAM_ATTR esp_early_log_write(esp_log_level_t level, const char *tag, const uint32_t color = level >= ESP_LOG_MAX ? 0 : s_log_color[level]; if (color) - ets_printf(LOG_COLOR, color); + ets_printf(LOG_COLOR_HEAD, color); #endif if (ets_printf("%c (%d) %s: ", prefix, esp_log_early_timestamp(), tag) < 0) @@ -227,7 +227,7 @@ void IRAM_ATTR esp_early_log_write(esp_log_level_t level, const char *tag, const out: #ifdef CONFIG_LOG_COLORS if (color) - ets_printf(LOG_RESET_COLOR); + ets_printf(LOG_COLOR_END); #endif ets_printf("\n"); } @@ -255,7 +255,7 @@ void esp_log_write(esp_log_level_t level, const char *tag, const char *fmt, ... uint32_t color = level >= ESP_LOG_MAX ? 0 : s_log_color[level]; if (color) { - sprintf(buf, LOG_COLOR, color); + sprintf(buf, LOG_COLOR_HEAD, color); ret = esp_log_write_str(buf); if (ret == EOF) goto exit; @@ -283,7 +283,7 @@ void esp_log_write(esp_log_level_t level, const char *tag, const char *fmt, ... out: #ifdef CONFIG_LOG_COLORS if (color) { - ret = esp_log_write_str(LOG_RESET_COLOR); + ret = esp_log_write_str(LOG_COLOR_END); if (ret == EOF) goto exit; } diff --git a/components/spi_flash/include/spi_flash.h b/components/spi_flash/include/spi_flash.h index b7dc6fc8..d51756d7 100644 --- a/components/spi_flash/include/spi_flash.h +++ b/components/spi_flash/include/spi_flash.h @@ -49,6 +49,15 @@ typedef enum { typedef uint32_t spi_flash_mmap_handle_t; #endif +/** + * @brief Get flash chip size, as set in binary image header + * + * @note This value does not necessarily match real flash size. + * + * @return size of flash chip, in bytes + */ +size_t spi_flash_get_chip_size(); + /** * @brief Erase the Flash sector. * diff --git a/components/spi_flash/src/spi_flash.c b/components/spi_flash/src/spi_flash.c index 7bad3f4e..468b5376 100644 --- a/components/spi_flash/src/spi_flash.c +++ b/components/spi_flash/src/spi_flash.c @@ -776,3 +776,8 @@ uintptr_t spi_flash_cache2phys(const void *cached) return segment * CACHE_2M_SIZE + (addr + addr_offset - CACHE_BASE_ADDR); } + +size_t spi_flash_get_chip_size() +{ + return flashchip.chip_size; +} diff --git a/examples/system/console/components/cmd_system/cmd_system.c b/examples/system/console/components/cmd_system/cmd_system.c index 46d265a0..d912e1aa 100644 --- a/examples/system/console/components/cmd_system/cmd_system.c +++ b/examples/system/console/components/cmd_system/cmd_system.c @@ -11,16 +11,15 @@ #include #include #include "esp_log.h" +#include "esp_attr.h" #include "esp_console.h" #include "esp_system.h" #include "esp_sleep.h" #include "esp_spi_flash.h" -#include "driver/rtc_io.h" -#include "driver/uart.h" #include "argtable3/argtable3.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "soc/rtc_cntl_reg.h" +#include "driver/uart.h" #include "rom/uart.h" #include "cmd_system.h" #include "sdkconfig.h" @@ -35,8 +34,6 @@ static void register_free(); static void register_heap(); static void register_version(); static void register_restart(); -static void register_deep_sleep(); -static void register_light_sleep(); static void register_make(); #if WITH_TASKS_INFO static void register_tasks(); @@ -48,8 +45,6 @@ void register_system() register_heap(); register_version(); register_restart(); - register_deep_sleep(); - register_light_sleep(); register_make(); #if WITH_TASKS_INFO register_tasks(); @@ -63,7 +58,7 @@ static int get_version(int argc, char **argv) esp_chip_info(&info); printf("IDF Version:%s\r\n", esp_get_idf_version()); printf("Chip info:\r\n"); - printf("\tmodel:%s\r\n", info.model == CHIP_ESP32 ? "ESP32" : "Unknow"); + printf("\tmodel:%s\r\n", info.model == CHIP_ESP8266 ? "ESP8266" : "Unknow"); printf("\tcores:%d\r\n", info.cores); printf("\tfeature:%s%s%s%s%d%s\r\n", info.features & CHIP_FEATURE_WIFI_BGN ? "/802.11bgn" : "", @@ -127,7 +122,7 @@ static void register_free() /* 'heap' command prints minumum heap size */ static int heap_size(int argc, char **argv) { - uint32_t heap_size = heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT); + uint32_t heap_size = heap_caps_get_minimum_free_size(MALLOC_CAP_32BIT); ESP_LOGI(TAG, "min heap size: %u", heap_size); return 0; } @@ -179,180 +174,10 @@ static void register_tasks() #endif // WITH_TASKS_INFO -/** 'deep_sleep' command puts the chip into deep sleep mode */ - -static struct { - struct arg_int *wakeup_time; - struct arg_int *wakeup_gpio_num; - struct arg_int *wakeup_gpio_level; - struct arg_end *end; -} deep_sleep_args; - - -static int deep_sleep(int argc, char **argv) -{ - int nerrors = arg_parse(argc, argv, (void **) &deep_sleep_args); - if (nerrors != 0) { - arg_print_errors(stderr, deep_sleep_args.end, argv[0]); - return 1; - } - if (deep_sleep_args.wakeup_time->count) { - uint64_t timeout = 1000ULL * deep_sleep_args.wakeup_time->ival[0]; - ESP_LOGI(TAG, "Enabling timer wakeup, timeout=%lluus", timeout); - ESP_ERROR_CHECK( esp_sleep_enable_timer_wakeup(timeout) ); - } - if (deep_sleep_args.wakeup_gpio_num->count) { - int io_num = deep_sleep_args.wakeup_gpio_num->ival[0]; - if (!rtc_gpio_is_valid_gpio(io_num)) { - ESP_LOGE(TAG, "GPIO %d is not an RTC IO", io_num); - return 1; - } - int level = 0; - if (deep_sleep_args.wakeup_gpio_level->count) { - level = deep_sleep_args.wakeup_gpio_level->ival[0]; - if (level != 0 && level != 1) { - ESP_LOGE(TAG, "Invalid wakeup level: %d", level); - return 1; - } - } - ESP_LOGI(TAG, "Enabling wakeup on GPIO%d, wakeup on %s level", - io_num, level ? "HIGH" : "LOW"); - - ESP_ERROR_CHECK( esp_sleep_enable_ext1_wakeup(1ULL << io_num, level) ); - } - rtc_gpio_isolate(GPIO_NUM_12); - esp_deep_sleep_start(); -} - -static void register_deep_sleep() -{ - deep_sleep_args.wakeup_time = - arg_int0("t", "time", "", "Wake up time, ms"); - deep_sleep_args.wakeup_gpio_num = - arg_int0(NULL, "io", "", - "If specified, wakeup using GPIO with given number"); - deep_sleep_args.wakeup_gpio_level = - arg_int0(NULL, "io_level", "<0|1>", "GPIO level to trigger wakeup"); - deep_sleep_args.end = arg_end(3); - - const esp_console_cmd_t cmd = { - .command = "deep_sleep", - .help = "Enter deep sleep mode. " - "Two wakeup modes are supported: timer and GPIO. " - "If no wakeup option is specified, will sleep indefinitely.", - .hint = NULL, - .func = &deep_sleep, - .argtable = &deep_sleep_args - }; - ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); -} - -/** 'light_sleep' command puts the chip into light sleep mode */ - -static struct { - struct arg_int *wakeup_time; - struct arg_int *wakeup_gpio_num; - struct arg_int *wakeup_gpio_level; - struct arg_end *end; -} light_sleep_args; - -static int light_sleep(int argc, char **argv) -{ - int nerrors = arg_parse(argc, argv, (void **) &light_sleep_args); - if (nerrors != 0) { - arg_print_errors(stderr, light_sleep_args.end, argv[0]); - return 1; - } - esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL); - if (light_sleep_args.wakeup_time->count) { - uint64_t timeout = 1000ULL * light_sleep_args.wakeup_time->ival[0]; - ESP_LOGI(TAG, "Enabling timer wakeup, timeout=%lluus", timeout); - ESP_ERROR_CHECK( esp_sleep_enable_timer_wakeup(timeout) ); - } - int io_count = light_sleep_args.wakeup_gpio_num->count; - if (io_count != light_sleep_args.wakeup_gpio_level->count) { - ESP_LOGE(TAG, "Should have same number of 'io' and 'io_level' arguments"); - return 1; - } - for (int i = 0; i < io_count; ++i) { - int io_num = light_sleep_args.wakeup_gpio_num->ival[i]; - int level = light_sleep_args.wakeup_gpio_level->ival[i]; - if (level != 0 && level != 1) { - ESP_LOGE(TAG, "Invalid wakeup level: %d", level); - return 1; - } - ESP_LOGI(TAG, "Enabling wakeup on GPIO%d, wakeup on %s level", - io_num, level ? "HIGH" : "LOW"); - - ESP_ERROR_CHECK( gpio_wakeup_enable(io_num, level ? GPIO_INTR_HIGH_LEVEL : GPIO_INTR_LOW_LEVEL) ); - } - if (io_count > 0) { - ESP_ERROR_CHECK( esp_sleep_enable_gpio_wakeup() ); - } - if (CONFIG_CONSOLE_UART_NUM <= UART_NUM_1) { - ESP_LOGI(TAG, "Enabling UART wakeup (press ENTER to exit light sleep)"); - ESP_ERROR_CHECK( uart_set_wakeup_threshold(CONFIG_CONSOLE_UART_NUM, 3) ); - ESP_ERROR_CHECK( esp_sleep_enable_uart_wakeup(CONFIG_CONSOLE_UART_NUM) ); - } - fflush(stdout); - uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM); - esp_light_sleep_start(); - esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); - const char *cause_str; - switch (cause) { - case ESP_SLEEP_WAKEUP_GPIO: - cause_str = "GPIO"; - break; - case ESP_SLEEP_WAKEUP_UART: - cause_str = "UART"; - break; - case ESP_SLEEP_WAKEUP_TIMER: - cause_str = "timer"; - break; - default: - cause_str = "unknown"; - printf("%d\n", cause); - } - ESP_LOGI(TAG, "Woke up from: %s", cause_str); - return 0; -} - -static void register_light_sleep() -{ - light_sleep_args.wakeup_time = - arg_int0("t", "time", "", "Wake up time, ms"); - light_sleep_args.wakeup_gpio_num = - arg_intn(NULL, "io", "", 0, 8, - "If specified, wakeup using GPIO with given number"); - light_sleep_args.wakeup_gpio_level = - arg_intn(NULL, "io_level", "<0|1>", 0, 8, "GPIO level to trigger wakeup"); - light_sleep_args.end = arg_end(3); - - const esp_console_cmd_t cmd = { - .command = "light_sleep", - .help = "Enter light sleep mode. " - "Two wakeup modes are supported: timer and GPIO. " - "Multiple GPIO pins can be specified using pairs of " - "'io' and 'io_level' arguments. " - "Will also wake up on UART input.", - .hint = NULL, - .func = &light_sleep, - .argtable = &light_sleep_args - }; - ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); -} - /** This command helps maintain sanity when testing console example from a console */ static int make(int argc, char **argv) { - int count = REG_READ(RTC_CNTL_STORE0_REG); - if (++count >= 3) { - printf("This is not the console you are looking for.\n"); - return 0; - } - REG_WRITE(RTC_CNTL_STORE0_REG, count); - const char *make_output = R"(LD build/console.elf esptool.py v2.1-beta1 diff --git a/examples/system/console/main/console_example_main.c b/examples/system/console/main/console_example_main.c index 5734a942..11a4f9ad 100644 --- a/examples/system/console/main/console_example_main.c +++ b/examples/system/console/main/console_example_main.c @@ -13,44 +13,20 @@ #include "esp_log.h" #include "esp_console.h" #include "esp_vfs_dev.h" +#include "FreeRTOS.h" #include "driver/uart.h" #include "linenoise/linenoise.h" #include "argtable3/argtable3.h" #include "cmd_decl.h" -#include "esp_vfs_fat.h" #include "nvs.h" #include "nvs_flash.h" -static const char* TAG = "example"; - -/* Console command history can be stored to and loaded from a file. - * The easiest way to do this is to use FATFS filesystem on top of - * wear_levelling library. - */ -#if CONFIG_STORE_HISTORY - -#define MOUNT_PATH "/data" -#define HISTORY_PATH MOUNT_PATH "/history.txt" - -static void initialize_filesystem() -{ - static wl_handle_t wl_handle; - const esp_vfs_fat_mount_config_t mount_config = { - .max_files = 4, - .format_if_mount_failed = true - }; - esp_err_t err = esp_vfs_fat_spiflash_mount(MOUNT_PATH, "storage", &mount_config, &wl_handle); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); - return; - } -} -#endif // CONFIG_STORE_HISTORY +#define TAG "example" static void initialize_nvs() { esp_err_t err = nvs_flash_init(); - if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + if (err == ESP_ERR_NVS_NO_FREE_PAGES) { ESP_ERROR_CHECK( nvs_flash_erase() ); err = nvs_flash_init(); } @@ -70,18 +46,17 @@ static void initialize_console() /* Configure UART. Note that REF_TICK is used so that the baud rate remains * correct while APB frequency is changing in light sleep mode. */ - const uart_config_t uart_config = { + uart_config_t uart_config = { .baud_rate = CONFIG_CONSOLE_UART_BAUDRATE, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, - .use_ref_tick = true }; ESP_ERROR_CHECK( uart_param_config(CONFIG_CONSOLE_UART_NUM, &uart_config) ); /* Install UART driver for interrupt-driven reads and writes */ ESP_ERROR_CHECK( uart_driver_install(CONFIG_CONSOLE_UART_NUM, - 256, 0, 0, NULL, 0) ); + 256, 0, 0, NULL) ); /* Tell VFS to use UART driver */ esp_vfs_dev_uart_use_driver(CONFIG_CONSOLE_UART_NUM); @@ -108,21 +83,12 @@ static void initialize_console() /* Set command history size */ linenoiseHistorySetMaxLen(100); - -#if CONFIG_STORE_HISTORY - /* Load command history from filesystem */ - linenoiseHistoryLoad(HISTORY_PATH); -#endif } void app_main() { initialize_nvs(); -#if CONFIG_STORE_HISTORY - initialize_filesystem(); -#endif - initialize_console(); /* Register commands */ @@ -133,7 +99,7 @@ void app_main() /* Prompt to be printed before each line. * This can be customized, made dynamic, etc. */ - const char* prompt = LOG_COLOR_I "esp32> " LOG_RESET_COLOR; + const char* prompt = LOG_COLOR_I "esp8266> " LOG_RESET_COLOR; printf("\n" "This is an example of ESP-IDF console component.\n" @@ -153,7 +119,7 @@ void app_main() /* Since the terminal doesn't support escape sequences, * don't use color codes in the prompt. */ - prompt = "esp32> "; + prompt = "esp8266> "; #endif //CONFIG_LOG_COLORS } @@ -168,10 +134,6 @@ void app_main() } /* Add the command to the history */ linenoiseHistoryAdd(line); -#if CONFIG_STORE_HISTORY - /* Save command history to filesystem */ - linenoiseHistorySave(HISTORY_PATH); -#endif /* Try to run the command */ int ret; diff --git a/examples/system/console/partitions_example.csv b/examples/system/console/partitions_example.csv index 7e28b566..26b8591a 100644 --- a/examples/system/console/partitions_example.csv +++ b/examples/system/console/partitions_example.csv @@ -3,4 +3,3 @@ nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 1M, -storage, data, fat, , 1M, diff --git a/examples/system/console/sdkconfig.defaults b/examples/system/console/sdkconfig.defaults index ebec8306..88823395 100644 --- a/examples/system/console/sdkconfig.defaults +++ b/examples/system/console/sdkconfig.defaults @@ -8,13 +8,8 @@ CONFIG_MAIN_TASK_STACK_SIZE=7168 # Enable filesystem CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" -CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000 CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" -CONFIG_APP_OFFSET=0x10000 # Enable FreeRTOS stats formatting functions, needed for 'tasks' command CONFIG_FREERTOS_USE_TRACE_FACILITY=y CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y - -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y -