Skip to content

Commit f082a5f

Browse files
committed
changed handling of preconfigured pin settings
1 parent 33cc5c5 commit f082a5f

File tree

5 files changed

+119
-66
lines changed

5 files changed

+119
-66
lines changed

src/config/feature_config.template.h.jinja

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#define GPIO_CONFIGURATION_PIN_MODE_INPUT 1
3131
#define GPIO_CONFIGURATION_PIN_MODE_OUTPUT 2
3232

33-
{% for index in range(0, 32) %}
33+
{% for index in range(0, 64) %}
3434

3535
// <h>Pin {{ index }} configuration
3636

src/gpio/sensor_gpio.c

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,6 @@ void gpio_init(gpio_input_change_handler_t input_change_handler) {
345345
err_code = nrf_drv_gpiote_init();
346346
APP_ERROR_CHECK(err_code);
347347

348-
uint32_t current_index = 0;
349-
350348
// initialize virtual inputs first
351349
gpio_input_digital_pin_count = preconfigured_pin_count = VIRTUAL_INPUT_PIN_COUNT;
352350

@@ -358,65 +356,6 @@ void gpio_init(gpio_input_change_handler_t input_change_handler) {
358356
config->pin.input.pin = 0xFF;
359357
}
360358

361-
// this is in a macro instead of a function
362-
// to make it usable with the configuration macros
363-
#define GPIO_CONFIGURATION_CHECK(pin_index) \
364-
do{ \
365-
current_index = gpio_input_digital_pin_count + gpio_output_digital_pin_count; \
366-
gpio_config_t *gpio_config = gpio_configs + current_index; \
367-
if(GPIO_CONFIGURATION_PIN_##pin_index##_MODE == GPIO_CONFIGURATION_PIN_MODE_INPUT){ \
368-
gpio_input_digital_pin_count++; \
369-
preconfigured_pin_count++; \
370-
gpio_config->direction = INPUT; \
371-
gpio_config->pin.input.pin = pin_index; \
372-
gpio_config->pin.input.invert = GPIO_CONFIGURATION_PIN_##pin_index##_INVERT; \
373-
gpio_config->pin.input.pull = GPIO_CONFIGURATION_PIN_##pin_index##_PULL; \
374-
}else if(GPIO_CONFIGURATION_PIN_##pin_index##_MODE == GPIO_CONFIGURATION_PIN_MODE_OUTPUT){ \
375-
gpio_output_digital_pin_count++; \
376-
preconfigured_pin_count++; \
377-
gpio_config->direction = OUTPUT; \
378-
gpio_config->pin.output.pin = pin_index; \
379-
gpio_config->pin.output.invert = GPIO_CONFIGURATION_PIN_##pin_index##_INVERT; \
380-
gpio_config->pin.output.default_state = GPIO_CONFIGURATION_PIN_##pin_index##_DEFAULT_OUTPUT; \
381-
gpio_config->pin.output.state = 0xff; \
382-
} \
383-
}while (false)
384-
385-
// is this neccessary?
386-
// well, i see no other way of dealing with preprocessor-based configuration...
387-
GPIO_CONFIGURATION_CHECK(0);
388-
GPIO_CONFIGURATION_CHECK(1);
389-
GPIO_CONFIGURATION_CHECK(2);
390-
GPIO_CONFIGURATION_CHECK(3);
391-
GPIO_CONFIGURATION_CHECK(4);
392-
GPIO_CONFIGURATION_CHECK(5);
393-
GPIO_CONFIGURATION_CHECK(6);
394-
GPIO_CONFIGURATION_CHECK(7);
395-
GPIO_CONFIGURATION_CHECK(8);
396-
GPIO_CONFIGURATION_CHECK(9);
397-
GPIO_CONFIGURATION_CHECK(10);
398-
GPIO_CONFIGURATION_CHECK(11);
399-
GPIO_CONFIGURATION_CHECK(12);
400-
GPIO_CONFIGURATION_CHECK(13);
401-
GPIO_CONFIGURATION_CHECK(14);
402-
GPIO_CONFIGURATION_CHECK(15);
403-
GPIO_CONFIGURATION_CHECK(16);
404-
GPIO_CONFIGURATION_CHECK(17);
405-
GPIO_CONFIGURATION_CHECK(18);
406-
GPIO_CONFIGURATION_CHECK(19);
407-
GPIO_CONFIGURATION_CHECK(20);
408-
GPIO_CONFIGURATION_CHECK(21);
409-
GPIO_CONFIGURATION_CHECK(22);
410-
GPIO_CONFIGURATION_CHECK(23);
411-
GPIO_CONFIGURATION_CHECK(24);
412-
GPIO_CONFIGURATION_CHECK(25);
413-
GPIO_CONFIGURATION_CHECK(26);
414-
GPIO_CONFIGURATION_CHECK(27);
415-
GPIO_CONFIGURATION_CHECK(28);
416-
GPIO_CONFIGURATION_CHECK(29);
417-
GPIO_CONFIGURATION_CHECK(30);
418-
GPIO_CONFIGURATION_CHECK(31);
419-
420359
pin_configuration_init();
421360

422361
gpio_output_digital_pin_count += get_pin_count_output_digital();

src/storage/preconfiguration.c

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

src/storage/preconfiguration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
void preconfiguration_load(uint8_t *data);

src/storage/storage.nrf52.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "feature_config.h"
66
#include "nrf_fstorage_sd.h"
77
#include "nrf_fstorage_nvmc.h"
8+
#include "preconfiguration.h"
89

910
NRF_FSTORAGE_DEF(nrf_fstorage_t m_storage) =
1011
{
@@ -20,6 +21,8 @@ NRF_FSTORAGE_DEF(nrf_fstorage_t m_storage) =
2021
#endif
2122
};
2223

24+
bool is_erased = true;
25+
2326
void fs_evt_handler(nrf_fstorage_evt_t * p_evt) {
2427

2528

@@ -76,10 +79,8 @@ void storage_checksum_check(){
7679
// read 4 more to capcure checksum
7780
storage_read(0x00, data, length + 4);
7881

79-
bool is_erased = true;
80-
81-
for(uint32_t i = 0; i < length; i++){
82-
if(data[i] != 0xFF){
82+
for(uint32_t i = 0; i < 4; i++){
83+
if(data[OFFSET_CHECKSUM + i] != 0xFF){
8384
is_erased = false;
8485
break;
8586
}
@@ -144,6 +145,10 @@ void storage_init() {
144145

145146
void storage_read_pin_configuration(uint8_t *buffer) {
146147
storage_read(OFFSET_PIN_CONFIGURATION, buffer, PIN_CONFIGURATION_LENGTH);
148+
149+
if(is_erased) {
150+
preconfiguration_load(buffer);
151+
}
147152
}
148153

149154
void storage_read_connection_params_configuration(uint8_t *buffer) {
@@ -177,6 +182,10 @@ void storage_store(uint32_t offset, const uint8_t *data, uint32_t length, const
177182
static uint8_t storage_data[CONFIGURATION_SIZE];
178183
storage_read(0, storage_data, size); // read whole storage
179184

185+
if(is_erased) {
186+
preconfiguration_load(storage_data + OFFSET_PIN_CONFIGURATION);
187+
}
188+
180189
memcpy(storage_data + offset, data, length);
181190

182191
uint32_t checksum = checksum_compute(storage_data, OFFSET_CHECKSUM);

0 commit comments

Comments
 (0)