-
Notifications
You must be signed in to change notification settings - Fork 125
/
Copy pathespcomm_boards.c
147 lines (123 loc) · 3.08 KB
/
espcomm_boards.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <stddef.h>
#include <string.h>
#include "espcomm_boards.h"
#include "serialport.h"
#include "delay.h"
struct espcomm_board_
{
const char* name;
void (*reset_into_bootloader)(void);
void (*reset_into_app)(void);
};
static espcomm_board_t s_boards[];
static size_t s_boards_count;
espcomm_board_t* espcomm_board_by_name(const char* name)
{
for (size_t i = 0; i < s_boards_count; ++i)
{
espcomm_board_t* board = s_boards + i;
if (strcmp(board->name, name) == 0)
return board;
}
return 0;
}
espcomm_board_t* espcomm_board_first()
{
return s_boards;
}
espcomm_board_t* espcomm_board_next(espcomm_board_t* board)
{
if (++board < s_boards + s_boards_count)
return board;
return 0;
}
const char* espcomm_board_name(espcomm_board_t* board)
{
return (board)?board->name:"";
}
void espcomm_board_reset_into_bootloader(espcomm_board_t* board)
{
if (board && board->reset_into_bootloader)
(*board->reset_into_bootloader)();
}
void espcomm_board_reset_into_app(espcomm_board_t* board)
{
if (board && board->reset_into_app)
(*board->reset_into_app)();
}
/// board definitions go below
//
// _rb = reset into bootloader
// _ra = reset into app
//
//
// "ck" board: dtr pulls down gpio0, rts pulls down reset
// also supports reset with RC circuit triggered by break signal
void board_ck_rb()
{
serialport_set_rts(1);
serialport_set_dtr(1);
serialport_send_break();
espcomm_delay_ms(5);
serialport_set_rts(0);
espcomm_delay_ms(250); // wait for break to finish
serialport_set_dtr(0);
}
void board_ck_ra()
{
serialport_set_dtr(0);
serialport_set_rts(1);
espcomm_delay_ms(5);
serialport_set_rts(0);
}
// WIFIO board, rev 2: TXD controls gpio0 via a pnp, and DTR controls rst via a capacitor
void board_wifio_rb()
{
serialport_set_dtr(0);
espcomm_delay_ms(5);
serialport_set_dtr(1);
espcomm_delay_ms(5);
serialport_set_dtr(0);
serialport_send_break();
}
void board_wifio_ra()
{
serialport_set_dtr(0);
espcomm_delay_ms(5);
serialport_set_dtr(1);
}
void board_nodemcu_rb()
{
serialport_set_rts(1);
serialport_set_dtr(0);
espcomm_delay_ms(5);
serialport_set_rts(0);
serialport_set_dtr(1);
espcomm_delay_ms(50);
serialport_set_dtr(0);
}
void board_nodemcu_ra()
{
serialport_set_dtr(0);
serialport_set_rts(1);
espcomm_delay_ms(5);
serialport_set_rts(0);
}
// dtrset board: DTR is set during serial communications
void board_dtrset_rb()
{
serialport_set_dtr(1); // This makes dtr active by setting line voltage low
}
void board_dtrset_ra()
{
serialport_set_dtr(0);
}
/// list of all boards
static espcomm_board_t s_boards[] = {
{ "none", 0, 0 },
{ "ck", &board_ck_rb, &board_ck_ra },
{ "wifio", &board_wifio_rb, &board_wifio_ra },
{ "nodemcu", &board_nodemcu_rb, &board_nodemcu_ra },
{ "dtrset", &board_dtrset_rb, &board_dtrset_ra },
};
static size_t s_boards_count = sizeof(s_boards) / sizeof(espcomm_board_t);