mirror of
https://github.com/liberatedsystems/RNode_Firmware_CE.git
synced 2025-08-02 03:16:03 -04:00
Added NRF52 support
This commit is contained in:
parent
9206a3b9d9
commit
381d40c4f5
14 changed files with 1942 additions and 409 deletions
|
@ -43,7 +43,7 @@ volatile bool serial_buffering = false;
|
|||
|
||||
char sbuf[128];
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
bool packet_ready = false;
|
||||
#endif
|
||||
|
||||
|
@ -86,15 +86,15 @@ void setup() {
|
|||
|
||||
// Set chip select, reset and interrupt
|
||||
// pins for the LoRa module
|
||||
LoRa.setPins(pin_cs, pin_reset, pin_dio);
|
||||
LoRa.setPins(pin_cs, pin_reset, pin_dio, pin_rxen, pin_busy);
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
init_channel_stats();
|
||||
|
||||
// Check installed transceiver chip and
|
||||
// probe boot parameters.
|
||||
if (LoRa.preInit()) {
|
||||
sx1276_installed = true;
|
||||
modem_installed = true;
|
||||
uint32_t lfr = LoRa.getFrequency();
|
||||
if (lfr == 0) {
|
||||
// Normal boot
|
||||
|
@ -110,12 +110,12 @@ void setup() {
|
|||
}
|
||||
LoRa.setFrequency(M_FRQ_S);
|
||||
} else {
|
||||
sx1276_installed = false;
|
||||
modem_installed = false;
|
||||
}
|
||||
#else
|
||||
// Older variants only came with SX1276/78 chips,
|
||||
// so assume that to be the case for now.
|
||||
sx1276_installed = true;
|
||||
modem_installed = true;
|
||||
#endif
|
||||
|
||||
#if HAS_DISPLAY
|
||||
|
@ -173,7 +173,7 @@ inline void kiss_write_packet() {
|
|||
}
|
||||
serial_write(FEND);
|
||||
read_len = 0;
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
packet_ready = false;
|
||||
#endif
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
read_len = 0;
|
||||
seq = sequence;
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
last_rssi = LoRa.packetRssi();
|
||||
last_snr_raw = LoRa.packetSnrRaw();
|
||||
#endif
|
||||
|
@ -214,12 +214,14 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
// packet, so we add it to the buffer
|
||||
// and set the ready flag.
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
last_rssi = (last_rssi+LoRa.packetRssi())/2;
|
||||
last_snr_raw = (last_snr_raw+LoRa.packetSnrRaw())/2;
|
||||
#endif
|
||||
|
||||
|
||||
getPacketData(packet_size);
|
||||
|
||||
seq = SEQ_UNSET;
|
||||
ready = true;
|
||||
|
||||
|
@ -231,7 +233,7 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
read_len = 0;
|
||||
seq = sequence;
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
last_rssi = LoRa.packetRssi();
|
||||
last_snr_raw = LoRa.packetSnrRaw();
|
||||
#endif
|
||||
|
@ -250,7 +252,7 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
seq = SEQ_UNSET;
|
||||
}
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
last_rssi = LoRa.packetRssi();
|
||||
last_snr_raw = LoRa.packetSnrRaw();
|
||||
#endif
|
||||
|
@ -260,7 +262,7 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
}
|
||||
|
||||
if (ready) {
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
// We first signal the RSSI of the
|
||||
// recieved packet to the host.
|
||||
kiss_indicate_stat_rssi();
|
||||
|
@ -277,7 +279,7 @@ void ISR_VECT receive_callback(int packet_size) {
|
|||
// output directly to the host
|
||||
read_len = 0;
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
last_rssi = LoRa.packetRssi();
|
||||
last_snr_raw = LoRa.packetSnrRaw();
|
||||
getPacketData(packet_size);
|
||||
|
@ -375,7 +377,7 @@ void flushQueue(void) {
|
|||
led_tx_on();
|
||||
uint16_t processed = 0;
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
while (!fifo16_isempty(&packet_starts)) {
|
||||
#else
|
||||
while (!fifo16_isempty_locked(&packet_starts)) {
|
||||
|
@ -402,7 +404,7 @@ void flushQueue(void) {
|
|||
|
||||
queue_height = 0;
|
||||
queued_bytes = 0;
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
update_airtime();
|
||||
#endif
|
||||
queue_flushing = false;
|
||||
|
@ -410,7 +412,7 @@ void flushQueue(void) {
|
|||
|
||||
#define PHY_HEADER_LORA_SYMBOLS 8
|
||||
void add_airtime(uint16_t written) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
float packet_cost_ms = 0.0;
|
||||
float payload_cost_ms = ((float)written * lora_us_per_byte)/1000.0;
|
||||
packet_cost_ms += payload_cost_ms;
|
||||
|
@ -424,7 +426,7 @@ void add_airtime(uint16_t written) {
|
|||
}
|
||||
|
||||
void update_airtime() {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
uint16_t cb = current_airtime_bin();
|
||||
uint16_t pb = cb-1; if (cb-1 < 0) { pb = AIRTIME_BINS-1; }
|
||||
uint16_t nb = cb+1; if (nb == AIRTIME_BINS) { nb = 0; }
|
||||
|
@ -443,7 +445,7 @@ void update_airtime() {
|
|||
}
|
||||
longterm_channel_util = (float)longterm_channel_util_sum/(float)AIRTIME_BINS;
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
update_csma_p();
|
||||
#endif
|
||||
kiss_indicate_channel_stats();
|
||||
|
@ -813,13 +815,13 @@ void serialCallback(uint8_t sbyte) {
|
|||
kiss_indicate_fb();
|
||||
}
|
||||
} else if (command == CMD_DEV_HASH) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
if (sbyte != 0x00) {
|
||||
kiss_indicate_device_hash();
|
||||
}
|
||||
#endif
|
||||
} else if (command == CMD_DEV_SIG) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
if (sbyte == FESC) {
|
||||
ESCAPE = true;
|
||||
} else {
|
||||
|
@ -843,7 +845,7 @@ void serialCallback(uint8_t sbyte) {
|
|||
firmware_update_mode = false;
|
||||
}
|
||||
} else if (command == CMD_HASHES) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
if (sbyte == 0x01) {
|
||||
kiss_indicate_target_fw_hash();
|
||||
} else if (sbyte == 0x02) {
|
||||
|
@ -855,7 +857,7 @@ void serialCallback(uint8_t sbyte) {
|
|||
}
|
||||
#endif
|
||||
} else if (command == CMD_FW_HASH) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
if (sbyte == FESC) {
|
||||
ESCAPE = true;
|
||||
} else {
|
||||
|
@ -925,6 +927,8 @@ void serialCallback(uint8_t sbyte) {
|
|||
void updateModemStatus() {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
portENTER_CRITICAL(&update_lock);
|
||||
#elif MCU_VARIANT == MCU_NRF52
|
||||
portENTER_CRITICAL();
|
||||
#endif
|
||||
|
||||
uint8_t status = LoRa.modemStatus();
|
||||
|
@ -933,6 +937,8 @@ void updateModemStatus() {
|
|||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
portEXIT_CRITICAL(&update_lock);
|
||||
#elif MCU_VARIANT == MCU_NRF52
|
||||
portEXIT_CRITICAL();
|
||||
#endif
|
||||
|
||||
if ((status & SIG_DETECT) == SIG_DETECT) { stat_signal_detected = true; } else { stat_signal_detected = false; }
|
||||
|
@ -982,7 +988,7 @@ void checkModemStatus() {
|
|||
if (millis()-last_status_update >= status_interval_ms) {
|
||||
updateModemStatus();
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
util_samples[dcd_sample] = dcd;
|
||||
dcd_sample = (dcd_sample+1)%DCD_SAMPLES;
|
||||
if (dcd_sample % UTIL_UPDATE_INTERVAL == 0) {
|
||||
|
@ -1023,6 +1029,12 @@ void validate_status() {
|
|||
uint8_t F_POR = 0x00;
|
||||
uint8_t F_BOR = 0x00;
|
||||
uint8_t F_WDR = 0x01;
|
||||
#elif MCU_VARIANT == MCU_NRF52
|
||||
// TODO: Get NRF52 boot flags
|
||||
uint8_t boot_flags = 0x02;
|
||||
uint8_t F_POR = 0x00;
|
||||
uint8_t F_BOR = 0x00;
|
||||
uint8_t F_WDR = 0x01;
|
||||
#endif
|
||||
|
||||
if (hw_ready || device_init_done) {
|
||||
|
@ -1059,7 +1071,7 @@ void validate_status() {
|
|||
if (eeprom_product_valid() && eeprom_model_valid() && eeprom_hwrev_valid()) {
|
||||
if (eeprom_checksum_valid()) {
|
||||
eeprom_ok = true;
|
||||
if (sx1276_installed) {
|
||||
if (modem_installed) {
|
||||
#if PLATFORM == PLATFORM_ESP32
|
||||
if (device_init()) {
|
||||
hw_ready = true;
|
||||
|
@ -1071,7 +1083,7 @@ void validate_status() {
|
|||
#endif
|
||||
} else {
|
||||
hw_ready = false;
|
||||
Serial.write("No SX1276/SX1278 radio module found\r\n");
|
||||
Serial.write("No valid radio module found\r\n");
|
||||
#if HAS_DISPLAY
|
||||
if (disp_ready) {
|
||||
device_init_done = true;
|
||||
|
@ -1125,7 +1137,7 @@ void validate_status() {
|
|||
}
|
||||
}
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
#define _e 2.71828183
|
||||
#define _S 10.0
|
||||
float csma_slope(float u) { return (pow(_e,_S*u-_S/2.0))/(pow(_e,_S*u-_S/2.0)+1.0); }
|
||||
|
@ -1147,6 +1159,21 @@ void loop() {
|
|||
kiss_write_packet();
|
||||
}
|
||||
|
||||
airtime_lock = false;
|
||||
if (st_airtime_limit != 0.0 && airtime >= st_airtime_limit) airtime_lock = true;
|
||||
if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true;
|
||||
|
||||
#elif MCU_VARIANT == MCU_NRF52
|
||||
if (packet_ready) {
|
||||
portENTER_CRITICAL();
|
||||
last_rssi = LoRa.packetRssi();
|
||||
last_snr_raw = LoRa.packetSnrRaw();
|
||||
portEXIT_CRITICAL();
|
||||
kiss_indicate_stat_rssi();
|
||||
kiss_indicate_stat_snr();
|
||||
kiss_write_packet();
|
||||
}
|
||||
|
||||
airtime_lock = false;
|
||||
if (st_airtime_limit != 0.0 && airtime >= st_airtime_limit) airtime_lock = true;
|
||||
if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true;
|
||||
|
@ -1155,7 +1182,7 @@ void loop() {
|
|||
checkModemStatus();
|
||||
if (!airtime_lock) {
|
||||
if (queue_height > 0) {
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
long check_time = millis();
|
||||
if (check_time > post_tx_yield_timeout) {
|
||||
if (dcd_waiting && (check_time >= dcd_wait_until)) { dcd_waiting = false; }
|
||||
|
@ -1212,7 +1239,7 @@ void loop() {
|
|||
}
|
||||
}
|
||||
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
|
||||
buffer_serial();
|
||||
if (!fifo_isempty(&serialFIFO)) serial_poll();
|
||||
#else
|
||||
|
@ -1236,7 +1263,7 @@ volatile bool serial_polling = false;
|
|||
void serial_poll() {
|
||||
serial_polling = true;
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
while (!fifo_isempty_locked(&serialFIFO)) {
|
||||
#else
|
||||
while (!fifo_isempty(&serialFIFO)) {
|
||||
|
@ -1270,14 +1297,14 @@ void buffer_serial() {
|
|||
{
|
||||
c++;
|
||||
|
||||
#if MCU_VARIANT != MCU_ESP32
|
||||
#if MCU_VARIANT != MCU_ESP32 && MCU_VARIANT != MCU_NRF52
|
||||
if (!fifo_isfull_locked(&serialFIFO)) {
|
||||
fifo_push_locked(&serialFIFO, Serial.read());
|
||||
}
|
||||
#else
|
||||
if (HAS_BLUETOOTH && bt_state == BT_STATE_CONNECTED) {
|
||||
if (!fifo_isfull(&serialFIFO)) {
|
||||
fifo_push(&serialFIFO, SerialBT.read());
|
||||
//fifo_push(&serialFIFO, SerialBT.read());
|
||||
}
|
||||
} else {
|
||||
if (!fifo_isfull(&serialFIFO)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue