1+ #include <stdint.h>
2+ #include <stdbool.h>
3+ #include <feature_config.h>
4+ #include <nrf_log.h>
5+
6+ /*
7+ This is awful.
8+ I am sorry for whoever needs to read and understand this.
9+
10+ If it's you Daniel, f you. You are responsible for this.
11+ */
12+
13+ #define GPIO_CONFIGURATION_CHECK (pin_index , data ) \
14+ do{ \
15+ uint8_t bits = 0b1111; \
16+ if(GPIO_CONFIGURATION_PIN_##pin_index##_MODE != GPIO_CONFIGURATION_PIN_MODE_DISABLED){ \
17+ bits = ((GPIO_CONFIGURATION_PIN_##pin_index##_MODE == GPIO_CONFIGURATION_PIN_MODE_INPUT) << 3) \
18+ | ((GPIO_CONFIGURATION_PIN_##pin_index##_INVERT)); \
19+ \
20+ if(GPIO_CONFIGURATION_PIN_##pin_index##_MODE == GPIO_CONFIGURATION_PIN_MODE_INPUT) { \
21+ bits |= (GPIO_CONFIGURATION_PIN_##pin_index##_PULL << 1); \
22+ }else{ \
23+ bits |= (GPIO_CONFIGURATION_PIN_##pin_index##_DEFAULT_OUTPUT << 1); \
24+ } \
25+ \
26+ uint8_t *pin_bits = data + ((HARDWARE_PIN_COUNT - pin_index - 1) / 2); \
27+ if((pin_index & 1) == 0) { \
28+ (*pin_bits) &= 0b11110000; \
29+ (*pin_bits) |= bits; \
30+ }else{ \
31+ (*pin_bits) &= 0b00001111; \
32+ (*pin_bits) |= (bits << 4); \
33+ } \
34+ } \
35+ }while (false)
36+
37+ void preconfiguration_load (uint8_t * data ) {
38+ GPIO_CONFIGURATION_CHECK (0 , data );
39+ GPIO_CONFIGURATION_CHECK (1 , data );
40+ GPIO_CONFIGURATION_CHECK (2 , data );
41+ GPIO_CONFIGURATION_CHECK (3 , data );
42+ GPIO_CONFIGURATION_CHECK (4 , data );
43+ GPIO_CONFIGURATION_CHECK (5 , data );
44+ GPIO_CONFIGURATION_CHECK (6 , data );
45+ GPIO_CONFIGURATION_CHECK (7 , data );
46+ GPIO_CONFIGURATION_CHECK (8 , data );
47+ GPIO_CONFIGURATION_CHECK (9 , data );
48+ GPIO_CONFIGURATION_CHECK (10 , data );
49+ GPIO_CONFIGURATION_CHECK (11 , data );
50+ GPIO_CONFIGURATION_CHECK (12 , data );
51+ GPIO_CONFIGURATION_CHECK (13 , data );
52+ GPIO_CONFIGURATION_CHECK (14 , data );
53+ GPIO_CONFIGURATION_CHECK (15 , data );
54+ GPIO_CONFIGURATION_CHECK (16 , data );
55+ GPIO_CONFIGURATION_CHECK (17 , data );
56+ GPIO_CONFIGURATION_CHECK (18 , data );
57+ GPIO_CONFIGURATION_CHECK (19 , data );
58+ GPIO_CONFIGURATION_CHECK (20 , data );
59+ GPIO_CONFIGURATION_CHECK (21 , data );
60+ GPIO_CONFIGURATION_CHECK (22 , data );
61+ GPIO_CONFIGURATION_CHECK (23 , data );
62+ GPIO_CONFIGURATION_CHECK (24 , data );
63+ GPIO_CONFIGURATION_CHECK (25 , data );
64+ GPIO_CONFIGURATION_CHECK (26 , data );
65+ GPIO_CONFIGURATION_CHECK (27 , data );
66+ GPIO_CONFIGURATION_CHECK (28 , data );
67+ GPIO_CONFIGURATION_CHECK (29 , data );
68+ GPIO_CONFIGURATION_CHECK (30 , data );
69+ GPIO_CONFIGURATION_CHECK (31 , data );
70+ #if HARDWARE_PIN_COUNT == 64
71+ GPIO_CONFIGURATION_CHECK (32 , data );
72+ GPIO_CONFIGURATION_CHECK (33 , data );
73+ GPIO_CONFIGURATION_CHECK (34 , data );
74+ GPIO_CONFIGURATION_CHECK (35 , data );
75+ GPIO_CONFIGURATION_CHECK (36 , data );
76+ GPIO_CONFIGURATION_CHECK (37 , data );
77+ GPIO_CONFIGURATION_CHECK (38 , data );
78+ GPIO_CONFIGURATION_CHECK (39 , data );
79+ GPIO_CONFIGURATION_CHECK (40 , data );
80+ GPIO_CONFIGURATION_CHECK (41 , data );
81+ GPIO_CONFIGURATION_CHECK (42 , data );
82+ GPIO_CONFIGURATION_CHECK (43 , data );
83+ GPIO_CONFIGURATION_CHECK (44 , data );
84+ GPIO_CONFIGURATION_CHECK (45 , data );
85+ GPIO_CONFIGURATION_CHECK (46 , data );
86+ GPIO_CONFIGURATION_CHECK (47 , data );
87+ GPIO_CONFIGURATION_CHECK (48 , data );
88+ GPIO_CONFIGURATION_CHECK (49 , data );
89+ GPIO_CONFIGURATION_CHECK (50 , data );
90+ GPIO_CONFIGURATION_CHECK (51 , data );
91+ GPIO_CONFIGURATION_CHECK (52 , data );
92+ GPIO_CONFIGURATION_CHECK (53 , data );
93+ GPIO_CONFIGURATION_CHECK (54 , data );
94+ GPIO_CONFIGURATION_CHECK (55 , data );
95+ GPIO_CONFIGURATION_CHECK (56 , data );
96+ GPIO_CONFIGURATION_CHECK (57 , data );
97+ GPIO_CONFIGURATION_CHECK (58 , data );
98+ GPIO_CONFIGURATION_CHECK (59 , data );
99+ GPIO_CONFIGURATION_CHECK (60 , data );
100+ GPIO_CONFIGURATION_CHECK (61 , data );
101+ GPIO_CONFIGURATION_CHECK (62 , data );
102+ GPIO_CONFIGURATION_CHECK (63 , data );
103+ #endif
104+ }
0 commit comments