Merge branch 'master' into feature/wpa2_enterprise
add lib
This commit is contained in:
commit
b649b48eae
42 changed files with 807 additions and 272 deletions
|
@ -46,6 +46,10 @@ build_template_app:
|
||||||
- sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
|
- sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
|
||||||
- make defconfig
|
- make defconfig
|
||||||
- make all V=1
|
- make all V=1
|
||||||
|
# Check if there are any stray printf/ets_printf references in WiFi libs
|
||||||
|
- cd ../components/esp32/lib
|
||||||
|
- test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
|
||||||
|
- test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
|
||||||
|
|
||||||
|
|
||||||
.build_gitlab: &build_template
|
.build_gitlab: &build_template
|
||||||
|
@ -88,7 +92,7 @@ build_esp_idf_tests:
|
||||||
- cd tools/unit-test-app
|
- cd tools/unit-test-app
|
||||||
- git checkout ${CI_BUILD_REF_NAME} || echo "Using default branch..."
|
- git checkout ${CI_BUILD_REF_NAME} || echo "Using default branch..."
|
||||||
- make defconfig
|
- make defconfig
|
||||||
- make
|
- make TESTS_ALL=1
|
||||||
|
|
||||||
build_examples:
|
build_examples:
|
||||||
<<: *build_template
|
<<: *build_template
|
||||||
|
@ -288,7 +292,7 @@ deploy_docs:
|
||||||
variables:
|
variables:
|
||||||
# jobs MUST set CONFIG_FILE in before_script, and overwrite the variables above if necessary
|
# jobs MUST set CONFIG_FILE in before_script, and overwrite the variables above if necessary
|
||||||
LOCAL_ENV_CONFIG_PATH: /home/gitlab-runner/LocalConfig/ESP32_IDF
|
LOCAL_ENV_CONFIG_PATH: /home/gitlab-runner/LocalConfig/ESP32_IDF
|
||||||
BIN_PATH: "$CI_PROJECT_DIR/esp-idf-tests/build/"
|
BIN_PATH: "$CI_PROJECT_DIR/tools/unit-test-app/build/"
|
||||||
LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF"
|
LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF"
|
||||||
APP_NAME: "ut"
|
APP_NAME: "ut"
|
||||||
TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/unit_test"
|
TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/unit_test"
|
||||||
|
|
|
@ -115,7 +115,7 @@ static struct osi_funcs_t osi_funcs = {
|
||||||
._mutex_create = mutex_create_wrapper,
|
._mutex_create = mutex_create_wrapper,
|
||||||
._mutex_lock = mutex_lock_wrapper,
|
._mutex_lock = mutex_lock_wrapper,
|
||||||
._mutex_unlock = mutex_unlock_wrapper,
|
._mutex_unlock = mutex_unlock_wrapper,
|
||||||
._read_efuse_mac = system_efuse_read_mac,
|
._read_efuse_mac = esp_efuse_read_mac,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void bt_controller_task(void *pvParam)
|
static void bt_controller_task(void *pvParam)
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
#include <esp_types.h>
|
#include <esp_types.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "freertos/xtensa_api.h"
|
#include "freertos/xtensa_api.h"
|
||||||
|
|
|
@ -84,7 +84,8 @@ typedef struct {
|
||||||
|
|
||||||
|
|
||||||
static uart_obj_t *p_uart_obj[UART_NUM_MAX] = {0};
|
static uart_obj_t *p_uart_obj[UART_NUM_MAX] = {0};
|
||||||
static uart_dev_t* UART[UART_NUM_MAX] = {&UART0, &UART1, &UART2};
|
/* DRAM_ATTR is required to avoid UART array placed in flash, due to accessed from ISR */
|
||||||
|
static DRAM_ATTR uart_dev_t* const UART[UART_NUM_MAX] = {&UART0, &UART1, &UART2};
|
||||||
static portMUX_TYPE uart_spinlock[UART_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED};
|
static portMUX_TYPE uart_spinlock[UART_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED};
|
||||||
|
|
||||||
esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit)
|
esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit)
|
||||||
|
|
|
@ -16,25 +16,8 @@
|
||||||
#include "rom/ets_sys.h"
|
#include "rom/ets_sys.h"
|
||||||
#include "rom/uart.h"
|
#include "rom/uart.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "phy.h"
|
||||||
typedef enum{
|
#include "rtc.h"
|
||||||
XTAL_40M = 40,
|
|
||||||
XTAL_26M = 26,
|
|
||||||
XTAL_24M = 24,
|
|
||||||
XTAL_AUTO = 0
|
|
||||||
} xtal_freq_t;
|
|
||||||
|
|
||||||
typedef enum{
|
|
||||||
CPU_80M = 1,
|
|
||||||
CPU_160M = 2,
|
|
||||||
CPU_240M = 3,
|
|
||||||
} cpu_freq_t;
|
|
||||||
|
|
||||||
extern void phy_get_romfunc_addr();
|
|
||||||
|
|
||||||
// TODO: these functions need to be moved from librtc to ESP-IDF
|
|
||||||
extern void rtc_init_lite();
|
|
||||||
extern void rtc_set_cpu_freq(xtal_freq_t xtal_freq, cpu_freq_t cpu_freq);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is not exposed as an API at this point,
|
* This function is not exposed as an API at this point,
|
||||||
|
@ -52,7 +35,7 @@ void esp_set_cpu_freq(void)
|
||||||
// wait uart tx finish, otherwise some uart output will be lost
|
// wait uart tx finish, otherwise some uart output will be lost
|
||||||
uart_tx_wait_idle(0);
|
uart_tx_wait_idle(0);
|
||||||
|
|
||||||
rtc_init_lite();
|
rtc_init_lite(XTAL_AUTO);
|
||||||
cpu_freq_t freq = CPU_80M;
|
cpu_freq_t freq = CPU_80M;
|
||||||
switch(freq_mhz) {
|
switch(freq_mhz) {
|
||||||
case 240:
|
case 240:
|
||||||
|
@ -73,7 +56,7 @@ void esp_set_cpu_freq(void)
|
||||||
// wait uart tx finish, otherwise some uart output will be lost
|
// wait uart tx finish, otherwise some uart output will be lost
|
||||||
uart_tx_wait_idle(0);
|
uart_tx_wait_idle(0);
|
||||||
|
|
||||||
rtc_set_cpu_freq(XTAL_AUTO, freq);
|
rtc_set_cpu_freq(freq);
|
||||||
ets_update_cpu_frequency(freq_mhz);
|
ets_update_cpu_frequency(freq_mhz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,9 +116,7 @@ void IRAM_ATTR call_start_cpu0()
|
||||||
//Flush and enable icache for APP CPU
|
//Flush and enable icache for APP CPU
|
||||||
Cache_Flush(1);
|
Cache_Flush(1);
|
||||||
Cache_Read_Enable(1);
|
Cache_Read_Enable(1);
|
||||||
//Un-stall the app cpu; the panic handler may have stalled it.
|
esp_cpu_unstall(1);
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_APPCPU_C1_M);
|
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_APPCPU_C0_M);
|
|
||||||
//Enable clock gating and reset the app cpu.
|
//Enable clock gating and reset the app cpu.
|
||||||
SET_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN);
|
SET_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN);
|
||||||
CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_C_REG, DPORT_APPCPU_RUNSTALL);
|
CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_C_REG, DPORT_APPCPU_RUNSTALL);
|
||||||
|
@ -154,6 +152,7 @@ void IRAM_ATTR call_start_cpu1()
|
||||||
|
|
||||||
void start_cpu0_default(void)
|
void start_cpu0_default(void)
|
||||||
{
|
{
|
||||||
|
esp_setup_syscall_table();
|
||||||
//Enable trace memory and immediately start trace.
|
//Enable trace memory and immediately start trace.
|
||||||
#if CONFIG_MEMMAP_TRACEMEM
|
#if CONFIG_MEMMAP_TRACEMEM
|
||||||
#if CONFIG_MEMMAP_TRACEMEM_TWOBANKS
|
#if CONFIG_MEMMAP_TRACEMEM_TWOBANKS
|
||||||
|
@ -174,7 +173,6 @@ void start_cpu0_default(void)
|
||||||
#if CONFIG_TASK_WDT
|
#if CONFIG_TASK_WDT
|
||||||
esp_task_wdt_init();
|
esp_task_wdt_init();
|
||||||
#endif
|
#endif
|
||||||
esp_setup_syscall_table();
|
|
||||||
esp_setup_time_syscalls();
|
esp_setup_time_syscalls();
|
||||||
esp_vfs_dev_uart_register();
|
esp_vfs_dev_uart_register();
|
||||||
esp_reent_init(_GLOBAL_REENT);
|
esp_reent_init(_GLOBAL_REENT);
|
||||||
|
|
44
components/esp32/cpu_util.c
Normal file
44
components/esp32/cpu_util.c
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "soc/cpu.h"
|
||||||
|
#include "soc/soc.h"
|
||||||
|
#include "soc/rtc_cntl_reg.h"
|
||||||
|
|
||||||
|
void IRAM_ATTR esp_cpu_stall(int cpu_id)
|
||||||
|
{
|
||||||
|
if (cpu_id == 1) {
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_APPCPU_C1_M);
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, 0x21<<RTC_CNTL_SW_STALL_APPCPU_C1_S);
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_APPCPU_C0_M);
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, 2<<RTC_CNTL_SW_STALL_APPCPU_C0_S);
|
||||||
|
} else {
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_PROCPU_C1_M);
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, 0x21<<RTC_CNTL_SW_STALL_PROCPU_C1_S);
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_PROCPU_C0_M);
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, 2<<RTC_CNTL_SW_STALL_PROCPU_C0_S);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR esp_cpu_unstall(int cpu_id)
|
||||||
|
{
|
||||||
|
if (cpu_id == 1) {
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_APPCPU_C1_M);
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_APPCPU_C0_M);
|
||||||
|
} else {
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_PROCPU_C1_M);
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_PROCPU_C0_M);
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
#include "soc/dport_reg.h"
|
#include "soc/dport_reg.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_deepsleep.h"
|
#include "esp_deepsleep.h"
|
||||||
|
#include "rtc.h"
|
||||||
|
|
||||||
/* Updating RTC_MEMORY_CRC_REG register via set_rtc_memory_crc()
|
/* Updating RTC_MEMORY_CRC_REG register via set_rtc_memory_crc()
|
||||||
is not thread-safe. */
|
is not thread-safe. */
|
||||||
|
@ -46,3 +47,21 @@ void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((weak, alias("esp_default_wake_deep_sleep"))) esp_wake_deep_sleep(void);
|
void __attribute__((weak, alias("esp_default_wake_deep_sleep"))) esp_wake_deep_sleep(void);
|
||||||
|
|
||||||
|
void esp_deep_sleep(uint64_t time_in_us)
|
||||||
|
{
|
||||||
|
rtc_set_cpu_freq(CPU_XTAL);
|
||||||
|
if (esp_get_deep_sleep_wake_stub() == NULL) {
|
||||||
|
esp_set_deep_sleep_wake_stub(esp_wake_deep_sleep);
|
||||||
|
}
|
||||||
|
uint32_t period = rtc_slowck_cali(CALI_RTC_MUX, 128);
|
||||||
|
uint32_t cycle_l, cycle_h;
|
||||||
|
rtc_usec2rtc(time_in_us >> 32, time_in_us, period, &cycle_h, &cycle_l);
|
||||||
|
rtc_slp_prep_lite(1, 0);
|
||||||
|
rtc_sleep(cycle_h, cycle_l, TIMER_EXPIRE_EN, 0);
|
||||||
|
while (1) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void system_deep_sleep(uint64_t) __attribute__((alias("esp_deep_sleep")));
|
||||||
|
|
41
components/esp32/hw_random.c
Normal file
41
components/esp32/hw_random.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "soc/wdev_reg.h"
|
||||||
|
#include "freertos/FreeRTOSConfig.h"
|
||||||
|
#include "xtensa/core-macros.h"
|
||||||
|
|
||||||
|
uint32_t IRAM_ATTR esp_random(void)
|
||||||
|
{
|
||||||
|
/* The PRNG which implements WDEV_RANDOM register gets 2 bits
|
||||||
|
* of extra entropy from a hardware randomness source every APB clock cycle.
|
||||||
|
* To make sure entropy is not drained faster than it is added,
|
||||||
|
* this function needs to wait for at least 16 APB clock cycles after reading
|
||||||
|
* previous word. This implementation may actually wait a bit longer
|
||||||
|
* due to extra time spent in arithmetic and branch statements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint32_t last_ccount = 0;
|
||||||
|
uint32_t ccount;
|
||||||
|
do {
|
||||||
|
ccount = XTHAL_GET_CCOUNT();
|
||||||
|
} while (ccount - last_ccount < XT_CLOCK_FREQ / APB_CLK_FREQ * 16);
|
||||||
|
last_ccount = ccount;
|
||||||
|
return REG_READ(WDEV_RND_REG);
|
||||||
|
}
|
|
@ -30,25 +30,34 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the chip to deep-sleep mode.
|
* @brief Enter deep-sleep mode
|
||||||
*
|
*
|
||||||
* The device will automatically wake up after the deep-sleep time set
|
* The device will automatically wake up after the deep-sleep time
|
||||||
* by the users. Upon waking up, the device boots up from user_init.
|
* Upon waking up, the device calls deep sleep wake stub, and then proceeds
|
||||||
|
* to load application.
|
||||||
*
|
*
|
||||||
* @attention The parameter time_in_us to be "uint64" is for further development.
|
* This function does not return.
|
||||||
* Only the low 32 bits of parameter time_in_us are avalable now.
|
|
||||||
*
|
*
|
||||||
* @param uint64 time_in_us : deep-sleep time, only the low 32bits are avalable now. unit: microsecond
|
* @param time_in_us deep-sleep time, unit: microsecond
|
||||||
*
|
|
||||||
* @return null
|
|
||||||
*/
|
*/
|
||||||
void system_deep_sleep(uint64_t time_in_us);
|
void esp_deep_sleep(uint64_t time_in_us) __attribute__((noreturn));
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enter deep-sleep mode
|
||||||
|
*
|
||||||
|
* Function has been renamed to esp_deep_sleep.
|
||||||
|
* This name is deprecated and will be removed in a future version.
|
||||||
|
*
|
||||||
|
* @param time_in_us deep-sleep time, unit: microsecond
|
||||||
|
*/
|
||||||
|
void system_deep_sleep(uint64_t time_in_us) __attribute__((noreturn, deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Default stub to run on wake from deep sleep.
|
* @brief Default stub to run on wake from deep sleep.
|
||||||
*
|
*
|
||||||
* Allows for executing code immediately on wake from sleep, before
|
* Allows for executing code immediately on wake from sleep, before
|
||||||
* the software bootloader or esp-idf app has started up.
|
* the software bootloader or ESP-IDF app has started up.
|
||||||
*
|
*
|
||||||
* This function is weak-linked, so you can implement your own version
|
* This function is weak-linked, so you can implement your own version
|
||||||
* to run code immediately when the chip wakes from
|
* to run code immediately when the chip wakes from
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define __ESP_SYSTEM_H__
|
#define __ESP_SYSTEM_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_deepsleep.h"
|
#include "esp_deepsleep.h"
|
||||||
|
|
||||||
|
@ -24,166 +24,107 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** \defgroup System_APIs System APIs
|
|
||||||
* @brief System APIs
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup System_APIs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @attention application don't need to call this function anymore. It do nothing and will
|
* @attention application don't need to call this function anymore. It do nothing and will
|
||||||
* be removed in future version.
|
* be removed in future version.
|
||||||
*/
|
*/
|
||||||
void system_init(void) __attribute__ ((deprecated));
|
void system_init(void) __attribute__ ((deprecated));
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get information of the SDK version.
|
|
||||||
*
|
|
||||||
* @param null
|
|
||||||
*
|
|
||||||
* @return Information of the SDK version.
|
|
||||||
*/
|
|
||||||
const char *system_get_sdk_version(void);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reset to default settings.
|
* @brief Reset to default settings.
|
||||||
*
|
*
|
||||||
* Reset to default settings of the following APIs : wifi_station_set_auto_connect,
|
* Function has been deprecated, please use esp_wifi_restore instead.
|
||||||
* wifi_set_phy_mode, wifi_softap_set_config related, wifi_station_set_config
|
* This name will be removed in a future release.
|
||||||
* related, and wifi_set_opmode.
|
|
||||||
*
|
|
||||||
* @param null
|
|
||||||
*
|
|
||||||
* @return null
|
|
||||||
*/
|
*/
|
||||||
void system_restore(void);
|
void system_restore(void) __attribute__ ((deprecated));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restart PRO and APP CPUs.
|
||||||
|
*
|
||||||
|
* This function can be called both from PRO and APP CPUs.
|
||||||
|
* After successful restart, CPU reset reason will be SW_CPU_RESET.
|
||||||
|
* Peripherals (except for WiFi, BT, UART0, SPI1, and legacy timers) are not reset.
|
||||||
|
* This function does not return.
|
||||||
|
*/
|
||||||
|
void esp_restart(void) __attribute__ ((noreturn));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Restart system.
|
* @brief Restart system.
|
||||||
*
|
*
|
||||||
* @param null
|
* Function has been renamed to esp_restart.
|
||||||
*
|
* This name will be removed in a future release.
|
||||||
* @return null
|
|
||||||
*/
|
*/
|
||||||
void system_restart(void);
|
void system_restart(void) __attribute__ ((deprecated, noreturn));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get system time, unit: microsecond.
|
* @brief Get system time, unit: microsecond.
|
||||||
*
|
*
|
||||||
* @param null
|
* This function is deprecated. Use 'gettimeofday' function for 64-bit precision.
|
||||||
*
|
* This definition will be removed in a future release.
|
||||||
* @return System time, unit: microsecond.
|
|
||||||
*/
|
*/
|
||||||
uint32_t system_get_time(void);
|
uint32_t system_get_time(void) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the size of available heap.
|
* @brief Get the size of available heap.
|
||||||
*
|
*
|
||||||
* @param null
|
* Note that the returned value may be larger than the maximum contiguous block
|
||||||
|
* which can be allocated.
|
||||||
*
|
*
|
||||||
* @return Available heap size.
|
* @return Available heap size, in bytes.
|
||||||
*/
|
*/
|
||||||
uint32_t system_get_free_heap_size(void);
|
uint32_t esp_get_free_heap_size(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get RTC time, unit: RTC clock cycle.
|
* @brief Get the size of available heap.
|
||||||
*
|
*
|
||||||
* @param null
|
* Function has been renamed to esp_get_free_heap_size.
|
||||||
|
* This name will be removed in a future release.
|
||||||
*
|
*
|
||||||
* @return RTC time.
|
* @return Available heap size, in bytes.
|
||||||
*/
|
*/
|
||||||
uint64_t system_get_rtc_time(void);
|
uint32_t system_get_free_heap_size(void) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read user data from the RTC memory.
|
* @brief Get one random 32-bit word from hardware RNG
|
||||||
*
|
*
|
||||||
* The user data segment (1024 bytes, as shown below) is used to store user data.
|
* @return random value between 0 and UINT32_MAX
|
||||||
*
|
|
||||||
* |<---- system data(512 bytes) ---->|<----------- user data(1024 bytes) --------->|
|
|
||||||
*
|
|
||||||
* @attention Read and write unit for data stored in the RTC memory is 4 bytes.
|
|
||||||
* @attention src_addr is the block number (4 bytes per block). So when reading data
|
|
||||||
* at the beginning of the user data segment, src_addr will be 512/4 = 128,
|
|
||||||
* n will be data length.
|
|
||||||
*
|
|
||||||
* @param uint16 src : source address of rtc memory, src_addr >= 128
|
|
||||||
* @param void *dst : data pointer
|
|
||||||
* @param uint16 n : data length, unit: byte
|
|
||||||
*
|
|
||||||
* @return true : succeed
|
|
||||||
* @return false : fail
|
|
||||||
*/
|
|
||||||
bool system_rtc_mem_read(uint16_t src, void *dst, uint16_t n);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write user data to the RTC memory.
|
|
||||||
*
|
|
||||||
* During deep-sleep, only RTC is working. So users can store their data
|
|
||||||
* in RTC memory if it is needed. The user data segment below (1024 bytes)
|
|
||||||
* is used to store the user data.
|
|
||||||
*
|
|
||||||
* |<---- system data(512 bytes) ---->|<----------- user data(1024 bytes) --------->|
|
|
||||||
*
|
|
||||||
* @attention Read and write unit for data stored in the RTC memory is 4 bytes.
|
|
||||||
* @attention src_addr is the block number (4 bytes per block). So when storing data
|
|
||||||
* at the beginning of the user data segment, src_addr will be 512/4 = 128,
|
|
||||||
* n will be data length.
|
|
||||||
*
|
|
||||||
* @param uint16 src : source address of rtc memory, src_addr >= 128
|
|
||||||
* @param void *dst : data pointer
|
|
||||||
* @param uint16 n : data length, unit: byte
|
|
||||||
*
|
|
||||||
* @return true : succeed
|
|
||||||
* @return false : fail
|
|
||||||
*/
|
|
||||||
bool system_rtc_mem_write(uint16_t dst, const void *src, uint16_t n);
|
|
||||||
|
|
||||||
/** \defgroup System_boot_APIs Boot APIs
|
|
||||||
* @brief boot APIs
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup System_boot_APIs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \defgroup Hardware_MAC_APIs Hardware MAC APIs
|
|
||||||
* @brief Hardware MAC address APIs
|
|
||||||
*
|
|
||||||
* In WiFi MAC, only ESP32 station MAC is the hardware MAC, ESP32 softAP MAC is a software MAC
|
|
||||||
* calculated from ESP32 station MAC.
|
|
||||||
* So users need to call wifi_get_macaddr to query the ESP32 softAP MAC if ESP32 station MAC changed.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup Hardware_MAC_APIs
|
|
||||||
* @{
|
|
||||||
*/
|
*/
|
||||||
|
uint32_t esp_random(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read hardware MAC address.
|
* @brief Read hardware MAC address.
|
||||||
*
|
*
|
||||||
* @param uint8 mac[6] : the hardware MAC address, length: 6 bytes.
|
* In WiFi MAC, only ESP32 station MAC is the hardware MAC, ESP32 softAP MAC is a software MAC
|
||||||
|
* calculated from ESP32 station MAC.
|
||||||
|
* So users need to call esp_wifi_get_macaddr to query the ESP32 softAP MAC if ESP32 station MAC changed.
|
||||||
*
|
*
|
||||||
* @return esp_err_t
|
* @param mac hardware MAC address, length: 6 bytes.
|
||||||
|
*
|
||||||
|
* @return ESP_OK on success
|
||||||
*/
|
*/
|
||||||
esp_err_t system_efuse_read_mac(uint8_t mac[6]);
|
esp_err_t esp_efuse_read_mac(uint8_t* mac);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @brief Read hardware MAC address.
|
||||||
|
*
|
||||||
|
* Function has been renamed to esp_efuse_read_mac.
|
||||||
|
* This name will be removed in a future release.
|
||||||
|
*
|
||||||
|
* @param mac hardware MAC address, length: 6 bytes.
|
||||||
|
* @return ESP_OK on success
|
||||||
*/
|
*/
|
||||||
|
esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* Get SDK version
|
||||||
|
*
|
||||||
|
* This function is deprecated and will be removed in a future release.
|
||||||
|
*
|
||||||
|
* @return constant string "master"
|
||||||
*/
|
*/
|
||||||
|
const char* system_get_sdk_version(void) __attribute__ ((deprecated));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,52 +22,4 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#define __ATTRIB_PACK __attribute__ ((packed))
|
|
||||||
#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
|
|
||||||
#define __ATTRIB_NORETURN __attribute__ ((noreturn))
|
|
||||||
#define __ATTRIB_ALIGN(x) __attribute__ ((aligned((x))))
|
|
||||||
#define INLINE __inline__
|
|
||||||
|
|
||||||
#define LOCAL static
|
|
||||||
|
|
||||||
/* probably should not put STATUS here */
|
|
||||||
typedef enum {
|
|
||||||
OK = 0,
|
|
||||||
FAIL,
|
|
||||||
PENDING,
|
|
||||||
BUSY,
|
|
||||||
CANCEL,
|
|
||||||
} STATUS;
|
|
||||||
|
|
||||||
//#define _LITTLE_ENDIAN 1234
|
|
||||||
//#define _BYTE_ORDER == _LITTLE_ENDIAN
|
|
||||||
|
|
||||||
#define ASSERT( x ) do { \
|
|
||||||
if (!(x)) { \
|
|
||||||
printf("%s %u\n", __FILE__, __LINE__); \
|
|
||||||
while (1) { \
|
|
||||||
asm volatile("nop"); \
|
|
||||||
}; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* #if __GNUC_PREREQ__(4, 1) */
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#if 1
|
|
||||||
#define __offsetof(type, field) __builtin_offsetof(type, field)
|
|
||||||
#else
|
|
||||||
#define __offsetof(type, field) ((size_t)(&((type *)0)->field))
|
|
||||||
#endif
|
|
||||||
#endif /* __GNUC__ */
|
|
||||||
|
|
||||||
|
|
||||||
/* Macros for counting and rounding. */
|
|
||||||
#ifndef howmany
|
|
||||||
#define howmany(x, y) (((x)+((y)-1))/(y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define container_of(ptr, type, member) ({ \
|
|
||||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
|
||||||
(type *)( (char *)__mptr - __offsetof(type,member) );})
|
|
||||||
|
|
||||||
#endif /* __ESP_TYPES_H__ */
|
#endif /* __ESP_TYPES_H__ */
|
||||||
|
|
|
@ -186,6 +186,21 @@ esp_err_t esp_wifi_start(void);
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_wifi_stop(void);
|
esp_err_t esp_wifi_stop(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore WiFi stack persistent settings to default values
|
||||||
|
*
|
||||||
|
* This function will reset settings made using the following APIs:
|
||||||
|
* - esp_wifi_get_auto_connect,
|
||||||
|
* - esp_wifi_set_protocol,
|
||||||
|
* - esp_wifi_set_config related
|
||||||
|
* - esp_wifi_set_mode
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - ESP_OK: succeed
|
||||||
|
* - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init
|
||||||
|
*/
|
||||||
|
esp_err_t esp_wifi_restore(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Connect the ESP32 WiFi station to the AP.
|
* @brief Connect the ESP32 WiFi station to the AP.
|
||||||
*
|
*
|
||||||
|
|
|
@ -43,10 +43,9 @@ extern "C" {
|
||||||
/**
|
/**
|
||||||
* @brief get whether the wifi driver is allowed to transmit data or not
|
* @brief get whether the wifi driver is allowed to transmit data or not
|
||||||
*
|
*
|
||||||
* @param none
|
* @return
|
||||||
*
|
* - true : upper layer should stop to transmit data to wifi driver
|
||||||
* @return true : upper layer should stop to transmit data to wifi driver
|
* - false : upper layer can transmit data to wifi driver
|
||||||
* @return false : upper layer can transmit data to wifi driver
|
|
||||||
*/
|
*/
|
||||||
bool esp_wifi_internal_tx_is_stop(void);
|
bool esp_wifi_internal_tx_is_stop(void);
|
||||||
|
|
||||||
|
@ -54,8 +53,6 @@ bool esp_wifi_internal_tx_is_stop(void);
|
||||||
* @brief free the rx buffer which allocated by wifi driver
|
* @brief free the rx buffer which allocated by wifi driver
|
||||||
*
|
*
|
||||||
* @param void* buffer: rx buffer pointer
|
* @param void* buffer: rx buffer pointer
|
||||||
*
|
|
||||||
* @return nonoe
|
|
||||||
*/
|
*/
|
||||||
void esp_wifi_internal_free_rx_buffer(void* buffer);
|
void esp_wifi_internal_free_rx_buffer(void* buffer);
|
||||||
|
|
||||||
|
@ -78,7 +75,6 @@ int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, u16_t len);
|
||||||
* @brief The WiFi RX callback function
|
* @brief The WiFi RX callback function
|
||||||
*
|
*
|
||||||
* Each time the WiFi need to forward the packets to high layer, the callback function will be called
|
* Each time the WiFi need to forward the packets to high layer, the callback function will be called
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb);
|
typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb);
|
||||||
|
|
||||||
|
@ -90,18 +86,18 @@ typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb);
|
||||||
* @param wifi_interface_t ifx : interface
|
* @param wifi_interface_t ifx : interface
|
||||||
* @param wifi_rxcb_t fn : WiFi RX callback
|
* @param wifi_rxcb_t fn : WiFi RX callback
|
||||||
*
|
*
|
||||||
* @return ESP_OK : succeed
|
* @return
|
||||||
* @return others : fail
|
* - ESP_OK : succeed
|
||||||
|
* - others : fail
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn);
|
esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Notify WIFI driver that the station got ip successfully
|
* @brief Notify WIFI driver that the station got ip successfully
|
||||||
*
|
*
|
||||||
* @param none
|
* @return
|
||||||
*
|
* - ESP_OK : succeed
|
||||||
* @return ESP_OK : succeed
|
* - others : fail
|
||||||
* @return others : fail
|
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_wifi_internal_set_sta_ip(void);
|
esp_err_t esp_wifi_internal_set_sta_ip(void);
|
||||||
|
|
||||||
|
|
|
@ -605,6 +605,14 @@ void intr_matrix_set(int cpu_no, uint32_t model_num, uint32_t intr_num);
|
||||||
|
|
||||||
#define ETS_MEM_BAR() asm volatile ( "" : : : "memory" )
|
#define ETS_MEM_BAR() asm volatile ( "" : : : "memory" )
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
OK = 0,
|
||||||
|
FAIL,
|
||||||
|
PENDING,
|
||||||
|
BUSY,
|
||||||
|
CANCEL,
|
||||||
|
} STATUS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "esp_types.h"
|
#include "esp_types.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
|
#include "ets_sys.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -51,7 +51,10 @@ static inline void cpu_write_itlb(unsigned vpn, unsigned attr)
|
||||||
asm volatile ("witlb %1, %0; isync\n" :: "r" (vpn), "r" (attr));
|
asm volatile ("witlb %1, %0; isync\n" :: "r" (vpn), "r" (attr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make page 0 access raise an exception.
|
/**
|
||||||
|
* @brief Configure memory region protection
|
||||||
|
*
|
||||||
|
* Make page 0 access raise an exception.
|
||||||
* Also protect some other unused pages so we can catch weirdness.
|
* Also protect some other unused pages so we can catch weirdness.
|
||||||
* Useful attribute values:
|
* Useful attribute values:
|
||||||
* 0 — cached, RW
|
* 0 — cached, RW
|
||||||
|
@ -70,9 +73,7 @@ static inline void cpu_configure_region_protection()
|
||||||
cpu_write_itlb(0x20000000, 0);
|
cpu_write_itlb(0x20000000, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Set CPU frequency to the value defined in menuconfig
|
* @brief Set CPU frequency to the value defined in menuconfig
|
||||||
*
|
*
|
||||||
* Called from cpu_start.c, not intended to be called from other places.
|
* Called from cpu_start.c, not intended to be called from other places.
|
||||||
|
@ -81,4 +82,16 @@ static inline void cpu_configure_region_protection()
|
||||||
*/
|
*/
|
||||||
void esp_set_cpu_freq(void);
|
void esp_set_cpu_freq(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stall CPU using RTC controller
|
||||||
|
* @param cpu_id ID of the CPU to stall (0 = PRO, 1 = APP)
|
||||||
|
*/
|
||||||
|
void esp_cpu_stall(int cpu_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Un-stall CPU using RTC controller
|
||||||
|
* @param cpu_id ID of the CPU to un-stall (0 = PRO, 1 = APP)
|
||||||
|
*/
|
||||||
|
void esp_cpu_unstall(int cpu_id);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -129,10 +129,10 @@
|
||||||
//}}
|
//}}
|
||||||
|
|
||||||
//Periheral Clock {{
|
//Periheral Clock {{
|
||||||
#define APB_CLK_FREQ_ROM 26*1000000
|
#define APB_CLK_FREQ_ROM ( 26*1000000 )
|
||||||
#define CPU_CLK_FREQ_ROM APB_CLK_FREQ_ROM
|
#define CPU_CLK_FREQ_ROM APB_CLK_FREQ_ROM
|
||||||
#define CPU_CLK_FREQ APB_CLK_FREQ
|
#define CPU_CLK_FREQ APB_CLK_FREQ
|
||||||
#define APB_CLK_FREQ 80*1000000 //unit: Hz
|
#define APB_CLK_FREQ ( 80*1000000 ) //unit: Hz
|
||||||
#define UART_CLK_FREQ APB_CLK_FREQ
|
#define UART_CLK_FREQ APB_CLK_FREQ
|
||||||
#define WDT_CLK_FREQ APB_CLK_FREQ
|
#define WDT_CLK_FREQ APB_CLK_FREQ
|
||||||
#define TIMER_CLK_FREQ (80000000>>4) //80MHz divided by 16
|
#define TIMER_CLK_FREQ (80000000>>4) //80MHz divided by 16
|
||||||
|
|
18
components/esp32/include/soc/wdev_reg.h
Normal file
18
components/esp32/include/soc/wdev_reg.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Hardware random number generator register */
|
||||||
|
#define WDEV_RND_REG 0x60035144
|
|
@ -42,7 +42,7 @@
|
||||||
* share the name with the existing functions from hal.h.
|
* share the name with the existing functions from hal.h.
|
||||||
* Including this header file will define XTHAL_USE_CACHE_MACROS
|
* Including this header file will define XTHAL_USE_CACHE_MACROS
|
||||||
* which directs hal.h not to use the functions.
|
* which directs hal.h not to use the functions.
|
||||||
*
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Single-cache-line operations in C-callable inline assembly.
|
* Single-cache-line operations in C-callable inline assembly.
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit e2e5781dc27e638c5e63f85bc23590dd21af1619
|
Subproject commit aa74ce27618c931fef8bdbdb683f80f4b364ba53
|
124
components/esp32/lib_printf.c
Normal file
124
components/esp32/lib_printf.c
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
// Copyright 2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file lib_printf.c
|
||||||
|
*
|
||||||
|
* This file contains library-specific printf functions
|
||||||
|
* used by WiFi libraries in the `lib` directory.
|
||||||
|
* These function are used to catch any output which gets printed
|
||||||
|
* by libraries, and redirect it to ESP_LOG macros.
|
||||||
|
*
|
||||||
|
* Eventually WiFi libraries will use ESP_LOG functions internally
|
||||||
|
* and these definitions will be removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
|
#define VPRINTF_STACK_BUFFER_SIZE 80
|
||||||
|
|
||||||
|
static int lib_printf(const char* tag, const char* format, va_list arg)
|
||||||
|
{
|
||||||
|
char temp[VPRINTF_STACK_BUFFER_SIZE];
|
||||||
|
int len = vsnprintf(temp, sizeof(temp) - 1, format, arg);
|
||||||
|
temp[sizeof(temp) - 1] = 0;
|
||||||
|
int i;
|
||||||
|
for (i = len - 1; i >= 0; --i) {
|
||||||
|
if (temp[i] != '\n' && temp[i] != '\r' && temp[i] != ' ') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
temp[i] = 0;
|
||||||
|
}
|
||||||
|
if (i > 0) {
|
||||||
|
ESP_EARLY_LOGI(tag, "%s", temp);
|
||||||
|
}
|
||||||
|
va_end(arg);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int phy_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("phy", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int rtc_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("rtc", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wpa_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("wpa", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wps_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("wps", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pp_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("pp", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sc_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("smartconfig", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int core_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("core", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net80211_printf(const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start(arg, format);
|
||||||
|
int res = lib_printf("net80211", format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
return res;
|
||||||
|
}
|
|
@ -27,6 +27,7 @@
|
||||||
#include "soc/rtc_cntl_reg.h"
|
#include "soc/rtc_cntl_reg.h"
|
||||||
#include "soc/timer_group_struct.h"
|
#include "soc/timer_group_struct.h"
|
||||||
#include "soc/timer_group_reg.h"
|
#include "soc/timer_group_reg.h"
|
||||||
|
#include "soc/cpu.h"
|
||||||
|
|
||||||
#include "esp_gdbstub.h"
|
#include "esp_gdbstub.h"
|
||||||
#include "esp_panic.h"
|
#include "esp_panic.h"
|
||||||
|
@ -108,21 +109,10 @@ static const char *edesc[]={
|
||||||
void commonErrorHandler(XtExcFrame *frame);
|
void commonErrorHandler(XtExcFrame *frame);
|
||||||
|
|
||||||
//The fact that we've panic'ed probably means the other CPU is now running wild, possibly
|
//The fact that we've panic'ed probably means the other CPU is now running wild, possibly
|
||||||
//messing up the serial output, so we kill it here.
|
//messing up the serial output, so we stall it here.
|
||||||
static void haltOtherCore() {
|
static void haltOtherCore()
|
||||||
if (xPortGetCoreID()==0) {
|
{
|
||||||
//Kill app cpu
|
esp_cpu_stall( xPortGetCoreID() == 0 ? 1 : 0 );
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_APPCPU_C1_M);
|
|
||||||
SET_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, 0x21<<RTC_CNTL_SW_STALL_APPCPU_C1_S);
|
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_APPCPU_C0_M);
|
|
||||||
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, 2<<RTC_CNTL_SW_STALL_APPCPU_C0_S);
|
|
||||||
} else {
|
|
||||||
//Kill pro cpu
|
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_PROCPU_C1_M);
|
|
||||||
SET_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, 0x21<<RTC_CNTL_SW_STALL_PROCPU_C1_S);
|
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_PROCPU_C0_M);
|
|
||||||
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, 2<<RTC_CNTL_SW_STALL_PROCPU_C0_S);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Returns true when a debugger is attached using JTAG.
|
//Returns true when a debugger is attached using JTAG.
|
||||||
|
|
|
@ -179,7 +179,7 @@ static esp_err_t load_cal_data_from_nvs_handle(nvs_handle handle,
|
||||||
return ESP_ERR_INVALID_SIZE;
|
return ESP_ERR_INVALID_SIZE;
|
||||||
}
|
}
|
||||||
uint8_t sta_mac[6];
|
uint8_t sta_mac[6];
|
||||||
system_efuse_read_mac(sta_mac);
|
esp_efuse_read_mac(sta_mac);
|
||||||
if (memcmp(sta_mac, cal_data_mac, sizeof(sta_mac)) != 0) {
|
if (memcmp(sta_mac, cal_data_mac, sizeof(sta_mac)) != 0) {
|
||||||
ESP_LOGE(TAG, "%s: calibration data MAC check failed: expected " \
|
ESP_LOGE(TAG, "%s: calibration data MAC check failed: expected " \
|
||||||
MACSTR ", found " MACSTR,
|
MACSTR ", found " MACSTR,
|
||||||
|
@ -210,7 +210,7 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
uint8_t sta_mac[6];
|
uint8_t sta_mac[6];
|
||||||
system_efuse_read_mac(sta_mac);
|
esp_efuse_read_mac(sta_mac);
|
||||||
err = nvs_set_blob(handle, PHY_CAL_MAC_KEY, sta_mac, sizeof(sta_mac));
|
err = nvs_set_blob(handle, PHY_CAL_MAC_KEY, sta_mac, sizeof(sta_mac));
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
return err;
|
return err;
|
||||||
|
|
142
components/esp32/rtc.h
Normal file
142
components/esp32/rtc.h
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file rtc.h
|
||||||
|
* @brief Declarations of APIs provided by librtc.a
|
||||||
|
*
|
||||||
|
* This file is not in the include directory of esp32 component, so it is not
|
||||||
|
* part of the public API. As the source code of librtc.a is gradually moved
|
||||||
|
* into the ESP-IDF, some of these APIs will be exposed to applications.
|
||||||
|
*
|
||||||
|
* For now, only esp_deep_sleep function declared in esp_deepsleep.h
|
||||||
|
* is part of public API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "soc/soc.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum{
|
||||||
|
XTAL_40M = 40,
|
||||||
|
XTAL_26M = 26,
|
||||||
|
XTAL_24M = 24,
|
||||||
|
XTAL_AUTO = 0
|
||||||
|
} xtal_freq_t;
|
||||||
|
|
||||||
|
typedef enum{
|
||||||
|
CPU_XTAL = 0,
|
||||||
|
CPU_80M = 1,
|
||||||
|
CPU_160M = 2,
|
||||||
|
CPU_240M = 3,
|
||||||
|
CPU_2M = 4
|
||||||
|
} cpu_freq_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CALI_RTC_MUX = 0,
|
||||||
|
CALI_8MD256 = 1,
|
||||||
|
CALI_32K_XTAL = 2
|
||||||
|
} cali_clk_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function must be called to initialize RTC library
|
||||||
|
* @param xtal_freq Frequency of main crystal
|
||||||
|
*/
|
||||||
|
void rtc_init_lite(xtal_freq_t xtal_freq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switch CPU frequency
|
||||||
|
* @param cpu_freq new CPU frequency
|
||||||
|
*/
|
||||||
|
void rtc_set_cpu_freq(cpu_freq_t cpu_freq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return RTC slow clock's period
|
||||||
|
* @param cali_clk clock to calibrate
|
||||||
|
* @param slow_clk_cycles number of slow clock cycles to average
|
||||||
|
* @param xtal_freq chip's main XTAL freq
|
||||||
|
* @return average slow clock period in microseconds, Q13.19 fixed point format
|
||||||
|
*/
|
||||||
|
uint32_t rtc_slowck_cali(cali_clk_t cali_clk, uint32_t slow_clk_cycles);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Convert from microseconds to slow clock cycles
|
||||||
|
* @param time_in_us_h Time in microseconds, higher 32 bit part
|
||||||
|
* @param time_in_us_l Time in microseconds, lower 32 bit part
|
||||||
|
* @param slow_clk_period Period of slow clock in microseconds, Q13.19 fixed point format (as returned by rtc_slowck_cali).
|
||||||
|
* @param[out] cylces_h output, higher 32 bit part of number of slow clock cycles
|
||||||
|
* @param[out] cycles_l output, lower 32 bit part of number of slow clock cycles
|
||||||
|
*/
|
||||||
|
void rtc_usec2rtc(uint32_t time_in_us_h, uint32_t time_in_us_l, uint32_t slow_clk_period, uint32_t *cylces_h, uint32_t *cycles_l);
|
||||||
|
|
||||||
|
|
||||||
|
#define DEEP_SLEEP_PD_NORMAL BIT(0) /*!< Base deep sleep mode */
|
||||||
|
#define DEEP_SLEEP_PD_RTC_PERIPH BIT(1) /*!< Power down RTC peripherals */
|
||||||
|
#define DEEP_SLEEP_PD_RTC_SLOW_MEM BIT(2) /*!< Power down RTC SLOW memory */
|
||||||
|
#define DEEP_SLEEP_PD_RTC_FAST_MEM BIT(3) /*!< Power down RTC FAST memory */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Prepare for entering sleep mode
|
||||||
|
* @param deep_slp DEEP_SLEEP_PD_ flags combined with OR (DEEP_SLEEP_PD_NORMAL must be included)
|
||||||
|
* @param cpu_lp_mode for deep sleep, should be 0
|
||||||
|
*/
|
||||||
|
void rtc_slp_prep_lite(uint32_t deep_slp, uint32_t cpu_lp_mode);
|
||||||
|
|
||||||
|
|
||||||
|
#define RTC_EXT_EVENT0_TRIG BIT(0)
|
||||||
|
#define RTC_EXT_EVENT1_TRIG BIT(1)
|
||||||
|
#define RTC_GPIO_TRIG BIT(2)
|
||||||
|
#define RTC_TIMER_EXPIRE BIT(3)
|
||||||
|
#define RTC_SDIO_TRIG BIT(4)
|
||||||
|
#define RTC_MAC_TRIG BIT(5)
|
||||||
|
#define RTC_UART0_TRIG BIT(6)
|
||||||
|
#define RTC_UART1_TRIG BIT(7)
|
||||||
|
#define RTC_TOUCH_TRIG BIT(8)
|
||||||
|
#define RTC_SAR_TRIG BIT(9)
|
||||||
|
#define RTC_BT_TRIG BIT(10)
|
||||||
|
|
||||||
|
|
||||||
|
#define RTC_EXT_EVENT0_TRIG_EN RTC_EXT_EVENT0_TRIG
|
||||||
|
#define RTC_EXT_EVENT1_TRIG_EN RTC_EXT_EVENT1_TRIG
|
||||||
|
#define RTC_GPIO_TRIG_EN RTC_GPIO_TRIG
|
||||||
|
#define RTC_TIMER_EXPIRE_EN RTC_TIMER_EXPIRE
|
||||||
|
#define RTC_SDIO_TRIG_EN RTC_SDIO_TRIG
|
||||||
|
#define RTC_MAC_TRIG_EN RTC_MAC_TRIG
|
||||||
|
#define RTC_UART0_TRIG_EN RTC_UART0_TRIG
|
||||||
|
#define RTC_UART1_TRIG_EN RTC_UART1_TRIG
|
||||||
|
#define RTC_TOUCH_TRIG_EN RTC_TOUCH_TRIG
|
||||||
|
#define RTC_SAR_TRIG_EN RTC_SAR_TRIG
|
||||||
|
#define RTC_BT_TRIG_EN RTC_BT_TRIG
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enter sleep mode for given number of cycles
|
||||||
|
* @param cycles_h higher 32 bit part of number of slow clock cycles
|
||||||
|
* @param cycles_l lower 32 bit part of number of slow clock cycles
|
||||||
|
* @param wakeup_opt wake up reason to enable (RTC_xxx_EN flags combined with OR)
|
||||||
|
* @param reject_opt reserved, should be 0
|
||||||
|
* @return TBD
|
||||||
|
*/
|
||||||
|
uint32_t rtc_sleep(uint32_t cycles_h, uint32_t cycles_l, uint32_t wakeup_opt, uint32_t reject_opt);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
158
components/esp32/system_api.c
Normal file
158
components/esp32/system_api.c
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "esp_wifi.h"
|
||||||
|
#include "esp_wifi_internal.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "rom/efuse.h"
|
||||||
|
#include "rom/cache.h"
|
||||||
|
#include "rom/uart.h"
|
||||||
|
#include "soc/dport_reg.h"
|
||||||
|
#include "soc/efuse_reg.h"
|
||||||
|
#include "soc/rtc_cntl_reg.h"
|
||||||
|
#include "soc/timer_group_reg.h"
|
||||||
|
#include "soc/timer_group_struct.h"
|
||||||
|
#include "soc/cpu.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "freertos/xtensa_api.h"
|
||||||
|
|
||||||
|
static const char* TAG = "system_api";
|
||||||
|
|
||||||
|
void system_init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_efuse_read_mac(uint8_t* mac)
|
||||||
|
{
|
||||||
|
uint8_t efuse_crc;
|
||||||
|
uint8_t calc_crc;
|
||||||
|
uint32_t mac_low = REG_READ(EFUSE_BLK0_RDATA1_REG);
|
||||||
|
uint32_t mac_high = REG_READ(EFUSE_BLK0_RDATA2_REG);
|
||||||
|
|
||||||
|
mac[0] = mac_high >> 8;
|
||||||
|
mac[1] = mac_high;
|
||||||
|
mac[2] = mac_low >> 24;
|
||||||
|
mac[3] = mac_low >> 16;
|
||||||
|
mac[4] = mac_low >> 8;
|
||||||
|
mac[5] = mac_low;
|
||||||
|
|
||||||
|
efuse_crc = mac_high >> 16;
|
||||||
|
calc_crc = esp_crc8(mac, 6);
|
||||||
|
|
||||||
|
if (efuse_crc != calc_crc) {
|
||||||
|
// Small range of MAC addresses are accepted even if CRC is invalid.
|
||||||
|
// These addresses are reserved for Espressif internal use.
|
||||||
|
if ((mac_high & 0xFFFF) == 0x18fe) {
|
||||||
|
if ((mac_low >= 0x346a85c7) && (mac_low <= 0x346a85f8)) {
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "MAC address CRC error, efuse_crc = 0x%02x; calc_crc = 0x%02x", efuse_crc, calc_crc);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__((alias("esp_efuse_read_mac")));
|
||||||
|
|
||||||
|
|
||||||
|
void IRAM_ATTR esp_restart(void)
|
||||||
|
{
|
||||||
|
esp_wifi_stop();
|
||||||
|
|
||||||
|
// Disable scheduler on this core.
|
||||||
|
vTaskSuspendAll();
|
||||||
|
const uint32_t core_id = xPortGetCoreID();
|
||||||
|
const uint32_t other_core_id = core_id == 0 ? 1 : 0;
|
||||||
|
esp_cpu_stall(other_core_id);
|
||||||
|
|
||||||
|
// We need to disable TG0/TG1 watchdogs
|
||||||
|
// First enable RTC watchdog to be on the safe side
|
||||||
|
REG_WRITE(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
|
||||||
|
REG_WRITE(RTC_CNTL_WDTCONFIG0_REG,
|
||||||
|
RTC_CNTL_WDT_FLASHBOOT_MOD_EN_M |
|
||||||
|
(1 << RTC_CNTL_WDT_SYS_RESET_LENGTH_S) |
|
||||||
|
(1 << RTC_CNTL_WDT_CPU_RESET_LENGTH_S) );
|
||||||
|
REG_WRITE(RTC_CNTL_WDTCONFIG1_REG, 128000);
|
||||||
|
|
||||||
|
// Disable TG0/TG1 watchdogs
|
||||||
|
TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
|
||||||
|
TIMERG0.wdt_config0.en = 0;
|
||||||
|
TIMERG0.wdt_wprotect=0;
|
||||||
|
TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
|
||||||
|
TIMERG1.wdt_config0.en = 0;
|
||||||
|
TIMERG1.wdt_wprotect=0;
|
||||||
|
|
||||||
|
// Disable all interrupts
|
||||||
|
xt_ints_off(0xFFFFFFFF);
|
||||||
|
|
||||||
|
// Disable cache
|
||||||
|
Cache_Read_Disable(0);
|
||||||
|
Cache_Read_Disable(1);
|
||||||
|
|
||||||
|
// Flush any data left in UART FIFO
|
||||||
|
uart_tx_flush(0);
|
||||||
|
uart_tx_flush(1);
|
||||||
|
uart_tx_flush(2);
|
||||||
|
|
||||||
|
// Reset wifi/bluetooth (bb/mac)
|
||||||
|
SET_PERI_REG_MASK(DPORT_WIFI_RST_EN_REG, 0x1f);
|
||||||
|
REG_WRITE(DPORT_WIFI_RST_EN_REG, 0);
|
||||||
|
|
||||||
|
// Reset timer/spi/uart
|
||||||
|
SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG,
|
||||||
|
DPORT_TIMERS_RST | DPORT_SPI_RST_1 | DPORT_UART_RST);
|
||||||
|
REG_WRITE(DPORT_PERIP_RST_EN_REG, 0);
|
||||||
|
|
||||||
|
// Reset CPUs
|
||||||
|
if (core_id == 0) {
|
||||||
|
// Running on PRO CPU: APP CPU is stalled. Can reset both CPUs.
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG,
|
||||||
|
RTC_CNTL_SW_PROCPU_RST_M | RTC_CNTL_SW_APPCPU_RST_M);
|
||||||
|
} else {
|
||||||
|
// Running on APP CPU: need to reset PRO CPU and unstall it,
|
||||||
|
// then stall APP CPU
|
||||||
|
SET_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_PROCPU_RST_M);
|
||||||
|
esp_cpu_unstall(0);
|
||||||
|
esp_cpu_stall(1);
|
||||||
|
}
|
||||||
|
while(true) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void system_restart(void) __attribute__((alias("esp_restart")));
|
||||||
|
|
||||||
|
void system_restore(void)
|
||||||
|
{
|
||||||
|
esp_wifi_restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t esp_get_free_heap_size(void)
|
||||||
|
{
|
||||||
|
return xPortGetFreeHeapSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t system_get_free_heap_size(void) __attribute__((alias("esp_get_free_heap_size")));
|
||||||
|
|
||||||
|
const char* system_get_sdk_version(void)
|
||||||
|
{
|
||||||
|
return "master";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
menu "TESTS"
|
|
||||||
|
|
||||||
config FP_TEST_ENABLE
|
|
||||||
bool "Enable test fp"
|
|
||||||
default "y"
|
|
||||||
help
|
|
||||||
For FPGA single core CPU which has no floating point support, floating point test should be disabled.
|
|
||||||
|
|
||||||
endmenu
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
|
|
||||||
#if CONFIG_FP_TEST_ENABLE
|
|
||||||
static float addsf(float a, float b)
|
static float addsf(float a, float b)
|
||||||
{
|
{
|
||||||
float result;
|
float result;
|
||||||
|
@ -192,4 +191,3 @@ TEST_CASE("context switch saves FP registers", "[fp]")
|
||||||
}
|
}
|
||||||
TEST_ASSERT(state.fail == 0);
|
TEST_ASSERT(state.fail == 0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -108,6 +108,7 @@
|
||||||
|
|
||||||
/* configASSERT behaviour */
|
/* configASSERT behaviour */
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
#include <stdlib.h> /* for abort() */
|
||||||
#include "rom/ets_sys.h"
|
#include "rom/ets_sys.h"
|
||||||
|
|
||||||
#if defined(CONFIG_FREERTOS_ASSERT_DISABLE)
|
#if defined(CONFIG_FREERTOS_ASSERT_DISABLE)
|
||||||
|
@ -126,8 +127,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION
|
#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION
|
||||||
#include <stdlib.h>
|
|
||||||
#include "rom/ets_sys.h"
|
|
||||||
#define UNTESTED_FUNCTION() { ets_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0)
|
#define UNTESTED_FUNCTION() { ets_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0)
|
||||||
#else
|
#else
|
||||||
#define UNTESTED_FUNCTION()
|
#define UNTESTED_FUNCTION()
|
||||||
|
|
|
@ -2,7 +2,6 @@ Config: {execute count: 1, execute order: in order}
|
||||||
DUT: [UT1]
|
DUT: [UT1]
|
||||||
Filter:
|
Filter:
|
||||||
- Add:
|
- Add:
|
||||||
ID: [SYS_OS_0102, SYS_MISC_0103, SYS_MISC_0102, SYS_MISC_0105, SYS_MISC_0104,
|
ID: [SYS_OS_0102, SYS_MISC_0102, SYS_MISC_0107, SYS_MISC_0106, SYS_MISC_0109,
|
||||||
SYS_MISC_0107, SYS_MISC_0106, SYS_MISC_0109, SYS_MISC_0108, SYS_MISC_0112, SYS_MISC_0113,
|
SYS_MISC_0108, SYS_MISC_0112, SYS_MISC_0113, SYS_MISC_0110, SYS_MISC_0111, SYS_LIB_0103,
|
||||||
SYS_MISC_0110, SYS_MISC_0111, SYS_MISC_0115, SYS_LIB_0103, SYS_LIB_0102, SYS_LIB_0101,
|
SYS_LIB_0102, SYS_LIB_0101, SYS_LIB_0106, SYS_LIB_0105, SYS_LIB_0104]
|
||||||
SYS_LIB_0106, SYS_LIB_0105, SYS_LIB_0104]
|
|
||||||
|
|
|
@ -18,10 +18,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
|
||||||
#ifdef BOOTLOADER_BUILD
|
|
||||||
#include <rom/ets_sys.h>
|
#include <rom/ets_sys.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include "mbedtls/bignum.h"
|
#include "mbedtls/bignum.h"
|
||||||
#include "rom/bigint.h"
|
#include "rom/bigint.h"
|
||||||
#include "soc/hwcrypto_reg.h"
|
#include "soc/hwcrypto_reg.h"
|
||||||
|
|
|
@ -184,3 +184,29 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t system_get_time(void)
|
||||||
|
{
|
||||||
|
#if defined( WITH_FRC1 ) || defined( WITH_RTC )
|
||||||
|
return get_time_since_boot();
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t system_get_current_time(void) __attribute__((alias("system_get_time")));
|
||||||
|
|
||||||
|
uint32_t system_relative_time(uint32_t current_time)
|
||||||
|
{
|
||||||
|
return system_get_time() - current_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t system_get_rtc_time(void)
|
||||||
|
{
|
||||||
|
#ifdef WITH_RTC
|
||||||
|
return get_rtc_time_us();
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ static int ssl_pm_reload_crt(SSL *ssl)
|
||||||
* Perform the mbedtls SSL handshake instead of mbedtls_ssl_handshake.
|
* Perform the mbedtls SSL handshake instead of mbedtls_ssl_handshake.
|
||||||
* We can add debug here.
|
* We can add debug here.
|
||||||
*/
|
*/
|
||||||
LOCAL int mbedtls_handshake( mbedtls_ssl_context *ssl )
|
static int mbedtls_handshake( mbedtls_ssl_context *ssl )
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
COMPONENT_ADD_INCLUDEDIRS := include port/include
|
COMPONENT_ADD_INCLUDEDIRS := include port/include
|
||||||
COMPONENT_SRCDIRS := src/crypto
|
COMPONENT_SRCDIRS := src/crypto port
|
||||||
|
|
||||||
CFLAGS += -DEMBEDDED_SUPP -D__ets__ -Wno-strict-aliasing -D__ESP32_SUPP_TYPE__
|
CFLAGS += -DEMBEDDED_SUPP -D__ets__ -Wno-strict-aliasing -D__ESP32_SUPP_TYPE__
|
||||||
|
|
|
@ -119,6 +119,7 @@ typedef __uint64_t uint64_t;
|
||||||
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
|
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
|
||||||
|
|
||||||
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
|
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
|
||||||
|
#define INLINE __inline__
|
||||||
|
|
||||||
static INLINE uint16_t
|
static INLINE uint16_t
|
||||||
be16dec(const void *pp)
|
be16dec(const void *pp)
|
||||||
|
|
64
components/wpa_supplicant/port/os_xtensa.c
Normal file
64
components/wpa_supplicant/port/os_xtensa.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* wpa_supplicant/hostapd / Internal implementation of OS specific functions
|
||||||
|
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* Alternatively, this software may be distributed under the terms of BSD
|
||||||
|
* license.
|
||||||
|
*
|
||||||
|
* See README and COPYING for more details.
|
||||||
|
*
|
||||||
|
* This file is an example of operating system specific wrapper functions.
|
||||||
|
* This version implements many of the functions internally, so it can be used
|
||||||
|
* to fill in missing functions from the target system C libraries.
|
||||||
|
*
|
||||||
|
* Some of the functions are using standard C library calls in order to keep
|
||||||
|
* this file in working condition to allow the functions to be tested on a
|
||||||
|
* Linux target. Please note that OS_NO_C_LIB_DEFINES needs to be defined for
|
||||||
|
* this file to work correctly. Note that these implementations are only
|
||||||
|
* examples and are not optimized for speed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "crypto/common.h"
|
||||||
|
#include "os.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include "esp_system.h"
|
||||||
|
|
||||||
|
int os_get_time(struct os_time *t)
|
||||||
|
{
|
||||||
|
return gettimeofday((struct timeval*) t, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long os_random(void)
|
||||||
|
{
|
||||||
|
return esp_random();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long r_rand(void) __attribute__((alias("os_random")));
|
||||||
|
|
||||||
|
|
||||||
|
int os_get_random(unsigned char *buf, size_t len)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
unsigned long tmp;
|
||||||
|
|
||||||
|
for (i = 0; i < ((len + 3) & ~3) / 4; i++) {
|
||||||
|
tmp = r_rand();
|
||||||
|
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
if ((i * 4 + j) < len) {
|
||||||
|
buf[i * 4 + j] = (uint8_t)(tmp >> (j * 8));
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ void hello_task(void *pvParameter)
|
||||||
}
|
}
|
||||||
printf("Restarting now.\n");
|
printf("Restarting now.\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
system_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_main()
|
void app_main()
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/event_groups.h"
|
#include "freertos/event_groups.h"
|
||||||
|
|
|
@ -88,7 +88,7 @@ void app_main()
|
||||||
|
|
||||||
const int deep_sleep_sec = 10;
|
const int deep_sleep_sec = 10;
|
||||||
ESP_LOGI(TAG, "Entering deep sleep for %d seconds", deep_sleep_sec);
|
ESP_LOGI(TAG, "Entering deep sleep for %d seconds", deep_sleep_sec);
|
||||||
system_deep_sleep(1000000LL * deep_sleep_sec);
|
esp_deep_sleep(1000000LL * deep_sleep_sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void obtain_time(void)
|
static void obtain_time(void)
|
||||||
|
|
|
@ -76,5 +76,5 @@ void app_main()
|
||||||
}
|
}
|
||||||
printf("Restarting now.\n");
|
printf("Restarting now.\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
system_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,7 +170,7 @@ void app_main()
|
||||||
if (err != ESP_OK) printf("Error (%d) saving run time blob to NVS!\n", err);
|
if (err != ESP_OK) printf("Error (%d) saving run time blob to NVS!\n", err);
|
||||||
printf("Restarting...\n");
|
printf("Restarting...\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
system_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vTaskDelay(200 / portTICK_RATE_MS);
|
vTaskDelay(200 / portTICK_RATE_MS);
|
||||||
|
|
Loading…
Reference in a new issue