wayne roberts / Mbed OS utility_sx12xx
Revision:
9:295e37c38fb3
Parent:
8:f8918514ec50
Child:
11:3a73edb3b246
--- a/radio_sx126x.cpp	Wed Mar 04 19:33:21 2020 +0000
+++ b/radio_sx126x.cpp	Mon May 04 17:54:55 2020 -0700
@@ -46,6 +46,7 @@
 uint8_t Radio::bw_idx;
 uint8_t Radio::cadParams[7];
 uint16_t Radio::ppg;
+unsigned Radio::tcxoDelayTicks;
 
 const char* opModes[] = {
     "SLEEP    ", // 0
@@ -168,6 +169,8 @@
         cadParams[2] = radio.readReg(REG_ADDR_LORA_CAD_MINPEAK, 1);
     }
 
+    pa_config_buf[2] = chipType;    /* auto-detect device from pin pull */
+    radio.xfer(OPCODE_SET_PA_CONFIG, 4, 0, pa_config_buf);
 }
 
 void Radio::hw_reset()
@@ -393,7 +396,7 @@
 const char* Radio::tx_ramp_strs[] = {
     "10  ", // 0
     "20  ", // 1
-    "80  ", // 2
+    "40  ", // 2
     "80  ", // 3
     "200 ", // 4
     "800 ", // 5
@@ -579,14 +582,14 @@
     antswPower = 0;
 }
 
-void Radio::cadDone(bool det)
+/*void Radio::cadDone(bool det)
 {
     log_printf("cadDone ");
     if (det)
         pc.printf("CadDetected");
 
     pc.printf("\r\n");
-}
+}*/
 
 uint8_t ana_regs[128];
 
@@ -606,6 +609,8 @@
 
     lpt.start();
     radio.SetDIO2AsRfSwitchCtrl(1);
+
+    tcxoDelayTicks = 3200;   // some default timeout for tcxo
 }
 
 bool Radio::deviceSel_read()
@@ -618,10 +623,11 @@
 
 bool Radio::deviceSel_push()
 {
-    if (pa_config_buf[2])
+/*    if (pa_config_buf[2])
         pa_config_buf[2] = 0;
     else
-        pa_config_buf[2] = 1;
+        pa_config_buf[2] = 1;*/
+    pa_config_buf[2] ^= 1;
 
     radio.xfer(OPCODE_SET_PA_CONFIG, 4, 0, pa_config_buf);
 
@@ -740,6 +746,142 @@
 
 const value_item_t Radio::xtb_item = { _ITEM_VALUE, 3, xtb_print, xtb_write};
 
+void Radio::ldo_push()
+{
+    uint8_t buf = 0;
+    radio.xfer(OPCODE_SET_REGULATOR_MODE, 1, 0, &buf);
+    log_printf("-> LDO\r\n");
+}
+
+const button_item_t Radio::ldo_item = { _ITEM_BUTTON, "LDO", ldo_push };
+
+void Radio::dcdc_push()
+{
+    uint8_t buf = 1;
+    radio.xfer(OPCODE_SET_REGULATOR_MODE, 1, 0, &buf);
+    log_printf("-> DC-DC\r\n");
+}
+
+const button_item_t Radio::dcdc_item = { _ITEM_BUTTON, "DCDC", dcdc_push };
+
+static const char* const rxfe_pms[] = {
+    "LP  0dB",
+    "HP1 2dB",
+    "HP2 4dB",
+    "HP3 6dB",
+    NULL
+};
+
+unsigned Radio::rxfe_pm_read(bool)
+{
+    AgcSensiAdj_t agcs;
+    agcs.octet = radio.readReg(REG_ADDR_AGC_SENSI_ADJ, 1);
+    return agcs.bits.power_mode;
+}
+
+menuMode_e Radio::rxfe_pm_write(unsigned sidx)
+{
+    AgcSensiAdj_t agcs;
+    agcs.octet = radio.readReg(REG_ADDR_AGC_SENSI_ADJ, 1);
+    agcs.bits.power_mode = sidx;
+    radio.writeReg(REG_ADDR_AGC_SENSI_ADJ, agcs.octet, 1);
+    return MENUMODE_REDRAW;
+}
+
+const dropdown_item_t Radio::rxfe_pm_item = { _ITEM_DROPDOWN, rxfe_pms, rxfe_pms, rxfe_pm_read, rxfe_pm_write};
+
+#ifdef MEMSCAN
+#define SHADOW_SIZE     0x9ff
+uint8_t Radio::shadow_read[SHADOW_SIZE];
+
+void Radio::memread_push()
+{
+    unsigned addr;
+    for (addr = 0; addr < SHADOW_SIZE; addr++) {
+        shadow_read[addr] = radio.readReg(addr, 1);
+    }
+    log_printf("memread\r\n");
+}
+
+const button_item_t Radio::memread_item = { _ITEM_BUTTON, "MRead", memread_push };
+
+void Radio::memcmp_push()
+{
+    unsigned addr;
+    uint8_t r;
+    for (addr = 0; addr < SHADOW_SIZE; addr++) {
+        r = radio.readReg(addr, 1);
+        if (shadow_read[addr] != r) {
+            log_printf("%03x: %02x -> %02x\r\n", addr, shadow_read[addr], r);
+        }
+    }
+    log_printf("memcmpDone\r\n");
+}
+
+const button_item_t Radio::memcmp_item = { _ITEM_BUTTON, "MCmp", memcmp_push };
+#endif /* MEMSCAN */
+
+void to_big_endian24(uint32_t in, uint8_t *out)
+{
+    out[2] = in & 0xff;
+    in >>= 8;
+    out[1] = in & 0xff;
+    in >>= 8;
+    out[0] = in & 0xff;
+}
+
+void Radio::tcxo_volts_print(void)
+{
+    // yyy;
+}
+
+bool Radio::tcxo_volts_write(const char *txt)
+{
+    uint8_t buf[4];
+    float volts;
+    sscanf(txt, "%f", &volts);
+    if (volts > 3.15)
+        buf[0] = 7;  // 3.3v
+    else if (volts > 2.85)
+        buf[0] = 6; // 3.0v
+    else if (volts > 2.55)
+        buf[0] = 5; // 2.7v
+    else if (volts > 2.3)
+        buf[0] = 4; // 2.4v
+    else if (volts > 2.3)
+        buf[0] = 3; // 2.2v
+    else if (volts > 2.0)
+        buf[0] = 2; // 1.8v
+    else if (volts > 1.65)
+        buf[0] = 1; // 1.7v
+    else
+        buf[0] = 0; // 1.6v
+
+    to_big_endian24(tcxoDelayTicks, buf+1);
+
+    radio.xfer(OPCODE_SET_DIO3_AS_TCXO_CTRL, 4, 0, buf);
+    log_printf("set txco %u, %u\r\n", buf[0], tcxoDelayTicks);
+    return false;
+}
+
+const value_item_t Radio::tcxo_volts_item = { _ITEM_VALUE, 3, tcxo_volts_print, tcxo_volts_write};
+
+void Radio::tcxo_delay_print(void)
+{
+    pc.printf("%u", tcxoDelayTicks / 64);
+}
+
+
+bool Radio::tcxo_delay_write(const char *txt)
+{
+    unsigned ms;
+    sscanf(txt, "%u", &ms);
+    tcxoDelayTicks = ms * 64;
+    return false;
+}
+
+const value_item_t Radio::tcxo_delay_item = { _ITEM_VALUE, 5, tcxo_delay_print, tcxo_delay_write};
+
 const menu_t Radio::common_menu[] = {
     { {FIRST_CHIP_MENU_ROW,  1},   "deviceSel:",   &deviceSel_item, FLAG_MSGTYPE_ALL, &tx_dbm_item },
     { {FIRST_CHIP_MENU_ROW, 18}, "paDutyCycle:", &paDutyCycle_item, FLAG_MSGTYPE_ALL },
@@ -748,6 +890,16 @@
     { {FIRST_CHIP_MENU_ROW, 55},         "XTA:",         &xta_item, FLAG_MSGTYPE_ALL },
     { {FIRST_CHIP_MENU_ROW, 62},         "XTB:",         &xtb_item, FLAG_MSGTYPE_ALL },
 
+    { {FIRST_CHIP_MENU_ROW+1,  1},  NULL,   &ldo_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+1,  5},  NULL,   &dcdc_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+1, 12},  "rxfe power:",   &rxfe_pm_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+1, 35},  "tcxoVolts:",   &tcxo_volts_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+1, 50},  "tcxoDelay(ms):",   &tcxo_delay_item, FLAG_MSGTYPE_ALL },
+#ifdef MEMSCAN
+    { {LAST_CHIP_MENU_ROW, 1},  NULL,   &memread_item, FLAG_MSGTYPE_ALL },
+    { {LAST_CHIP_MENU_ROW, 10},  NULL,   &memcmp_item, FLAG_MSGTYPE_ALL },
+#endif /* MEMSCAN */
+
     { {0, 0}, NULL, NULL }
 };
 
@@ -859,7 +1011,7 @@
 
 void Radio::lora_pblLen_print()
 {
-    uint32_t val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
+    unsigned val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
     ppLORA.lora.PreambleLengthHi = val >> 8;
     ppLORA.lora.PreambleLengthLo = val;
     pc.printf("%u", val);
@@ -1119,24 +1271,24 @@
 const value_item_t Radio::lora_cadtimeout_item = { _ITEM_VALUE, 4, lora_cadtimeout_print, lora_cadtimeout_write};
 
 const menu_t Radio::lora_menu[] = {
-    { {FIRST_CHIP_MENU_ROW+1,  1},   NULL,      &lora_bw_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 12},  "sf:",      &lora_sf_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 20},  "cr:",      &lora_cr_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 30},   NULL, &lora_ppmOffset_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2,  1},   NULL,      &lora_bw_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 12},  "sf:",      &lora_sf_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 20},  "cr:",      &lora_cr_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 30},   NULL, &lora_ppmOffset_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+2,  1}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 22},              NULL, &lora_headerType_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 32},              NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 39},              NULL, &lora_inviq_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 49},            "ppg:", &lora_ppg_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 58},              NULL, &lora_sdmode_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3,  1}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 22},              NULL, &lora_headerType_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 32},              NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 39},              NULL, &lora_inviq_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 49},            "ppg:", &lora_ppg_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 58},              NULL, &lora_sdmode_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+3,  1},          NULL,        &lora_cad_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+3,  5},    "symbols:",   &lora_cadsymbs_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+3, 20}, "peak/noise:", &lora_cadpnratio_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+3, 35},        "min:",     &lora_cadmin_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+3, 45},       "exit:",    &lora_cadexit_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+3, 62}, "timeout us:", &lora_cadtimeout_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4,  1},          NULL,        &lora_cad_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4,  5},    "symbols:",   &lora_cadsymbs_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4, 20}, "peak/noise:", &lora_cadpnratio_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4, 35},        "min:",     &lora_cadmin_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4, 45},       "exit:",    &lora_cadexit_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4, 62}, "timeout us:", &lora_cadtimeout_item, FLAG_MSGTYPE_ALL },
 
     { {0, 0}, NULL, NULL }
 };
@@ -1359,7 +1511,7 @@
         swl_bits++;
     }
     while (swl_bits > 0) {
-        pc.printf("%02x", radio.readReg(addr++, 1));
+        pc.printf("%02x", (unsigned)radio.readReg(addr++, 1));
         swl_bits -= 8;
     }
 }
@@ -1439,7 +1591,7 @@
 
 void Radio::gfsk_nodeadrs_print()
 {
-    pc.printf("%02x", radio.readReg(REG_ADDR_NODEADDR, 1));
+    pc.printf("%02x", (unsigned)radio.readReg(REG_ADDR_NODEADDR, 1));
 }
 
 bool Radio::gfsk_nodeadrs_write(const char* txt)
@@ -1455,7 +1607,7 @@
 
 void Radio::gfsk_broadcast_print()
 {
-    pc.printf("%02x", radio.readReg(REG_ADDR_BROADCAST, 1));
+    pc.printf("%02x", (unsigned)radio.readReg(REG_ADDR_BROADCAST, 1));
 }
 
 bool Radio::gfsk_broadcast_write(const char* txt)
@@ -1532,7 +1684,7 @@
 
 void Radio::gfsk_crcinit_print()
 {
-    pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCINIT, 2));
+    pc.printf("%04x", (unsigned)radio.readReg(REG_ADDR_FSK_CRCINIT, 2));
 }
 
 bool Radio::gfsk_crcinit_write(const char* txt)
@@ -1548,7 +1700,7 @@
 
 void Radio::gfsk_crcpoly_print()
 {
-    pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCPOLY, 2));
+    pc.printf("%04x", (unsigned)radio.readReg(REG_ADDR_FSK_CRCPOLY, 2));
 }
 
 bool Radio::gfsk_crcpoly_write(const char* txt)
@@ -1584,28 +1736,28 @@
 const value_item_t Radio::gfsk_whiteInit_item = { _ITEM_VALUE, 5, gfsk_whiteInit_print, gfsk_whiteInit_write};
 
 const menu_t Radio::gfsk_menu[] = {
-    { {FIRST_CHIP_MENU_ROW+1,  1},    "bps:", &gfsk_bitrate_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 15},    "bt:",       &gfsk_bt_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 23},   "rxbw:",    &gfsk_rxbw_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 39},   "fdev:",    &gfsk_fdev_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+1, 53},      NULL,  &gfsk_fixLen_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2,  1},    "bps:", &gfsk_bitrate_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 15},    "bt:",       &gfsk_bt_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 23},   "rxbw:",    &gfsk_rxbw_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 39},   "fdev:",    &gfsk_fdev_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+2, 53},      NULL,  &gfsk_fixLen_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+2,  1}, "PreambleLength:",  &gfsk_pblLen_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 21}, "PreambleDetectorLength:",  &gfsk_pblDetLen_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+2, 51}, "SyncWordLength bits:",  &gfsk_swl_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3,  1}, "PreambleLength:",  &gfsk_pblLen_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 21}, "PreambleDetectorLength:",  &gfsk_pblDetLen_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+3, 51}, "SyncWordLength bits:",  &gfsk_swl_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+3, 1}, "SyncWord:",  &gfsk_syncword_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+4, 1}, "SyncWord:",  &gfsk_syncword_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+4,  1}, "AddrComp:",   &gfsk_addrcomp_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+4, 33}, "NodeAdrs:",   &gfsk_nodeadrs_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+4, 47}, "broadcast:", &gfsk_broadcast_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+5,  1}, "AddrComp:",   &gfsk_addrcomp_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+5, 33}, "NodeAdrs:",   &gfsk_nodeadrs_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+5, 47}, "broadcast:", &gfsk_broadcast_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+5,   1}, "crcType:", &gfsk_crctype_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+5,  21}, "crcInit:", &gfsk_crcinit_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+5,  34}, "crcPoly:", &gfsk_crcpoly_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+6,   1}, "crcType:", &gfsk_crctype_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+6,  21}, "crcInit:", &gfsk_crcinit_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+6,  34}, "crcPoly:", &gfsk_crcpoly_item, FLAG_MSGTYPE_ALL },
 
-    { {FIRST_CHIP_MENU_ROW+6,  1},          NULL, &gfsk_white_item, FLAG_MSGTYPE_ALL },
-    { {FIRST_CHIP_MENU_ROW+6,  12}, "lfsr init:", &gfsk_whiteInit_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+7,  1},          NULL, &gfsk_white_item, FLAG_MSGTYPE_ALL },
+    { {FIRST_CHIP_MENU_ROW+7,  12}, "lfsr init:", &gfsk_whiteInit_item, FLAG_MSGTYPE_ALL },
 //12345678901234567890123456789012
 
     { {0, 0}, NULL, NULL }