1
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
31
32
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
77
78
82
83
92
93
97
98
102
103
104
105
106
107
108
109
110
111
112
113
119
120
121
143
144
145
146
150
151
155
156
160
161
165
166
167
168
172
173
174
179
180
181
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
215
216
217
218
219
220
221
222
223
224
225
235
236
237
238
239
240
241
242
243
244
245
246
250
251
252
253
/* ... */
#include <fcntl.h>
#include "esp_err.h"
#include "esp_rom_sys.h"
#include "esp_vfs_cdcacm.h"
#include "esp_private/esp_vfs_cdcacm.h"
#include "driver/esp_private/usb_serial_jtag_vfs.h"
#include "driver/esp_private/uart_vfs.h"
#include "esp_private/usb_console.h"
#include "esp_vfs_console.h"
#include "sdkconfig.h"
#include "esp_private/startup_internal.h"
#include "esp_vfs_null.h"
#include "esp_private/nullfs.h"13 includes
#define STRINGIFY(s) STRINGIFY2(s)
#define STRINGIFY2(s) #s
/* ... */
typedef struct {
int fd_primary;
int fd_secondary;
}{ ... } vfs_console_context_t;
#if CONFIG_VFS_SUPPORT_IO
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
const static esp_vfs_fs_ops_t *secondary_vfs = NULL;
#endif
const static esp_vfs_fs_ops_t *primary_vfs = NULL;
static vfs_console_context_t vfs_console = {0};
int console_open(const char * path, int flags, int mode)
{
#if CONFIG_ESP_CONSOLE_UART
vfs_console.fd_primary = open("/dev/uart/"STRINGIFY(CONFIG_ESP_CONSOLE_UART_NUM), flags, mode);
#elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
vfs_console.fd_primary = open("/dev/usbserjtag", flags, mode);
#elif CONFIG_ESP_CONSOLE_USB_CDC
vfs_console.fd_primary = open("/dev/cdcacm", flags, mode);
#else
vfs_console.fd_primary = open("/dev/null", flags, mode);
#endif
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
vfs_console.fd_secondary = open("/dev/secondary", flags, mode);
#endif
return 0;
}{ ... }
ssize_t console_write(int fd, const void *data, size_t size)
{
write(vfs_console.fd_primary, data, size);
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
write(vfs_console.fd_secondary, data, size);
#endif
return size;
}{ ... }
int console_fstat(int fd, struct stat * st)
{
return fstat(vfs_console.fd_primary, st);
}{ ... }
int console_close(int fd)
{
close(vfs_console.fd_primary);
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
close(vfs_console.fd_secondary);
#endif
return 0;
}{ ... }
ssize_t console_read(int fd, void * dst, size_t size)
{
return read(vfs_console.fd_primary, dst, size);
}{ ... }
int console_fcntl(int fd, int cmd, int arg)
{
return fcntl(vfs_console.fd_primary, cmd, arg);
}{ ... }
int console_fsync(int fd)
{
const int ret_val = fsync(vfs_console.fd_primary);
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
(void)fsync(vfs_console.fd_secondary);
#endif
return ret_val;
}{ ... }
#ifdef CONFIG_VFS_SUPPORT_DIR
int console_access(const char *path, int amode)
{
return access("/dev/uart/"STRINGIFY(CONFIG_ESP_CONSOLE_UART_NUM), amode);
}{ ... }
/* ... */#endif
#ifdef CONFIG_VFS_SUPPORT_SELECT
static esp_err_t console_start_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
esp_vfs_select_sem_t select_sem, void **end_select_args)
{
if (primary_vfs->select->start_select) {
return primary_vfs->select->start_select(nfds, readfds, writefds, exceptfds, select_sem, end_select_args);
}{...}
return ESP_ERR_NOT_SUPPORTED;
}{ ... }
esp_err_t console_end_select(void *end_select_args)
{
if (primary_vfs->select->end_select) {
return primary_vfs->select->end_select(end_select_args);
}{...}
return ESP_ERR_NOT_SUPPORTED;
}{ ... }
/* ... */#endif
#ifdef CONFIG_VFS_SUPPORT_TERMIOS
int console_tcsetattr(int fd, int optional_actions, const struct termios *p)
{
return tcsetattr(vfs_console.fd_primary, optional_actions, p);
}{ ... }
int console_tcgetattr(int fd, struct termios *p)
{
return tcgetattr(vfs_console.fd_primary, p);
}{ ... }
int console_tcdrain(int fd)
{
return tcdrain(vfs_console.fd_primary);
}{ ... }
int console_tcflush(int fd, int select)
{
return tcflush(vfs_console.fd_primary, select);
}{ ... }
#endif/* ... */
#ifdef CONFIG_VFS_SUPPORT_DIR
static const esp_vfs_dir_ops_t s_vfs_console_dir = {
.access = &console_access,
}{...};
/* ... */#endif
#ifdef CONFIG_VFS_SUPPORT_SELECT
static const esp_vfs_select_ops_t s_vfs_console_select = {
.start_select = &console_start_select,
.end_select = &console_end_select,
}{...};
/* ... */#endif
#ifdef CONFIG_VFS_SUPPORT_TERMIOS
static const esp_vfs_termios_ops_t s_vfs_console_termios = {
.tcsetattr = &console_tcsetattr,
.tcgetattr = &console_tcgetattr,
.tcdrain = &console_tcdrain,
.tcflush = &console_tcflush,
}{...};
/* ... */#endif
static const esp_vfs_fs_ops_t s_vfs_console = {
.write = &console_write,
.open = &console_open,
.fstat = &console_fstat,
.close = &console_close,
.read = &console_read,
.fcntl = &console_fcntl,
.fsync = &console_fsync,
#ifdef CONFIG_VFS_SUPPORT_DIR
.dir = &s_vfs_console_dir,
#endif
#ifdef CONFIG_VFS_SUPPORT_SELECT
.select = &s_vfs_console_select,
#endif
#ifdef CONFIG_VFS_SUPPORT_TERMIOS
.termios = &s_vfs_console_termios,
#endif
}{...};
static esp_err_t esp_vfs_dev_console_register(void)
{
return esp_vfs_register_fs(ESP_VFS_DEV_CONSOLE, &s_vfs_console, ESP_VFS_FLAG_STATIC, NULL);
}{ ... }
esp_err_t esp_vfs_console_register(void)
{
esp_err_t err = ESP_OK;
#if CONFIG_ESP_CONSOLE_UART
primary_vfs = esp_vfs_uart_get_vfs();
#elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
primary_vfs = esp_vfs_usb_serial_jtag_get_vfs();
#elif CONFIG_ESP_CONSOLE_USB_CDC
primary_vfs = esp_vfs_cdcacm_get_vfs();
err = esp_usb_console_init();
if (err != ESP_OK) {
return err;
}{...}
err = esp_vfs_dev_cdcacm_register();
if (err != ESP_OK) {
return err;
}{...}
#else/* ... */
primary_vfs = esp_vfs_null_get_vfs();
#endif
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
secondary_vfs = esp_vfs_usb_serial_jtag_get_vfs();
#endif
err = esp_vfs_dev_console_register();
return err;
}{ ... }
ESP_SYSTEM_INIT_FN(init_vfs_console, CORE, BIT(0), 114)
{
return esp_vfs_console_register();
}{ ... }
/* ... */
#endif
void esp_vfs_include_console_register(void)
{
}{ ... }