feat(esp8266): Add "putc" and "vprintf" of version "ets_"

This commit is contained in:
Dong Heng
2018-05-25 17:01:50 +08:00
parent 316a44f3c3
commit e15f211d46
5 changed files with 45 additions and 87 deletions

View File

@ -9,7 +9,7 @@ uint32_t Wait_SPI_Idle();
void uart_div_modify(uint32_t uart_no, uint32_t baud_div);
void ets_delay_us(uint32_t us);
int ets_vprintf(void (*putc)(char), const char* fmt, va_list ap);
int ets_io_vprintf(int (*putc)(int), const char* fmt, va_list ap);
void system_soft_wdt_feed();

View File

@ -28,14 +28,37 @@
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
uint32_t os_random(void);
int32_t os_get_random(unsigned char *buf, size_t len);
/**
* @brief put a character to uart or other devices, similar with putc.
*
* @param c : a character.
*
* @return int : the character written as an unsigned char cast to an int or EOF on error.
*/
int ets_putc(int c);
/**
* @brief Printf the strings to uart or other devices, similar with vprintf, simple than vprintf.
* Can not print float point data format, or longlong data format.
*
* @param const char *fmt : See vprintf.
*
* @param ap : parameter list, see vprintf.
*
* @return int : the length printed to the output device.
*/
int ets_vprintf(const char *fmt, va_list ap);
/**
* @brief Printf the strings to uart or other devices, similar with printf, simple than printf.
* Can not print float point data format, or longlong data format.

View File

@ -57,4 +57,4 @@ PROVIDE ( gpio_input_get = 0x40004cf0 );
PROVIDE ( gpio_pin_wakeup_disable = 0x40004ed4 );
PROVIDE ( gpio_pin_wakeup_enable = 0x40004e90 );
PROVIDE ( ets_vprintf = 0x40001f00 );
PROVIDE ( ets_io_vprintf = 0x40001f00 );

View File

@ -13,7 +13,6 @@
// limitations under the License.
#include <stdint.h>
#include <stdarg.h>
#include "esp_attr.h"
@ -21,16 +20,27 @@
#include "esp8266/uart_register.h"
#include "esp8266/rom_functions.h"
static void IRAM_ATTR uart_tx_one_char(char c)
#ifndef CONFIG_ETS_PUTC_UART
#define CONFIG_ETS_PUTC_UART 0
#endif
int IRAM_ATTR ets_putc(int c)
{
while (1) {
uint32_t fifo_cnt = READ_PERI_REG(UART_STATUS(0)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S);
uint32_t fifo_cnt = READ_PERI_REG(UART_STATUS(CONFIG_ETS_PUTC_UART)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S);
if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126)
break;
}
WRITE_PERI_REG(UART_FIFO(0) , c);
WRITE_PERI_REG(UART_FIFO(CONFIG_ETS_PUTC_UART) , c);
return c;
}
int IRAM_ATTR ets_vprintf(const char *fmt, va_list ap)
{
return ets_io_vprintf(ets_putc, fmt, ap);
}
/* Re-write ets_printf in SDK side, since ets_printf in ROM will use a global
@ -42,7 +52,7 @@ int IRAM_ATTR ets_printf(const char* fmt, ...)
int ret;
va_start(ap, fmt);
ret = ets_vprintf(uart_tx_one_char, fmt, ap);
ret = ets_vprintf(fmt, ap);
va_end(ap);
return ret;