1+ #include <stdio.h>
2+ #include "pico/stdlib.h"
3+ #include "pico/aon_timer.h"
4+ #include <stdint.h>
5+ #include <stdlib.h>
6+ #include <string.h>
7+ #include <unistd.h>
8+ #include <time.h>
9+ #include <sys/time.h>
10+
11+
12+ #include "hardware/pll.h"
13+ #include "hardware/clocks.h"
14+ #include "hardware/structs/pll.h"
15+ #include "hardware/structs/clocks.h"
16+
17+
18+ #include "sha256.h"
19+
20+ #define BUFFER_SZ 4096
21+
22+ /**************************** DATA TYPES ****************************/
23+ typedef struct lfsr128_t {
24+ uint64_t lfsr_h ;
25+ uint64_t lfsr_l ;
26+ } lfsr128_t ;
27+
28+ typedef struct lfsr128x3_t {
29+ lfsr128_t lfsr [3 ];
30+ } lfsr128x3_t ;
31+
32+ lfsr128x3_t lfsr ;
33+
34+ uint8_t buffer [BUFFER_SZ ];
35+
36+ void lfsr128_set_password (lfsr128_t * l , unsigned char * p );
37+ void lfsr128_init (lfsr128_t * l , uint64_t lfsr_h , uint64_t lfsr_l );
38+ uint64_t lfsr128_shift (lfsr128_t * l );
39+ uint64_t lfsr128_shiftn (lfsr128_t * l , uint8_t n );
40+ uint64_t lfsr128_shift_with_mult_dec (lfsr128x3_t * l );
41+ uint64_t lfsr128_shiftn_with_mult_dec (lfsr128x3_t * l , uint8_t n );
42+ uint64_t lfsr128_shift_return_carry (lfsr128_t * l );
43+ void lfsr128x3_set_password (lfsr128x3_t * l , unsigned char * p );
44+ uint64_t lfsr128_shift_with_mult_dec (lfsr128x3_t * l );
45+
46+ //
47+ // LED stuff
48+ //
49+
50+ //#define MYLED LED_BUILTIN
51+ #define MYLED PC13 // Blackpill or Bluepill
52+ //#define MYLED 14
53+ //#define MYLED 19 // ESP-C3-12F
54+
55+ #define YIELDNEEDED 0
56+
57+ #define NEOPIXEL 0
58+ #define ESP32NEOPIXEL 0
59+
60+ #define ESP_WIFI_SLEEP 0
61+
62+ #if ESP_WIFI_SLEEP
63+ #include <WiFi.h>
64+ #endif
65+
66+ #if NEOPIXEL
67+ //#define LED_PIN 11 // Jade Pebble
68+ //#define LED_PIN 2 // Carbon V3 - ESP32
69+ //#define LED_ENABLE_PIN 4 // Carbon V3 - ESP32
70+ #define LED_PIN 1 // Carbon S2 - ESP32-S2
71+ #define LED_ENABLE_PIN 2 // Carbon S2 - ESP32-S2
72+ #define LED_COUNT 1
73+ #define BRIGHTNESS 50
74+ #include <Adafruit_NeoPixel.h>
75+ Adafruit_NeoPixel strip (LED_COUNT , LED_PIN , NEO_GRB + NEO_KHZ800 );
76+
77+ void colorWipe (uint32_t color , int wait ) {
78+ for (int i = 0 ; i < strip .numPixels (); i ++ ) { // For each pixel in strip...
79+ strip .setPixelColor (i , color ); // Set pixel's color (in RAM)
80+ strip .show (); // Update strip to match
81+ delay (wait ); // Pause for a moment
82+ }
83+ }
84+
85+ #endif
86+
87+ #if ESP_WIFI_SLEEP
88+ void initWiFi () {
89+ WiFi .mode (WIFI_STA );
90+ WiFi .begin ("KIDS" , "12345678sims" );
91+ //Serial.print("Connecting to WiFi ..");
92+ while (WiFi .status () != WL_CONNECTED ) {
93+ //Serial.print('.');
94+ delay (1000 );
95+ }
96+ //Serial.println(WiFi.localIP());
97+ }
98+
99+ void sleepWiFi () {
100+ WiFi .setSleep (WIFI_PS_MAX_MODEM );
101+ //Serial.println("Modem asleep");
102+ }
103+
104+ #endif
105+
106+
107+ void lfsr128_set_password (lfsr128_t * l , unsigned char * p ) {
108+ BYTE buf [SHA256_BLOCK_SIZE ];
109+ SHA256_CTX ctx ;
110+ uint64_t lfsr_h ;
111+ uint64_t lfsr_l ;
112+
113+ sha256_init (& ctx );
114+ sha256_update (& ctx , p , strlen ((char * )p ));
115+ sha256_final (& ctx , buf );
116+ memcpy (& lfsr_h , buf , sizeof (uint64_t ));
117+ memcpy (& lfsr_l , buf + sizeof (uint64_t ), sizeof (uint64_t ));
118+ lfsr128_init (l , lfsr_h , lfsr_l );
119+ }
120+
121+ void lfsr128x3_set_from_captain (lfsr128_t * captain , lfsr128x3_t * l ) {
122+ l -> lfsr [0 ].lfsr_h = lfsr128_shiftn (captain , 64 );
123+ l -> lfsr [0 ].lfsr_l = lfsr128_shiftn (captain , 64 );
124+ l -> lfsr [1 ].lfsr_h = lfsr128_shiftn (captain , 64 );
125+ l -> lfsr [1 ].lfsr_l = lfsr128_shiftn (captain , 64 );
126+ l -> lfsr [2 ].lfsr_h = lfsr128_shiftn (captain , 64 );
127+ l -> lfsr [2 ].lfsr_l = lfsr128_shiftn (captain , 64 );
128+ }
129+
130+ void lfsr128x3_set_password (lfsr128x3_t * l , unsigned char * p ) {
131+ lfsr128_t lfsr128_captain ;
132+
133+ lfsr128_set_password (& lfsr128_captain , p );
134+ lfsr128x3_set_from_captain (& lfsr128_captain , l );
135+ }
136+
137+ void lfsr128x3_set_init_state (lfsr128x3_t * l , lfsr128_t * initState ) {
138+ l -> lfsr [0 ].lfsr_h = initState -> lfsr_h ;
139+ l -> lfsr [0 ].lfsr_l = initState -> lfsr_l ;
140+ l -> lfsr [1 ].lfsr_h = initState -> lfsr_h ;
141+ l -> lfsr [1 ].lfsr_l = initState -> lfsr_l ;
142+ l -> lfsr [2 ].lfsr_h = initState -> lfsr_h ;
143+ l -> lfsr [2 ].lfsr_l = initState -> lfsr_l ;
144+ }
145+
146+ void lfsr128x3_set_cap_state (lfsr128x3_t * l , lfsr128_t * initState ) {
147+ lfsr128_t lfsr128_captain ;
148+
149+ lfsr128_init (& lfsr128_captain , initState -> lfsr_h , initState -> lfsr_l );
150+ lfsr128x3_set_from_captain (& lfsr128_captain , l );
151+ }
152+
153+ void lfsr128_init (lfsr128_t * l , uint64_t lfsr_h , uint64_t lfsr_l ) {
154+ l -> lfsr_h = lfsr_h ;
155+ l -> lfsr_l = lfsr_l ;
156+ }
157+
158+ uint64_t lfsr128_shift (lfsr128_t * l ) {
159+ uint64_t bit , bit_h , r ;
160+ r = l -> lfsr_l & 1 ;
161+ bit = ((l -> lfsr_l >> 0 ) ^ (l -> lfsr_l >> 1 ) ^ (l -> lfsr_l >> 2 ) ^ (l -> lfsr_l >> 7 )) & 1 ;
162+ bit_h = l -> lfsr_h & 1 ;
163+ l -> lfsr_l = (l -> lfsr_l >> 1 ) | (bit_h << 63 );
164+ l -> lfsr_h = (l -> lfsr_h >> 1 ) | (bit << 63 );
165+
166+ return r ;
167+ }
168+
169+ /*
170+ * Return the carry bit, not the shited out bit
171+ */
172+ uint64_t lfsr128_shift_return_carry (lfsr128_t * l ) {
173+ uint64_t bit , bit_h ;
174+ bit = ((l -> lfsr_l >> 0 ) ^ (l -> lfsr_l >> 1 ) ^ (l -> lfsr_l >> 2 ) ^ (l -> lfsr_l >> 7 )) & 1 ;
175+ bit_h = l -> lfsr_h & 1 ;
176+ l -> lfsr_l = (l -> lfsr_l >> 1 ) | (bit_h << 63 );
177+ l -> lfsr_h = (l -> lfsr_h >> 1 ) | (bit << 63 );
178+
179+ return bit ;
180+ }
181+
182+ uint64_t lfsr128_shiftn (lfsr128_t * l , uint8_t n ) {
183+ uint64_t r = 0 ;
184+ int i ;
185+ r = lfsr128_shift (l );
186+ for (i = 0 ; i < n - 1 ; i ++ ) {
187+ r = r << 1 ;
188+ r = r | lfsr128_shift (l );
189+ }
190+
191+ return r ;
192+ }
193+
194+ uint64_t lfsr128_shift_with_mult_dec (lfsr128x3_t * l ) {
195+ uint64_t r0 , r1 , r2 ;
196+
197+ r0 = lfsr128_shift (& l -> lfsr [0 ]);
198+ r1 = lfsr128_shift (& l -> lfsr [1 ]);
199+ r2 = lfsr128_shift_return_carry (& l -> lfsr [2 ]);
200+
201+ if (r2 == 1 ) {
202+ /* Decimate r0 by 1 bit, r2 by 2 bits*/
203+ r0 = lfsr128_shift (& l -> lfsr [0 ]);
204+ r1 = lfsr128_shift (& l -> lfsr [1 ]);
205+ r1 = lfsr128_shift (& l -> lfsr [1 ]);
206+ }
207+
208+ return r0 ^ r1 ;
209+ }
210+
211+ uint64_t lfsr128_shiftn_with_mult_dec (lfsr128x3_t * l , uint8_t n ) {
212+ uint64_t r = 0 ;
213+ int i ;
214+
215+ r = lfsr128_shift_with_mult_dec (l );
216+ for (i = 0 ; i < n - 1 ; i ++ ) {
217+ r = r << 1 ;
218+ r = r | lfsr128_shift_with_mult_dec (l );
219+ }
220+
221+ return r ;
222+ }
223+
224+ void code_buffer (uint8_t * b , lfsr128x3_t * l , int sz ) {
225+ for (int i = 0 ; i < sz ; i ++ ) {
226+ b [i ] = b [i ] ^ (uint8_t )lfsr128_shiftn_with_mult_dec (l , 8 );
227+ }
228+ }
229+
230+ void do_print_random_numbers (lfsr128x3_t * l , int sz ) {
231+ uint64_t ln = 0 ;
232+
233+ do {
234+ ln ++ ;
235+ printf ("%03d\n" , (uint8_t )lfsr128_shiftn_with_mult_dec (l , 8 ));
236+ } while (ln < sz );
237+ }
238+
239+ void measure_freqs (void ) {
240+ uint f_pll_sys = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_PLL_SYS_CLKSRC_PRIMARY );
241+ uint f_pll_usb = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_PLL_USB_CLKSRC_PRIMARY );
242+ uint f_rosc = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_ROSC_CLKSRC );
243+ uint f_clk_sys = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_SYS );
244+ uint f_clk_peri = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_PERI );
245+ uint f_clk_usb = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_USB );
246+ uint f_clk_adc = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_ADC );
247+ #ifdef CLOCKS_FC0_SRC_VALUE_CLK_RTC
248+ uint f_clk_rtc = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_RTC );
249+ #endif
250+
251+ printf ("pll_sys = %dkHz\n" , f_pll_sys );
252+ printf ("pll_usb = %dkHz\n" , f_pll_usb );
253+ printf ("rosc = %dkHz\n" , f_rosc );
254+ printf ("clk_sys = %dkHz\n" , f_clk_sys );
255+ printf ("clk_peri = %dkHz\n" , f_clk_peri );
256+ printf ("clk_usb = %dkHz\n" , f_clk_usb );
257+ printf ("clk_adc = %dkHz\n" , f_clk_adc );
258+ #ifdef CLOCKS_FC0_SRC_VALUE_CLK_RTC
259+ printf ("clk_rtc = %dkHz\n" , f_clk_rtc );
260+ #endif
261+
262+ // Can't measure clk_ref / xosc as it is the ref
263+ }
264+
265+ static void alarm_callback (void ) {
266+ printf ("Alarm fired\n" );
267+ stdio_flush ();
268+ }
269+
270+ int main () {
271+ stdio_init_all ();
272+
273+ #if NEOPIXEL
274+ #if ESP32NEOPIXEL
275+ pinMode (LED_ENABLE_PIN , OUTPUT );
276+ digitalWrite (LED_ENABLE_PIN , 0 );
277+ #endif
278+ strip .begin (); // INITIALIZE NeoPixel strip object (REQUIRED)
279+ strip .show (); // Turn OFF all pixels ASAP
280+ strip .setBrightness (50 ); // Set BRIGHTNESS to about 1/5 (max = 255)
281+ colorWipe (strip .Color (0 , 0 , 0 ), 500 );
282+ #endif
283+
284+ // initialize digital pin MYLED as an output.
285+ #if MYLED
286+ pinMode (MYLED , OUTPUT );
287+ digitalWrite (MYLED , LOW );
288+ #endif
289+ printf ("Init...\n" );
290+ sleep_ms (5000 );
291+ printf ("Start...\n" );
292+ #if MYSERIAL
293+ mySerial .println (F ("mySerial Start..." ));
294+ #endif
295+
296+ #if ESP_WIFI_SLEEP
297+ //initWiFi();
298+ sleepWiFi ();
299+ #endif
300+
301+ lfsr128x3_set_password (& lfsr , (unsigned char * )"password1234" );
302+ for (int i = 0 ; i < BUFFER_SZ ; i ++ ) {
303+ buffer [i ] = (uint8_t )i % 256 ;
304+ }
305+
306+ #if MYLED
307+ digitalWrite (MYLED , HIGH );
308+ #endif
309+
310+ #if PICO_RP2350
311+ printf ("I'm an RP2350 " );
312+ #ifdef __riscv
313+ printf ("running RISC-V\n" );
314+ #else
315+ printf ("running ARM\n" );
316+ #endif
317+ #endif
318+
319+ int count = 0 ;
320+
321+ clock_t startt = clock ();
322+ printf ("Started at %u\n" , startt );
323+ //Serial.printf("%02x %02x %02x %02x\n", buffer[0],buffer[1],buffer[2],buffer[3]);
324+ for (count = 0 ; count < 600 ; count ++ ) {
325+ #if YIELDNEEDED
326+ vTaskDelay (1 );
327+ taskYIELD ();
328+ #endif
329+ code_buffer (buffer , & lfsr , BUFFER_SZ );
330+ }
331+
332+ clock_t endt = clock ();
333+ printf ("Ended at %u\n" , endt );
334+ printf ("%d\n" , count );
335+ printf ("%d\n" , (int ) (endt - startt ));
336+
337+
338+
339+ measure_freqs ();
340+
341+ // Change clk_sys to be 48MHz. The simplest way is to take this from PLL_USB
342+ // which has a source frequency of 48MHz
343+ clock_configure (clk_sys ,
344+ CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX ,
345+ CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB ,
346+ 48 * MHZ ,
347+ 48 * MHZ );
348+
349+ // Turn off PLL sys for good measure
350+ pll_deinit (pll_sys );
351+
352+ // CLK peri is clocked from clk_sys so need to change clk_peri's freq
353+ clock_configure (clk_peri ,
354+ 0 ,
355+ CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS ,
356+ 48 * MHZ ,
357+ 48 * MHZ );
358+
359+ // Re init uart now that clk_peri has changed
360+ stdio_init_all ();
361+
362+ measure_freqs ();
363+ printf ("Hello, 48MHz\n" );
364+
365+ sleep_ms (10000 );
366+
367+ struct timespec ts ;
368+ struct timeval tv ;
369+ gettimeofday (& tv , NULL );
370+ ts .tv_sec = tv .tv_sec ;
371+ ts .tv_nsec = tv .tv_usec * 1000 ;
372+ ts .tv_sec = ts .tv_sec + 10 ;
373+ aon_timer_enable_alarm (& ts , (aon_timer_alarm_handler_t ) alarm_callback , false);
374+
375+ printf ("Go into loop\n" );
376+ stdio_flush ();
377+
378+ for (;;) {
379+ #if NEOPIXEL
380+ colorWipe (strip .Color (255 , 0 , 0 ), 500 ); // Blue
381+ #endif
382+ #if MYLED
383+ digitalWrite (MYLED , HIGH ); // turn the LED on (HIGH is the voltage level)
384+ #endif
385+ sleep_ms (250 ); // wait for a second
386+ #if NEOPIXEL
387+ colorWipe (strip .Color (0 , 0 , 0 ), 500 ); // Blue
388+ #endif
389+ #if MYLED
390+ digitalWrite (MYLED , LOW ); // turn the LED off by making the voltage LOW
391+ #endif
392+ sleep_ms (250 ); // wait for a second
393+ }
394+ }
0 commit comments