// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef _ROM_ETS_SYS_H_ #define _ROM_ETS_SYS_H_ #include #include #include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif #define ETS_DEBUG #define ETS_SERIAL_ENABLED() (1) typedef enum { ETS_OK = 0, ETS_FAILED = 1 } ETS_STATUS; typedef uint32_t ETSSignal; typedef uint32_t ETSParam; typedef struct ETSEventTag ETSEvent; struct ETSEventTag { ETSSignal sig; ETSParam par; }; typedef void (*ETSTask)(ETSEvent *e); enum ETS_User_Priorities { /* task priorities... */ TICK_TASK_A_PRIO = 2, KBD_TASK_PRIO = 5, MAX_ETS_USER_PRIO = 16, /* ISR priorities... */ MAX_ETS_USER_ISR_PRIO = 0xFF - 16 }; /* ETS interrupt entry and exit */ /* actually we don't need the following 2 macros any more since we won't exit * isr until it is finised, more over, we don't do nest interrupt */ void ets_run(void); void ets_task(ETSTask task, uint8_t prio, ETSEvent *queue, uint8_t qlen); ETS_STATUS ets_post(uint8_t prio, ETSSignal sig, ETSParam par); /* * now things become complicated, print could be directed to uart and/or SDIO */ int ets_printf(const char *fmt, ...); /* by default it's UART, just install_uart_printf, set putc1 to NULL to disable */ void ets_install_putc1(void (*p)(char c)); void ets_install_uart_printf(void); /* no need to install, call directly */ int ets_uart_printf(const char *fmt, ...); /* usually we don't need to call this, unless we want to disable SDIO print */ void ets_install_putc2(void (*p)(char c)); /* @prepare_buf: allocate buffer for printf internal writting * @putc: just set to NULL, let printf write to to buffer, unless if you want more fancy stuff * @post_printf: will be called every time printf finish write buffer * * main idea of external printf is re-directing content to an external buffer. * e.g. sip module allocates an event buffer in prepare_buf() and send the event to host in post_printf() * moreover, you can check printf_buf_remain_len in post_printf(), send the event to host till buf is * about to full. * * TBD: Another approach is sending printf parameter to host and let host to decode, which could save some bytes. */ void ets_install_external_printf(void (*prepare_buf)(char ** bufptr, uint16_t *buflen, uint32_t *cookie), void (*putc)(char c), void (*post_printf)(uint32_t cookie)); uint16_t est_get_printf_buf_remain_len(void); void est_reset_printf_buf_len(void); /* external (SDIO) printf only, still need to install*/ int ets_external_printf(const char *fmt, ...); #define ETS_PRINTF(...) ets_printf(...) #define ETS_ASSERT(v) do { \ if (!(v)) { \ ets_printf("%s %u \n", __FILE__, __LINE__); \ while (1) {}; \ } \ } while (0); /* memory and string support */ int8_t ets_char2xdigit(char ch); uint8_t * ets_str2macaddr(uint8_t *macaddr, char *str); void ets_getc(char *c); void ets_putc(char c); /* timer related */ typedef uint32_t ETSHandle; typedef void ETSTimerFunc(void *timer_arg); typedef struct _ETSTIMER_ { struct _ETSTIMER_ *timer_next; uint32_t timer_expire; uint32_t timer_period; ETSTimerFunc *timer_func; void *timer_arg; } ETSTimer; void ets_timer_init(void); void ets_timer_arm(ETSTimer *timer, uint32_t tmout, bool repeat); void ets_timer_disarm(ETSTimer *timer); void ets_timer_done(ETSTimer *ptimer); void ets_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunction, void *parg); /* watchdog related */ typedef enum { WDT_NONE = -1, WDT_DISABLED = 0, WDT_CONTROL_RESET = 1, WDT_CONTROL_INTR = 2, /* usually we use this mode? */ WDT_CONTROL_EXTERNAL_FEED = 3, WDT_TESET_OVERFLOW = 4, // intend to make watchdog overflow to test } WDT_MODE; typedef enum{ WDT_INTERVAL_THREE_SEC = 3, WDT_INTERVAL_SIX_SEC = 6, WDT_INTERVAL_TWELVE_SEC = 12, } WDT_INTERVAL_TIME; void ets_wdt_init(void); WDT_MODE ets_wdt_get_mode(void); void ets_wdt_enable(WDT_MODE mode, WDT_INTERVAL_TIME feed_interval, WDT_INTERVAL_TIME expire_interval); WDT_MODE ets_wdt_disable(void); void ets_wdt_restore(WDT_MODE old_mode); /* interrupt related */ typedef void (* ets_isr_t)(void *); #define ETS_WMAC_SOURCE 0 #define ETS_SLC_SOURCE 1 #define ETS_UART_SOURCE 13 #define ETS_UART1_SOURCE 14 #define ETS_FRC_TIMER2_SOURCE 43 #define ETS_WMAC_INUM 0 #define ETS_SLC_INUM 1 #define ETS_SPI_INUM 2 #define ETS_HSIP_INUM 2 #define ETS_I2S_INUM 2 #define ETS_RTC_INUM 3 #define ETS_FRC_TIMER1_INUM 9 /* use edge*/ #define ETS_FRC_TIMER2_INUM 10 /* use edge*/ #define ETS_WDT_INUM 8 /* use edge*/ #define ETS_GPIO_INUM 4 #define ETS_UART_INUM 5 #define ETS_UART1_INUM 5 #define ETS_MAX_INUM 6 void ets_isr_attach(int i, ets_isr_t func, void *arg); void ets_isr_mask(uint32_t mask); void ets_isr_unmask(uint32_t unmask); void ets_intr_lock(void); void ets_intr_unlock(void); void intr_matrix_set(int cpu_no, uint32_t model_num, uint32_t intr_num); #define _ETSTR(v) # v #define _ETS_SET_INTLEVEL(intlevel) ({ unsigned __tmp; \ __asm__ __volatile__( "rsil %0, " _ETSTR(intlevel) "\n" \ : "=a" (__tmp) : : "memory" ); \ }) #define ETS_INTR_LOCK() \ ets_intr_lock() #define ETS_INTR_UNLOCK() \ ets_intr_unlock() #define ETS_CCOMPARE_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_CCOMPARE_INUM, (func), (void *)(arg)) #define ETS_PWM_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_PWM_INUM, (func), (void *)(arg)) #define ETS_WMAC_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_WMAC_INUM, (func), (void *)(arg)) #define ETS_FRC_TIMER1_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_FRC_TIMER1_INUM, (func), (void *)(arg)) #define ETS_FRC_TIMER2_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_FRC_TIMER2_INUM, (func), (void *)(arg)) #define ETS_GPIO_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_GPIO_INUM, (func), (void *)(arg)) #define ETS_UART_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_UART_INUM, (func), (void *)(arg)) #define ETS_WDT_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_WDT_INUM, (func), (void *)(arg)) #define ETS_RTC_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_RTC_INUM, (func), (void *)(arg)) #define ETS_SLC_INTR_ATTACH(func, arg) \ ets_isr_attach(ETS_SLC_INUM, (func), (void *)(arg)) #define ETS_INTR_ENABLE(inum) \ ets_isr_unmask((1<= '0') && (c <= '9')) #define isxdigit(c) (((c >= '0') && (c <= '9')) || \ ((c >= 'a') && (c <= 'f')) || \ ((c >= 'A') && (c <= 'F')) ) #define isblank(c) ((c == ' ') || (c == '\t')) #define isupper(c) ((c >= 'A') && (c <= 'Z')) #endif #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 #define ETS_MEM_BAR() asm volatile ( "" : : : "memory" ) #ifdef __cplusplus } #endif #endif /* _ROM_ETS_SYS_H_ */