T096Board.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "T096Board.h"
  2. #include <Arduino.h>
  3. #include <Wire.h>
  4. #ifdef NRF52_POWER_MANAGEMENT
  5. // Static configuration for power management
  6. // Values come from variant.h defines
  7. const PowerMgtConfig power_config = {
  8. .lpcomp_ain_channel = PWRMGT_LPCOMP_AIN,
  9. .lpcomp_refsel = PWRMGT_LPCOMP_REFSEL,
  10. .voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK
  11. };
  12. void T096Board::initiateShutdown(uint8_t reason) {
  13. #if ENV_INCLUDE_GPS == 1
  14. pinMode(PIN_GPS_EN, OUTPUT);
  15. digitalWrite(PIN_GPS_EN, !PIN_GPS_EN_ACTIVE);
  16. #endif
  17. variant_shutdown();
  18. bool enable_lpcomp = (reason == SHUTDOWN_REASON_LOW_VOLTAGE ||
  19. reason == SHUTDOWN_REASON_BOOT_PROTECT);
  20. pinMode(PIN_BAT_CTL, OUTPUT);
  21. digitalWrite(PIN_BAT_CTL, enable_lpcomp ? HIGH : LOW);
  22. if (enable_lpcomp) {
  23. configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel);
  24. }
  25. enterSystemOff(reason);
  26. }
  27. #endif // NRF52_POWER_MANAGEMENT
  28. void T096Board::begin() {
  29. NRF52Board::begin();
  30. #ifdef NRF52_POWER_MANAGEMENT
  31. // Boot voltage protection check (may not return if voltage too low)
  32. checkBootVoltage(&power_config);
  33. #endif
  34. #if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
  35. Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL);
  36. #endif
  37. Wire.begin();
  38. pinMode(P_LORA_TX_LED, OUTPUT);
  39. digitalWrite(P_LORA_TX_LED, LOW);
  40. periph_power.begin();
  41. loRaFEMControl.init();
  42. delay(1);
  43. }
  44. void T096Board::onBeforeTransmit() {
  45. digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
  46. loRaFEMControl.setTxModeEnable();
  47. }
  48. void T096Board::onAfterTransmit() {
  49. digitalWrite(P_LORA_TX_LED, LOW); //turn TX LED off
  50. loRaFEMControl.setRxModeEnable();
  51. }
  52. uint16_t T096Board::getBattMilliVolts() {
  53. int adcvalue = 0;
  54. analogReadResolution(12);
  55. analogReference(AR_INTERNAL_3_0);
  56. pinMode(PIN_VBAT_READ, INPUT);
  57. pinMode(PIN_BAT_CTL, OUTPUT);
  58. digitalWrite(PIN_BAT_CTL, 1);
  59. delay(10);
  60. adcvalue = analogRead(PIN_VBAT_READ);
  61. digitalWrite(PIN_BAT_CTL, 0);
  62. return (uint16_t)((float)adcvalue * MV_LSB * 4.9);
  63. }
  64. void T096Board::variant_shutdown() {
  65. nrf_gpio_cfg_default(PIN_VEXT_EN);
  66. nrf_gpio_cfg_default(PIN_TFT_CS);
  67. nrf_gpio_cfg_default(PIN_TFT_DC);
  68. nrf_gpio_cfg_default(PIN_TFT_SDA);
  69. nrf_gpio_cfg_default(PIN_TFT_SCL);
  70. nrf_gpio_cfg_default(PIN_TFT_RST);
  71. nrf_gpio_cfg_default(PIN_TFT_LEDA_CTL);
  72. nrf_gpio_cfg_default(PIN_LED);
  73. nrf_gpio_cfg_default(P_LORA_KCT8103L_PA_CSD);
  74. nrf_gpio_cfg_default(P_LORA_KCT8103L_PA_CTX);
  75. pinMode(P_LORA_PA_POWER, OUTPUT);
  76. digitalWrite(P_LORA_PA_POWER, LOW);
  77. digitalWrite(PIN_BAT_CTL, LOW);
  78. nrf_gpio_cfg_default(LORA_CS);
  79. nrf_gpio_cfg_default(SX126X_DIO1);
  80. nrf_gpio_cfg_default(SX126X_BUSY);
  81. nrf_gpio_cfg_default(SX126X_RESET);
  82. nrf_gpio_cfg_default(PIN_SPI_MISO);
  83. nrf_gpio_cfg_default(PIN_SPI_MOSI);
  84. nrf_gpio_cfg_default(PIN_SPI_SCK);
  85. // nrf_gpio_cfg_default(PIN_GPS_PPS);
  86. nrf_gpio_cfg_default(PIN_GPS_RESET);
  87. nrf_gpio_cfg_default(PIN_GPS_EN);
  88. nrf_gpio_cfg_default(PIN_GPS_RX);
  89. nrf_gpio_cfg_default(PIN_GPS_TX);
  90. }
  91. void T096Board::powerOff() {
  92. #if ENV_INCLUDE_GPS == 1
  93. pinMode(PIN_GPS_EN, OUTPUT);
  94. digitalWrite(PIN_GPS_EN, !PIN_GPS_EN_ACTIVE);
  95. #endif
  96. loRaFEMControl.setSleepModeEnable();
  97. variant_shutdown();
  98. sd_power_system_off();
  99. }
  100. const char* T096Board::getManufacturerName() const {
  101. return "Heltec T096";
  102. }
  103. bool T096Board::setLoRaFemLnaEnabled(bool enable) {
  104. if (!loRaFEMControl.isLnaCanControl()) {
  105. return false;
  106. }
  107. loRaFEMControl.setLNAEnable(enable);
  108. loRaFEMControl.setRxModeEnable();
  109. return true;
  110. }
  111. bool T096Board::canControlLoRaFemLna() const {
  112. return loRaFEMControl.isLnaCanControl();
  113. }
  114. bool T096Board::isLoRaFemLnaEnabled() const {
  115. return loRaFEMControl.isLNAEnabled();
  116. }