@@ -90,17 +90,72 @@ void NTPUtils::sendNTPpacket(UDP & udp)
90
90
udp.endPacket ();
91
91
}
92
92
93
+ #ifdef NTP_USE_RANDOM_PORT
93
94
int NTPUtils::getRandomPort (int const min_port, int const max_port)
94
95
{
95
- #if defined (BOARD_HAS_ECCX08)
96
- return ECCX08.random (min_port, max_port);
97
- #elif defined (ARDUINO_ARCH_ESP8266) || (ARDUINO_ARCH_ESP32)
96
+ #if defined (ARDUINO_ARCH_ESP8266) || (ARDUINO_ARCH_ESP32) || \
97
+ (ARDUINO_ARCH_RENESAS) || (ARDUINO_ARCH_MBED)
98
98
/* Uses HW Random Number Generator */
99
- return random (min_port, max_port);
99
+ #elif defined (ARDUINO_ARCH_SAMD)
100
+ /* Use ADC to generate a seed */
101
+ randomSeed (adcSeed ());
100
102
#else
101
103
randomSeed (analogRead (0 ));
102
- return random (min_port, max_port);
103
104
#endif
105
+ return random (min_port, max_port);
104
106
}
105
107
106
- #endif /* #ifndef HAS_LORA */
108
+ #if defined (ARDUINO_ARCH_SAMD)
109
+ unsigned long NTPUtils::adcSeed ()
110
+ {
111
+ uint32_t seed = 0 ;
112
+ uint32_t bitCount = 0 ;
113
+ uint16_t sampctlr = ADC->SAMPCTRL .reg ;
114
+
115
+ // Use lowest sampling time
116
+ ADC->SAMPCTRL .reg = 0 ;
117
+ // Enable ADC
118
+ ADC->CTRLA .bit .ENABLE = 1 ;
119
+ while (ADC->STATUS .bit .SYNCBUSY == 1 );
120
+ do {
121
+ uint16_t adcReading;
122
+ // Start ADC conversion
123
+ ADC->SWTRIG .bit .START = 1 ;
124
+ // Wait until ADC conversion is done
125
+ while (!(ADC->INTFLAG .bit .RESRDY ));
126
+ while (ADC->STATUS .bit .SYNCBUSY == 1 );
127
+ // Get result
128
+ adcReading = ADC->RESULT .reg ;
129
+ // Clear result ready flag
130
+ ADC->INTFLAG .reg = ADC_INTFLAG_RESRDY;
131
+ while (ADC->STATUS .bit .SYNCBUSY == 1 );
132
+ // Take least significant bit
133
+ uint8_t b0 = adcReading & 0x0001 ;
134
+ ADC->SWTRIG .bit .START = 1 ;
135
+ // Wait until ADC conversion is done
136
+ while (!(ADC->INTFLAG .bit .RESRDY ));
137
+ while (ADC->STATUS .bit .SYNCBUSY == 1 );
138
+ // Get result
139
+ adcReading = ADC->RESULT .reg ;
140
+ // Clear result ready flag
141
+ ADC->INTFLAG .reg = ADC_INTFLAG_RESRDY;
142
+ while (ADC->STATUS .bit .SYNCBUSY == 1 );
143
+ // Take least significant nibble
144
+ uint8_t b1 = adcReading & 0x0001 ;
145
+ if (b0 == b1) {
146
+ continue ;
147
+ }
148
+ seed |= b0 << bitCount;
149
+ bitCount++;
150
+ } while (bitCount < 32 );
151
+ // Disable ADC
152
+ ADC->CTRLA .bit .ENABLE = 0 ;
153
+ // restore original sampling time
154
+ ADC->SAMPCTRL .reg = sampctlr;
155
+ return seed;
156
+ }
157
+ #endif /* ARDUINO_ARCH_SAMD */
158
+
159
+ #endif /* NTP_USE_RANDOM_PORT */
160
+
161
+ #endif /* !HAS_LORA */
0 commit comments