8
8
#include "sdkconfig.h"
9
9
#include "esp_log.h"
10
10
#include "esp_netif.h"
11
+ #include "esp_check.h"
11
12
#include "esp_event.h"
12
13
#include "esp_netif_ppp.h"
13
14
#include "eppp_link_types.h"
17
18
#include "driver/spi_slave.h"
18
19
#include "driver/gpio.h"
19
20
#include "esp_timer.h"
21
+ #elif CONFIG_EPPP_LINK_DEVICE_UART
22
+ #include "driver/uart.h"
20
23
#endif
21
24
22
25
static const int GOT_IPV4 = BIT0 ;
@@ -44,7 +47,11 @@ enum eppp_type {
44
47
45
48
struct eppp_handle {
46
49
QueueHandle_t out_queue ;
50
+ #if CONFIG_EPPP_LINK_DEVICE_SPI
47
51
QueueHandle_t ready_semaphore ;
52
+ #elif CONFIG_EPPP_LINK_DEVICE_UART
53
+ QueueHandle_t uart_event_queue ;
54
+ #endif
48
55
esp_netif_t * netif ;
49
56
enum eppp_type role ;
50
57
};
@@ -57,7 +64,7 @@ struct packet {
57
64
58
65
static esp_err_t transmit (void * h , void * buffer , size_t len )
59
66
{
60
- #if CONFIG_EXAMPLE_CONNECT_PPP_DEVICE_SPI
67
+ #if CONFIG_EPPP_LINK_DEVICE_SPI
61
68
#define MAX_PAYLOAD 1600
62
69
struct eppp_handle * handle = h ;
63
70
struct packet buf = { };
@@ -76,6 +83,8 @@ static esp_err_t transmit(void *h, void *buffer, size_t len)
76
83
ESP_LOGE (TAG , "Failed to queue packet to slave!" );
77
84
}
78
85
} while (remaining > 0 );
86
+ #elif CONFIG_EPPP_LINK_DEVICE_UART
87
+ uart_write_bytes (UART_NUM_1 , buffer , len );
79
88
#endif
80
89
return ESP_OK ;
81
90
}
@@ -101,6 +110,7 @@ static esp_netif_t *netif_init(enum eppp_type role)
101
110
return NULL ;
102
111
}
103
112
h -> role = role ;
113
+ #if CONFIG_EPPP_LINK_DEVICE_SPI
104
114
if (role == EPPP_CLIENT ) {
105
115
h -> ready_semaphore = xSemaphoreCreateBinary ();
106
116
if (!h -> ready_semaphore ) {
@@ -110,6 +120,7 @@ static esp_netif_t *netif_init(enum eppp_type role)
110
120
return NULL ;
111
121
}
112
122
}
123
+ #endif
113
124
114
125
esp_netif_driver_ifconfig_t driver_cfg = {
115
126
.handle = h ,
@@ -119,7 +130,7 @@ static esp_netif_t *netif_init(enum eppp_type role)
119
130
120
131
esp_netif_inherent_config_t base_netif_cfg = ESP_NETIF_INHERENT_DEFAULT_PPP ();
121
132
char if_key [] = "EPPP0" ; // netif key needs to be unique
122
- if_key [sizeof (if_key ) - 1 ] += s_eppp_netif_count ++ ;
133
+ if_key [sizeof (if_key ) - 2 /* 2 = two chars before the terminator */ ] += s_eppp_netif_count ++ ;
123
134
base_netif_cfg .if_key = if_key ;
124
135
if (role == EPPP_CLIENT ) {
125
136
base_netif_cfg .if_desc = "pppos_client" ;
@@ -470,7 +481,56 @@ _Noreturn static void ppp_task(void *args)
470
481
}
471
482
}
472
483
}
473
- #endif // CONFIG_EPPP_LINK_DEVICE_SPI
484
+ #elif CONFIG_EPPP_LINK_DEVICE_UART
485
+ #define BUF_SIZE (1024)
486
+ #define UART_TX_CLIENT_TO_SERVER 10
487
+ #define UART_TX_SERVER_TO_CLIENT 11
488
+ #define UART_BAUDRATE 4000000
489
+ #define UART_QUEUE_SIZE 16
490
+
491
+ static esp_err_t init_uart (struct eppp_handle * h )
492
+ {
493
+ uart_config_t uart_config = {};
494
+ uart_config .baud_rate = UART_BAUDRATE ;
495
+ uart_config .data_bits = UART_DATA_8_BITS ;
496
+ uart_config .parity = UART_PARITY_DISABLE ;
497
+ uart_config .stop_bits = UART_STOP_BITS_1 ;
498
+ uart_config .flow_ctrl = UART_HW_FLOWCTRL_DISABLE ;
499
+ uart_config .source_clk = UART_SCLK_DEFAULT ;
500
+
501
+ ESP_RETURN_ON_ERROR (uart_driver_install (UART_NUM_1 , BUF_SIZE , 0 , UART_QUEUE_SIZE , & h -> uart_event_queue , 0 ), TAG , "Failed to install UART" );
502
+ ESP_RETURN_ON_ERROR (uart_param_config (UART_NUM_1 , & uart_config ), TAG , "Failed to set params" );
503
+ int tx_io_num = h -> role == EPPP_CLIENT ? UART_TX_CLIENT_TO_SERVER : UART_TX_SERVER_TO_CLIENT ;
504
+ int rx_io_num = h -> role == EPPP_CLIENT ? UART_TX_SERVER_TO_CLIENT : UART_TX_CLIENT_TO_SERVER ;
505
+ ESP_RETURN_ON_ERROR (uart_set_pin (UART_NUM_1 , tx_io_num , rx_io_num , UART_PIN_NO_CHANGE , UART_PIN_NO_CHANGE ), TAG , "Failed to set UART pins" );
506
+ ESP_RETURN_ON_ERROR (uart_set_rx_timeout (UART_NUM_1 , 1 ), TAG , "Failed to set UART Rx timeout" );
507
+ return ESP_OK ;
508
+ }
509
+
510
+ _Noreturn static void ppp_task (void * args )
511
+ {
512
+ static uint8_t buffer [BUF_SIZE ] = {};
513
+
514
+ esp_netif_t * netif = args ;
515
+ struct eppp_handle * h = esp_netif_get_io_driver (netif );
516
+ uart_event_t event ;
517
+ while (1 ) {
518
+ xQueueReceive (h -> uart_event_queue , & event , pdMS_TO_TICKS (pdMS_TO_TICKS (100 )));
519
+ if (event .type == UART_DATA ) {
520
+ size_t len ;
521
+ uart_get_buffered_data_len (UART_NUM_1 , & len );
522
+ if (len ) {
523
+ len = uart_read_bytes (UART_NUM_1 , buffer , BUF_SIZE , 0 );
524
+ ESP_LOG_BUFFER_HEXDUMP ("ppp_uart_recv" , buffer , len , ESP_LOG_VERBOSE );
525
+ esp_netif_receive (netif , buffer , len , NULL );
526
+ }
527
+ } else {
528
+ ESP_LOGW (TAG , "Received UART event: %d" , event .type );
529
+ }
530
+ }
531
+
532
+ }
533
+ #endif // CONFIG_EPPP_LINK_DEVICE_SPI / UART
474
534
475
535
476
536
static esp_netif_t * default_setup (enum eppp_type role )
@@ -498,6 +558,8 @@ static esp_netif_t *default_setup(enum eppp_type role)
498
558
} else {
499
559
init_slave (& s_spi_device , netif );
500
560
}
561
+ #elif CONFIG_EPPP_LINK_DEVICE_UART
562
+ init_uart (esp_netif_get_io_driver (netif ));
501
563
#endif
502
564
503
565
netif_start (netif );
0 commit comments