Skip to content

Commit eb05960

Browse files
committed
Merge branch 'master' oi git://github.com/espressif/arduino-esp3f
2 parents 582c657 + 7fa8caf commit eb05960

File tree

165 files changed

+7447
-3758
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

165 files changed

+7447
-3758
lines changed

cores/esp32/esp32-hal-bt.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED)
1818

1919

20-
#include "bt.h"
20+
#include "esp_bt.h"
2121
#include "esp_bt_defs.h"
2222
#include "esp_bt_main.h"
2323

cores/esp32/esp32-hal-ledc.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ static void _ledcSetupTimer(uint8_t chan, uint32_t div_num, uint8_t bit_num, boo
6868
#endif
6969
}
7070
LEDC_MUTEX_LOCK();
71-
LEDC_TIMER(group, timer).conf.div_num = div_num;//18 bit (10.8) This register is used to configure parameter for divider in timer the least significant eight bits represent the decimal part.
72-
LEDC_TIMER(group, timer).conf.bit_num = bit_num;//5 bit This register controls the range of the counter in timer. the counter range is [0 2**bit_num] the max bit width for counter is 20.
71+
LEDC_TIMER(group, timer).conf.clock_divider = div_num;//18 bit (10.8) This register is used to configure parameter for divider in timer the least significant eight bits represent the decimal part.
72+
LEDC_TIMER(group, timer).conf.duty_resolution = bit_num;//5 bit This register controls the range of the counter in timer. the counter range is [0 2**bit_num] the max bit width for counter is 20.
7373
LEDC_TIMER(group, timer).conf.tick_sel = apb_clk;//apb clock
7474
if(group) {
7575
LEDC_TIMER(group, timer).conf.low_speed_update = 1;//This bit is only useful for low speed timer channels, reserved for high speed timers
@@ -111,8 +111,8 @@ static double _ledcTimerRead(uint8_t chan)
111111
bool apb_clk;
112112
uint8_t group=(chan/8), timer=((chan/2)%4);
113113
LEDC_MUTEX_LOCK();
114-
div_num = LEDC_TIMER(group, timer).conf.div_num;//18 bit (10.8) This register is used to configure parameter for divider in timer the least significant eight bits represent the decimal part.
115-
bit_num = LEDC_TIMER(group, timer).conf.bit_num;//5 bit This register controls the range of the counter in timer. the counter range is [0 2**bit_num] the max bit width for counter is 20.
114+
div_num = LEDC_TIMER(group, timer).conf.clock_divider;//18 bit (10.8) This register is used to configure parameter for divider in timer the least significant eight bits represent the decimal part.
115+
bit_num = LEDC_TIMER(group, timer).conf.duty_resolution;//5 bit This register controls the range of the counter in timer. the counter range is [0 2**bit_num] the max bit width for counter is 20.
116116
apb_clk = LEDC_TIMER(group, timer).conf.tick_sel;//apb clock
117117
LEDC_MUTEX_UNLOCK();
118118
uint64_t clk_freq = 1000000;

cores/esp32/pgmspace.h

+18-3
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,33 @@ typedef unsigned long prog_uint32_t;
3737
#define _SFR_BYTE(n) (n)
3838

3939
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
40-
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
41-
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
42-
#define pgm_read_float(addr) (*(const float *)(addr))
40+
#define pgm_read_word(addr) ({ \
41+
typeof(addr) _addr = (addr); \
42+
*(const unsigned short *)(_addr); \
43+
})
44+
#define pgm_read_dword(addr) ({ \
45+
typeof(addr) _addr = (addr); \
46+
*(const unsigned long *)(_addr); \
47+
})
48+
#define pgm_read_float(addr) ({ \
49+
typeof(addr) _addr = (addr); \
50+
*(const float *)(_addr); \
51+
})
52+
#define pgm_read_ptr(addr) ({ \
53+
typeof(addr) _addr = (addr); \
54+
*(void * const *)(_addr); \
55+
})
4356

4457
#define pgm_read_byte_near(addr) pgm_read_byte(addr)
4558
#define pgm_read_word_near(addr) pgm_read_word(addr)
4659
#define pgm_read_dword_near(addr) pgm_read_dword(addr)
4760
#define pgm_read_float_near(addr) pgm_read_float(addr)
61+
#define pgm_read_ptr_near(addr) pgm_read_ptr(addr)
4862
#define pgm_read_byte_far(addr) pgm_read_byte(addr)
4963
#define pgm_read_word_far(addr) pgm_read_word(addr)
5064
#define pgm_read_dword_far(addr) pgm_read_dword(addr)
5165
#define pgm_read_float_far(addr) pgm_read_float(addr)
66+
#define pgm_read_ptr_far(addr) pgm_read_ptr(addr)
5267

5368
#define memcmp_P memcmp
5469
#define memccpy_P memccpy

docs/arduino-ide/windows.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
![Step 2](win-screenshots/win-gui-2.png)
1818
![Step 3](win-screenshots/win-gui-3.png)
19-
19+
- open a `Git Bash` session pointing to ```ARDUINO_SKETCHBOOK_DIR``` and execute ```git submodule update --init --recursive```
2020
- Open ```[ARDUINO_SKETCHBOOK_DIR]/hardware/espressif/esp32/tools``` and double-click ```get.exe```
2121

2222
![Step 4](win-screenshots/win-gui-4.png)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <WiFi.h>
2+
#include <DNSServer.h>
3+
4+
const byte DNS_PORT = 53;
5+
IPAddress apIP(192, 168, 1, 1);
6+
DNSServer dnsServer;
7+
WiFiServer server(80);
8+
9+
String responseHTML = ""
10+
"<!DOCTYPE html><html><head><title>CaptivePortal</title></head><body>"
11+
"<h1>Hello World!</h1><p>This is a captive portal example. All requests will "
12+
"be redirected here.</p></body></html>";
13+
14+
void setup() {
15+
WiFi.mode(WIFI_AP);
16+
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
17+
WiFi.softAP("DNSServer CaptivePortal example");
18+
19+
// if DNSServer is started with "*" for domain name, it will reply with
20+
// provided IP to all DNS request
21+
dnsServer.start(DNS_PORT, "*", apIP);
22+
23+
server.begin();
24+
}
25+
26+
void loop() {
27+
dnsServer.processNextRequest();
28+
WiFiClient client = server.available(); // listen for incoming clients
29+
30+
if (client) {
31+
String currentLine = "";
32+
while (client.connected()) {
33+
if (client.available()) {
34+
char c = client.read();
35+
if (c == '\n') {
36+
if (currentLine.length() == 0) {
37+
client.println("HTTP/1.1 200 OK");
38+
client.println("Content-type:text/html");
39+
client.println();
40+
client.print(responseHTML);
41+
break;
42+
} else {
43+
currentLine = "";
44+
}
45+
} else if (c != '\r') {
46+
currentLine += c;
47+
}
48+
}
49+
}
50+
client.stop();
51+
}
52+
}
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=DNSServer
2+
version=1.1.0
3+
author=Kristijan Novoselić
4+
maintainer=Kristijan Novoselić, <kristijan.novoselic@gmail.com>
5+
sentence=A simple DNS server for ESP32.
6+
paragraph=This library implements a simple DNS server.
7+
category=Communication
8+
url=
9+
architectures=esp32

libraries/DNSServer/src/DNSServer.cpp

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
#include "DNSServer.h"
2+
#include <lwip/def.h>
3+
#include <Arduino.h>
4+
5+
6+
DNSServer::DNSServer()
7+
{
8+
_ttl = htonl(60);
9+
_errorReplyCode = DNSReplyCode::NonExistentDomain;
10+
_dnsHeader = NULL;
11+
_buffer = NULL;
12+
_currentPacketSize = 0;
13+
_port = 0;
14+
}
15+
16+
bool DNSServer::start(const uint16_t &port, const String &domainName,
17+
const IPAddress &resolvedIP)
18+
{
19+
_port = port;
20+
_buffer = NULL;
21+
_domainName = domainName;
22+
_resolvedIP[0] = resolvedIP[0];
23+
_resolvedIP[1] = resolvedIP[1];
24+
_resolvedIP[2] = resolvedIP[2];
25+
_resolvedIP[3] = resolvedIP[3];
26+
downcaseAndRemoveWwwPrefix(_domainName);
27+
return _udp.begin(_port) == 1;
28+
}
29+
30+
void DNSServer::setErrorReplyCode(const DNSReplyCode &replyCode)
31+
{
32+
_errorReplyCode = replyCode;
33+
}
34+
35+
void DNSServer::setTTL(const uint32_t &ttl)
36+
{
37+
_ttl = htonl(ttl);
38+
}
39+
40+
void DNSServer::stop()
41+
{
42+
_udp.stop();
43+
free(_buffer);
44+
_buffer = NULL;
45+
}
46+
47+
void DNSServer::downcaseAndRemoveWwwPrefix(String &domainName)
48+
{
49+
domainName.toLowerCase();
50+
domainName.replace("www.", "");
51+
}
52+
53+
void DNSServer::processNextRequest()
54+
{
55+
_currentPacketSize = _udp.parsePacket();
56+
if (_currentPacketSize)
57+
{
58+
if (_buffer != NULL) free(_buffer);
59+
_buffer = (unsigned char*)malloc(_currentPacketSize * sizeof(char));
60+
if (_buffer == NULL) return;
61+
_udp.read(_buffer, _currentPacketSize);
62+
_dnsHeader = (DNSHeader*) _buffer;
63+
64+
if (_dnsHeader->QR == DNS_QR_QUERY &&
65+
_dnsHeader->OPCode == DNS_OPCODE_QUERY &&
66+
requestIncludesOnlyOneQuestion() &&
67+
(_domainName == "*" || getDomainNameWithoutWwwPrefix() == _domainName)
68+
)
69+
{
70+
replyWithIP();
71+
}
72+
else if (_dnsHeader->QR == DNS_QR_QUERY)
73+
{
74+
replyWithCustomCode();
75+
}
76+
77+
free(_buffer);
78+
_buffer = NULL;
79+
}
80+
}
81+
82+
bool DNSServer::requestIncludesOnlyOneQuestion()
83+
{
84+
return ntohs(_dnsHeader->QDCount) == 1 &&
85+
_dnsHeader->ANCount == 0 &&
86+
_dnsHeader->NSCount == 0 &&
87+
_dnsHeader->ARCount == 0;
88+
}
89+
90+
String DNSServer::getDomainNameWithoutWwwPrefix()
91+
{
92+
String parsedDomainName = "";
93+
if (_buffer == NULL) return parsedDomainName;
94+
unsigned char *start = _buffer + 12;
95+
if (*start == 0)
96+
{
97+
return parsedDomainName;
98+
}
99+
int pos = 0;
100+
while(true)
101+
{
102+
unsigned char labelLength = *(start + pos);
103+
for(int i = 0; i < labelLength; i++)
104+
{
105+
pos++;
106+
parsedDomainName += (char)*(start + pos);
107+
}
108+
pos++;
109+
if (*(start + pos) == 0)
110+
{
111+
downcaseAndRemoveWwwPrefix(parsedDomainName);
112+
return parsedDomainName;
113+
}
114+
else
115+
{
116+
parsedDomainName += ".";
117+
}
118+
}
119+
}
120+
121+
void DNSServer::replyWithIP()
122+
{
123+
if (_buffer == NULL) return;
124+
_dnsHeader->QR = DNS_QR_RESPONSE;
125+
_dnsHeader->ANCount = _dnsHeader->QDCount;
126+
_dnsHeader->QDCount = 0;
127+
128+
_udp.beginPacket(_udp.remoteIP(), _udp.remotePort());
129+
_udp.write(_buffer, _currentPacketSize);
130+
_udp.write((unsigned char*)&_ttl, 4);
131+
_udp.write((uint8_t)0);
132+
_udp.write((uint8_t)4);
133+
_udp.write(_resolvedIP, 4);
134+
_udp.endPacket();
135+
}
136+
137+
void DNSServer::replyWithCustomCode()
138+
{
139+
if (_buffer == NULL) return;
140+
_dnsHeader->QR = DNS_QR_RESPONSE;
141+
_dnsHeader->RCode = (unsigned char)_errorReplyCode;
142+
_dnsHeader->QDCount = 0;
143+
144+
_udp.beginPacket(_udp.remoteIP(), _udp.remotePort());
145+
_udp.write(_buffer, sizeof(DNSHeader));
146+
_udp.endPacket();
147+
}

libraries/DNSServer/src/DNSServer.h

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#ifndef DNSServer_h
2+
#define DNSServer_h
3+
#include <WiFiUdp.h>
4+
5+
#define DNS_QR_QUERY 0
6+
#define DNS_QR_RESPONSE 1
7+
#define DNS_OPCODE_QUERY 0
8+
9+
enum class DNSReplyCode
10+
{
11+
NoError = 0,
12+
FormError = 1,
13+
ServerFailure = 2,
14+
NonExistentDomain = 3,
15+
NotImplemented = 4,
16+
Refused = 5,
17+
YXDomain = 6,
18+
YXRRSet = 7,
19+
NXRRSet = 8
20+
};
21+
22+
struct DNSHeader
23+
{
24+
uint16_t ID; // identification number
25+
union {
26+
struct {
27+
uint16_t RD : 1; // recursion desired
28+
uint16_t TC : 1; // truncated message
29+
uint16_t AA : 1; // authoritive answer
30+
uint16_t OPCode : 4; // message_type
31+
uint16_t QR : 1; // query/response flag
32+
uint16_t RCode : 4; // response code
33+
uint16_t Z : 3; // its z! reserved
34+
uint16_t RA : 1; // recursion available
35+
};
36+
uint16_t Flags;
37+
};
38+
uint16_t QDCount; // number of question entries
39+
uint16_t ANCount; // number of answer entries
40+
uint16_t NSCount; // number of authority entries
41+
uint16_t ARCount; // number of resource entries
42+
};
43+
44+
class DNSServer
45+
{
46+
public:
47+
DNSServer();
48+
void processNextRequest();
49+
void setErrorReplyCode(const DNSReplyCode &replyCode);
50+
void setTTL(const uint32_t &ttl);
51+
52+
// Returns true if successful, false if there are no sockets available
53+
bool start(const uint16_t &port,
54+
const String &domainName,
55+
const IPAddress &resolvedIP);
56+
// stops the DNS server
57+
void stop();
58+
59+
private:
60+
WiFiUDP _udp;
61+
uint16_t _port;
62+
String _domainName;
63+
unsigned char _resolvedIP[4];
64+
int _currentPacketSize;
65+
unsigned char* _buffer;
66+
DNSHeader* _dnsHeader;
67+
uint32_t _ttl;
68+
DNSReplyCode _errorReplyCode;
69+
70+
void downcaseAndRemoveWwwPrefix(String &domainName);
71+
String getDomainNameWithoutWwwPrefix();
72+
bool requestIncludesOnlyOneQuestion();
73+
void replyWithIP();
74+
void replyWithCustomCode();
75+
};
76+
#endif

0 commit comments

Comments
 (0)