parent
c2593c2207
commit
b0d3c55bbb
@ -0,0 +1,34 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
#include "cgi_main.h" |
||||||
|
#include "screen.h" |
||||||
|
|
||||||
|
/**
|
||||||
|
* Main page template substitution |
||||||
|
* |
||||||
|
* @param connData |
||||||
|
* @param token |
||||||
|
* @param arg |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
httpd_cgi_state ICACHE_FLASH_ATTR tplScreen(HttpdConnData *connData, char *token, void **arg) |
||||||
|
{ |
||||||
|
if (token == NULL) { |
||||||
|
// Release data object
|
||||||
|
screenSerializeToBuffer(NULL, 0, arg); |
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
const int bufsiz = 512; |
||||||
|
char buff[bufsiz]; |
||||||
|
|
||||||
|
if (streq(token, "screenData")) { |
||||||
|
httpd_cgi_state cont = screenSerializeToBuffer(buff, bufsiz, arg); |
||||||
|
httpdSend(connData, buff, -1); |
||||||
|
return cont; |
||||||
|
} |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,6 @@ |
|||||||
|
#ifndef CGI_MAIN_H |
||||||
|
#define CGI_MAIN_H |
||||||
|
|
||||||
|
httpd_cgi_state tplScreen(HttpdConnData *connData, char *token, void **arg); |
||||||
|
|
||||||
|
#endif // CGI_MAIN_H
|
@ -0,0 +1,20 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
#include "cgi_ping.h" |
||||||
|
|
||||||
|
httpd_cgi_state ICACHE_FLASH_ATTR cgiPing(HttpdConnData *connData) |
||||||
|
{ |
||||||
|
if (connData->conn==NULL) { |
||||||
|
//Connection aborted. Clean up.
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
httpdStartResponse(connData, 200); |
||||||
|
httpdHeader(connData, "Content-Type", "text/plain"); |
||||||
|
httpdEndHeaders(connData); |
||||||
|
|
||||||
|
httpdSend(connData, "pong\n", -1); |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
#ifndef CGI_PING_H |
||||||
|
#define CGI_PING_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
// this is used by the UI to check if server is already restarted and working again.
|
||||||
|
|
||||||
|
httpd_cgi_state cgiPing(HttpdConnData *connData); |
||||||
|
|
||||||
|
#endif // CGI_PING_H
|
@ -0,0 +1,31 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
#include "cgi_reset.h" |
||||||
|
|
||||||
|
static ETSTimer tmr; |
||||||
|
|
||||||
|
static void ICACHE_FLASH_ATTR tmrCb(void *arg) |
||||||
|
{ |
||||||
|
system_restart(); |
||||||
|
} |
||||||
|
|
||||||
|
httpd_cgi_state ICACHE_FLASH_ATTR cgiResetDevice(HttpdConnData *connData) |
||||||
|
{ |
||||||
|
if (connData->conn==NULL) { |
||||||
|
//Connection aborted. Clean up.
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
httpdStartResponse(connData, 200); |
||||||
|
httpdHeader(connData, "Content-Type", "text/plain"); |
||||||
|
httpdEndHeaders(connData); |
||||||
|
|
||||||
|
os_timer_disarm(&tmr); |
||||||
|
os_timer_setfn(&tmr, tmrCb, NULL); |
||||||
|
os_timer_arm(&tmr, 100, false); |
||||||
|
|
||||||
|
httpdSend(connData, "system reset\n", -1); |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
#ifndef CGI_RESET_H |
||||||
|
#define CGI_RESET_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
httpd_cgi_state cgiResetDevice(HttpdConnData *connData); |
||||||
|
|
||||||
|
#endif // CGI_RESET_H
|
@ -0,0 +1,8 @@ |
|||||||
|
#ifndef CGI_SOCKETS_H |
||||||
|
#define CGI_SOCKETS_H |
||||||
|
|
||||||
|
#define URL_WS_UPDATE "/ws/update.cgi" |
||||||
|
|
||||||
|
void myWebsocketConnect(Websock *ws); |
||||||
|
|
||||||
|
#endif //CGI_SOCKETS_H
|
@ -0,0 +1,91 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
#include <cgiwebsocket.h> |
||||||
|
#include <httpdespfs.h> |
||||||
|
#include <cgiwifi.h> |
||||||
|
#include <auth.h> |
||||||
|
|
||||||
|
#include "routes.h" |
||||||
|
|
||||||
|
#include "cgi_reset.h" |
||||||
|
#include "cgi_ping.h" |
||||||
|
#include "cgi_main.h" |
||||||
|
#include "cgi_sockets.h" |
||||||
|
|
||||||
|
#define WIFI_PROTECT 1 |
||||||
|
#define WIFI_AUTH_NAME "admin" |
||||||
|
#define WIFI_AUTH_PASS "password" |
||||||
|
|
||||||
|
#if WIFI_PROTECT |
||||||
|
static int ICACHE_FLASH_ATTR myPassFn(HttpdConnData *connData, int no, char *user, int userLen, char *pass, int passLen); |
||||||
|
#endif |
||||||
|
|
||||||
|
/** Routes */ |
||||||
|
HttpdBuiltInUrl builtInUrls[] = { |
||||||
|
// redirect func for the captive portal
|
||||||
|
ROUTE_CGI_ARG("*", cgiRedirectApClientToHostname, "esp8266.nonet"), |
||||||
|
|
||||||
|
// --- Web pages ---
|
||||||
|
ROUTE_TPL_FILE("/", tplScreen, "term.tpl"), |
||||||
|
|
||||||
|
// --- Sockets ---
|
||||||
|
ROUTE_WS(URL_WS_UPDATE, myWebsocketConnect), |
||||||
|
|
||||||
|
// --- System control ---
|
||||||
|
ROUTE_CGI("/system/reset", cgiResetDevice), |
||||||
|
ROUTE_CGI("/system/ping", cgiPing), |
||||||
|
|
||||||
|
|
||||||
|
// --- WiFi config ---
|
||||||
|
#if WIFI_PROTECT |
||||||
|
ROUTE_AUTH("/wifi*", myPassFn), |
||||||
|
#endif |
||||||
|
// TODO add those pages
|
||||||
|
// ROUTE_REDIRECT("/wifi/", "/wifi"),
|
||||||
|
// ROUTE_TPL_FILE("/wifi", tplWlan, "/pages/wifi.tpl"),
|
||||||
|
|
||||||
|
ROUTE_CGI("/wifi/scan", cgiWiFiScan), |
||||||
|
ROUTE_CGI("/wifi/connect", cgiWiFiConnect), |
||||||
|
ROUTE_CGI("/wifi/connstatus", cgiWiFiConnStatus), |
||||||
|
ROUTE_CGI("/wifi/setmode", cgiWiFiSetMode), |
||||||
|
ROUTE_CGI("/wifi/setchannel", cgiWiFiSetChannel), |
||||||
|
|
||||||
|
ROUTE_FILESYSTEM(), |
||||||
|
ROUTE_END(), |
||||||
|
}; |
||||||
|
|
||||||
|
#if WIFI_PROTECT |
||||||
|
/**
|
||||||
|
* @brief BasicAuth name/password checking function. |
||||||
|
* |
||||||
|
* It's invoked by the authBasic() built-in route handler |
||||||
|
* until it returns 0. Each time it populates the provided |
||||||
|
* name and password buffer. |
||||||
|
* |
||||||
|
* @param connData : connection context |
||||||
|
* @param no : user number (incremented each time it's called) |
||||||
|
* @param user : user buffer |
||||||
|
* @param userLen : user buffer size |
||||||
|
* @param pass : password buffer |
||||||
|
* @param passLen : password buffer size |
||||||
|
* @return 0 to end, 1 if more users are available. |
||||||
|
*/ |
||||||
|
static int ICACHE_FLASH_ATTR myPassFn(HttpdConnData *connData, int no, char *user, int userLen, char *pass, int passLen) |
||||||
|
{ |
||||||
|
(void)connData; |
||||||
|
(void)userLen; |
||||||
|
(void)passLen; |
||||||
|
|
||||||
|
if (no == 0) { |
||||||
|
os_strcpy(user, WIFI_AUTH_NAME); |
||||||
|
os_strcpy(pass, WIFI_AUTH_PASS); |
||||||
|
return 1; |
||||||
|
//Add more users this way. Check against incrementing no for each user added.
|
||||||
|
// } else if (no==1) {
|
||||||
|
// os_strcpy(user, "user1");
|
||||||
|
// os_strcpy(pass, "something");
|
||||||
|
// return 1;
|
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
#endif |
@ -0,0 +1,34 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include "uart_driver.h" |
||||||
|
#include "uart_handler.h" |
||||||
|
#include "ansi_parser.h" |
||||||
|
|
||||||
|
// Here the bitrates are defined
|
||||||
|
#define UART0_BAUD BIT_RATE_115200 |
||||||
|
#define UART1_BAUD BIT_RATE_115200 |
||||||
|
|
||||||
|
/**
|
||||||
|
* Init the serial ports |
||||||
|
*/ |
||||||
|
void ICACHE_FLASH_ATTR serialInit(void) |
||||||
|
{ |
||||||
|
UART_Init(UART0_BAUD, UART1_BAUD); |
||||||
|
UART_SetPrintPort(UART0); |
||||||
|
UART_SetupAsyncReceiver(); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle a byte received from UART. |
||||||
|
* Might do some buffering here maybe |
||||||
|
* |
||||||
|
* @param c |
||||||
|
*/ |
||||||
|
void ICACHE_FLASH_ATTR UART_HandleRxByte(char c) |
||||||
|
{ |
||||||
|
if (c > 0 && c < 127) { |
||||||
|
// TODO buffering, do not run parser after just 1 char
|
||||||
|
ansi_parser(&c, 1); |
||||||
|
} else { |
||||||
|
warn("Bad char %d ('%c')", (unsigned char)c, c); |
||||||
|
} |
||||||
|
} |
@ -1,9 +1,12 @@ |
|||||||
#ifndef SERIAL_H |
#ifndef STDOUT_H |
||||||
#define SERIAL_H |
#define STDOUT_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
|
||||||
/** Init the uarts */ |
/** Init the uarts */ |
||||||
void serialInit(void); |
void serialInit(); |
||||||
|
|
||||||
void UART_HandleRxByte(char c); |
/** poll uart while waiting for something */ |
||||||
|
void uart_poll(void); |
||||||
|
|
||||||
#endif //SERIAL_H
|
#endif |
||||||
|
@ -0,0 +1,9 @@ |
|||||||
|
#ifndef SERIAL_H |
||||||
|
#define SERIAL_H |
||||||
|
|
||||||
|
/** Init the uarts */ |
||||||
|
void serialInit(void); |
||||||
|
|
||||||
|
void UART_HandleRxByte(char c); |
||||||
|
|
||||||
|
#endif //SERIAL_H
|
@ -0,0 +1,249 @@ |
|||||||
|
/*
|
||||||
|
* Driver file for ESP8266 UART, works with the SDK. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "uart_driver.h" |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
|
||||||
|
#include "ets_sys.h" |
||||||
|
#include "osapi.h" |
||||||
|
#include "mem.h" |
||||||
|
#include "os_type.h" |
||||||
|
|
||||||
|
#include "ets_sys_extra.h" |
||||||
|
#include "uart_register.h" |
||||||
|
|
||||||
|
//========================================================
|
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetWordLength(UARTn uart_no, UartBitsNum4Char len) |
||||||
|
{ |
||||||
|
SET_PERI_REG_BITS(UART_CONF0(uart_no), UART_BIT_NUM, len, UART_BIT_NUM_S); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetStopBits(UARTn uart_no, UartStopBitsNum bit_num) |
||||||
|
{ |
||||||
|
SET_PERI_REG_BITS(UART_CONF0(uart_no), UART_STOP_BIT_NUM, bit_num, UART_STOP_BIT_NUM_S); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetLineInverse(UARTn uart_no, UART_LineLevelInverse inverse_mask) |
||||||
|
{ |
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_LINE_INV_MASK); |
||||||
|
SET_PERI_REG_MASK(UART_CONF0(uart_no), inverse_mask); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetParity(UARTn uart_no, UartParityMode Parity_mode) |
||||||
|
{ |
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_PARITY | UART_PARITY_EN); |
||||||
|
if (Parity_mode == PARITY_NONE) { |
||||||
|
} else { |
||||||
|
SET_PERI_REG_MASK(UART_CONF0(uart_no), Parity_mode | UART_PARITY_EN); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetBaudrate(UARTn uart_no, uint32 baud_rate) |
||||||
|
{ |
||||||
|
uart_div_modify(uart_no, UART_CLK_FREQ / baud_rate); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetFlowCtrl(UARTn uart_no, UART_HwFlowCtrl flow_ctrl, uint8 rx_thresh) |
||||||
|
{ |
||||||
|
if (flow_ctrl & USART_HWFlow_RTS) { |
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS); |
||||||
|
SET_PERI_REG_BITS(UART_CONF1(uart_no), UART_RX_FLOW_THRHD, rx_thresh, UART_RX_FLOW_THRHD_S); |
||||||
|
SET_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN); |
||||||
|
} else { |
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN); |
||||||
|
} |
||||||
|
|
||||||
|
if (flow_ctrl & USART_HWFlow_CTS) { |
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS); |
||||||
|
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN); |
||||||
|
} else { |
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_WaitTxFifoEmpty(UARTn uart_no , uint32 time_out_us) //do not use if tx flow control enabled
|
||||||
|
{ |
||||||
|
uint32 t_s = system_get_time(); |
||||||
|
while (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S)) { |
||||||
|
|
||||||
|
if ((system_get_time() - t_s) > time_out_us) { |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
system_soft_wdt_feed(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR UART_CheckOutputFinished(UARTn uart_no, uint32 time_out_us) |
||||||
|
{ |
||||||
|
uint32 t_start = system_get_time(); |
||||||
|
uint8 tx_fifo_len; |
||||||
|
|
||||||
|
while (1) { |
||||||
|
tx_fifo_len = UART_TxQueLen(uart_no); |
||||||
|
|
||||||
|
// TODO If using output circbuf, check if empty
|
||||||
|
|
||||||
|
if (tx_fifo_len == 0) { |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
if (system_get_time() - t_start > time_out_us) { |
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
|
||||||
|
system_soft_wdt_feed(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_ResetFifo(UARTn uart_no) |
||||||
|
{ |
||||||
|
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST); |
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_ClearIntrStatus(UARTn uart_no, uint32 clr_mask) |
||||||
|
{ |
||||||
|
WRITE_PERI_REG(UART_INT_CLR(uart_no), clr_mask); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetIntrEna(UARTn uart_no, uint32 ena_mask) |
||||||
|
{ |
||||||
|
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), ena_mask); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
LOCAL void u0_putc_crlf(char c) |
||||||
|
{ |
||||||
|
UART_WriteCharCRLF(UART0, (u8)c, UART_TIMEOUT_US); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
LOCAL void u1_putc_crlf(char c) |
||||||
|
{ |
||||||
|
UART_WriteCharCRLF(UART1, (u8)c, UART_TIMEOUT_US); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR UART_SetPrintPort(UARTn uart_no) |
||||||
|
{ |
||||||
|
if (uart_no == UART0) { |
||||||
|
os_install_putc1((void *)u0_putc_crlf); |
||||||
|
} else { |
||||||
|
os_install_putc1((void *)u1_putc_crlf); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// -------------- Custom UART functions -------------------------
|
||||||
|
|
||||||
|
// !!! write handlers are not ICACHE_FLASH_ATTR -> can be used in IRQ !!!
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write a char to UART. |
||||||
|
* @param uart_no |
||||||
|
* @param c |
||||||
|
* @param timeout_us - how long to max wait for space in FIFO. |
||||||
|
* @return write success |
||||||
|
*/ |
||||||
|
STATUS UART_WriteChar(UARTn uart_no, uint8 c, uint32 timeout_us) |
||||||
|
{ |
||||||
|
if (timeout_us == 0) { |
||||||
|
timeout_us = UART_TIMEOUT_US; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
uint32 t_s = system_get_time(); |
||||||
|
|
||||||
|
while ((system_get_time() - t_s) < timeout_us) { |
||||||
|
uint8 fifo_cnt = UART_TxQueLen(uart_no); |
||||||
|
|
||||||
|
if (fifo_cnt < UART_TX_FULL_THRESH_VAL) { |
||||||
|
WRITE_PERI_REG(UART_FIFO(uart_no), c); |
||||||
|
return OK; |
||||||
|
} |
||||||
|
|
||||||
|
system_soft_wdt_feed(); |
||||||
|
} |
||||||
|
|
||||||
|
return FAIL; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write a char to UART, translating LF to CRLF and discarding CR. |
||||||
|
* @param uart_no |
||||||
|
* @param c |
||||||
|
* @param timeout_us - how long to max wait for space in FIFO. |
||||||
|
* @return write success |
||||||
|
*/ |
||||||
|
STATUS UART_WriteCharCRLF(UARTn uart_no, uint8 c, uint32 timeout_us) |
||||||
|
{ |
||||||
|
STATUS st; |
||||||
|
|
||||||
|
if (c == '\r') { |
||||||
|
return OK; |
||||||
|
} else if (c == '\n') { |
||||||
|
|
||||||
|
st = UART_WriteChar(uart_no, '\r', timeout_us); |
||||||
|
if (st != OK) return st; |
||||||
|
|
||||||
|
st = UART_WriteChar(uart_no, '\n', timeout_us); |
||||||
|
return st; |
||||||
|
|
||||||
|
} else { |
||||||
|
return UART_WriteChar(uart_no, c, timeout_us); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a string to UART. |
||||||
|
* @param uart_no |
||||||
|
* @param str |
||||||
|
* @param timeout_us - how long to max wait for space in FIFO. |
||||||
|
* @return write success |
||||||
|
*/ |
||||||
|
STATUS UART_WriteString(UARTn uart_no, const char *str, uint32 timeout_us) |
||||||
|
{ |
||||||
|
while (*str) { |
||||||
|
STATUS suc = UART_WriteChar(uart_no, (u8) * str++, timeout_us); |
||||||
|
if (suc != OK) return suc; |
||||||
|
} |
||||||
|
|
||||||
|
return OK; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a buffer |
||||||
|
* @param uart_no |
||||||
|
* @param buffer - buffer to send |
||||||
|
* @param len - buffer size |
||||||
|
* @param timeout_us - how long to max wait for space in FIFO. |
||||||
|
* @return write success |
||||||
|
*/ |
||||||
|
STATUS UART_WriteBuffer(UARTn uart_no, const uint8 *buffer, size_t len, uint32 timeout_us) |
||||||
|
{ |
||||||
|
for (size_t i = 0; i < len; i++) { |
||||||
|
STATUS suc = UART_WriteChar(uart_no, (u8) * buffer++, timeout_us); |
||||||
|
if (suc != OK) return suc; |
||||||
|
} |
||||||
|
|
||||||
|
return OK; |
||||||
|
} |
@ -0,0 +1,201 @@ |
|||||||
|
/**
|
||||||
|
* Low level UART peripheral support functions |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* File : uart.h |
||||||
|
* Copyright (C) 2013 - 2016, Espressif Systems |
||||||
|
* Copyright (C) 2016, Ondřej Hruška (cleaning, modif.) |
||||||
|
* |
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
#ifndef UART_APP_H |
||||||
|
#define UART_APP_H |
||||||
|
|
||||||
|
#include "uart_register.h" |
||||||
|
|
||||||
|
#include "eagle_soc.h" |
||||||
|
#include "c_types.h" |
||||||
|
|
||||||
|
|
||||||
|
// ===========
|
||||||
|
|
||||||
|
// timeout for sending / receiving a char (default)
|
||||||
|
#define UART_TIMEOUT_US 5000 |
||||||
|
|
||||||
|
#define UART_TX_FULL_THRESH_VAL (UART_FIFO_LEN - 2) // if more than this many bytes in queue, don't write more
|
||||||
|
#define UART_TX_EMPTY_THRESH_VAL 16 |
||||||
|
|
||||||
|
// ===========
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
UART0 = 0, |
||||||
|
UART1 = 1 |
||||||
|
} UARTn; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
FIVE_BITS = 0x0, |
||||||
|
SIX_BITS = 0x1, |
||||||
|
SEVEN_BITS = 0x2, |
||||||
|
EIGHT_BITS = 0x3 |
||||||
|
} UartBitsNum4Char; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
ONE_STOP_BIT = 0x1, |
||||||
|
ONE_HALF_STOP_BIT = 0x2, |
||||||
|
TWO_STOP_BIT = 0x3 |
||||||
|
} UartStopBitsNum; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
PARITY_NONE = 0x2, |
||||||
|
PARITY_ODD = 1, |
||||||
|
PARITY_EVEN = 0 |
||||||
|
} UartParityMode; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
PARITY_DIS = 0, |
||||||
|
PARITY_EN = 1 |
||||||
|
} UartExistParity; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
UART_None_Inverse = 0x0, |
||||||
|
UART_Rxd_Inverse = UART_RXD_INV, |
||||||
|
UART_CTS_Inverse = UART_CTS_INV, |
||||||
|
UART_Txd_Inverse = UART_TXD_INV, |
||||||
|
UART_RTS_Inverse = UART_RTS_INV, |
||||||
|
} UART_LineLevelInverse; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
BIT_RATE_300 = 300, |
||||||
|
BIT_RATE_600 = 600, |
||||||
|
BIT_RATE_1200 = 1200, |
||||||
|
BIT_RATE_2400 = 2400, |
||||||
|
BIT_RATE_4800 = 4800, |
||||||
|
BIT_RATE_9600 = 9600, |
||||||
|
BIT_RATE_19200 = 19200, |
||||||
|
BIT_RATE_38400 = 38400, |
||||||
|
BIT_RATE_57600 = 57600, |
||||||
|
BIT_RATE_74880 = 74880, |
||||||
|
BIT_RATE_115200 = 115200, |
||||||
|
BIT_RATE_230400 = 230400, |
||||||
|
BIT_RATE_460800 = 460800, |
||||||
|
BIT_RATE_921600 = 921600, |
||||||
|
BIT_RATE_1843200 = 1843200, |
||||||
|
BIT_RATE_3686400 = 3686400, |
||||||
|
} UartBautRate; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
NONE_CTRL, |
||||||
|
HARDWARE_CTRL, |
||||||
|
XON_XOFF_CTRL |
||||||
|
} UartFlowCtrl; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
USART_HWFlow_None = 0x0, |
||||||
|
USART_HWFlow_RTS = 0x1, |
||||||
|
USART_HWFlow_CTS = 0x2, |
||||||
|
USART_HWFlow_CTS_RTS = 0x3 |
||||||
|
} UART_HwFlowCtrl; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
EMPTY, |
||||||
|
UNDER_WRITE, |
||||||
|
WRITE_OVER |
||||||
|
} RcvMsgBuffState; |
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
uint32 RcvBuffSize; |
||||||
|
uint8 *pRcvMsgBuff; |
||||||
|
uint8 *pWritePos; |
||||||
|
uint8 *pReadPos; |
||||||
|
uint8 TrigLvl; //JLU: may need to pad
|
||||||
|
RcvMsgBuffState BuffState; |
||||||
|
} RcvMsgBuff; |
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
uint32 TrxBuffSize; |
||||||
|
uint8 *pTrxBuff; |
||||||
|
} TrxMsgBuff; |
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
BAUD_RATE_DET, |
||||||
|
WAIT_SYNC_FRM, |
||||||
|
SRCH_MSG_HEAD, |
||||||
|
RCV_MSG_BODY, |
||||||
|
RCV_ESC_CHAR, |
||||||
|
} RcvMsgState; |
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
UartBautRate baut_rate; |
||||||
|
UartBitsNum4Char data_bits; |
||||||
|
UartExistParity exist_parity; |
||||||
|
UartParityMode parity; |
||||||
|
UartStopBitsNum stop_bits; |
||||||
|
UartFlowCtrl flow_ctrl; |
||||||
|
RcvMsgBuff rcv_buff; |
||||||
|
TrxMsgBuff trx_buff; |
||||||
|
RcvMsgState rcv_state; |
||||||
|
int received; |
||||||
|
int buff_uart_no; //indicate which uart use tx/rx buffer
|
||||||
|
} UartDevice; |
||||||
|
|
||||||
|
// UartDev is defined and initialized in rom code.
|
||||||
|
extern UartDevice UartDev; |
||||||
|
|
||||||
|
|
||||||
|
//==============================================
|
||||||
|
|
||||||
|
// FIFO used count
|
||||||
|
#define UART_TxQueLen(uart_no) ((READ_PERI_REG(UART_STATUS((uart_no))) >> UART_TXFIFO_CNT_S) & UART_TXFIFO_CNT) |
||||||
|
#define UART_RxQueLen(uart_no) ((READ_PERI_REG(UART_STATUS((uart_no))) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT) |
||||||
|
|
||||||
|
STATUS UART_WriteCharCRLF(UARTn uart_no, uint8 c, uint32 timeout_us); |
||||||
|
STATUS UART_WriteChar(UARTn uart_no, uint8 c, uint32 timeout_us); |
||||||
|
STATUS UART_WriteString(UARTn uart_no, const char *str, uint32 timeout_us); |
||||||
|
STATUS UART_WriteBuffer(UARTn uart_no, const uint8 *buffer, size_t len, uint32 timeout_us); |
||||||
|
|
||||||
|
//==============================================
|
||||||
|
|
||||||
|
void UART_SetWordLength(UARTn uart_no, UartBitsNum4Char len); |
||||||
|
void UART_SetStopBits(UARTn uart_no, UartStopBitsNum bit_num); |
||||||
|
void UART_SetLineInverse(UARTn uart_no, UART_LineLevelInverse inverse_mask); |
||||||
|
void UART_SetParity(UARTn uart_no, UartParityMode Parity_mode); |
||||||
|
void UART_SetBaudrate(UARTn uart_no, uint32 baud_rate); |
||||||
|
void UART_SetFlowCtrl(UARTn uart_no, UART_HwFlowCtrl flow_ctrl, uint8 rx_thresh); |
||||||
|
void UART_WaitTxFifoEmpty(UARTn uart_no , uint32 time_out_us); //do not use if tx flow control enabled
|
||||||
|
void UART_ResetFifo(UARTn uart_no); |
||||||
|
void UART_ClearIntrStatus(UARTn uart_no, uint32 clr_mask); |
||||||
|
void UART_SetIntrEna(UARTn uart_no, uint32 ena_mask); |
||||||
|
void UART_SetPrintPort(UARTn uart_no); |
||||||
|
bool UART_CheckOutputFinished(UARTn uart_no, uint32 time_out_us); |
||||||
|
|
||||||
|
//==============================================
|
||||||
|
|
||||||
|
#endif |
||||||
|
|
Loading…
Reference in new issue