From c1cd58e0968d260bf4c4b13030b39b918f0724e6 Mon Sep 17 00:00:00 2001 From: Johny Mattsson Date: Thu, 1 Oct 2015 15:04:18 +1000 Subject: [PATCH] Build using 1.4.0 SDK + remove old SDK includes/libs. Leaving the linker scripts intact for now, as they're quite customised. --- Makefile | 8 + app/Makefile | 1 - include/at_custom.h | 85 -------- include/c_types.h | 101 ---------- include/eagle_soc.h | 256 ------------------------ include/espconn.h | 407 --------------------------------------- include/ets_sys.h | 90 --------- include/gpio.h | 100 ---------- include/ip_addr.h | 69 ------- include/json/json.h | 70 ------- include/json/jsonparse.h | 94 --------- include/json/jsontree.h | 145 -------------- include/mem.h | 12 -- include/os_type.h | 19 -- include/osapi.h | 57 ------ include/ping.h | 32 --- include/queue.h | 204 -------------------- include/smartconfig.h | 28 --- include/spi_flash.h | 31 --- include/upgrade.h | 51 ----- include/user_interface.h | 267 ------------------------- lib/libat.a | Bin 155494 -> 0 bytes lib/libjson.a | Bin 12714 -> 0 bytes lib/liblwip.a | Bin 257102 -> 0 bytes lib/libm.a | Bin 1410244 -> 0 bytes lib/libmain.a | Bin 101482 -> 0 bytes lib/libnet80211.a | Bin 183276 -> 0 bytes lib/libphy.a | Bin 144622 -> 0 bytes lib/libpp.a | Bin 175734 -> 0 bytes lib/libsmartconfig.a | Bin 69302 -> 0 bytes lib/libssl.a | Bin 161766 -> 0 bytes lib/libupgrade.a | Bin 15516 -> 0 bytes lib/libwpa.a | Bin 123492 -> 0 bytes 33 files changed, 8 insertions(+), 2119 deletions(-) delete mode 100644 include/at_custom.h delete mode 100644 include/c_types.h delete mode 100644 include/eagle_soc.h delete mode 100644 include/espconn.h delete mode 100644 include/ets_sys.h delete mode 100644 include/gpio.h delete mode 100644 include/ip_addr.h delete mode 100644 include/json/json.h delete mode 100644 include/json/jsonparse.h delete mode 100644 include/json/jsontree.h delete mode 100644 include/mem.h delete mode 100644 include/os_type.h delete mode 100644 include/osapi.h delete mode 100644 include/ping.h delete mode 100644 include/queue.h delete mode 100644 include/smartconfig.h delete mode 100644 include/spi_flash.h delete mode 100644 include/upgrade.h delete mode 100644 include/user_interface.h delete mode 100644 lib/libat.a delete mode 100644 lib/libjson.a delete mode 100644 lib/liblwip.a delete mode 100644 lib/libm.a delete mode 100644 lib/libmain.a delete mode 100644 lib/libnet80211.a delete mode 100644 lib/libphy.a delete mode 100644 lib/libpp.a delete mode 100644 lib/libsmartconfig.a delete mode 100644 lib/libssl.a delete mode 100644 lib/libupgrade.a delete mode 100644 lib/libwpa.a diff --git a/Makefile b/Makefile index 19feb38d..2e16a06b 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,14 @@ ifndef PDIR endif +# SDK version NodeMCU is locked to +SDK_VER:=1.4.0 +# Ensure we search "our" SDK before the tool-chain's SDK (if any) +TOP_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) +SDK_DIR:=$(TOP_DIR)sdk/esp_iot_sdk_v$(SDK_VER) +CCFLAGS:= -I$(TOP_DIR)sdk-overrides/include -I$(SDK_DIR)/include +LDFLAGS:= -L$(SDK_DIR)/lib $(LDFLAGS) + ############################################################# # Select compile # diff --git a/app/Makefile b/app/Makefile index 636490e5..6ac746c4 100644 --- a/app/Makefile +++ b/app/Makefile @@ -97,7 +97,6 @@ COMPONENTS_eagle.app.v6 = \ modules/libmodules.a LINKFLAGS_eagle.app.v6 = \ - -L../lib \ -Wl,--gc-sections \ -Xlinker -Map=mapfile \ -nostdlib \ diff --git a/include/at_custom.h b/include/at_custom.h deleted file mode 100644 index a9b05c4c..00000000 --- a/include/at_custom.h +++ /dev/null @@ -1,85 +0,0 @@ - -/* - * custom_at.h - * - * This file is part of Espressif's AT+ command set program. - * Copyright (C) 2013 - 2016, Espressif Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of version 3 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef CUSTOM_AT_H_ -#define CUSTOM_AT_H_ - -#include "c_types.h" - -typedef struct -{ - char *at_cmdName; - int8_t at_cmdLen; - void (*at_testCmd)(uint8_t id); - void (*at_queryCmd)(uint8_t id); - void (*at_setupCmd)(uint8_t id, char *pPara); - void (*at_exeCmd)(uint8_t id); -}at_funcationType; - -/** - * @brief Response "OK" to uart. - * @param None - * @retval None - */ -void at_response_ok(void); -/** - * @brief Response "ERROR" to uart. - * @param events: no used - * @retval None - */ -void at_response_error(void); -/** - * @brief Task of process command or txdata. - * @param custom_at_cmd_array: the array of at cmd that custom defined - * cmd_num : the num of at cmd that custom defined - * @retval None - */ -void at_cmd_array_regist(at_funcationType *custom_at_cmd_array,uint32 cmd_num); -/** - * @brief get digit form at cmd line.the maybe alter pSrc - * @param p_src: at cmd line string - * result:the buffer to be placed result - * err : err num - * @retval TRUE: - * FALSE: - */ -bool at_get_next_int_dec(char **p_src,int*result,int* err); -/** - * @brief get string form at cmd line.the maybe alter pSrc - * @param p_dest: the buffer to be placed result - * p_src: at cmd line string - * max_len :max len of string excepted to get - * @retval None - */ -int32 at_data_str_copy(char *p_dest, char **p_src, int32 max_len); - -/** - * @brief initialize at module - * @param None - * @retval None - */ -void at_init(void); -/** - * @brief print string to at port - * @param string - * @retval None - */ -void at_port_print(const char *str); -#endif diff --git a/include/c_types.h b/include/c_types.h deleted file mode 100644 index 36ef6d12..00000000 --- a/include/c_types.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2010 - 2011 Espressif System - * - */ - -#ifndef _C_TYPES_H_ -#define _C_TYPES_H_ - -typedef unsigned char uint8_t; -typedef signed char sint8_t; -typedef signed char int8_t; -typedef unsigned short uint16_t; -typedef signed short sint16_t; -typedef signed short int16_t; -typedef unsigned long uint32_t; -typedef signed long sint32_t; -typedef signed long int32_t; -typedef signed long long sint64_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; -typedef unsigned long long u_int64_t; -typedef float real32_t; -typedef double real64_t; - -typedef unsigned char uint8; -typedef unsigned char u8; -typedef signed char sint8; -typedef signed char int8; -typedef signed char s8; -typedef unsigned short uint16; -typedef unsigned short u16; -typedef signed short sint16; -typedef signed short s16; -typedef unsigned int uint32; -typedef unsigned int u_int; -typedef unsigned int u32; -typedef signed int sint32; -typedef signed int s32; -typedef int int32; -typedef signed long long sint64; -typedef unsigned long long uint64; -typedef unsigned long long u64; -typedef float real32; -typedef double real64; - -#define __le16 u16 - -//typedef unsigned int size_t; -#if !defined(__size_t) - #define __size_t 1 - typedef unsigned int size_t; /* others (e.g. ) also define */ - /* the unsigned integral type of the result of the sizeof operator. */ -#endif - -#define __packed __attribute__((packed)) - -#define LOCAL static - -#ifndef NULL -#define NULL (void *)0 -#endif /* NULL */ - -/* probably should not put STATUS here */ -typedef enum { - OK = 0, - FAIL, - PENDING, - BUSY, - CANCEL, -} STATUS; - -#define BIT(nr) (1UL << (nr)) - -#define REG_SET_BIT(_r, _b) (*(volatile uint32_t*)(_r) |= (_b)) -#define REG_CLR_BIT(_r, _b) (*(volatile uint32_t*)(_r) &= ~(_b)) - -#define DMEM_ATTR __attribute__((section(".bss"))) -#define SHMEM_ATTR - -#ifdef ICACHE_FLASH -#define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text"))) -#define ICACHE_RODATA_ATTR __attribute__((section(".irom.text"))) -#else -#define ICACHE_FLASH_ATTR -#endif /* ICACHE_FLASH */ - -#define TEXT_SECTION_ATTR __attribute__((section(".text"))) -#define RAM_CONST_ATTR __attribute__((section(".rodata"))) - -#ifndef __cplusplus -typedef unsigned char bool; -#define BOOL bool -#define true (1) -#define false (0) -#define TRUE true -#define FALSE false - - -#endif /* !__cplusplus */ - -#endif /* _C_TYPES_H_ */ diff --git a/include/eagle_soc.h b/include/eagle_soc.h deleted file mode 100644 index 9c4b8a01..00000000 --- a/include/eagle_soc.h +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) Espressif System 2010 - 2012 - * - */ - -#ifndef _EAGLE_SOC_H_ -#define _EAGLE_SOC_H_ - -//Register Bits{{ -#define BIT31 0x80000000 -#define BIT30 0x40000000 -#define BIT29 0x20000000 -#define BIT28 0x10000000 -#define BIT27 0x08000000 -#define BIT26 0x04000000 -#define BIT25 0x02000000 -#define BIT24 0x01000000 -#define BIT23 0x00800000 -#define BIT22 0x00400000 -#define BIT21 0x00200000 -#define BIT20 0x00100000 -#define BIT19 0x00080000 -#define BIT18 0x00040000 -#define BIT17 0x00020000 -#define BIT16 0x00010000 -#define BIT15 0x00008000 -#define BIT14 0x00004000 -#define BIT13 0x00002000 -#define BIT12 0x00001000 -#define BIT11 0x00000800 -#define BIT10 0x00000400 -#define BIT9 0x00000200 -#define BIT8 0x00000100 -#define BIT7 0x00000080 -#define BIT6 0x00000040 -#define BIT5 0x00000020 -#define BIT4 0x00000010 -#define BIT3 0x00000008 -#define BIT2 0x00000004 -#define BIT1 0x00000002 -#define BIT0 0x00000001 -//}} - -//Registers Operation {{ -#define ETS_UNCACHED_ADDR(addr) (addr) -#define ETS_CACHED_ADDR(addr) (addr) - - -#define READ_PERI_REG(addr) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) -#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val) -#define CLEAR_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)&(~(mask)))) -#define SET_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask))) -#define GET_PERI_REG_BITS(reg, hipos,lowpos) ((READ_PERI_REG(reg)>>(lowpos))&((1<<((hipos)-(lowpos)+1))-1)) -#define SET_PERI_REG_BITS(reg,bit_map,value,shift) (WRITE_PERI_REG((reg),(READ_PERI_REG(reg)&(~((bit_map)<<(shift))))|((value)<<(shift)) )) -//}} - -//Periheral Clock {{ -#define CPU_CLK_FREQ 80*1000000 //unit: Hz -#define APB_CLK_FREQ CPU_CLK_FREQ -#define UART_CLK_FREQ APB_CLK_FREQ -#define TIMER_CLK_FREQ (APB_CLK_FREQ>>8) //divided by 256 -//}} - -//Peripheral device base address define{{ -#define PERIPHS_DPORT_BASEADDR 0x3ff00000 -#define PERIPHS_GPIO_BASEADDR 0x60000300 -#define PERIPHS_TIMER_BASEDDR 0x60000600 -#define PERIPHS_RTC_BASEADDR 0x60000700 -#define PERIPHS_IO_MUX 0x60000800 -//}} - -//Interrupt remap control registers define{{ -#define EDGE_INT_ENABLE_REG (PERIPHS_DPORT_BASEADDR+0x04) -#define TM1_EDGE_INT_ENABLE() SET_PERI_REG_MASK(EDGE_INT_ENABLE_REG, BIT1) -#define TM1_EDGE_INT_DISABLE() CLEAR_PERI_REG_MASK(EDGE_INT_ENABLE_REG, BIT1) -//}} - -//GPIO reg {{ -#define GPIO_REG_READ(reg) READ_PERI_REG(PERIPHS_GPIO_BASEADDR + reg) -#define GPIO_REG_WRITE(reg, val) WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + reg, val) -#define GPIO_OUT_ADDRESS 0x00 -#define GPIO_OUT_W1TS_ADDRESS 0x04 -#define GPIO_OUT_W1TC_ADDRESS 0x08 - -#define GPIO_ENABLE_ADDRESS 0x0c -#define GPIO_ENABLE_W1TS_ADDRESS 0x10 -#define GPIO_ENABLE_W1TC_ADDRESS 0x14 -#define GPIO_OUT_W1TC_DATA_MASK 0x0000ffff - -#define GPIO_IN_ADDRESS 0x18 - -#define GPIO_STATUS_ADDRESS 0x1c -#define GPIO_STATUS_W1TS_ADDRESS 0x20 -#define GPIO_STATUS_W1TC_ADDRESS 0x24 -#define GPIO_STATUS_INTERRUPT_MASK 0x0000ffff - -#define GPIO_RTC_CALIB_SYNC PERIPHS_GPIO_BASEADDR+0x6c -#define RTC_CALIB_START BIT31 //first write to zero, then to one to start -#define RTC_PERIOD_NUM_MASK 0x3ff //max 8ms -#define GPIO_RTC_CALIB_VALUE PERIPHS_GPIO_BASEADDR+0x70 -#define RTC_CALIB_RDY_S 31 //after measure, flag to one, when start from zero to one, turn to zero -#define RTC_CALIB_VALUE_MASK 0xfffff - -#define GPIO_PIN0_ADDRESS 0x28 - -#define GPIO_ID_PIN0 0 -#define GPIO_ID_PIN(n) (GPIO_ID_PIN0+(n)) -#define GPIO_LAST_REGISTER_ID GPIO_ID_PIN(15) -#define GPIO_ID_NONE 0xffffffff - -#define GPIO_PIN_COUNT 16 - -#define GPIO_PIN_CONFIG_MSB 12 -#define GPIO_PIN_CONFIG_LSB 11 -#define GPIO_PIN_CONFIG_MASK 0x00001800 -#define GPIO_PIN_CONFIG_GET(x) (((x) & GPIO_PIN_CONFIG_MASK) >> GPIO_PIN_CONFIG_LSB) -#define GPIO_PIN_CONFIG_SET(x) (((x) << GPIO_PIN_CONFIG_LSB) & GPIO_PIN_CONFIG_MASK) - -#define GPIO_WAKEUP_ENABLE 1 -#define GPIO_WAKEUP_DISABLE (~GPIO_WAKEUP_ENABLE) -#define GPIO_PIN_WAKEUP_ENABLE_MSB 10 -#define GPIO_PIN_WAKEUP_ENABLE_LSB 10 -#define GPIO_PIN_WAKEUP_ENABLE_MASK 0x00000400 -#define GPIO_PIN_WAKEUP_ENABLE_GET(x) (((x) & GPIO_PIN_WAKEUP_ENABLE_MASK) >> GPIO_PIN_WAKEUP_ENABLE_LSB) -#define GPIO_PIN_WAKEUP_ENABLE_SET(x) (((x) << GPIO_PIN_WAKEUP_ENABLE_LSB) & GPIO_PIN_WAKEUP_ENABLE_MASK) - -#define GPIO_PIN_INT_TYPE_MASK 0x380 -#define GPIO_PIN_INT_TYPE_MSB 9 -#define GPIO_PIN_INT_TYPE_LSB 7 -#define GPIO_PIN_INT_TYPE_GET(x) (((x) & GPIO_PIN_INT_TYPE_MASK) >> GPIO_PIN_INT_TYPE_LSB) -#define GPIO_PIN_INT_TYPE_SET(x) (((x) << GPIO_PIN_INT_TYPE_LSB) & GPIO_PIN_INT_TYPE_MASK) - -#define GPIO_PAD_DRIVER_ENABLE 1 -#define GPIO_PAD_DRIVER_DISABLE (~GPIO_PAD_DRIVER_ENABLE) -#define GPIO_PIN_PAD_DRIVER_MSB 2 -#define GPIO_PIN_PAD_DRIVER_LSB 2 -#define GPIO_PIN_PAD_DRIVER_MASK 0x00000004 -#define GPIO_PIN_PAD_DRIVER_GET(x) (((x) & GPIO_PIN_PAD_DRIVER_MASK) >> GPIO_PIN_PAD_DRIVER_LSB) -#define GPIO_PIN_PAD_DRIVER_SET(x) (((x) << GPIO_PIN_PAD_DRIVER_LSB) & GPIO_PIN_PAD_DRIVER_MASK) - -#define GPIO_AS_PIN_SOURCE 0 -#define SIGMA_AS_PIN_SOURCE (~GPIO_AS_PIN_SOURCE) -#define GPIO_PIN_SOURCE_MSB 0 -#define GPIO_PIN_SOURCE_LSB 0 -#define GPIO_PIN_SOURCE_MASK 0x00000001 -#define GPIO_PIN_SOURCE_GET(x) (((x) & GPIO_PIN_SOURCE_MASK) >> GPIO_PIN_SOURCE_LSB) -#define GPIO_PIN_SOURCE_SET(x) (((x) << GPIO_PIN_SOURCE_LSB) & GPIO_PIN_SOURCE_MASK) -// }} - -// TIMER reg {{ -#define RTC_REG_READ(addr) READ_PERI_REG(PERIPHS_TIMER_BASEDDR + addr) -#define RTC_REG_WRITE(addr, val) WRITE_PERI_REG(PERIPHS_TIMER_BASEDDR + addr, val) -#define RTC_CLR_REG_MASK(reg, mask) CLEAR_PERI_REG_MASK(PERIPHS_TIMER_BASEDDR +reg, mask) -/* Returns the current time according to the timer timer. */ -#define NOW() RTC_REG_READ(FRC2_COUNT_ADDRESS) - -//load initial_value to timer1 -#define FRC1_LOAD_ADDRESS 0x00 - -//timer1's counter value(count from initial_value to 0) -#define FRC1_COUNT_ADDRESS 0x04 - -#define FRC1_CTRL_ADDRESS 0x08 - -//clear timer1's interrupt when write this address -#define FRC1_INT_ADDRESS 0x0c -#define FRC1_INT_CLR_MASK 0x00000001 - -//timer2's counter value(count from initial_value to 0) -#define FRC2_COUNT_ADDRESS 0x24 -// }} - -//RTC reg {{ -#define REG_RTC_BASE PERIPHS_RTC_BASEADDR - -#define RTC_GPIO_OUT (REG_RTC_BASE + 0x068) -#define RTC_GPIO_ENABLE (REG_RTC_BASE + 0x074) -#define RTC_GPIO_IN_DATA (REG_RTC_BASE + 0x08C) -#define RTC_GPIO_CONF (REG_RTC_BASE + 0x090) -#define PAD_XPD_DCDC_CONF (REG_RTC_BASE + 0x0A0) -//}} - -//PIN Mux reg {{ -#define PERIPHS_IO_MUX_FUNC 0x13 -#define PERIPHS_IO_MUX_FUNC_S 4 -#define PERIPHS_IO_MUX_PULLUP BIT7 -#define PERIPHS_IO_MUX_PULLDWN BIT6 -#define PERIPHS_IO_MUX_SLEEP_PULLUP BIT3 -#define PERIPHS_IO_MUX_SLEEP_PULLDWN BIT2 -#define PERIPHS_IO_MUX_SLEEP_OE BIT1 -#define PERIPHS_IO_MUX_OE BIT0 - -#define PERIPHS_IO_MUX_CONF_U (PERIPHS_IO_MUX + 0x00) -#define SPI0_CLK_EQU_SYS_CLK BIT8 -#define SPI1_CLK_EQU_SYS_CLK BIT9 -#define PERIPHS_IO_MUX_MTDI_U (PERIPHS_IO_MUX + 0x04) -#define FUNC_GPIO12 3 -#define PERIPHS_IO_MUX_MTCK_U (PERIPHS_IO_MUX + 0x08) -#define FUNC_GPIO13 3 -#define PERIPHS_IO_MUX_MTMS_U (PERIPHS_IO_MUX + 0x0C) -#define FUNC_GPIO14 3 -#define PERIPHS_IO_MUX_MTDO_U (PERIPHS_IO_MUX + 0x10) -#define FUNC_GPIO15 3 -#define FUNC_U0RTS 4 -#define PERIPHS_IO_MUX_U0RXD_U (PERIPHS_IO_MUX + 0x14) -#define FUNC_U0RXD 0 -#define FUNC_GPIO3 3 -#define PERIPHS_IO_MUX_U0TXD_U (PERIPHS_IO_MUX + 0x18) -#define FUNC_U0TXD 0 -#define FUNC_GPIO1 3 -#define PERIPHS_IO_MUX_SD_CLK_U (PERIPHS_IO_MUX + 0x1c) -#define FUNC_SDCLK 0 -#define FUNC_SPICLK 1 -#define PERIPHS_IO_MUX_SD_DATA0_U (PERIPHS_IO_MUX + 0x20) -#define FUNC_SDDATA0 0 -#define FUNC_SPIQ 1 -#define FUNC_U1TXD 4 -#define PERIPHS_IO_MUX_SD_DATA1_U (PERIPHS_IO_MUX + 0x24) -#define FUNC_SDDATA1 0 -#define FUNC_SPID 1 -#define FUNC_U1RXD 4 -#define FUNC_SDDATA1_U1RXD 7 -#define PERIPHS_IO_MUX_SD_DATA2_U (PERIPHS_IO_MUX + 0x28) -#define FUNC_SDDATA2 0 -#define FUNC_SPIHD 1 -#define FUNC_GPIO9 3 -#define PERIPHS_IO_MUX_SD_DATA3_U (PERIPHS_IO_MUX + 0x2c) -#define FUNC_SDDATA3 0 -#define FUNC_SPIWP 1 -#define FUNC_GPIO10 3 -#define PERIPHS_IO_MUX_SD_CMD_U (PERIPHS_IO_MUX + 0x30) -#define FUNC_SDCMD 0 -#define FUNC_SPICS0 1 -#define PERIPHS_IO_MUX_GPIO0_U (PERIPHS_IO_MUX + 0x34) -#define FUNC_GPIO0 0 -#define PERIPHS_IO_MUX_GPIO2_U (PERIPHS_IO_MUX + 0x38) -#define FUNC_GPIO2 0 -#define FUNC_U1TXD_BK 2 -#define FUNC_U0TXD_BK 4 -#define PERIPHS_IO_MUX_GPIO4_U (PERIPHS_IO_MUX + 0x3C) -#define FUNC_GPIO4 0 -#define PERIPHS_IO_MUX_GPIO5_U (PERIPHS_IO_MUX + 0x40) -#define FUNC_GPIO5 0 - -#define PIN_PULLUP_DIS(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME, PERIPHS_IO_MUX_PULLUP) -#define PIN_PULLUP_EN(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME, PERIPHS_IO_MUX_PULLUP) -#define PIN_PULLDWN_DIS(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME, PERIPHS_IO_MUX_PULLDWN) -#define PIN_PULLDWN_EN(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME, PERIPHS_IO_MUX_PULLDWN) -#define PIN_FUNC_SELECT(PIN_NAME, FUNC) do { \ - CLEAR_PERI_REG_MASK(PIN_NAME, (PERIPHS_IO_MUX_FUNC<= GPIO_ID_PIN0) && (reg_id <= GPIO_ID_PIN(GPIO_PIN_COUNT-1))) - -#define GPIO_REGID_TO_PINIDX(reg_id) ((reg_id) - GPIO_ID_PIN0) - -typedef enum { - GPIO_PIN_INTR_DISABLE = 0, - GPIO_PIN_INTR_POSEDGE = 1, - GPIO_PIN_INTR_NEGEDGE = 2, - GPIO_PIN_INTR_ANYEGDE = 3, - GPIO_PIN_INTR_LOLEVEL = 4, - GPIO_PIN_INTR_HILEVEL = 5 -} GPIO_INT_TYPE; - -#define GPIO_OUTPUT_SET(gpio_no, bit_value) \ - gpio_output_set(bit_value<>gpio_no)&BIT0) - -/* GPIO interrupt handler, registered through gpio_intr_handler_register */ -typedef void (* gpio_intr_handler_fn_t)(uint32 intr_mask, void *arg); - - -/* - * Initialize GPIO. This includes reading the GPIO Configuration DataSet - * to initialize "output enables" and pin configurations for each gpio pin. - * Must be called once during startup. - */ -void gpio_init(void); - -/* - * Change GPIO pin output by setting, clearing, or disabling pins. - * In general, it is expected that a bit will be set in at most one - * of these masks. If a bit is clear in all masks, the output state - * remains unchanged. - * - * There is no particular ordering guaranteed; so if the order of - * writes is significant, calling code should divide a single call - * into multiple calls. - */ -void gpio_output_set(uint32 set_mask, - uint32 clear_mask, - uint32 enable_mask, - uint32 disable_mask); - -/* - * Sample the value of GPIO input pins and returns a bitmask. - */ -uint32 gpio_input_get(void); - -/* - * Set the specified GPIO register to the specified value. - * This is a very general and powerful interface that is not - * expected to be used during normal operation. It is intended - * mainly for debug, or for unusual requirements. - */ -void gpio_register_set(uint32 reg_id, uint32 value); - -/* Get the current value of the specified GPIO register. */ -uint32 gpio_register_get(uint32 reg_id); - -/* - * Register an application-specific interrupt handler for GPIO pin - * interrupts. Once the interrupt handler is called, it will not - * be called again until after a call to gpio_intr_ack. Any GPIO - * interrupts that occur during the interim are masked. - * - * The application-specific handler is called with a mask of - * pending GPIO interrupts. After processing pin interrupts, the - * application-specific handler may wish to use gpio_intr_pending - * to check for any additional pending interrupts before it returns. - */ -void gpio_intr_handler_register(gpio_intr_handler_fn_t fn, void *arg); - -/* Determine which GPIO interrupts are pending. */ -uint32 gpio_intr_pending(void); - -/* - * Acknowledge GPIO interrupts. - * Intended to be called from the gpio_intr_handler_fn. - */ -void gpio_intr_ack(uint32 ack_mask); - -void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state); - -void gpio_pin_wakeup_disable(); - -void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state); - -#endif // _GPIO_H_ diff --git a/include/ip_addr.h b/include/ip_addr.h deleted file mode 100644 index 728a75c4..00000000 --- a/include/ip_addr.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __IP_ADDR_H__ -#define __IP_ADDR_H__ - -#include "c_types.h" - -struct ip_addr { - uint32 addr; -}; - -typedef struct ip_addr ip_addr_t; - -struct ip_info { - struct ip_addr ip; - struct ip_addr netmask; - struct ip_addr gw; -}; - -#define IP4_ADDR(ipaddr, a,b,c,d) \ - (ipaddr)->addr = ((uint32)((d) & 0xff) << 24) | \ - ((uint32)((c) & 0xff) << 16) | \ - ((uint32)((b) & 0xff) << 8) | \ - (uint32)((a) & 0xff) - -/** - * Determine if two address are on the same network. - * - * @arg addr1 IP address 1 - * @arg addr2 IP address 2 - * @arg mask network identifier mask - * @return !0 if the network identifiers of both address match - */ -#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ - (mask)->addr) == \ - ((addr2)->addr & \ - (mask)->addr)) - -/** Set an IP address given by the four byte-parts. - Little-endian version that prevents the use of htonl. */ -#define IP4_ADDR(ipaddr, a,b,c,d) \ - (ipaddr)->addr = ((uint32)((d) & 0xff) << 24) | \ - ((uint32)((c) & 0xff) << 16) | \ - ((uint32)((b) & 0xff) << 8) | \ - (uint32)((a) & 0xff) - -#define ip4_addr1(ipaddr) (((uint8*)(ipaddr))[0]) -#define ip4_addr2(ipaddr) (((uint8*)(ipaddr))[1]) -#define ip4_addr3(ipaddr) (((uint8*)(ipaddr))[2]) -#define ip4_addr4(ipaddr) (((uint8*)(ipaddr))[3]) - -#define ip4_addr1_16(ipaddr) ((uint16)ip4_addr1(ipaddr)) -#define ip4_addr2_16(ipaddr) ((uint16)ip4_addr2(ipaddr)) -#define ip4_addr3_16(ipaddr) ((uint16)ip4_addr3(ipaddr)) -#define ip4_addr4_16(ipaddr) ((uint16)ip4_addr4(ipaddr)) - - -/** 255.255.255.255 */ -#define IPADDR_NONE ((uint32)0xffffffffUL) -/** 0.0.0.0 */ -#define IPADDR_ANY ((uint32)0x00000000UL) -uint32 ipaddr_addr(const char *cp); - -#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \ - ip4_addr2_16(ipaddr), \ - ip4_addr3_16(ipaddr), \ - ip4_addr4_16(ipaddr) - -#define IPSTR "%d.%d.%d.%d" - -#endif /* __IP_ADDR_H__ */ diff --git a/include/json/json.h b/include/json/json.h deleted file mode 100644 index 2308b5b7..00000000 --- a/include/json/json.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2011-2012, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * A few JSON defines used for parsing and generating JSON. - * \author - * Niclas Finne - * Joakim Eriksson - */ - -#ifndef __JSON_H__ -#define __JSON_H__ - -#define JSON_TYPE_ARRAY '[' -#define JSON_TYPE_OBJECT '{' -#define JSON_TYPE_PAIR ':' -#define JSON_TYPE_PAIR_NAME 'N' /* for N:V pairs */ -#define JSON_TYPE_STRING '"' -#define JSON_TYPE_INT 'I' -#define JSON_TYPE_NUMBER '0' -#define JSON_TYPE_ERROR 0 - -/* how should we handle null vs false - both can be 0? */ -#define JSON_TYPE_NULL 'n' -#define JSON_TYPE_TRUE 't' -#define JSON_TYPE_FALSE 'f' - -#define JSON_TYPE_CALLBACK 'C' - -enum { - JSON_ERROR_OK, - JSON_ERROR_SYNTAX, - JSON_ERROR_UNEXPECTED_ARRAY, - JSON_ERROR_UNEXPECTED_END_OF_ARRAY, - JSON_ERROR_UNEXPECTED_OBJECT, - JSON_ERROR_UNEXPECTED_STRING -}; - -#define JSON_CONTENT_TYPE "application/json" - -#endif /* __JSON_H__ */ diff --git a/include/json/jsonparse.h b/include/json/jsonparse.h deleted file mode 100644 index e1cb67a4..00000000 --- a/include/json/jsonparse.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2011-2012, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -#ifndef __JSONPARSE_H__ -#define __JSONPARSE_H__ - -#include "c_types.h" -#include "json/json.h" - -#ifdef JSONPARSE_CONF_MAX_DEPTH -#define JSONPARSE_MAX_DEPTH JSONPARSE_CONF_MAX_DEPTH -#else -#define JSONPARSE_MAX_DEPTH 10 -#endif - -struct jsonparse_state { - const char *json; - int pos; - int len; - int depth; - /* for handling atomic values */ - int vstart; - int vlen; - char vtype; - char error; - char stack[JSONPARSE_MAX_DEPTH]; -}; - -/** - * \brief Initialize a JSON parser state. - * \param state A pointer to a JSON parser state - * \param json The string to parse as JSON - * \param len The length of the string to parse - * - * This function initializes a JSON parser state for - * parsing a string as JSON. - */ -void jsonparse_setup(struct jsonparse_state *state, const char *json, - int len); - -/* move to next JSON element */ -int jsonparse_next(struct jsonparse_state *state); - -/* copy the current JSON value into the specified buffer */ -int jsonparse_copy_value(struct jsonparse_state *state, char *buf, - int buf_size); - -/* get the current JSON value parsed as an int */ -int jsonparse_get_value_as_int(struct jsonparse_state *state); - -/* get the current JSON value parsed as a long */ -long jsonparse_get_value_as_long(struct jsonparse_state *state); - -/* get the current JSON value parsed as a unsigned long */ -unsigned long jsonparse_get_value_as_ulong(struct jsonparse_state *state); - -/* get the length of the current JSON value */ -int jsonparse_get_len(struct jsonparse_state *state); - -/* get the type of the current JSON value */ -int jsonparse_get_type(struct jsonparse_state *state); - -/* compare the JSON value with the specified string */ -int jsonparse_strcmp_value(struct jsonparse_state *state, const char *str); - -#endif /* __JSONPARSE_H__ */ diff --git a/include/json/jsontree.h b/include/json/jsontree.h deleted file mode 100644 index 0ffe9d15..00000000 --- a/include/json/jsontree.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2011-2012, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * JSON output generation - * \author - * Niclas Finne - * Joakim Eriksson - */ - -#ifndef __JSONTREE_H__ -#define __JSONTREE_H__ - -#include "c_types.h" -#include "json/json.h" - -#ifdef JSONTREE_CONF_MAX_DEPTH -#define JSONTREE_MAX_DEPTH JSONTREE_CONF_MAX_DEPTH -#else -#define JSONTREE_MAX_DEPTH 10 -#endif /* JSONTREE_CONF_MAX_DEPTH */ - -struct jsontree_context { - struct jsontree_value *values[JSONTREE_MAX_DEPTH]; - uint16_t index[JSONTREE_MAX_DEPTH]; - int (* putchar)(int); - uint8_t depth; - uint8_t path; - int callback_state; -}; - -struct jsontree_value { - uint8_t type; - /* followed by a value */ -}; - -struct jsontree_string { - uint8_t type; - const char *value; -}; - -struct jsontree_int { - uint8_t type; - int value; -}; - -/* NOTE: the jsontree_callback set will receive a jsonparse state */ -struct jsonparse_state; -struct jsontree_callback { - uint8_t type; - int (* output)(struct jsontree_context *js_ctx); - int (* set)(struct jsontree_context *js_ctx, struct jsonparse_state *parser); -}; - -struct jsontree_pair { - const char *name; - struct jsontree_value *value; -}; - -struct jsontree_object { - uint8_t type; - uint8_t count; - struct jsontree_pair *pairs; -}; - -struct jsontree_array { - uint8_t type; - uint8_t count; - struct jsontree_value **values; -}; - -#define JSONTREE_STRING(text) {JSON_TYPE_STRING, (text)} -#define JSONTREE_PAIR(name, value) {(name), (struct jsontree_value *)(value)} -#define JSONTREE_CALLBACK(output, set) {JSON_TYPE_CALLBACK, (output), (set)} - -#define JSONTREE_OBJECT(name, ...) \ - static struct jsontree_pair jsontree_pair_##name[] = {__VA_ARGS__}; \ - static struct jsontree_object name = { \ - JSON_TYPE_OBJECT, \ - sizeof(jsontree_pair_##name)/sizeof(struct jsontree_pair), \ - jsontree_pair_##name } - -#define JSONTREE_PAIR_ARRAY(value) (struct jsontree_value *)(value) -#define JSONTREE_ARRAY(name, ...) \ - static struct jsontree_value* jsontree_value_##name[] = {__VA_ARGS__}; \ - static struct jsontree_array name = { \ - JSON_TYPE_ARRAY, \ - sizeof(jsontree_value_##name)/sizeof(struct jsontree_value*), \ - jsontree_value_##name } - -#define JSONTREE_OBJECT_EXT(name, ...) \ - static struct jsontree_pair jsontree_pair_##name[] = {__VA_ARGS__}; \ - struct jsontree_object name = { \ - JSON_TYPE_OBJECT, \ - sizeof(jsontree_pair_##name)/sizeof(struct jsontree_pair), \ - jsontree_pair_##name } - -void jsontree_setup(struct jsontree_context *js_ctx, - struct jsontree_value *root, int (* putchar)(int)); -void jsontree_reset(struct jsontree_context *js_ctx); - -const char *jsontree_path_name(const struct jsontree_context *js_ctx, - int depth); - -void jsontree_write_int(const struct jsontree_context *js_ctx, int value); -void jsontree_write_int_array(const struct jsontree_context *js_ctx, const int *text, uint32 length); - -void jsontree_write_atom(const struct jsontree_context *js_ctx, - const char *text); -void jsontree_write_string(const struct jsontree_context *js_ctx, - const char *text); -int jsontree_print_next(struct jsontree_context *js_ctx); -struct jsontree_value *jsontree_find_next(struct jsontree_context *js_ctx, - int type); - -#endif /* __JSONTREE_H__ */ diff --git a/include/mem.h b/include/mem.h deleted file mode 100644 index b3fb8f48..00000000 --- a/include/mem.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __MEM_H__ -#define __MEM_H__ - -//void *pvPortMalloc( size_t xWantedSize ); -//void vPortFree( void *pv ); -//void *pvPortZalloc(size_t size); - -#define os_malloc pvPortMalloc -#define os_free vPortFree -#define os_zalloc pvPortZalloc - -#endif diff --git a/include/os_type.h b/include/os_type.h deleted file mode 100644 index a9901061..00000000 --- a/include/os_type.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * copyright (c) Espressif System 2010 - * - * mapping to ETS structures - * - */ -#ifndef _OS_TYPES_H_ -#define _OS_TYPES_H_ - -#include "ets_sys.h" - -#define os_signal_t ETSSignal -#define os_param_t ETSParam -#define os_event_t ETSEvent -#define os_task_t ETSTask -#define os_timer_t ETSTimer -#define os_timer_func_t ETSTimerFunc - -#endif diff --git a/include/osapi.h b/include/osapi.h deleted file mode 100644 index 5fbdf0da..00000000 --- a/include/osapi.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2010 Espressif System - */ - -#ifndef _OSAPI_H_ -#define _OSAPI_H_ - -#include -#include "user_config.h" - -#define os_bzero ets_bzero -#define os_delay_us ets_delay_us -#define os_install_putc1 ets_install_putc1 -#define os_install_putc2 ets_install_putc2 -#define os_intr_lock ets_intr_lock -#define os_intr_unlock ets_intr_unlock -#define os_isr_attach ets_isr_attach -#define os_isr_mask ets_isr_mask -#define os_isr_unmask ets_isr_unmask -#define os_memcmp ets_memcmp -#define os_memcpy ets_memcpy -#define os_memmove ets_memmove -#define os_memset ets_memset -#define os_putc ets_putc -#define os_str2macaddr ets_str2macaddr -#define os_strcat strcat -#define os_strchr strchr -#define os_strcmp ets_strcmp -#define os_strcpy ets_strcpy -#define os_strlen ets_strlen -#define os_strncmp ets_strncmp -#define os_strncpy ets_strncpy -#define os_strstr ets_strstr -#ifdef USE_US_TIMER -#define os_timer_arm_us(a, b, c) ets_timer_arm_new(a, b, c, 0) -#endif -#define os_timer_arm(a, b, c) ets_timer_arm_new(a, b, c, 1) -#define os_timer_disarm ets_timer_disarm -#define os_timer_done ets_timer_done -#define os_timer_handler_isr ets_timer_handler_isr -#define os_timer_init ets_timer_init -#define os_timer_setfn ets_timer_setfn - -#define os_sprintf ets_sprintf -#define os_update_cpu_frequency ets_update_cpu_frequency - -#ifdef USE_OPTIMIZE_PRINTF -#define os_printf(fmt, ...) do { \ - static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \ - os_printf_plus(flash_str, ##__VA_ARGS__); \ - } while(0) -#else -#define os_printf os_printf_plus -#endif - -#endif - diff --git a/include/ping.h b/include/ping.h deleted file mode 100644 index 4ecd032b..00000000 --- a/include/ping.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __PING_H__ -#define __PING_H__ - - -typedef void (* ping_recv_function)(void* arg, void *pdata); -typedef void (* ping_sent_function)(void* arg, void *pdata); - -struct ping_option{ - uint32 count; - uint32 ip; - uint32 coarse_time; - ping_recv_function recv_function; - ping_sent_function sent_function; - void* reverse; -}; - -struct ping_resp{ - uint32 total_count; - uint32 resp_time; - uint32 seqno; - uint32 timeout_count; - uint32 bytes; - uint32 total_bytes; - uint32 total_time; - sint8 ping_err; -}; - -bool ping_start(struct ping_option *ping_opt); -bool ping_regist_recv(struct ping_option *ping_opt, ping_recv_function ping_recv); -bool ping_regist_sent(struct ping_option *ping_opt, ping_sent_function ping_sent); - -#endif /* __PING_H__ */ diff --git a/include/queue.h b/include/queue.h deleted file mode 100644 index a760c8db..00000000 --- a/include/queue.h +++ /dev/null @@ -1,204 +0,0 @@ -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -#define QMD_SAVELINK(name, link) -#define TRASHIT(x) - -/* - * Singly-linked List declarations. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) - -#define SLIST_FIRST(head) ((head)->slh_first) - -#define SLIST_FOREACH(var, head, field) \ - for ((var) = SLIST_FIRST((head)); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ - for ((varp) = &SLIST_FIRST((head)); \ - ((var) = *(varp)) != NULL; \ - (varp) = &SLIST_NEXT((var), field)) - -#define SLIST_INIT(head) do { \ - SLIST_FIRST((head)) = NULL; \ -} while (0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ - SLIST_NEXT((slistelm), field) = (elm); \ -} while (0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ - SLIST_FIRST((head)) = (elm); \ -} while (0) - -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ - if (SLIST_FIRST((head)) == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = SLIST_FIRST((head)); \ - while (SLIST_NEXT(curelm, field) != (elm)) \ - curelm = SLIST_NEXT(curelm, field); \ - SLIST_REMOVE_AFTER(curelm, field); \ - } \ - TRASHIT(*oldnext); \ -} while (0) - -#define SLIST_REMOVE_AFTER(elm, field) do { \ - SLIST_NEXT(elm, field) = \ - SLIST_NEXT(SLIST_NEXT(elm, field), field); \ -} while (0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ -} while (0) - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ - struct name { \ - struct type *stqh_first;/* first element */ \ - struct type **stqh_last;/* addr of last next element */ \ - } - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ - struct { \ - struct type *stqe_next; /* next element */ \ - } - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ - } while (0) - -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) - -#define STAILQ_FIRST(head) ((head)->stqh_first) - -#define STAILQ_FOREACH(var, head, field) \ - for((var) = STAILQ_FIRST((head)); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - - -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_INIT(head) do { \ - STAILQ_FIRST((head)) = NULL; \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ - } while (0) - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_NEXT((tqelm), field) = (elm); \ - } while (0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_FIRST((head)) = (elm); \ - } while (0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - STAILQ_NEXT((elm), field) = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - } while (0) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *)(void *) \ - ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) - -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ - if (STAILQ_FIRST((head)) == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = STAILQ_FIRST((head)); \ - while (STAILQ_NEXT(curelm, field) != (elm)) \ - curelm = STAILQ_NEXT(curelm, field); \ - STAILQ_REMOVE_AFTER(head, curelm, field); \ - } \ - TRASHIT(*oldnext); \ - } while (0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if ((STAILQ_FIRST((head)) = \ - STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ - } while (0) - -#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ - if ((STAILQ_NEXT(elm, field) = \ - STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - } while (0) - -#define STAILQ_SWAP(head1, head2, type) do { \ - struct type *swap_first = STAILQ_FIRST(head1); \ - struct type **swap_last = (head1)->stqh_last; \ - STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_FIRST(head2) = swap_first; \ - (head2)->stqh_last = swap_last; \ - if (STAILQ_EMPTY(head1)) \ - (head1)->stqh_last = &STAILQ_FIRST(head1); \ - if (STAILQ_EMPTY(head2)) \ - (head2)->stqh_last = &STAILQ_FIRST(head2); \ - } while (0) - -#define STAILQ_INSERT_CHAIN_HEAD(head, elm_chead, elm_ctail, field) do { \ - if ((STAILQ_NEXT(elm_ctail, field) = STAILQ_FIRST(head)) == NULL ) { \ - (head)->stqh_last = &STAILQ_NEXT(elm_ctail, field); \ - } \ - STAILQ_FIRST(head) = (elm_chead); \ - } while (0) - -#endif /* !_SYS_QUEUE_H_ */ diff --git a/include/smartconfig.h b/include/smartconfig.h deleted file mode 100644 index 02a1e317..00000000 --- a/include/smartconfig.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2015 -2018 Espressif System - * - */ - -#ifndef __SMARTCONFIG_H__ -#define __SMARTCONFIG_H__ - -typedef void (*sc_callback_t)(void *data); - -typedef enum { - SC_STATUS_FIND_CHANNEL = 0, - SC_STATUS_GETTING_SSID_PSWD, - SC_STATUS_GOT_SSID_PSWD, - SC_STATUS_LINK, -} sc_status; - -typedef enum { - SC_TYPE_ESPTOUCH = 0, - SC_TYPE_AIRKISS, -} sc_type; - -sc_status smartconfig_get_status(void); -const char *smartconfig_get_version(void); -bool smartconfig_start(sc_type type, sc_callback_t cb); -bool smartconfig_stop(void); - -#endif diff --git a/include/spi_flash.h b/include/spi_flash.h deleted file mode 100644 index 12dd6e17..00000000 --- a/include/spi_flash.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * copyright (c) Espressif System 2010 - * - */ - -#ifndef SPI_FLASH_H -#define SPI_FLASH_H - -typedef enum { - SPI_FLASH_RESULT_OK, - SPI_FLASH_RESULT_ERR, - SPI_FLASH_RESULT_TIMEOUT -} SpiFlashOpResult; - -typedef struct{ - uint32 deviceId; - uint32 chip_size; // chip size in byte - uint32 block_size; - uint32 sector_size; - uint32 page_size; - uint32 status_mask; -} SpiFlashChip; - -#define SPI_FLASH_SEC_SIZE 4096 - -uint32 spi_flash_get_id(void); -SpiFlashOpResult spi_flash_erase_sector(uint16 sec); -SpiFlashOpResult spi_flash_write(uint32 des_addr, uint32 *src_addr, uint32 size); -SpiFlashOpResult spi_flash_read(uint32 src_addr, uint32 *des_addr, uint32 size); - -#endif diff --git a/include/upgrade.h b/include/upgrade.h deleted file mode 100644 index 3b6bb70f..00000000 --- a/include/upgrade.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef __UPGRADE_H__ -#define __UPGRADE_H__ - -#define SPI_FLASH_SEC_SIZE 4096 - -#define USER_BIN1 0x00 -#define USER_BIN2 0x01 - -#define UPGRADE_FLAG_IDLE 0x00 -#define UPGRADE_FLAG_START 0x01 -#define UPGRADE_FLAG_FINISH 0x02 - -#define UPGRADE_FW_BIN1 0x00 -#define UPGRADE_FW_BIN2 0x01 - -typedef void (*upgrade_states_check_callback)(void * arg); - -//#define UPGRADE_SSL_ENABLE - -struct upgrade_server_info { - uint8 ip[4]; - uint16 port; - - uint8 upgrade_flag; - - uint8 pre_version[16]; - uint8 upgrade_version[16]; - - uint32 check_times; - uint8 *url; - - upgrade_states_check_callback check_cb; - struct espconn *pespconn; -}; - -#define UPGRADE_FLAG_IDLE 0x00 -#define UPGRADE_FLAG_START 0x01 -#define UPGRADE_FLAG_FINISH 0x02 - -//bool system_upgrade_start(struct upgrade_server_info *server); -bool system_upgrade_start_ssl(struct upgrade_server_info *server); -void system_upgrade_init(); -void system_upgrade_deinit(); -bool system_upgrade(uint8 *data, uint16 len); - -#ifdef UPGRADE_SSL_ENABLE -bool system_upgrade_start_ssl(struct upgrade_server_info *server); -#else -bool system_upgrade_start(struct upgrade_server_info *server); -#endif -#endif diff --git a/include/user_interface.h b/include/user_interface.h deleted file mode 100644 index 4212ba94..00000000 --- a/include/user_interface.h +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2013 -2014 Espressif System - * - */ - -#ifndef __USER_INTERFACE_H__ -#define __USER_INTERFACE_H__ - -#include "os_type.h" -#ifdef LWIP_OPEN_SRC -#include "lwip/ip_addr.h" -#else -#include "ip_addr.h" -#endif - -#include "queue.h" -#include "user_config.h" -#include "spi_flash.h" - -#ifndef MAC2STR -#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] -#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" -#endif - -enum rst_reason { - DEFAULT_RST_FLAG = 0, - WDT_RST_FLAG = 1, - EXP_RST_FLAG = 2 -}; - -struct rst_info{ - uint32 flag; - uint32 exccause; - uint32 epc1; - uint32 epc2; - uint32 epc3; - uint32 excvaddr; - uint32 depc; -}; - -#define UPGRADE_FW_BIN1 0x00 -#define UPGRADE_FW_BIN2 0x01 - -void system_restore(void); -void system_restart(void); - -bool system_deep_sleep_set_option(uint8 option); -void system_deep_sleep(uint32 time_in_us); - -uint8 system_upgrade_userbin_check(void); -void system_upgrade_reboot(void); -uint8 system_upgrade_flag_check(); -void system_upgrade_flag_set(uint8 flag); - -void system_timer_reinit(void); -uint32 system_get_time(void); - -/* user task's prio must be 0/1/2 !!!*/ -enum { - USER_TASK_PRIO_0 = 0, - USER_TASK_PRIO_1, - USER_TASK_PRIO_2, - USER_TASK_PRIO_MAX -}; - -bool system_os_task(os_task_t task, uint8 prio, os_event_t *queue, uint8 qlen); -bool system_os_post(uint8 prio, os_signal_t sig, os_param_t par); - -void system_print_meminfo(void); -uint32 system_get_free_heap_size(void); - -void system_set_os_print(uint8 onoff); -uint8 system_get_os_print(); - -uint64 system_mktime(uint32 year, uint32 mon, uint32 day, uint32 hour, uint32 min, uint32 sec); - -uint32 system_get_chip_id(void); - -typedef void (* init_done_cb_t)(void); - -void system_init_done_cb(init_done_cb_t cb); - -uint32 system_rtc_clock_cali_proc(void); -uint32 system_get_rtc_time(void); - -bool system_rtc_mem_read(uint8 src_addr, void *des_addr, uint16 load_size); -bool system_rtc_mem_write(uint8 des_addr, const void *src_addr, uint16 save_size); - -void system_uart_swap(void); - -uint16 system_adc_read(void); -uint16 system_get_vdd33(void); - -const char *system_get_sdk_version(void); - -#define NULL_MODE 0x00 -#define STATION_MODE 0x01 -#define SOFTAP_MODE 0x02 -#define STATIONAP_MODE 0x03 - - -typedef enum _auth_mode { - AUTH_OPEN = 0, - AUTH_WEP, - AUTH_WPA_PSK, - AUTH_WPA2_PSK, - AUTH_WPA_WPA2_PSK, - AUTH_MAX -} AUTH_MODE; - -uint8 wifi_get_opmode(void); -bool wifi_set_opmode(uint8 opmode); - -struct bss_info { - STAILQ_ENTRY(bss_info) next; - - uint8 bssid[6]; - uint8 ssid[32]; - uint8 channel; - sint8 rssi; - AUTH_MODE authmode; - uint8 is_hidden; -}; - -typedef struct _scaninfo { - STAILQ_HEAD(, bss_info) *pbss; - struct espconn *pespconn; - uint8 totalpage; - uint8 pagenum; - uint8 page_sn; - uint8 data_cnt; -} scaninfo; - -typedef void (* scan_done_cb_t)(void *arg, STATUS status); - -struct station_config { - uint8 ssid[32]; - uint8 password[64]; - uint8 bssid_set; // Note: If bssid_set is 1, station will just connect to the router - // with both ssid[] and bssid[] matched. Please check about this. - uint8 bssid[6]; -}; - -bool wifi_station_get_config(struct station_config *config); -bool wifi_station_set_config(struct station_config *config); - -bool wifi_station_connect(void); -bool wifi_station_disconnect(void); - -struct scan_config { - uint8 *ssid; // Note: ssid == NULL, don't filter ssid. - uint8 *bssid; // Note: bssid == NULL, don't filter bssid. - uint8 channel; // Note: channel == 0, scan all channels, otherwise scan set channel. - uint8 show_hidden; // Note: show_hidden == 1, can get hidden ssid routers' info. -}; - -bool wifi_station_scan(struct scan_config *config, scan_done_cb_t cb); - -uint8 wifi_station_get_auto_connect(void); -bool wifi_station_set_auto_connect(uint8 set); - -enum { - STATION_IDLE = 0, - STATION_CONNECTING, - STATION_WRONG_PASSWORD, - STATION_NO_AP_FOUND, - STATION_CONNECT_FAIL, - STATION_GOT_IP -}; - -enum dhcp_status { - DHCP_STOPPED, - DHCP_STARTED -}; - -uint8 wifi_station_get_connect_status(void); - -uint8 wifi_station_get_current_ap_id(void); -bool wifi_station_ap_change(uint8 current_ap_id); -bool wifi_station_ap_number_set(uint8 ap_number); - -bool wifi_station_dhcpc_start(void); -bool wifi_station_dhcpc_stop(void); -enum dhcp_status wifi_station_dhcpc_status(void); - -struct softap_config { - uint8 ssid[32]; - uint8 password[64]; - uint8 ssid_len; // Note: Recommend to set it according to your ssid - uint8 channel; // Note: support 1 ~ 13 - AUTH_MODE authmode; // Note: Don't support AUTH_WEP in softAP mode. - uint8 ssid_hidden; // Note: default 0 - uint8 max_connection; // Note: default 4, max 4 - uint16 beacon_interval; // Note: support 100 ~ 60000 ms, default 100 -}; - -bool wifi_softap_get_config(struct softap_config *config); -bool wifi_softap_set_config(struct softap_config *config); - -struct station_info { - STAILQ_ENTRY(station_info) next; - - uint8 bssid[6]; - struct ip_addr ip; -}; - -struct dhcps_lease { - uint32 start_ip; - uint32 end_ip; -}; - -struct station_info * wifi_softap_get_station_info(void); -void wifi_softap_free_station_info(void); -uint8 wifi_station_get_ap_info(struct station_config config[]); - -bool wifi_softap_dhcps_start(void); -bool wifi_softap_dhcps_stop(void); -bool wifi_softap_set_dhcps_lease(struct dhcps_lease *please); -enum dhcp_status wifi_softap_dhcps_status(void); - -#define STATION_IF 0x00 -#define SOFTAP_IF 0x01 - -bool wifi_get_ip_info(uint8 if_index, struct ip_info *info); -bool wifi_set_ip_info(uint8 if_index, struct ip_info *info); -bool wifi_get_macaddr(uint8 if_index, uint8 *macaddr); -bool wifi_set_macaddr(uint8 if_index, uint8 *macaddr); - -uint8 wifi_get_channel(void); -bool wifi_set_channel(uint8 channel); - -void wifi_status_led_install(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func); -void wifi_status_led_uninstall(); - -/** Get the absolute difference between 2 u32_t values (correcting overflows) - * 'a' is expected to be 'higher' (without overflow) than 'b'. */ -#define ESP_U32_DIFF(a, b) (((a) >= (b)) ? ((a) - (b)) : (((a) + ((b) ^ 0xFFFFFFFF) + 1))) - -void wifi_promiscuous_enable(uint8 promiscuous); - -typedef void (* wifi_promiscuous_cb_t)(uint8 *buf, uint16 len); - -void wifi_set_promiscuous_rx_cb(wifi_promiscuous_cb_t cb); - -#define PHY_MODE_B 0x01 -#define PHY_MODE_G 0x02 -#define PHY_MODE_N 0x03 - -enum phy_mode { - PHY_MODE_11B = 1, - PHY_MODE_11G = 2, - PHY_MODE_11N = 3 -}; - -enum phy_mode wifi_get_phy_mode(void); -bool wifi_set_phy_mode(enum phy_mode mode); - -enum sleep_type { - NONE_SLEEP_T = 0, - LIGHT_SLEEP_T, - MODEM_SLEEP_T -}; - -bool wifi_set_sleep_type(enum sleep_type type); -enum sleep_type wifi_get_sleep_type(void); - -#endif diff --git a/lib/libat.a b/lib/libat.a deleted file mode 100644 index 81d93ea80680b0a83aa4f4eccbdd98c97b593d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155494 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∨Jz=VUZtkWz$>rYqv4g-gUV*l9jY;p)F^}dhBq{ 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 WaLn;AEbGa@c~aw3j?**F>i-XjxwTdR diff --git a/lib/libjson.a b/lib/libjson.a deleted file mode 100644 index efb36fe4261ee50e4894571b0168fcb101ab1056..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12714 zcmeI232rOlz14Ob;y?wKqFMS;SSf=7 zii%@pkEbcgFpPA=FsFaHl)c9=zBv75PgiGmbEu~^*wY%`*lkRdJ6rq0qPV^_91L&j zZWXGQuI^32o0{7RIER`{&0t!wLC8≥Aiv9A9CAg>@dvOXVt)(#{<(9DJf68lC2C1D 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 diff --git a/lib/liblwip.a b/lib/liblwip.a deleted file mode 100644 index 0f90932b8ca9a047fdcd27d648e4502b8b1dd70a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257102 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