Skip to content

Commit 9e23265

Browse files
authored
Add files via upload
1 parent 72bbe4d commit 9e23265

File tree

3 files changed

+587
-0
lines changed

3 files changed

+587
-0
lines changed

rp2350/oceantoo_rp2350.c

Lines changed: 394 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,394 @@
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

Comments
 (0)