@@ -90,17 +90,72 @@ void NTPUtils::sendNTPpacket(UDP & udp)
9090 udp.endPacket ();
9191}
9292
93+ #ifdef NTP_USE_RANDOM_PORT
9394int NTPUtils::getRandomPort (int const min_port, int const max_port)
9495{
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)
9898 /* 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 ());
100102#else
101103 randomSeed (analogRead (0 ));
102- return random (min_port, max_port);
103104#endif
105+ return random (min_port, max_port);
104106}
105107
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