diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-10-29 06:40:58 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-11-05 03:39:50 +0700 |
commit | ef1671c6ed3362958b95a7074c8d2242b756c6cf (patch) | |
tree | 1c80d546d39abcee29b0924e251a58b451c20369 /src/osmo-bts-litecell15/misc | |
parent | 44d25af9cd1288feda867ce60c636d9334521c4f (diff) |
osmo-bts-lc15: use consistent name for containing directory
The binary is called 'osmo-bts-lc15', while the containing folder
is named 'osmo-bts-litecell15'. This inconsistency complicates
automatic generation of the XML VTY reference - fix it.
Change-Id: I55c073fbd01aee42871101401d76d87e7c91832e
Related: SYS#4937, OS#3036
Diffstat (limited to 'src/osmo-bts-litecell15/misc')
27 files changed, 0 insertions, 5249 deletions
diff --git a/src/osmo-bts-litecell15/misc/lc15bts_bid.c b/src/osmo-bts-litecell15/misc/lc15bts_bid.c deleted file mode 100644 index 9284b62e..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_bid.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <stdbool.h> - -#include "lc15bts_bid.h" - -#define BOARD_REV_SYSFS "/var/lc15/platform/revision" -#define BOARD_OPT_SYSFS "/var/lc15/platform/option" - -static const int option_type_mask[_NUM_OPTION_TYPES] = { - [LC15BTS_OPTION_OCXO] = 0x07, - [LC15BTS_OPTION_FPGA] = 0x03, - [LC15BTS_OPTION_PA] = 0x01, - [LC15BTS_OPTION_BAND] = 0x03, - [LC15BTS_OPTION_TX_ISO_BYP] = 0x01, - [LC15BTS_OPTION_RX_DUP_BYP] = 0x01, - [LC15BTS_OPTION_RX_PB_BYP] = 0x01, - [LC15BTS_OPTION_RX_DIV] = 0x01, - [LC15BTS_OPTION_RX1A] = 0x01, - [LC15BTS_OPTION_RX1B] = 0x01, - [LC15BTS_OPTION_RX2A] = 0x01, - [LC15BTS_OPTION_RX2B] = 0x01, - [LC15BTS_OPTION_DDR_32B] = 0x01, - [LC15BTS_OPTION_DDR_ECC] = 0x01, - [LC15BTS_OPTION_LOG_DET] = 0x01, - [LC15BTS_OPTION_DUAL_LOG_DET] = 0x01, -}; - -static const int option_type_shift[_NUM_OPTION_TYPES] = { - [LC15BTS_OPTION_OCXO] = 0, - [LC15BTS_OPTION_FPGA] = 3, - [LC15BTS_OPTION_PA] = 5, - [LC15BTS_OPTION_BAND] = 6, - [LC15BTS_OPTION_TX_ISO_BYP] = 8, - [LC15BTS_OPTION_RX_DUP_BYP] = 9, - [LC15BTS_OPTION_RX_PB_BYP] = 10, - [LC15BTS_OPTION_RX_DIV] = 11, - [LC15BTS_OPTION_RX1A] = 12, - [LC15BTS_OPTION_RX1B] = 13, - [LC15BTS_OPTION_RX2A] = 14, - [LC15BTS_OPTION_RX2B] = 15, - [LC15BTS_OPTION_DDR_32B] = 16, - [LC15BTS_OPTION_DDR_ECC] = 17, - [LC15BTS_OPTION_LOG_DET] = 18, - [LC15BTS_OPTION_DUAL_LOG_DET] = 19, -}; - - -static int board_rev = -1; -static int board_option = -1; - -static inline bool read_board(const char *src, const char *spec, void *dst) -{ - FILE *fp = fopen(src, "r"); - if (!fp) { - fprintf(stderr, "Failed to open %s due to '%s' error\n", src, strerror(errno)); - return false; - } - - if (fscanf(fp, spec, dst) != 1) { - fclose(fp); - fprintf(stderr, "Failed to read %s due to '%s' error\n", src, strerror(errno)); - return false; - } - fclose(fp); - return true; -} - -int lc15bts_rev_get(void) -{ - char rev; - - if (board_rev != -1) { - return board_rev; - } - - if (!read_board(BOARD_REV_SYSFS, "%c", &rev)) - return -1; - - board_rev = rev; - return board_rev; -} - -int lc15bts_model_get(void) -{ - int opt; - - if (board_option != -1) - return board_option; - - if (!read_board(BOARD_OPT_SYSFS, "%X", &opt)) - return -1; - - board_option = opt; - return board_option; -} - -int lc15bts_option_get(enum lc15bts_option_type type) -{ - int rc; - int option; - - if (type >= _NUM_OPTION_TYPES) { - return -EINVAL; - } - - if (board_option == -1) { - rc = lc15bts_model_get(); - if (rc < 0) return rc; - } - - option = (board_option >> option_type_shift[type]) - & option_type_mask[type]; - - return option; -} - -const char* get_hwversion_desc() -{ - int rev; - int model; - size_t len; - static char model_name[64] = {0, }; - len = snprintf(model_name, sizeof(model_name), "NuRAN Litecell 1.5 BTS"); - - rev = lc15bts_rev_get(); - if (rev >= 0) { - len += snprintf(model_name + len, sizeof(model_name) - len, - " Rev %c", (char)rev); - } - - model = lc15bts_model_get(); - if (model >= 0) { - snprintf(model_name + len, sizeof(model_name) - len, - "%s (%05X)", model_name, model); - } - return model_name; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_bid.h b/src/osmo-bts-litecell15/misc/lc15bts_bid.h deleted file mode 100644 index a71fdd7e..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_bid.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _LC15BTS_BOARD_H -#define _LC15BTS_BOARD_H - -#include <stdint.h> - -enum lc15bts_option_type { - LC15BTS_OPTION_OCXO, - LC15BTS_OPTION_FPGA, - LC15BTS_OPTION_PA, - LC15BTS_OPTION_BAND, - LC15BTS_OPTION_TX_ISO_BYP, - LC15BTS_OPTION_RX_DUP_BYP, - LC15BTS_OPTION_RX_PB_BYP, - LC15BTS_OPTION_RX_DIV, - LC15BTS_OPTION_RX1A, - LC15BTS_OPTION_RX1B, - LC15BTS_OPTION_RX2A, - LC15BTS_OPTION_RX2B, - LC15BTS_OPTION_DDR_32B, - LC15BTS_OPTION_DDR_ECC, - LC15BTS_OPTION_LOG_DET, - LC15BTS_OPTION_DUAL_LOG_DET, - _NUM_OPTION_TYPES -}; - -enum lc15bts_ocxo_type { - LC15BTS_OCXO_BILAY_NVG45AV2072, - LC15BTS_OCXO_TAITIEN_NJ26M003, - _NUM_OCXO_TYPES -}; - -enum lc15bts_fpga_type { - LC15BTS_FPGA_35T, - LC15BTS_FPGA_50T, - LC15BTS_FPGA_75T, - LC15BTS_FPGA_100T, - _NUM_FPGA_TYPES -}; - -enum lc15bts_gsm_band { - LC15BTS_BAND_850, - LC15BTS_BAND_900, - LC15BTS_BAND_1800, - LC15BTS_BAND_1900, -}; - -int lc15bts_rev_get(void); -int lc15bts_model_get(void); -int lc15bts_option_get(enum lc15bts_option_type type); -const char* get_hwversion_desc(); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_bts.c b/src/osmo-bts-litecell15/misc/lc15bts_bts.c deleted file mode 100644 index 0343e930..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_bts.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Copyright (C) 2016 by NuRAN Wireless <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <sys/ioctl.h> -#include <net/if.h> -#include <netdb.h> -#include <ifaddrs.h> -#include <netinet/in.h> -#include <netinet/ip.h> -#include "lc15bts_mgr.h" -#include "lc15bts_bts.h" - -static int check_eth_status(char *dev_name) -{ - int fd, rc; - struct ifreq ifr; - - fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - if (fd < 0) - return fd; - - memset(&ifr, 0, sizeof(ifr)); - memcpy(&ifr.ifr_name, dev_name, sizeof(ifr.ifr_name)); - rc = ioctl(fd, SIOCGIFFLAGS, &ifr); - close(fd); - - if (rc < 0) - return rc; - - if ((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING)) - return 0; - - return 1; -} - -void check_bts_led_pattern(uint8_t *led) -{ - FILE *fp; - char str[64] = "\0"; - int rc; - - /* check for existing of BTS state file */ - if ((fp = fopen("/var/run/osmo-bts/state", "r")) == NULL) { - led[BLINK_PATTERN_INIT] = 1; - return; - } - - /* check Ethernet interface status */ - rc = check_eth_status("eth0"); - if (rc > 0) { - LOGP(DTEMP, LOGL_DEBUG,"External link is DOWN\n"); - led[BLINK_PATTERN_EXT_LINK_MALFUNC] = 1; - fclose(fp); - return; - } - - /* check for BTS is still alive */ - if (system("pidof osmo-bts-lc15 > /dev/null")) { - LOGP(DTEMP, LOGL_DEBUG,"BTS process has stopped\n"); - led[BLINK_PATTERN_INT_PROC_MALFUNC] = 1; - fclose(fp); - return; - } - - /* check for BTS state */ - while (fgets(str, 64, fp) != NULL) { - LOGP(DTEMP, LOGL_DEBUG,"BTS state is %s\n", (strstr(str, "ABIS DOWN") != NULL) ? "DOWN" : "UP"); - if (strstr(str, "ABIS DOWN") != NULL) - led[BLINK_PATTERN_INT_PROC_MALFUNC] = 1; - } - fclose(fp); - - return; -} - -int check_sensor_led_pattern( struct lc15bts_mgr_instance *mgr, uint8_t *led) -{ - if(mgr->alarms.temp_high == 1) - led[BLINK_PATTERN_TEMP_HIGH] = 1; - - if(mgr->alarms.temp_max == 1) - led[BLINK_PATTERN_TEMP_MAX] = 1; - - if(mgr->alarms.supply_low == 1) - led[BLINK_PATTERN_SUPPLY_VOLT_LOW] = 1; - - if(mgr->alarms.supply_min == 1) - led[BLINK_PATTERN_SUPPLY_VOLT_MIN] = 1; - - if(mgr->alarms.vswr_high == 1) - led[BLINK_PATTERN_VSWR_HIGH] = 1; - - if(mgr->alarms.vswr_max == 1) - led[BLINK_PATTERN_VSWR_MAX] = 1; - - if(mgr->alarms.supply_pwr_high == 1) - led[BLINK_PATTERN_SUPPLY_PWR_HIGH] = 1; - - if(mgr->alarms.supply_pwr_max == 1) - led[BLINK_PATTERN_SUPPLY_PWR_MAX] = 1; - - if(mgr->alarms.supply_pwr_max2 == 1) - led[BLINK_PATTERN_SUPPLY_PWR_MAX2] = 1; - - if(mgr->alarms.pa_pwr_high == 1) - led[BLINK_PATTERN_PA_PWR_HIGH] = 1; - - if(mgr->alarms.pa_pwr_max == 1) - led[BLINK_PATTERN_PA_PWR_MAX] = 1; - - if(mgr->alarms.gps_fix_lost == 1) - led[BLINK_PATTERN_GPS_FIX_LOST] = 1; - - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_bts.h b/src/osmo-bts-litecell15/misc/lc15bts_bts.h deleted file mode 100644 index 3918b870..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_bts.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _LC15BTS_BTS_H_ -#define _LC15BTS_BTS_H_ - -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <stdint.h> -#include <ctype.h> -#include <string.h> -#include <sys/signal.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include <osmo-bts/logging.h> - -/* public function prototypes */ -void check_bts_led_pattern(uint8_t *led); -int check_sensor_led_pattern( struct lc15bts_mgr_instance *mgr, uint8_t *led); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_clock.c b/src/osmo-bts-litecell15/misc/lc15bts_clock.c deleted file mode 100644 index 71701496..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_clock.c +++ /dev/null @@ -1,260 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> - -#include "lc15bts_clock.h" - -#define CLKERR_ERR_SYSFS "/var/lc15/clkerr/clkerr1_average" -#define CLKERR_ACC_SYSFS "/var/lc15/clkerr/clkerr1_average_accuracy" -#define CLKERR_INT_SYSFS "/var/lc15/clkerr/clkerr1_average_interval" -#define CLKERR_FLT_SYSFS "/var/lc15/clkerr/clkerr1_fault" -#define CLKERR_RFS_SYSFS "/var/lc15/clkerr/refresh" -#define CLKERR_RST_SYSFS "/var/lc15/clkerr/reset" - -#define OCXODAC_VAL_SYSFS "/var/lc15/ocxo/voltage" -#define OCXODAC_ROM_SYSFS "/var/lc15/ocxo/eeprom" - -/* clock error */ -static int clkerr_fd_err = -1; -static int clkerr_fd_accuracy = -1; -static int clkerr_fd_interval = -1; -static int clkerr_fd_fault = -1; -static int clkerr_fd_refresh = -1; -static int clkerr_fd_reset = -1; - -/* ocxo dac */ -static int ocxodac_fd_value = -1; -static int ocxodac_fd_save = -1; - - -static int sysfs_read_val(int fd, int *val) -{ - int rc; - char szVal[32] = {0}; - - lseek( fd, 0, SEEK_SET ); - - rc = read(fd, szVal, sizeof(szVal) - 1); - if (rc < 0) { - return -errno; - } - - rc = sscanf(szVal, "%d", val); - if (rc != 1) { - return -1; - } - - return 0; -} - -static int sysfs_write_val(int fd, int val) -{ - int n, rc; - char szVal[32] = {0}; - - n = sprintf(szVal, "%d", val); - - lseek(fd, 0, SEEK_SET); - rc = write(fd, szVal, n+1); - if (rc < 0) { - return -errno; - } - return 0; -} - -static int sysfs_write_str(int fd, const char *str) -{ - int rc; - - lseek( fd, 0, SEEK_SET ); - rc = write(fd, str, strlen(str)+1); - if (rc < 0) { - return -errno; - } - return 0; -} - - -int lc15bts_clock_err_open(void) -{ - if (clkerr_fd_err < 0) { - clkerr_fd_err = open(CLKERR_ERR_SYSFS, O_RDONLY); - if (clkerr_fd_err < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_err; - } - } - - if (clkerr_fd_accuracy < 0) { - clkerr_fd_accuracy = open(CLKERR_ACC_SYSFS, O_RDONLY); - if (clkerr_fd_accuracy < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_accuracy; - } - } - - if (clkerr_fd_interval < 0) { - clkerr_fd_interval = open(CLKERR_INT_SYSFS, O_RDONLY); - if (clkerr_fd_interval < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_interval; - } - } - - if (clkerr_fd_fault < 0) { - clkerr_fd_fault = open(CLKERR_FLT_SYSFS, O_RDONLY); - if (clkerr_fd_fault < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_fault; - } - } - - if (clkerr_fd_refresh < 0) { - clkerr_fd_refresh = open(CLKERR_RFS_SYSFS, O_WRONLY); - if (clkerr_fd_refresh < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_refresh; - } - } - - if (clkerr_fd_reset < 0) { - clkerr_fd_reset = open(CLKERR_RST_SYSFS, O_WRONLY); - if (clkerr_fd_reset < 0) { - lc15bts_clock_err_close(); - return clkerr_fd_reset; - } - } - return 0; -} - -void lc15bts_clock_err_close(void) -{ - if (clkerr_fd_err >= 0) { - close(clkerr_fd_err); - clkerr_fd_err = -1; - } - - if (clkerr_fd_accuracy >= 0) { - close(clkerr_fd_accuracy); - clkerr_fd_accuracy = -1; - } - - if (clkerr_fd_interval >= 0) { - close(clkerr_fd_interval); - clkerr_fd_interval = -1; - } - - if (clkerr_fd_fault >= 0) { - close(clkerr_fd_fault); - clkerr_fd_fault = -1; - } - - if (clkerr_fd_refresh >= 0) { - close(clkerr_fd_refresh); - clkerr_fd_refresh = -1; - } - - if (clkerr_fd_reset >= 0) { - close(clkerr_fd_reset); - clkerr_fd_reset = -1; - } -} - -int lc15bts_clock_err_reset(void) -{ - return sysfs_write_val(clkerr_fd_reset, 1); -} - -int lc15bts_clock_err_get(int *fault, int *error_ppt, - int *accuracy_ppq, int *interval_sec) -{ - int rc; - - rc = sysfs_write_str(clkerr_fd_refresh, "once"); - if (rc < 0) { - return -1; - } - - rc = sysfs_read_val(clkerr_fd_fault, fault); - rc |= sysfs_read_val(clkerr_fd_err, error_ppt); - rc |= sysfs_read_val(clkerr_fd_accuracy, accuracy_ppq); - rc |= sysfs_read_val(clkerr_fd_interval, interval_sec); - if (rc) { - return -1; - } - return 0; -} - - -int lc15bts_clock_dac_open(void) -{ - if (ocxodac_fd_value < 0) { - ocxodac_fd_value = open(OCXODAC_VAL_SYSFS, O_RDWR); - if (ocxodac_fd_value < 0) { - lc15bts_clock_dac_close(); - return ocxodac_fd_value; - } - } - - if (ocxodac_fd_save < 0) { - ocxodac_fd_save = open(OCXODAC_ROM_SYSFS, O_WRONLY); - if (ocxodac_fd_save < 0) { - lc15bts_clock_dac_close(); - return ocxodac_fd_save; - } - } - return 0; -} - -void lc15bts_clock_dac_close(void) -{ - if (ocxodac_fd_value >= 0) { - close(ocxodac_fd_value); - ocxodac_fd_value = -1; - } - - if (ocxodac_fd_save >= 0) { - close(ocxodac_fd_save); - ocxodac_fd_save = -1; - } -} - -int lc15bts_clock_dac_get(int *dac_value) -{ - return sysfs_read_val(ocxodac_fd_value, dac_value); -} - -int lc15bts_clock_dac_set(int dac_value) -{ - return sysfs_write_val(ocxodac_fd_value, dac_value); -} - -int lc15bts_clock_dac_save(void) -{ - return sysfs_write_val(ocxodac_fd_save, 1); -} - - diff --git a/src/osmo-bts-litecell15/misc/lc15bts_clock.h b/src/osmo-bts-litecell15/misc/lc15bts_clock.h deleted file mode 100644 index d9673598..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_clock.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _LC15BTS_CLOCK_H -#define _LC15BTS_CLOCK_H - -int lc15bts_clock_err_open(void); -void lc15bts_clock_err_close(void); -int lc15bts_clock_err_reset(void); -int lc15bts_clock_err_get(int *fault, int *error_ppt, - int *accuracy_ppq, int *interval_sec); - -int lc15bts_clock_dac_open(void); -void lc15bts_clock_dac_close(void); -int lc15bts_clock_dac_get(int *dac_value); -int lc15bts_clock_dac_set(int dac_value); -int lc15bts_clock_dac_save(void); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_led.c b/src/osmo-bts-litecell15/misc/lc15bts_led.c deleted file mode 100644 index a93d3fb0..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_led.c +++ /dev/null @@ -1,333 +0,0 @@ -/* Copyright (C) 2016 by NuRAN Wireless <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -#include "lc15bts_led.h" -#include "lc15bts_bts.h" -#include <osmocom/core/talloc.h> -#include <osmocom/core/linuxlist.h> - -static struct lc15bts_led led_entries[] = { - { - .name = "led0", - .fullname = "led red", - .path = "/var/lc15/leds/led0/brightness" - }, - { - .name = "led1", - .fullname = "led green", - .path = "/var/lc15/leds/led1/brightness" - } -}; - -static const struct value_string lc15bts_led_strs[] = { - { LC15BTS_LED_RED, "LED red" }, - { LC15BTS_LED_GREEN, "LED green" }, - { LC15BTS_LED_ORANGE, "LED orange" }, - { LC15BTS_LED_OFF, "LED off" }, - { 0, NULL } -}; - -static uint8_t led_priority[] = { - BLINK_PATTERN_INIT, - BLINK_PATTERN_INT_PROC_MALFUNC, - BLINK_PATTERN_SUPPLY_PWR_MAX, - BLINK_PATTERN_PA_PWR_MAX, - BLINK_PATTERN_VSWR_MAX, - BLINK_PATTERN_SUPPLY_VOLT_MIN, - BLINK_PATTERN_TEMP_MAX, - BLINK_PATTERN_SUPPLY_PWR_MAX2, - BLINK_PATTERN_EXT_LINK_MALFUNC, - BLINK_PATTERN_SUPPLY_VOLT_LOW, - BLINK_PATTERN_TEMP_HIGH, - BLINK_PATTERN_VSWR_HIGH, - BLINK_PATTERN_SUPPLY_PWR_HIGH, - BLINK_PATTERN_PA_PWR_HIGH, - BLINK_PATTERN_GPS_FIX_LOST, - BLINK_PATTERN_NORMAL -}; - - -char *blink_pattern_command[] = BLINK_PATTERN_COMMAND; - -static int lc15bts_led_write(char *path, char *str) -{ - int fd; - - if ((fd = open(path, O_WRONLY)) == -1) - { - return 0; - } - - write(fd, str, strlen(str)+1); - close(fd); - return 1; -} - -static void led_set_red() -{ - lc15bts_led_write(led_entries[0].path, "1"); - lc15bts_led_write(led_entries[1].path, "0"); -} - -static void led_set_green() -{ - lc15bts_led_write(led_entries[0].path, "0"); - lc15bts_led_write(led_entries[1].path, "1"); -} - -static void led_set_orange() -{ - lc15bts_led_write(led_entries[0].path, "1"); - lc15bts_led_write(led_entries[1].path, "1"); -} - -static void led_set_off() -{ - lc15bts_led_write(led_entries[0].path, "0"); - lc15bts_led_write(led_entries[1].path, "0"); -} - -static void led_sleep( struct lc15bts_mgr_instance *mgr, struct lc15bts_led_timer *led_timer, void (*led_timer_cb)(void *_data)) { - /* Cancel any pending timer */ - osmo_timer_del(&led_timer->timer); - /* Start LED timer */ - led_timer->timer.cb = led_timer_cb; - led_timer->timer.data = mgr; - mgr->lc15bts_leds.active_timer = led_timer->idx; - osmo_timer_schedule(&led_timer->timer, led_timer->param.sleep_sec, led_timer->param.sleep_usec); - LOGP(DTEMP, LOGL_DEBUG,"%s timer scheduled for %d sec + %d usec\n", - get_value_string(lc15bts_led_strs, led_timer->idx), - led_timer->param.sleep_sec, - led_timer->param.sleep_usec); - - switch (led_timer->idx) { - case LC15BTS_LED_RED: - led_set_red(); - break; - case LC15BTS_LED_GREEN: - led_set_green(); - break; - case LC15BTS_LED_ORANGE: - led_set_orange(); - break; - case LC15BTS_LED_OFF: - led_set_off(); - break; - default: - led_set_off(); - } -} - -static void led_sleep_cb(void *_data) { - struct lc15bts_mgr_instance *mgr = _data; - struct lc15bts_led_timer_list *led_list; - - /* make sure the timer list is not empty */ - if (llist_empty(&mgr->lc15bts_leds.list)) - return; - - llist_for_each_entry(led_list, &mgr->lc15bts_leds.list, list) { - if (led_list->led_timer.idx == mgr->lc15bts_leds.active_timer) { - LOGP(DTEMP, LOGL_DEBUG,"Delete expired %s timer %d sec + %d usec\n", - get_value_string(lc15bts_led_strs, led_list->led_timer.idx), - led_list->led_timer.param.sleep_sec, - led_list->led_timer.param.sleep_usec); - - /* Delete current timer */ - osmo_timer_del(&led_list->led_timer.timer); - /* Rotate the timer list */ - llist_move_tail(&led_list->list, &mgr->lc15bts_leds.list); - break; - } - } - - /* Execute next timer */ - led_list = llist_first_entry(&mgr->lc15bts_leds.list, struct lc15bts_led_timer_list, list); - if (led_list) { - LOGP(DTEMP, LOGL_DEBUG,"Execute %s timer %d sec + %d usec, total entries=%d\n", - get_value_string(lc15bts_led_strs, led_list->led_timer.idx), - led_list->led_timer.param.sleep_sec, - led_list->led_timer.param.sleep_usec, - llist_count(&mgr->lc15bts_leds.list)); - - led_sleep(mgr, &led_list->led_timer, led_sleep_cb); - } - -} - -static void delete_led_timer_entries(struct lc15bts_mgr_instance *mgr) -{ - struct lc15bts_led_timer_list *led_list, *led_list2; - - if (llist_empty(&mgr->lc15bts_leds.list)) - return; - - llist_for_each_entry_safe(led_list, led_list2, &mgr->lc15bts_leds.list, list) { - /* Delete the timer in list */ - if (led_list) { - LOGP(DTEMP, LOGL_DEBUG,"Delete %s timer entry from list, %d sec + %d usec\n", - get_value_string(lc15bts_led_strs, led_list->led_timer.idx), - led_list->led_timer.param.sleep_sec, - led_list->led_timer.param.sleep_usec); - - /* Delete current timer */ - osmo_timer_del(&led_list->led_timer.timer); - llist_del(&led_list->list); - talloc_free(led_list); - } - } - return; -} - -static int add_led_timer_entry(struct lc15bts_mgr_instance *mgr, char *cmdstr) -{ - double sec, int_sec, frac_sec; - struct lc15bts_sleep_time led_param; - - led_param.sleep_sec = 0; - led_param.sleep_usec = 0; - - if (strstr(cmdstr, "set red") != NULL) - mgr->lc15bts_leds.led_idx = LC15BTS_LED_RED; - else if (strstr(cmdstr, "set green") != NULL) - mgr->lc15bts_leds.led_idx = LC15BTS_LED_GREEN; - else if (strstr(cmdstr, "set orange") != NULL) - mgr->lc15bts_leds.led_idx = LC15BTS_LED_ORANGE; - else if (strstr(cmdstr, "set off") != NULL) - mgr->lc15bts_leds.led_idx = LC15BTS_LED_OFF; - else if (strstr(cmdstr, "sleep") != NULL) { - sec = atof(cmdstr + 6); - /* split time into integer and fractional of seconds */ - frac_sec = modf(sec, &int_sec) * 1000000.0; - led_param.sleep_sec = (int)int_sec; - led_param.sleep_usec = (int)frac_sec; - - if ((mgr->lc15bts_leds.led_idx >= LC15BTS_LED_RED) && (mgr->lc15bts_leds.led_idx < _LC15BTS_LED_MAX)) { - struct lc15bts_led_timer_list *led_list; - - /* allocate timer entry */ - led_list = talloc_zero(tall_mgr_ctx, struct lc15bts_led_timer_list); - if (led_list) { - led_list->led_timer.idx = mgr->lc15bts_leds.led_idx; - led_list->led_timer.param.sleep_sec = led_param.sleep_sec; - led_list->led_timer.param.sleep_usec = led_param.sleep_usec; - llist_add_tail(&led_list->list, &mgr->lc15bts_leds.list); - - LOGP(DTEMP, LOGL_DEBUG,"Add %s timer to list, %d sec + %d usec, total entries=%d\n", - get_value_string(lc15bts_led_strs, mgr->lc15bts_leds.led_idx), - led_list->led_timer.param.sleep_sec, - led_list->led_timer.param.sleep_usec, - llist_count(&mgr->lc15bts_leds.list)); - } - } - } else - return -1; - - return 0; -} - -static int parse_led_pattern(char *pattern, struct lc15bts_mgr_instance *mgr) -{ - char str[1024]; - char *pstr; - char *sep; - int rc = 0; - - strcpy(str, pattern); - pstr = str; - while ((sep = strsep(&pstr, ";")) != NULL) { - rc = add_led_timer_entry(mgr, sep); - if (rc < 0) { - break; - } - - } - return rc; -} - -/*** led interface ***/ - -void led_set(struct lc15bts_mgr_instance *mgr, int pattern_id) -{ - int rc; - struct lc15bts_led_timer_list *led_list; - - if (pattern_id > BLINK_PATTERN_MAX_ITEM - 1) { - LOGP(DTEMP, LOGL_ERROR, "Invalid LED pattern : %d. LED pattern must be between %d..%d\n", - pattern_id, - BLINK_PATTERN_POWER_ON, - BLINK_PATTERN_MAX_ITEM - 1); - return; - } - if (pattern_id == mgr->lc15bts_leds.last_pattern_id) - return; - - mgr->lc15bts_leds.last_pattern_id = pattern_id; - - LOGP(DTEMP, LOGL_NOTICE, "blink pattern command : %d\n", pattern_id); - LOGP(DTEMP, LOGL_NOTICE, "%s\n", blink_pattern_command[pattern_id]); - - /* Empty existing LED timer in the list */ - delete_led_timer_entries(mgr); - - /* parse LED pattern */ - rc = parse_led_pattern(blink_pattern_command[pattern_id], mgr); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR,"LED pattern not found or invalid LED pattern\n"); - return; - } - - /* make sure the timer list is not empty */ - if (llist_empty(&mgr->lc15bts_leds.list)) - return; - - /* Start the first LED timer in the list */ - led_list = llist_first_entry(&mgr->lc15bts_leds.list, struct lc15bts_led_timer_list, list); - if (led_list) { - LOGP(DTEMP, LOGL_DEBUG,"Execute timer %s for %d sec + %d usec\n", - get_value_string(lc15bts_led_strs, led_list->led_timer.idx), - led_list->led_timer.param.sleep_sec, - led_list->led_timer.param.sleep_usec); - - led_sleep(mgr, &led_list->led_timer, led_sleep_cb); - } - -} - -void select_led_pattern(struct lc15bts_mgr_instance *mgr) -{ - int i; - uint8_t led[BLINK_PATTERN_MAX_ITEM] = {0}; - - /* set normal LED pattern at first */ - led[BLINK_PATTERN_NORMAL] = 1; - - /* check on-board sensors for new LED pattern */ - check_sensor_led_pattern(mgr, led); - - /* check BTS status for new LED pattern */ - check_bts_led_pattern(led); - - /* check by priority */ - for (i = 0; i < sizeof(led_priority)/sizeof(uint8_t); i++) { - if(led[led_priority[i]] == 1) { - led_set(mgr, led_priority[i]); - break; - } - } -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_led.h b/src/osmo-bts-litecell15/misc/lc15bts_led.h deleted file mode 100644 index b6d9d28b..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_led.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _LC15BTS_LED_H -#define _LC15BTS_LED_H - -#include <stdint.h> -#include <unistd.h> -#include <errno.h> -#include <fcntl.h> -#include <math.h> -#include <sys/stat.h> - -#include <osmo-bts/logging.h> -#include <osmocom/core/timer.h> -#include <osmocom/core/utils.h> - -#include "lc15bts_mgr.h" - -/* public function prototypes */ -void led_set(struct lc15bts_mgr_instance *mgr, int pattern_id); - -void select_led_pattern(struct lc15bts_mgr_instance *mgr); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr.c deleted file mode 100644 index da21c9d0..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr.c +++ /dev/null @@ -1,366 +0,0 @@ -/* Main program for NuRAN Wireless Litecell 1.5 BTS management daemon */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_mgr.c - * (C) 2012 by Harald Welte <laforge@gnumonks.org> - * (C) 2014 by Holger Hans Peter Freyther - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <errno.h> -#include <getopt.h> -#include <limits.h> -#include <sys/signal.h> -#include <sys/stat.h> - -#include <osmocom/core/talloc.h> -#include <osmocom/core/application.h> -#include <osmocom/core/timer.h> -#include <osmocom/core/msgb.h> -#include <osmocom/vty/telnet_interface.h> -#include <osmocom/vty/logging.h> -#include <osmocom/vty/ports.h> - -#include "misc/lc15bts_misc.h" -#include "misc/lc15bts_mgr.h" -#include "misc/lc15bts_par.h" -#include "misc/lc15bts_bid.h" -#include "misc/lc15bts_power.h" -#include "misc/lc15bts_swd.h" - -#include "lc15bts_led.h" - -static int no_rom_write = 0; -static int daemonize = 0; -void *tall_mgr_ctx; - -/* every 6 hours means 365*4 = 1460 rom writes per year (max) */ -#define SENSOR_TIMER_SECS (6 * 3600) - -/* every 1 hours means 365*24 = 8760 rom writes per year (max) */ -#define HOURS_TIMER_SECS (1 * 3600) - - -/* the initial state */ -static struct lc15bts_mgr_instance manager = { - .config_file = "lc15bts-mgr.cfg", - .temp = { - .supply_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -40, - }, - .soc_temp_limit = { - .thresh_warn_max = 95, - .thresh_crit_max = 100, - .thresh_warn_min = -40, - }, - .fpga_temp_limit = { - .thresh_warn_max = 95, - .thresh_crit_max = 100, - .thresh_warn_min = -40, - }, - .rmsdet_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -40, - }, - .ocxo_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -40, - }, - .tx0_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -20, - }, - .tx1_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -20, - }, - .pa0_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -40, - }, - .pa1_temp_limit = { - .thresh_warn_max = 80, - .thresh_crit_max = 85, - .thresh_warn_min = -40, - } - }, - .volt = { - .supply_volt_limit = { - .thresh_warn_max = 30000, - .thresh_crit_max = 30500, - .thresh_warn_min = 19000, - .thresh_crit_min = 17500, - } - }, - .pwr = { - .supply_pwr_limit = { - .thresh_warn_max = 110, - .thresh_crit_max = 120, - }, - .pa0_pwr_limit = { - .thresh_warn_max = 50, - .thresh_crit_max = 60, - }, - .pa1_pwr_limit = { - .thresh_warn_max = 50, - .thresh_crit_max = 60, - } - }, - .vswr = { - .tx0_vswr_limit = { - .thresh_warn_max = 3000, - .thresh_crit_max = 5000, - }, - .tx1_vswr_limit = { - .thresh_warn_max = 3000, - .thresh_crit_max = 5000, - } - }, - .gps = { - .gps_fix_limit = { - .thresh_warn_max = 7, - } - }, - .state = { - .action_norm = SENSOR_ACT_NORM_PA0_ON | SENSOR_ACT_NORM_PA1_ON, - .action_warn = 0, - .action_crit = 0, - .action_comb = 0, - .state = STATE_NORMAL, - } -}; - -static struct osmo_timer_list sensor_timer; -static void check_sensor_timer_cb(void *unused) -{ - lc15bts_check_temp(no_rom_write); - lc15bts_check_power(no_rom_write); - lc15bts_check_vswr(no_rom_write); - osmo_timer_schedule(&sensor_timer, SENSOR_TIMER_SECS, 0); - /* TODO checks if lc15bts_check_temp/lc15bts_check_power/lc15bts_check_vswr went ok */ - lc15bts_swd_event(&manager, SWD_CHECK_SENSOR); -} - -static struct osmo_timer_list hours_timer; -static void hours_timer_cb(void *unused) -{ - lc15bts_update_hours(no_rom_write); - - osmo_timer_schedule(&hours_timer, HOURS_TIMER_SECS, 0); - /* TODO: validates if lc15bts_update_hours went correctly */ - lc15bts_swd_event(&manager, SWD_UPDATE_HOURS); -} - -static void print_help(void) -{ - printf("lc15bts-mgr [-nsD] [-d cat]\n"); - printf(" -n Do not write to ROM\n"); - printf(" -s Disable color\n"); - printf(" -d CAT enable debugging\n"); - printf(" -D daemonize\n"); - printf(" -c Specify the filename of the config file\n"); -} - -static int parse_options(int argc, char **argv) -{ - int opt; - - while ((opt = getopt(argc, argv, "nhsd:c:")) != -1) { - switch (opt) { - case 'n': - no_rom_write = 1; - break; - case 'h': - print_help(); - return -1; - case 's': - log_set_use_color(osmo_stderr_target, 0); - break; - case 'd': - log_parse_category_mask(osmo_stderr_target, optarg); - break; - case 'D': - daemonize = 1; - break; - case 'c': - manager.config_file = optarg; - break; - default: - return -1; - } - } - - return 0; -} - -static void signal_handler(int signal) -{ - fprintf(stderr, "signal %u received\n", signal); - - switch (signal) { - case SIGINT: - case SIGTERM: - lc15bts_check_temp(no_rom_write); - lc15bts_check_power(no_rom_write); - lc15bts_check_vswr(no_rom_write); - lc15bts_update_hours(no_rom_write); - exit(0); - break; - case SIGABRT: - case SIGUSR1: - case SIGUSR2: - talloc_report_full(tall_mgr_ctx, stderr); - break; - default: - break; - } -} - -static struct log_info_cat mgr_log_info_cat[] = { - [DTEMP] = { - .name = "DTEMP", - .description = "Temperature monitoring", - .color = "\033[1;35m", - .enabled = 1, .loglevel = LOGL_NOTICE, - }, - [DFW] = { - .name = "DFW", - .description = "Firmware management", - .color = "\033[1;36m", - .enabled = 1, .loglevel = LOGL_NOTICE, - }, - [DFIND] = { - .name = "DFIND", - .description = "ipaccess-find handling", - .color = "\033[1;37m", - .enabled = 1, .loglevel = LOGL_NOTICE, - }, - [DCALIB] = { - .name = "DCALIB", - .description = "Calibration handling", - .color = "\033[1;37m", - .enabled = 1, .loglevel = LOGL_NOTICE, - }, - [DSWD] = { - .name = "DSWD", - .description = "Software Watchdog", - .color = "\033[1;37m", - .enabled = 1, .loglevel = LOGL_NOTICE, - }, -}; - -static const struct log_info mgr_log_info = { - .cat = mgr_log_info_cat, - .num_cat = ARRAY_SIZE(mgr_log_info_cat), -}; - -int main(int argc, char **argv) -{ - int rc; - - tall_mgr_ctx = talloc_named_const(NULL, 1, "bts manager"); - msgb_talloc_ctx_init(tall_mgr_ctx, 0); - - osmo_init_logging2(tall_mgr_ctx, &mgr_log_info); - - osmo_init_ignore_signals(); - signal(SIGINT, &signal_handler); - signal(SIGTERM, &signal_handler); - signal(SIGUSR1, &signal_handler); - signal(SIGUSR2, &signal_handler); - - rc = parse_options(argc, argv); - if (rc < 0) - exit(2); - - lc15bts_mgr_vty_init(); - logging_vty_add_cmds(); - rc = lc15bts_mgr_parse_config(&manager); - if (rc < 0) { - LOGP(DFIND, LOGL_FATAL, "Cannot parse config file\n"); - exit(1); - } - - rc = telnet_init(tall_mgr_ctx, NULL, OSMO_VTY_PORT_BTSMGR); - if (rc < 0) { - fprintf(stderr, "Error initializing telnet\n"); - exit(1); - } - - INIT_LLIST_HEAD(&manager.lc15bts_leds.list); - INIT_LLIST_HEAD(&manager.alarms.list); - - /* Initialize the service watchdog notification for SWD_LAST event(s) */ - if (lc15bts_swd_init(&manager, (int)(SWD_LAST)) != 0) - exit(3); - - /* start temperature check timer */ - sensor_timer.cb = check_sensor_timer_cb; - check_sensor_timer_cb(NULL); - - /* start operational hours timer */ - hours_timer.cb = hours_timer_cb; - hours_timer_cb(NULL); - - /* Enable the PAs */ - rc = lc15bts_power_set(LC15BTS_POWER_PA0, 1); - if (rc < 0) { - exit(3); - } - - rc = lc15bts_power_set(LC15BTS_POWER_PA1, 1); - if (rc < 0) { - exit(3); - } - - /* handle broadcast messages for ipaccess-find */ - if (lc15bts_mgr_nl_init() != 0) - exit(3); - - /* Initialize the sensor control */ - lc15bts_mgr_sensor_init(&manager); - - if (lc15bts_mgr_calib_init(&manager) != 0) - exit(3); - - if (daemonize) { - rc = osmo_daemonize(); - if (rc < 0) { - perror("Error during daemonize"); - exit(1); - } - } - - while (1) { - log_reset_context(); - osmo_select_main(0); - lc15bts_swd_event(&manager, SWD_MAINLOOP); - } -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr.h b/src/osmo-bts-litecell15/misc/lc15bts_mgr.h deleted file mode 100644 index 4bfbdbc9..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr.h +++ /dev/null @@ -1,422 +0,0 @@ -#ifndef _LC15BTS_MGR_H -#define _LC15BTS_MGR_H - -#include <osmocom/vty/vty.h> -#include <osmocom/vty/command.h> - -#include <osmocom/core/select.h> -#include <osmocom/core/timer.h> - -#include <stdint.h> - -#define LC15BTS_SENSOR_TIMER_DURATION 60 -#define LC15BTS_PREVENT_TIMER_DURATION 15 * 60 -#define LC15BTS_PREVENT_TIMER_SHORT_DURATION 5 * 60 -#define LC15BTS_PREVENT_TIMER_NONE 0 -#define LC15BTS_PREVENT_RETRY INT_MAX - 1 - -enum BLINK_PATTERN { - BLINK_PATTERN_POWER_ON = 0, //hardware set - BLINK_PATTERN_INIT, - BLINK_PATTERN_NORMAL, - BLINK_PATTERN_EXT_LINK_MALFUNC, - BLINK_PATTERN_INT_PROC_MALFUNC, - BLINK_PATTERN_SUPPLY_VOLT_LOW, - BLINK_PATTERN_SUPPLY_VOLT_MIN, - BLINK_PATTERN_VSWR_HIGH, - BLINK_PATTERN_VSWR_MAX, - BLINK_PATTERN_TEMP_HIGH, - BLINK_PATTERN_TEMP_MAX, - BLINK_PATTERN_SUPPLY_PWR_HIGH, - BLINK_PATTERN_SUPPLY_PWR_MAX, - BLINK_PATTERN_SUPPLY_PWR_MAX2, - BLINK_PATTERN_PA_PWR_HIGH, - BLINK_PATTERN_PA_PWR_MAX, - BLINK_PATTERN_GPS_FIX_LOST, - BLINK_PATTERN_MAX_ITEM -}; - -#define BLINK_PATTERN_COMMAND {\ - "set red; sleep 5.0",\ - "set orange; sleep 5.0",\ - "set green; sleep 2.5; set off; sleep 2.5",\ - "set red; sleep 0.5; set off; sleep 0.5",\ - "set red; sleep 2.5; set off; sleep 2.5",\ - "set green; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5",\ - "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5 ",\ - "set green; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\ - "set red; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\ - "set orange; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5 ",\ - "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\ - "set green; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\ - "set red; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\ - "set orange; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\ - "set green; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\ - "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\ - "set green; sleep 2.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\ -} - -enum { - DTEMP, - DFW, - DFIND, - DCALIB, - DSWD, -}; - -// TODO NTQD: Define new actions like reducing output power, limit ARM core speed, shutdown second TRX/PA, ... -enum { -#if 0 - SENSOR_ACT_PWR_CONTRL = 0x1, -#endif - SENSOR_ACT_PA0_OFF = 0x2, - SENSOR_ACT_PA1_OFF = 0x4, - SENSOR_ACT_BTS_SRV_OFF = 0x10, -}; - -/* actions only for normal state */ -enum { -#if 0 - SENSOR_ACT_NORM_PW_CONTRL = 0x1, -#endif - SENSOR_ACT_NORM_PA0_ON = 0x2, - SENSOR_ACT_NORM_PA1_ON = 0x4, - SENSOR_ACT_NORM_BTS_SRV_ON= 0x10, -}; - -enum lc15bts_sensor_state { - STATE_NORMAL, /* Everything is fine */ - STATE_WARNING_HYST, /* Go back to normal next? */ - STATE_WARNING, /* We are above the warning threshold */ - STATE_CRITICAL, /* We have an issue. Wait for below warning */ -}; - -enum lc15bts_leds_name { - LC15BTS_LED_RED = 0, - LC15BTS_LED_GREEN, - LC15BTS_LED_ORANGE, - LC15BTS_LED_OFF, - _LC15BTS_LED_MAX -}; - -struct lc15bts_led{ - char *name; - char *fullname; - char *path; -}; - -/** - * Temperature Limits. We separate from a threshold - * that will generate a warning and one that is so - * severe that an action will be taken. - */ -struct lc15bts_temp_limit { - int thresh_warn_max; - int thresh_crit_max; - int thresh_warn_min; -}; - -struct lc15bts_volt_limit { - int thresh_warn_max; - int thresh_crit_max; - int thresh_warn_min; - int thresh_crit_min; -}; - -struct lc15bts_pwr_limit { - int thresh_warn_max; - int thresh_crit_max; -}; - -struct lc15bts_vswr_limit { - int thresh_warn_max; - int thresh_crit_max; -}; - -struct lc15bts_gps_fix_limit { - int thresh_warn_max; -}; - -struct lc15bts_sleep_time { - int sleep_sec; - int sleep_usec; -}; - -struct lc15bts_led_timer { - uint8_t idx; - struct osmo_timer_list timer; - struct lc15bts_sleep_time param; -}; - -struct lc15bts_led_timer_list { - struct llist_head list; - struct lc15bts_led_timer led_timer; -}; - -struct lc15bts_preventive_list { - struct llist_head list; - struct lc15bts_sleep_time param; - int action_flag; -}; - -enum mgr_vty_node { - MGR_NODE = _LAST_OSMOVTY_NODE + 1, - - ACT_NORM_NODE, - ACT_WARN_NODE, - ACT_CRIT_NODE, - LIMIT_SUPPLY_TEMP_NODE, - LIMIT_SOC_NODE, - LIMIT_FPGA_NODE, - LIMIT_RMSDET_NODE, - LIMIT_OCXO_NODE, - LIMIT_TX0_TEMP_NODE, - LIMIT_TX1_TEMP_NODE, - LIMIT_PA0_TEMP_NODE, - LIMIT_PA1_TEMP_NODE, - LIMIT_SUPPLY_VOLT_NODE, - LIMIT_TX0_VSWR_NODE, - LIMIT_TX1_VSWR_NODE, - LIMIT_SUPPLY_PWR_NODE, - LIMIT_PA0_PWR_NODE, - LIMIT_PA1_PWR_NODE, - LIMIT_GPS_FIX_NODE, -}; - -enum mgr_vty_limit_type { - MGR_LIMIT_TYPE_TEMP = 0, - MGR_LIMIT_TYPE_VOLT, - MGR_LIMIT_TYPE_VSWR, - MGR_LIMIT_TYPE_PWR, - _MGR_LIMIT_TYPE_MAX, -}; - -struct lc15bts_mgr_instance { - const char *config_file; - - struct { - struct lc15bts_temp_limit supply_temp_limit; - struct lc15bts_temp_limit soc_temp_limit; - struct lc15bts_temp_limit fpga_temp_limit; - struct lc15bts_temp_limit rmsdet_temp_limit; - struct lc15bts_temp_limit ocxo_temp_limit; - struct lc15bts_temp_limit tx0_temp_limit; - struct lc15bts_temp_limit tx1_temp_limit; - struct lc15bts_temp_limit pa0_temp_limit; - struct lc15bts_temp_limit pa1_temp_limit; - } temp; - - struct { - struct lc15bts_volt_limit supply_volt_limit; - } volt; - - struct { - struct lc15bts_pwr_limit supply_pwr_limit; - struct lc15bts_pwr_limit pa0_pwr_limit; - struct lc15bts_pwr_limit pa1_pwr_limit; - } pwr; - - struct { - struct lc15bts_vswr_limit tx0_vswr_limit; - struct lc15bts_vswr_limit tx1_vswr_limit; - int tx0_last_vswr; - int tx1_last_vswr; - } vswr; - - struct { - struct lc15bts_gps_fix_limit gps_fix_limit; - time_t last_update; - } gps; - - struct { - int action_norm; - int action_warn; - int action_crit; - int action_comb; - - enum lc15bts_sensor_state state; - } state; - - struct { - int state; - int calib_from_loop; - struct osmo_timer_list calib_timeout; - } calib; - - struct { - int state; - int swd_from_loop; - unsigned long long int swd_events; - unsigned long long int swd_events_cache; - unsigned long long int swd_eventmasks; - int num_events; - struct osmo_timer_list swd_timeout; - } swd; - - struct { - uint8_t led_idx; - uint8_t last_pattern_id; - uint8_t active_timer; - struct llist_head list; - } lc15bts_leds; - - struct { - int is_up; - uint32_t last_seqno; - struct osmo_timer_list recon_timer; - struct ipa_client_conn *bts_conn; - uint32_t crit_flags; - uint32_t warn_flags; - } lc15bts_ctrl; - - struct lc15bts_alarms { - int temp_high; - int temp_max; - int supply_low; - int supply_min; - int vswr_high; - int vswr_max; - int supply_pwr_high; - int supply_pwr_max; - int supply_pwr_max2; - int pa_pwr_high; - int pa_pwr_max; - int gps_fix_lost; - struct llist_head list; - struct osmo_timer_list preventive_timer; - int preventive_duration; - int preventive_retry; - } alarms; - -}; - -enum lc15bts_mgr_fail_evt_rep_crit_sig { - /* Critical alarms */ - S_MGR_TEMP_SUPPLY_CRIT_MAX_ALARM = (1 << 0), - S_MGR_TEMP_SOC_CRIT_MAX_ALARM = (1 << 1), - S_MGR_TEMP_FPGA_CRIT_MAX_ALARM = (1 << 2), - S_MGR_TEMP_RMS_DET_CRIT_MAX_ALARM = (1 << 3), - S_MGR_TEMP_OCXO_CRIT_MAX_ALARM = (1 << 4), - S_MGR_TEMP_TRX0_CRIT_MAX_ALARM = (1 << 5), - S_MGR_TEMP_TRX1_CRIT_MAX_ALARM = (1 << 6), - S_MGR_TEMP_PA0_CRIT_MAX_ALARM = (1 << 7), - S_MGR_TEMP_PA1_CRIT_MAX_ALARM = (1 << 8), - S_MGR_SUPPLY_CRIT_MAX_ALARM = (1 << 9), - S_MGR_SUPPLY_CRIT_MIN_ALARM = (1 << 10), - S_MGR_VSWR0_CRIT_MAX_ALARM = (1 << 11), - S_MGR_VSWR1_CRIT_MAX_ALARM = (1 << 12), - S_MGR_PWR_SUPPLY_CRIT_MAX_ALARM = (1 << 13), - S_MGR_PWR_PA0_CRIT_MAX_ALARM = (1 << 14), - S_MGR_PWR_PA1_CRIT_MAX_ALARM = (1 << 15), - _S_MGR_CRIT_ALARM_MAX, -}; - -enum lc15bts_mgr_fail_evt_rep_warn_sig { - /* Warning alarms */ - S_MGR_TEMP_SUPPLY_WARN_MIN_ALARM = (1 << 0), - S_MGR_TEMP_SUPPLY_WARN_MAX_ALARM = (1 << 2), - S_MGR_TEMP_SOC_WARN_MIN_ALARM = (1 << 3), - S_MGR_TEMP_SOC_WARN_MAX_ALARM = (1 << 4), - S_MGR_TEMP_FPGA_WARN_MIN_ALARM = (1 << 5), - S_MGR_TEMP_FPGA_WARN_MAX_ALARM = (1 << 6), - S_MGR_TEMP_RMS_DET_WARN_MIN_ALARM = (1 << 7), - S_MGR_TEMP_RMS_DET_WARN_MAX_ALARM = (1 << 8), - S_MGR_TEMP_OCXO_WARN_MIN_ALARM = (1 << 9), - S_MGR_TEMP_OCXO_WARN_MAX_ALARM = (1 << 10), - S_MGR_TEMP_TRX0_WARN_MIN_ALARM = (1 << 11), - S_MGR_TEMP_TRX0_WARN_MAX_ALARM = (1 << 12), - S_MGR_TEMP_TRX1_WARN_MIN_ALARM = (1 << 13), - S_MGR_TEMP_TRX1_WARN_MAX_ALARM = (1 << 14), - S_MGR_TEMP_PA0_WARN_MIN_ALARM = (1 << 15), - S_MGR_TEMP_PA0_WARN_MAX_ALARM = (1 << 16), - S_MGR_TEMP_PA1_WARN_MIN_ALARM = (1 << 17), - S_MGR_TEMP_PA1_WARN_MAX_ALARM = (1 << 18), - S_MGR_SUPPLY_WARN_MIN_ALARM = (1 << 19), - S_MGR_SUPPLY_WARN_MAX_ALARM = (1 << 20), - S_MGR_VSWR0_WARN_MAX_ALARM = (1 << 21), - S_MGR_VSWR1_WARN_MAX_ALARM = (1 << 22), - S_MGR_PWR_SUPPLY_WARN_MAX_ALARM = (1 << 23), - S_MGR_PWR_PA0_WARN_MAX_ALARM = (1 << 24), - S_MGR_PWR_PA1_WARN_MAX_ALARM = (1 << 25), - S_MGR_GPS_FIX_WARN_ALARM = (1 << 26), - _S_MGR_WARN_ALARM_MAX, -}; - -enum lc15bts_mgr_failure_event_causes { - /* Critical causes */ - NM_EVT_CAUSE_CRIT_TEMP_SUPPLY_MAX_FAIL = 0x4100, - NM_EVT_CAUSE_CRIT_TEMP_FPGA_MAX_FAIL = 0x4101, - NM_EVT_CAUSE_CRIT_TEMP_SOC_MAX_FAIL = 0x4102, - NM_EVT_CAUSE_CRIT_TEMP_RMS_DET_MAX_FAIL = 0x4103, - NM_EVT_CAUSE_CRIT_TEMP_OCXO_MAX_FAIL = 0x4104, - NM_EVT_CAUSE_CRIT_TEMP_TRX0_MAX_FAIL = 0x4105, - NM_EVT_CAUSE_CRIT_TEMP_TRX1_MAX_FAIL = 0x4106, - NM_EVT_CAUSE_CRIT_TEMP_PA0_MAX_FAIL = 0x4107, - NM_EVT_CAUSE_CRIT_TEMP_PA1_MAX_FAIL = 0x4108, - NM_EVT_CAUSE_CRIT_SUPPLY_MAX_FAIL = 0x4109, - NM_EVT_CAUSE_CRIT_SUPPLY_MIN_FAIL = 0x410A, - NM_EVT_CAUSE_CRIT_VSWR0_MAX_FAIL = 0x410B, - NM_EVT_CAUSE_CRIT_VSWR1_MAX_FAIL = 0x410C, - NM_EVT_CAUSE_CRIT_PWR_SUPPLY_MAX_FAIL = 0x410D, - NM_EVT_CAUSE_CRIT_PWR_PA0_MAX_FAIL = 0x410E, - NM_EVT_CAUSE_CRIT_PWR_PA1_MAX_FAIL = 0x410F, - /* Warning causes */ - NM_EVT_CAUSE_WARN_TEMP_SUPPLY_LOW_FAIL = 0x4400, - NM_EVT_CAUSE_WARN_TEMP_SUPPLY_HIGH_FAIL = 0x4401, - NM_EVT_CAUSE_WARN_TEMP_FPGA_LOW_FAIL = 0x4402, - NM_EVT_CAUSE_WARN_TEMP_FPGA_HIGH_FAIL = 0x4403, - NM_EVT_CAUSE_WARN_TEMP_SOC_LOW_FAIL = 0x4404, - NM_EVT_CAUSE_WARN_TEMP_SOC_HIGH_FAIL = 0x4405, - NM_EVT_CAUSE_WARN_TEMP_RMS_DET_LOW_FAIL = 0x4406, - NM_EVT_CAUSE_WARN_TEMP_RMS_DET_HIGH_FAIL= 0x4407, - NM_EVT_CAUSE_WARN_TEMP_OCXO_LOW_FAIL = 0x4408, - NM_EVT_CAUSE_WARN_TEMP_OCXO_HIGH_FAIL = 0x4409, - NM_EVT_CAUSE_WARN_TEMP_TRX0_LOW_FAIL = 0x440A, - NM_EVT_CAUSE_WARN_TEMP_TRX0_HIGH_FAIL = 0x440B, - NM_EVT_CAUSE_WARN_TEMP_TRX1_LOW_FAIL = 0x440C, - NM_EVT_CAUSE_WARN_TEMP_TRX1_HIGH_FAIL = 0x440D, - NM_EVT_CAUSE_WARN_TEMP_PA0_LOW_FAIL = 0x440E, - NM_EVT_CAUSE_WARN_TEMP_PA0_HIGH_FAIL = 0x440F, - NM_EVT_CAUSE_WARN_TEMP_PA1_LOW_FAIL = 0x4410, - NM_EVT_CAUSE_WARN_TEMP_PA1_HIGH_FAIL = 0x4411, - NM_EVT_CAUSE_WARN_SUPPLY_LOW_FAIL = 0x4412, - NM_EVT_CAUSE_WARN_SUPPLY_HIGH_FAIL = 0x4413, - NM_EVT_CAUSE_WARN_VSWR0_HIGH_FAIL = 0x4414, - NM_EVT_CAUSE_WANR_VSWR1_HIGH_FAIL = 0x4415, - NM_EVT_CAUSE_WARN_PWR_SUPPLY_HIGH_FAIL = 0x4416, - NM_EVT_CAUSE_WARN_PWR_PA0_HIGH_FAIL = 0x4417, - NM_EVT_CAUSE_WARN_PWR_PA1_HIGH_FAIL = 0x4418, - NM_EVT_CAUSE_WARN_GPS_FIX_FAIL = 0x4419, -}; - -/* This defines the list of notification events for systemd service watchdog. - all these events must be notified in a certain service defined timeslot - or the service (this app) would be restarted (only if related systemd service - unit file has WatchdogSec!=0). - WARNING: swd events must begin with event 0. Last events must be - SWD_LAST (max 64 events in this list). -*/ -enum mgr_swd_events { - SWD_MAINLOOP = 0, - SWD_CHECK_SENSOR, - SWD_UPDATE_HOURS, - SWD_CHECK_TEMP_SENSOR, - SWD_CHECK_LED_CTRL, - SWD_CHECK_CALIB, - SWD_CHECK_BTS_CONNECTION, - SWD_LAST -}; - -int lc15bts_mgr_vty_init(void); -int lc15bts_mgr_parse_config(struct lc15bts_mgr_instance *mgr); -int lc15bts_mgr_nl_init(void); -int lc15bts_mgr_sensor_init(struct lc15bts_mgr_instance *mgr); -const char *lc15bts_mgr_sensor_get_state(enum lc15bts_sensor_state state); - -int lc15bts_mgr_calib_init(struct lc15bts_mgr_instance *mgr); -int lc15bts_mgr_control_init(struct lc15bts_mgr_instance *mgr); -int lc15bts_mgr_calib_run(struct lc15bts_mgr_instance *mgr); -void lc15bts_mgr_dispatch_alarm(struct lc15bts_mgr_instance *mgr, const int cause, const char *key, const char *text); -extern void *tall_mgr_ctx; - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr_calib.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr_calib.c deleted file mode 100644 index badb5455..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr_calib.c +++ /dev/null @@ -1,292 +0,0 @@ -/* OCXO calibration control for Litecell 1.5 BTS management daemon */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_mgr_calib.c - * (C) 2014,2015 by Holger Hans Peter Freyther - * (C) 2014 by Harald Welte for the IPA code from the oml router - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include "misc/lc15bts_mgr.h" -#include "misc/lc15bts_misc.h" -#include "misc/lc15bts_clock.h" -#include "misc/lc15bts_swd.h" -#include "misc/lc15bts_par.h" -#include "misc/lc15bts_led.h" -#include "osmo-bts/msg_utils.h" - -#include <osmocom/core/logging.h> -#include <osmocom/core/select.h> - -#include <osmocom/ctrl/control_cmd.h> - -#include <osmocom/gsm/ipa.h> -#include <osmocom/gsm/protocol/ipaccess.h> - -#include <osmocom/abis/abis.h> -#include <osmocom/abis/e1_input.h> -#include <osmocom/abis/ipa.h> - -#include <time.h> - -static void calib_adjust(struct lc15bts_mgr_instance *mgr); -static void calib_state_reset(struct lc15bts_mgr_instance *mgr, int reason); -static void calib_loop_run(void *_data); - -static int ocxodac_saved_value = -1; - -enum calib_state { - CALIB_INITIAL, - CALIB_IN_PROGRESS, -}; - -enum calib_result { - CALIB_FAIL_START, - CALIB_FAIL_GPSFIX, - CALIB_FAIL_CLKERR, - CALIB_FAIL_OCXODAC, - CALIB_SUCCESS, -}; - -static void calib_start(struct lc15bts_mgr_instance *mgr) -{ - int rc; - - rc = lc15bts_clock_err_open(); - if (rc != 0) { - LOGP(DCALIB, LOGL_ERROR, "Failed to open clock error module %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_CLKERR); - return; - } - - rc = lc15bts_clock_dac_open(); - if (rc != 0) { - LOGP(DCALIB, LOGL_ERROR, "Failed to open OCXO dac module %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_OCXODAC); - return; - } - - calib_adjust(mgr); -} - -static void calib_adjust(struct lc15bts_mgr_instance *mgr) -{ - int rc; - int fault; - int error_ppt; - int accuracy_ppq; - int interval_sec; - int dac_value; - int new_dac_value; - int dac_correction; - time_t now; - time_t last_gps_fix; - - rc = lc15bts_clock_err_get(&fault, &error_ppt, - &accuracy_ppq, &interval_sec); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to get clock error measurement %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_CLKERR); - return; - } - - /* get current time */ - now = time(NULL); - - /* first time after start of manager program */ - if (mgr->gps.last_update == 0) - mgr->gps.last_update = now; - - /* read last GPS 3D fix from storage */ - rc = lc15bts_par_get_gps_fix(&last_gps_fix); - if (rc < 0) { - LOGP(DCALIB, LOGL_NOTICE, "Last GPS 3D fix can not read (%d). Last GPS 3D fix sets to zero\n", rc); - last_gps_fix = 0; - } - - if (fault) { - LOGP(DCALIB, LOGL_NOTICE, "GPS has no fix\n"); - calib_state_reset(mgr, CALIB_FAIL_GPSFIX); - return; - } - - /* We got GPS 3D fix */ - LOGP(DCALIB, LOGL_DEBUG, "Got GPS 3D fix warn_flags=0x%08x, last=%lld, now=%lld\n", - mgr->lc15bts_ctrl.warn_flags, - (long long)last_gps_fix, - (long long)now); - - rc = lc15bts_clock_dac_get(&dac_value); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to get OCXO dac value %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_OCXODAC); - return; - } - - /* Set OCXO initial dac value */ - if (ocxodac_saved_value < 0) - ocxodac_saved_value = dac_value; - - LOGP(DCALIB, LOGL_NOTICE, - "Calibration ERR(%f PPB) ACC(%f PPB) INT(%d) DAC(%d)\n", - error_ppt / 1000., accuracy_ppq / 1000000., interval_sec, dac_value); - - /* Need integration time to correct */ - if (interval_sec) { - /* 1 unit of correction equal about 0.5 - 1 PPB correction */ - dac_correction = (int)(-error_ppt * 0.0015); - new_dac_value = dac_value + dac_correction; - - if (new_dac_value > 4095) - new_dac_value = 4095; - else if (new_dac_value < 0) - new_dac_value = 0; - - /* We have a fix, make sure the measured error is - meaningful (10 times the accuracy) */ - if ((new_dac_value != dac_value) && ((100l * abs(error_ppt)) > accuracy_ppq)) { - - LOGP(DCALIB, LOGL_NOTICE, - "Going to apply %d as new clock setting.\n", - new_dac_value); - - rc = lc15bts_clock_dac_set(new_dac_value); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to set OCXO dac value %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_OCXODAC); - return; - } - rc = lc15bts_clock_err_reset(); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to reset clock error module %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_CLKERR); - return; - } - } - /* New conditions to store DAC value: - * - Resolution accuracy less or equal than 0.01PPB (or 10000 PPQ) - * - Error less or equal than 2PPB (or 2000PPT) - * - Solution different than the last one */ - else if (accuracy_ppq <= 10000) { - if((dac_value != ocxodac_saved_value) && (abs(error_ppt) < 2000)) { - LOGP(DCALIB, LOGL_NOTICE, "Saving OCXO DAC value to memory... val = %d\n", dac_value); - rc = lc15bts_clock_dac_save(); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to save OCXO dac value %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_OCXODAC); - } else { - ocxodac_saved_value = dac_value; - } - } - - rc = lc15bts_clock_err_reset(); - if (rc < 0) { - LOGP(DCALIB, LOGL_ERROR, - "Failed to reset clock error module %d\n", rc); - calib_state_reset(mgr, CALIB_FAIL_CLKERR); - } - } - } else { - LOGP(DCALIB, LOGL_NOTICE, "Skipping this iteration, no integration time\n"); - } - - calib_state_reset(mgr, CALIB_SUCCESS); - return; -} - -static void calib_close(struct lc15bts_mgr_instance *mgr) -{ - lc15bts_clock_err_close(); - lc15bts_clock_dac_close(); -} - -static void calib_state_reset(struct lc15bts_mgr_instance *mgr, int outcome) -{ - if (mgr->calib.calib_from_loop) { - /* - * In case of success calibrate in two hours again - * and in case of a failure in some minutes. - * - * TODO NTQ: Select timeout based on last error and accuracy - */ - int timeout = 60; - //int timeout = 2 * 60 * 60; - //if (outcome != CALIB_SUCESS) } - // timeout = 5 * 60; - //} - - mgr->calib.calib_timeout.data = mgr; - mgr->calib.calib_timeout.cb = calib_loop_run; - osmo_timer_schedule(&mgr->calib.calib_timeout, timeout, 0); - /* TODO: do we want to notify if we got a calibration error, like no gps fix? */ - lc15bts_swd_event(mgr, SWD_CHECK_CALIB); - } - - mgr->calib.state = CALIB_INITIAL; - calib_close(mgr); -} - -static int calib_run(struct lc15bts_mgr_instance *mgr, int from_loop) -{ - if (mgr->calib.state != CALIB_INITIAL) { - LOGP(DCALIB, LOGL_ERROR, "Calib is already in progress.\n"); - return -1; - } - - mgr->calib.calib_from_loop = from_loop; - - /* From now on everything will be handled from the failure */ - mgr->calib.state = CALIB_IN_PROGRESS; - calib_start(mgr); - return 0; -} - -static void calib_loop_run(void *_data) -{ - int rc; - struct lc15bts_mgr_instance *mgr = _data; - - LOGP(DCALIB, LOGL_NOTICE, "Going to calibrate the system.\n"); - rc = calib_run(mgr, 1); - if (rc != 0) { - calib_state_reset(mgr, CALIB_FAIL_START); - } -} - -int lc15bts_mgr_calib_run(struct lc15bts_mgr_instance *mgr) -{ - return calib_run(mgr, 0); -} - -int lc15bts_mgr_calib_init(struct lc15bts_mgr_instance *mgr) -{ - mgr->calib.state = CALIB_INITIAL; - mgr->calib.calib_timeout.data = mgr; - mgr->calib.calib_timeout.cb = calib_loop_run; - osmo_timer_schedule(&mgr->calib.calib_timeout, 0, 0); - - return 0; -} - diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr_nl.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr_nl.c deleted file mode 100644 index 3a617dd7..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr_nl.c +++ /dev/null @@ -1,195 +0,0 @@ -/* NetworkListen for NuRAN Litecell 1.5 BTS management daemon */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_mgr_nl.c - * (C) 2014 by Holger Hans Peter Freyther - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include "misc/lc15bts_mgr.h" -#include "misc/lc15bts_misc.h" -#include "misc/lc15bts_nl.h" -#include "misc/lc15bts_par.h" -#include "misc/lc15bts_bid.h" - -#include <osmo-bts/logging.h> - -#include <osmocom/gsm/protocol/ipaccess.h> - -#include <osmocom/core/msgb.h> -#include <osmocom/core/socket.h> -#include <osmocom/core/select.h> - -#include <arpa/inet.h> - -#include <sys/types.h> -#include <sys/socket.h> - -#include <errno.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> - -#define ETH0_ADDR_SYSFS "/var/lc15/net/eth0/address" - -static struct osmo_fd nl_fd; - -/* - * The TLV structure in IPA messages in UDP packages is a bit - * weird. First the header appears to have an extra NULL byte - * and second the L16 of the L16TV needs to include +1 for the - * tag. The default msgb/tlv and libosmo-abis routines do not - * provide this. - */ - -static void ipaccess_prepend_header_quirk(struct msgb *msg, int proto) -{ - struct ipaccess_head *hh; - - /* prepend the ip.access header */ - hh = (struct ipaccess_head *) msgb_push(msg, sizeof(*hh) + 1); - hh->len = htons(msg->len - sizeof(*hh) - 1); - hh->proto = proto; -} - -static void quirk_l16tv_put(struct msgb *msg, uint16_t len, uint8_t tag, - const uint8_t *val) -{ - uint8_t *buf = msgb_put(msg, len + 2 + 1); - - *buf++ = (len + 1) >> 8; - *buf++ = (len + 1) & 0xff; - *buf++ = tag; - memcpy(buf, val, len); -} - -/* - * We don't look at the content of the request yet and lie - * about most of the responses. - */ -static void respond_to(struct sockaddr_in *src, struct osmo_fd *fd, - uint8_t *data, size_t len) -{ - static int fetched_info = 0; - static char mac_str[20] = {0, }; - static char model_name[64] = {0, }; - static char ser_str[20] = {0, }; - - struct sockaddr_in loc_addr; - int rc; - char loc_ip[INET_ADDRSTRLEN]; - struct msgb *msg = msgb_alloc_headroom(512, 128, "ipa get response"); - if (!msg) { - LOGP(DFIND, LOGL_ERROR, "Failed to allocate msgb\n"); - return; - } - - if (!fetched_info) { - int fd_eth; - int serno; - - /* fetch the MAC */ - fd_eth = open(ETH0_ADDR_SYSFS, O_RDONLY); - if (fd_eth >= 0) { - read(fd_eth, mac_str, sizeof(mac_str)-1); - mac_str[sizeof(mac_str)-1] = '\0'; - close(fd_eth); - } - - /* fetch the serial number */ - lc15bts_par_get_int(tall_mgr_ctx, LC15BTS_PAR_SERNR, &serno); - snprintf(ser_str, sizeof(ser_str), "%d", serno); - - strncpy(model_name, get_hwversion_desc(), sizeof(model_name)-1); - fetched_info = 1; - } - - if (source_for_dest(&src->sin_addr, &loc_addr.sin_addr) != 0) { - LOGP(DFIND, LOGL_ERROR, "Failed to determine local source\n"); - return; - } - - msgb_put_u8(msg, IPAC_MSGT_ID_RESP); - - /* append MAC addr */ - quirk_l16tv_put(msg, strlen(mac_str) + 1, IPAC_IDTAG_MACADDR, (uint8_t *) mac_str); - - /* append ip address */ - inet_ntop(AF_INET, &loc_addr.sin_addr, loc_ip, sizeof(loc_ip)); - quirk_l16tv_put(msg, strlen(loc_ip) + 1, IPAC_IDTAG_IPADDR, (uint8_t *) loc_ip); - - /* append the serial number */ - quirk_l16tv_put(msg, strlen(ser_str) + 1, IPAC_IDTAG_SERNR, (uint8_t *) ser_str); - - /* abuse some flags */ - quirk_l16tv_put(msg, strlen(model_name) + 1, IPAC_IDTAG_UNIT, (uint8_t *) model_name); - - /* ip.access nanoBTS would reply to port==3006 */ - ipaccess_prepend_header_quirk(msg, IPAC_PROTO_IPACCESS); - rc = sendto(fd->fd, msg->data, msg->len, 0, (struct sockaddr *)src, sizeof(*src)); - if (rc != msg->len) - LOGP(DFIND, LOGL_ERROR, - "Failed to send with rc(%d) errno(%d)\n", rc, errno); -} - -static int ipaccess_bcast(struct osmo_fd *fd, unsigned int what) -{ - uint8_t data[2048]; - char src[INET_ADDRSTRLEN]; - struct sockaddr_in addr = {}; - socklen_t len = sizeof(addr); - int rc; - - rc = recvfrom(fd->fd, data, sizeof(data), 0, - (struct sockaddr *) &addr, &len); - if (rc <= 0) { - LOGP(DFIND, LOGL_ERROR, - "Failed to read from socket errno(%d)\n", errno); - return -1; - } - - LOGP(DFIND, LOGL_DEBUG, - "Received request from: %s size %d\n", - inet_ntop(AF_INET, &addr.sin_addr, src, sizeof(src)), rc); - - if (rc < 6) - return 0; - - if (data[2] != IPAC_PROTO_IPACCESS || data[4] != IPAC_MSGT_ID_GET) - return 0; - - respond_to(&addr, fd, data + 6, rc - 6); - return 0; -} - -int lc15bts_mgr_nl_init(void) -{ - int rc; - - nl_fd.cb = ipaccess_bcast; - rc = osmo_sock_init_ofd(&nl_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, - "0.0.0.0", 3006, OSMO_SOCK_F_BIND); - if (rc < 0) { - perror("Socket creation"); - return -1; - } - - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c deleted file mode 100644 index 9665e1db..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c +++ /dev/null @@ -1,378 +0,0 @@ -/* Temperature control for NuRAN Litecell 1.5 BTS management daemon */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_mgr_temp.c - * (C) 2014 by Holger Hans Peter Freyther - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -#include <inttypes.h> -#include "misc/lc15bts_mgr.h" -#include "misc/lc15bts_misc.h" -#include "misc/lc15bts_temp.h" -#include "misc/lc15bts_power.h" -#include "misc/lc15bts_led.h" -#include "misc/lc15bts_swd.h" -#include "limits.h" - -#include <osmo-bts/logging.h> - -#include <osmocom/core/timer.h> -#include <osmocom/core/utils.h> -#include <osmocom/core/linuxlist.h> - -struct lc15bts_mgr_instance *s_mgr; -static struct osmo_timer_list sensor_ctrl_timer; - -static const struct value_string state_names[] = { - { STATE_NORMAL, "NORMAL" }, - { STATE_WARNING_HYST, "WARNING (HYST)" }, - { STATE_WARNING, "WARNING" }, - { STATE_CRITICAL, "CRITICAL" }, - { 0, NULL } -}; - -const char *lc15bts_mgr_sensor_get_state(enum lc15bts_sensor_state state) -{ - return get_value_string(state_names, state); -} - -static int next_state(enum lc15bts_sensor_state current_state, int critical, int warning) -{ - int next_state = -1; - switch (current_state) { - case STATE_NORMAL: - if (critical) - next_state = STATE_CRITICAL; - else if (warning) - next_state = STATE_WARNING; - break; - case STATE_WARNING_HYST: - if (critical) - next_state = STATE_CRITICAL; - else if (warning) - next_state = STATE_WARNING; - else - next_state = STATE_NORMAL; - break; - case STATE_WARNING: - if (critical) - next_state = STATE_CRITICAL; - else if (!warning) - next_state = STATE_WARNING_HYST; - break; - case STATE_CRITICAL: - if (!critical && !warning) - next_state = STATE_WARNING; - break; - }; - - return next_state; -} - -static void handle_normal_actions(int actions) -{ - /* switch on the PA */ - if (actions & SENSOR_ACT_NORM_PA0_ON) { - if (lc15bts_power_set(LC15BTS_POWER_PA0, 1) != 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to switch on the PA #0\n"); - } else { - LOGP(DTEMP, LOGL_NOTICE, - "Switched on the PA #0 as normal action.\n"); - } - } - - if (actions & SENSOR_ACT_NORM_PA1_ON) { - if (lc15bts_power_set(LC15BTS_POWER_PA1, 1) != 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to switch on the PA #1\n"); - } else { - LOGP(DTEMP, LOGL_NOTICE, - "Switched on the PA #1 as normal action.\n"); - } - } - - if (actions & SENSOR_ACT_NORM_BTS_SRV_ON) { - LOGP(DTEMP, LOGL_NOTICE, - "Going to switch on the BTS service\n"); - /* - * TODO: use/create something like nspawn that serializes - * and used SIGCHLD/waitpid to pick up the dead processes - * without invoking shell. - */ - system("/bin/systemctl start osmo-bts.service"); - } -} - -static void handle_actions(int actions) -{ - /* switch off the PA */ - if (actions & SENSOR_ACT_PA1_OFF) { - if (lc15bts_power_set(LC15BTS_POWER_PA1, 0) != 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to switch off the PA #1. Stop BTS?\n"); - } else { - LOGP(DTEMP, LOGL_NOTICE, - "Switched off the PA #1 due temperature.\n"); - } - } - - if (actions & SENSOR_ACT_PA0_OFF) { - if (lc15bts_power_set(LC15BTS_POWER_PA0, 0) != 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to switch off the PA #0. Stop BTS?\n"); - } else { - LOGP(DTEMP, LOGL_NOTICE, - "Switched off the PA #0 due temperature.\n"); - } - } - - if (actions & SENSOR_ACT_BTS_SRV_OFF) { - LOGP(DTEMP, LOGL_NOTICE, - "Going to switch off the BTS service\n"); - /* - * TODO: use/create something like nspawn that serializes - * and used SIGCHLD/waitpid to pick up the dead processes - * without invoking shell. - */ - system("/bin/systemctl stop osmo-bts.service"); - } -} - -/** - * Go back to normal! Depending on the configuration execute the normal - * actions that could (start to) undo everything we did in the other - * states. What is still missing is the power increase/decrease depending - * on the state. E.g. starting from WARNING_HYST we might want to slowly - * ramp up the output power again. - */ -static void execute_normal_act(struct lc15bts_mgr_instance *manager) -{ - LOGP(DTEMP, LOGL_NOTICE, "System is back to normal state.\n"); - handle_normal_actions(manager->state.action_norm); -} - -static void execute_warning_act(struct lc15bts_mgr_instance *manager) -{ - LOGP(DTEMP, LOGL_NOTICE, "System has reached warning state.\n"); - handle_actions(manager->state.action_warn); -} - -static void execute_critical_act(struct lc15bts_mgr_instance *manager) -{ - LOGP(DTEMP, LOGL_NOTICE, "System has reached critical warning.\n"); - handle_actions(manager->state.action_crit); -} - -static void lc15bts_mgr_sensor_handle(struct lc15bts_mgr_instance *manager, - int critical, int warning) -{ - int new_state = next_state(manager->state.state, critical, warning); - - /* Nothing changed */ - if (new_state < 0) - return; - - LOGP(DTEMP, LOGL_NOTICE, "Moving from state %s to %s.\n", - get_value_string(state_names, manager->state.state), - get_value_string(state_names, new_state)); - manager->state.state = new_state; - switch (manager->state.state) { - case STATE_NORMAL: - execute_normal_act(manager); - break; - case STATE_WARNING_HYST: - /* do nothing? Maybe start to increase transmit power? */ - break; - case STATE_WARNING: - execute_warning_act(manager); - break; - case STATE_CRITICAL: - execute_critical_act(manager); - break; - }; -} - -static void sensor_ctrl_check(struct lc15bts_mgr_instance *mgr) -{ - int rc; - int temp = 0; - int warn_thresh_passed = 0; - int crit_thresh_passed = 0; - - LOGP(DTEMP, LOGL_DEBUG, "Going to check the temperature.\n"); - - /* Read the current supply temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_SUPPLY, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the supply temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.supply_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.supply_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "Supply temperature is: %d\n", temp); - } - - /* Read the current SoC temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_SOC, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the SoC temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.soc_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.soc_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "SoC temperature is: %d\n", temp); - } - - /* Read the current fpga temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_FPGA, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the fpga temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.fpga_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.fpga_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "FPGA temperature is: %d\n", temp); - } - - /* Read the current RMS detector temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_RMSDET, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the RMS detector temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.rmsdet_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.rmsdet_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "RMS detector temperature is: %d\n", temp); - } - - /* Read the current OCXO temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_OCXO, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the OCXO temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.ocxo_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.ocxo_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "OCXO temperature is: %d\n", temp); - } - - /* Read the current TX #0 temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_TX0, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the TX #0 temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.tx0_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.tx0_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "TX #0 temperature is: %d\n", temp); - } - - /* Read the current TX #1 temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_TX1, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the TX #1 temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.tx1_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.tx1_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "TX #1 temperature is: %d\n", temp); - } - - /* Read the current PA #0 temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_PA0, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the PA #0 temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.pa0_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.pa0_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "PA #0 temperature is: %d\n", temp); - } - - /* Read the current PA #1 temperature */ - rc = lc15bts_temp_get(LC15BTS_TEMP_PA1, &temp); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, - "Failed to read the PA #1 temperature. rc=%d\n", rc); - warn_thresh_passed = crit_thresh_passed = 1; - } else { - temp = temp / 1000; - if (temp > mgr->temp.pa1_temp_limit.thresh_warn_max) - warn_thresh_passed = 1; - if (temp > mgr->temp.pa1_temp_limit.thresh_crit_max) - crit_thresh_passed = 1; - LOGP(DTEMP, LOGL_DEBUG, "PA #1 temperature is: %d\n", temp); - } - - lc15bts_mgr_sensor_handle(mgr, crit_thresh_passed, warn_thresh_passed); -} - -static void sensor_ctrl_check_cb(void *_data) -{ - struct lc15bts_mgr_instance *mgr = _data; - sensor_ctrl_check(mgr); - /* Check every minute? XXX make it configurable! */ - osmo_timer_schedule(&sensor_ctrl_timer, LC15BTS_SENSOR_TIMER_DURATION, 0); - LOGP(DTEMP, LOGL_DEBUG,"Check sensors timer expired\n"); - /* TODO: do we want to notify if some sensors could not be read? */ - lc15bts_swd_event(mgr, SWD_CHECK_TEMP_SENSOR); -} - -int lc15bts_mgr_sensor_init(struct lc15bts_mgr_instance *mgr) -{ - s_mgr = mgr; - sensor_ctrl_timer.cb = sensor_ctrl_check_cb; - sensor_ctrl_timer.data = s_mgr; - sensor_ctrl_check_cb(s_mgr); - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr_vty.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr_vty.c deleted file mode 100644 index 424ff18f..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_mgr_vty.c +++ /dev/null @@ -1,1074 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_mgr_vty.c - * (C) 2014 by sysmocom - s.f.m.c. GmbH - * - * All Rights Reserved - * - * Author: Alvaro Neira Ayuso <anayuso@sysmocom.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <stdint.h> -#include <ctype.h> -#include <string.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <inttypes.h> - -#include <osmocom/vty/vty.h> -#include <osmocom/vty/command.h> -#include <osmocom/vty/misc.h> - -#include <osmo-bts/logging.h> - -#include "lc15bts_misc.h" -#include "lc15bts_mgr.h" -#include "lc15bts_temp.h" -#include "lc15bts_power.h" -#include "lc15bts_led.h" -#include "btsconfig.h" - -static struct lc15bts_mgr_instance *s_mgr; - -static const char copyright[] = - "(C) 2012 by Harald Welte <laforge@gnumonks.org>\r\n" - "(C) 2014 by Holger Hans Peter Freyther\r\n" - "(C) 2015 by Yves Godin <support@nuranwireless.com>\r\n" - "License AGPLv3+: GNU AGPL version 2 or later <http://gnu.org/licenses/agpl-3.0.html>\r\n" - "This is free software: you are free to change and redistribute it.\r\n" - "There is NO WARRANTY, to the extent permitted by law.\r\n"; - -static int go_to_parent(struct vty *vty) -{ - switch (vty->node) { - case MGR_NODE: - vty->node = CONFIG_NODE; - break; - case ACT_NORM_NODE: - case ACT_WARN_NODE: - case ACT_CRIT_NODE: - case LIMIT_SUPPLY_TEMP_NODE: - case LIMIT_SOC_NODE: - case LIMIT_FPGA_NODE: - case LIMIT_RMSDET_NODE: - case LIMIT_OCXO_NODE: - case LIMIT_TX0_TEMP_NODE: - case LIMIT_TX1_TEMP_NODE: - case LIMIT_PA0_TEMP_NODE: - case LIMIT_PA1_TEMP_NODE: - case LIMIT_SUPPLY_VOLT_NODE: - case LIMIT_TX0_VSWR_NODE: - case LIMIT_TX1_VSWR_NODE: - case LIMIT_SUPPLY_PWR_NODE: - case LIMIT_PA0_PWR_NODE: - case LIMIT_PA1_PWR_NODE: - vty->node = MGR_NODE; - break; - default: - vty->node = CONFIG_NODE; - } - return vty->node; -} - -static int is_config_node(struct vty *vty, int node) -{ - switch (node) { - case MGR_NODE: - case ACT_NORM_NODE: - case ACT_WARN_NODE: - case ACT_CRIT_NODE: - case LIMIT_SUPPLY_TEMP_NODE: - case LIMIT_SOC_NODE: - case LIMIT_FPGA_NODE: - case LIMIT_RMSDET_NODE: - case LIMIT_OCXO_NODE: - case LIMIT_TX0_TEMP_NODE: - case LIMIT_TX1_TEMP_NODE: - case LIMIT_PA0_TEMP_NODE: - case LIMIT_PA1_TEMP_NODE: - case LIMIT_SUPPLY_VOLT_NODE: - case LIMIT_TX0_VSWR_NODE: - case LIMIT_TX1_VSWR_NODE: - case LIMIT_SUPPLY_PWR_NODE: - case LIMIT_PA0_PWR_NODE: - case LIMIT_PA1_PWR_NODE: - return 1; - default: - return 0; - } -} - -static struct vty_app_info vty_info = { - .name = "lc15bts-mgr", - .version = PACKAGE_VERSION, - .go_parent_cb = go_to_parent, - .is_config_node = is_config_node, - .copyright = copyright, -}; - - -#define MGR_STR "Configure lc15bts-mgr\n" - -static struct cmd_node mgr_node = { - MGR_NODE, - "%s(lc15bts-mgr)# ", - 1, -}; - -static struct cmd_node act_norm_node = { - ACT_NORM_NODE, - "%s(actions-normal)# ", - 1, -}; - -static struct cmd_node act_warn_node = { - ACT_WARN_NODE, - "%s(actions-warn)# ", - 1, -}; - -static struct cmd_node act_crit_node = { - ACT_CRIT_NODE, - "%s(actions-critical)# ", - 1, -}; - -static struct cmd_node limit_supply_temp_node = { - LIMIT_SUPPLY_TEMP_NODE, - "%s(limit-supply-temp)# ", - 1, -}; - -static struct cmd_node limit_soc_node = { - LIMIT_SOC_NODE, - "%s(limit-soc)# ", - 1, -}; - -static struct cmd_node limit_fpga_node = { - LIMIT_FPGA_NODE, - "%s(limit-fpga)# ", - 1, -}; - -static struct cmd_node limit_rmsdet_node = { - LIMIT_RMSDET_NODE, - "%s(limit-rmsdet)# ", - 1, -}; - -static struct cmd_node limit_ocxo_node = { - LIMIT_OCXO_NODE, - "%s(limit-ocxo)# ", - 1, -}; - -static struct cmd_node limit_tx0_temp_node = { - LIMIT_TX0_TEMP_NODE, - "%s(limit-tx0-temp)# ", - 1, -}; -static struct cmd_node limit_tx1_temp_node = { - LIMIT_TX1_TEMP_NODE, - "%s(limit-tx1-temp)# ", - 1, -}; -static struct cmd_node limit_pa0_temp_node = { - LIMIT_PA0_TEMP_NODE, - "%s(limit-pa0-temp)# ", - 1, -}; -static struct cmd_node limit_pa1_temp_node = { - LIMIT_PA1_TEMP_NODE, - "%s(limit-pa1-temp)# ", - 1, -}; -static struct cmd_node limit_supply_volt_node = { - LIMIT_SUPPLY_VOLT_NODE, - "%s(limit-supply-volt)# ", - 1, -}; -static struct cmd_node limit_tx0_vswr_node = { - LIMIT_TX0_VSWR_NODE, - "%s(limit-tx0-vswr)# ", - 1, -}; -static struct cmd_node limit_tx1_vswr_node = { - LIMIT_TX1_VSWR_NODE, - "%s(limit-tx1-vswr)# ", - 1, -}; -static struct cmd_node limit_supply_pwr_node = { - LIMIT_SUPPLY_PWR_NODE, - "%s(limit-supply-pwr)# ", - 1, -}; -static struct cmd_node limit_pa0_pwr_node = { - LIMIT_PA0_PWR_NODE, - "%s(limit-pa0-pwr)# ", - 1, -}; -static struct cmd_node limit_pa1_pwr_node = { - LIMIT_PA1_PWR_NODE, - "%s(limit-pa1-pwr)# ", - 1, -}; - -static struct cmd_node limit_gps_fix_node = { - LIMIT_GPS_FIX_NODE, - "%s(limit-gps-fix)# ", - 1, -}; - -DEFUN(cfg_mgr, cfg_mgr_cmd, - "lc15bts-mgr", - MGR_STR) -{ - vty->node = MGR_NODE; - return CMD_SUCCESS; -} - -static void write_volt_limit(struct vty *vty, const char *name, - struct lc15bts_volt_limit *limit) -{ - vty_out(vty, " %s%s", name, VTY_NEWLINE); - vty_out(vty, " threshold warning min %d%s", - limit->thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " threshold critical min %d%s", - limit->thresh_crit_min, VTY_NEWLINE); -} - -static void write_vswr_limit(struct vty *vty, const char *name, - struct lc15bts_vswr_limit *limit) -{ - vty_out(vty, " %s%s", name, VTY_NEWLINE); - vty_out(vty, " threshold warning max %d%s", - limit->thresh_warn_max, VTY_NEWLINE); -} - -static void write_pwr_limit(struct vty *vty, const char *name, - struct lc15bts_pwr_limit *limit) -{ - vty_out(vty, " %s%s", name, VTY_NEWLINE); - vty_out(vty, " threshold warning max %d%s", - limit->thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " threshold critical max %d%s", - limit->thresh_crit_max, VTY_NEWLINE); -} - -static void write_norm_action(struct vty *vty, const char *name, int actions) -{ - vty_out(vty, " %s%s", name, VTY_NEWLINE); - vty_out(vty, " %spa0-on%s", - (actions & SENSOR_ACT_NORM_PA0_ON) ? "" : "no ", VTY_NEWLINE); - vty_out(vty, " %spa1-on%s", - (actions & SENSOR_ACT_NORM_PA1_ON) ? "" : "no ", VTY_NEWLINE); - vty_out(vty, " %sbts-service-on%s", - (actions & SENSOR_ACT_NORM_BTS_SRV_ON) ? "" : "no ", VTY_NEWLINE); -} - -static void write_action(struct vty *vty, const char *name, int actions) -{ - vty_out(vty, " %s%s", name, VTY_NEWLINE); - vty_out(vty, " %spa0-off%s", - (actions & SENSOR_ACT_PA0_OFF) ? "" : "no ", VTY_NEWLINE); - vty_out(vty, " %spa1-off%s", - (actions & SENSOR_ACT_PA1_OFF) ? "" : "no ", VTY_NEWLINE); - vty_out(vty, " %sbts-service-off%s", - (actions & SENSOR_ACT_BTS_SRV_OFF) ? "" : "no ", VTY_NEWLINE); -} - -static int config_write_mgr(struct vty *vty) -{ - vty_out(vty, "lc15bts-mgr%s", VTY_NEWLINE); - - write_volt_limit(vty, "limits supply_volt", &s_mgr->volt.supply_volt_limit); - write_pwr_limit(vty, "limits supply_pwr", &s_mgr->pwr.supply_pwr_limit); - write_vswr_limit(vty, "limits tx0_vswr", &s_mgr->vswr.tx0_vswr_limit); - write_vswr_limit(vty, "limits tx1_vswr", &s_mgr->vswr.tx1_vswr_limit); - - write_norm_action(vty, "actions normal", s_mgr->state.action_norm); - write_action(vty, "actions warn", s_mgr->state.action_warn); - write_action(vty, "actions critical", s_mgr->state.action_crit); - - return CMD_SUCCESS; -} - -static int config_write_dummy(struct vty *vty) -{ - return CMD_SUCCESS; -} - -#define CFG_LIMIT_TEMP(name, expl, switch_to, variable) \ -DEFUN(cfg_limit_##name, cfg_limit_##name##_cmd, \ - "limits " #name, \ - "Configure Limits\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->temp.variable; \ - return CMD_SUCCESS; \ -} - -CFG_LIMIT_TEMP(supply_temp, "SUPPLY TEMP\n", LIMIT_SUPPLY_TEMP_NODE, supply_temp_limit) -CFG_LIMIT_TEMP(soc_temp, "SOC TEMP\n", LIMIT_SOC_NODE, soc_temp_limit) -CFG_LIMIT_TEMP(fpga_temp, "FPGA TEMP\n", LIMIT_FPGA_NODE, fpga_temp_limit) -CFG_LIMIT_TEMP(rmsdet_temp, "RMSDET TEMP\n", LIMIT_RMSDET_NODE, rmsdet_temp_limit) -CFG_LIMIT_TEMP(ocxo_temp, "OCXO TEMP\n", LIMIT_OCXO_NODE, ocxo_temp_limit) -CFG_LIMIT_TEMP(tx0_temp, "TX0 TEMP\n", LIMIT_TX0_TEMP_NODE, tx0_temp_limit) -CFG_LIMIT_TEMP(tx1_temp, "TX1 TEMP\n", LIMIT_TX1_TEMP_NODE, tx1_temp_limit) -CFG_LIMIT_TEMP(pa0_temp, "PA0 TEMP\n", LIMIT_PA0_TEMP_NODE, pa0_temp_limit) -CFG_LIMIT_TEMP(pa1_temp, "PA1 TEMP\n", LIMIT_PA1_TEMP_NODE, pa1_temp_limit) -#undef CFG_LIMIT_TEMP - -#define CFG_LIMIT_VOLT(name, expl, switch_to, variable) \ -DEFUN(cfg_limit_##name, cfg_limit_##name##_cmd, \ - "limits " #name, \ - "Configure Limits\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->volt.variable; \ - return CMD_SUCCESS; \ -} - -CFG_LIMIT_VOLT(supply_volt, "SUPPLY VOLT\n", LIMIT_SUPPLY_VOLT_NODE, supply_volt_limit) -#undef CFG_LIMIT_VOLT - -#define CFG_LIMIT_VSWR(name, expl, switch_to, variable) \ -DEFUN(cfg_limit_##name, cfg_limit_##name##_cmd, \ - "limits " #name, \ - "Configure Limits\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->vswr.variable; \ - return CMD_SUCCESS; \ -} - -CFG_LIMIT_VSWR(tx0_vswr, "TX0 VSWR\n", LIMIT_TX0_VSWR_NODE, tx0_vswr_limit) -CFG_LIMIT_VSWR(tx1_vswr, "TX1 VSWR\n", LIMIT_TX1_VSWR_NODE, tx1_vswr_limit) -#undef CFG_LIMIT_VSWR - -#define CFG_LIMIT_PWR(name, expl, switch_to, variable) \ -DEFUN(cfg_limit_##name, cfg_limit_##name##_cmd, \ - "limits " #name, \ - "Configure Limits\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->pwr.variable; \ - return CMD_SUCCESS; \ -} - -CFG_LIMIT_PWR(supply_pwr, "SUPPLY PWR\n", LIMIT_SUPPLY_PWR_NODE, supply_pwr_limit) -CFG_LIMIT_PWR(pa0_pwr, "PA0 PWR\n", LIMIT_PA0_PWR_NODE, pa0_pwr_limit) -CFG_LIMIT_PWR(pa1_pwr, "PA1 PWR\n", LIMIT_PA1_PWR_NODE, pa1_pwr_limit) -#undef CFG_LIMIT_PWR - -#define CFG_LIMIT_GPS_FIX(name, expl, switch_to, variable) \ -DEFUN(cfg_limit_##name, cfg_limit_##name##_cmd, \ - "limits " #name, \ - "Configure Limits\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->gps.variable; \ - return CMD_SUCCESS; \ -} - -CFG_LIMIT_GPS_FIX(gps_fix, "GPS FIX\n", LIMIT_GPS_FIX_NODE, gps_fix_limit) -#undef CFG_LIMIT_GPS_FIX - -DEFUN(cfg_limit_volt_warn_min, cfg_thresh_volt_warn_min_cmd, - "threshold warning min <0-48000>", - "Threshold to reach\n" "Warning level\n" "Range\n") -{ - struct lc15bts_volt_limit *limit = vty->index; - limit->thresh_warn_min = atoi(argv[0]); - return CMD_SUCCESS; -} - -DEFUN(cfg_limit_volt_crit_min, cfg_thresh_volt_crit_min_cmd, - "threshold critical min <0-48000>", - "Threshold to reach\n" "Critical level\n" "Range\n") -{ - struct lc15bts_volt_limit *limit = vty->index; - limit->thresh_crit_min = atoi(argv[0]); - return CMD_SUCCESS; -} - -DEFUN(cfg_limit_vswr_warn_max, cfg_thresh_vswr_warn_max_cmd, - "threshold warning max <1000-200000>", - "Threshold to reach\n" "Warning level\n" "Range\n") -{ - struct lc15bts_vswr_limit *limit = vty->index; - limit->thresh_warn_max = atoi(argv[0]); - return CMD_SUCCESS; -} - -DEFUN(cfg_limit_vswr_crit_max, cfg_thresh_vswr_crit_max_cmd, - "threshold critical max <1000-200000>", - "Threshold to reach\n" "Critical level\n" "Range\n") -{ - struct lc15bts_vswr_limit *limit = vty->index; - limit->thresh_crit_max = atoi(argv[0]); - return CMD_SUCCESS; -} - -DEFUN(cfg_limit_pwr_warn_max, cfg_thresh_pwr_warn_max_cmd, - "threshold warning max <0-200>", - "Threshold to reach\n" "Warning level\n" "Range\n") -{ - struct lc15bts_pwr_limit *limit = vty->index; - limit->thresh_warn_max = atoi(argv[0]); - return CMD_SUCCESS; -} - -DEFUN(cfg_limit_pwr_crit_max, cfg_thresh_pwr_crit_max_cmd, - "threshold critical max <0-200>", - "Threshold to reach\n" "Critical level\n" "Range\n") -{ - struct lc15bts_pwr_limit *limit = vty->index; - limit->thresh_crit_max = atoi(argv[0]); - return CMD_SUCCESS; -} - -#define CFG_ACTION(name, expl, switch_to, variable) \ -DEFUN(cfg_action_##name, cfg_action_##name##_cmd, \ - "actions " #name, \ - "Configure Actions\n" expl) \ -{ \ - vty->node = switch_to; \ - vty->index = &s_mgr->state.variable; \ - return CMD_SUCCESS; \ -} -CFG_ACTION(normal, "Normal Actions\n", ACT_NORM_NODE, action_norm) -CFG_ACTION(warn, "Warning Actions\n", ACT_WARN_NODE, action_warn) -CFG_ACTION(critical, "Critical Actions\n", ACT_CRIT_NODE, action_crit) -#undef CFG_ACTION - -DEFUN(cfg_action_pa0_on, cfg_action_pa0_on_cmd, - "pa0-on", - "Switch the Power Amplifier #0 on\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_NORM_PA0_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_pa0_on, cfg_no_action_pa0_on_cmd, - "no pa0-on", - NO_STR "Switch the Power Amplifieri #0 on\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_NORM_PA0_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_action_pa1_on, cfg_action_pa1_on_cmd, - "pa1-on", - "Switch the Power Amplifier #1 on\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_NORM_PA1_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_pa1_on, cfg_no_action_pa1_on_cmd, - "no pa1-on", - NO_STR "Switch the Power Amplifieri #1 on\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_NORM_PA1_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_action_bts_srv_on, cfg_action_bts_srv_on_cmd, - "bts-service-on", - "Start the systemd lc15bts.service\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_NORM_BTS_SRV_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_bts_srv_on, cfg_no_action_bts_srv_on_cmd, - "no bts-service-on", - NO_STR "Start the systemd lc15bts.service\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_NORM_BTS_SRV_ON; - return CMD_SUCCESS; -} - -DEFUN(cfg_action_pa0_off, cfg_action_pa0_off_cmd, - "pa0-off", - "Switch the Power Amplifier #0 off\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_PA0_OFF; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_pa0_off, cfg_no_action_pa0_off_cmd, - "no pa0-off", - NO_STR "Do not switch off the Power Amplifier #0\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_PA0_OFF; - return CMD_SUCCESS; -} - -DEFUN(cfg_action_pa1_off, cfg_action_pa1_off_cmd, - "pa1-off", - "Switch the Power Amplifier #1 off\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_PA1_OFF; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_pa1_off, cfg_no_action_pa1_off_cmd, - "no pa1-off", - NO_STR "Do not switch off the Power Amplifier #1\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_PA1_OFF; - return CMD_SUCCESS; -} - -DEFUN(cfg_action_bts_srv_off, cfg_action_bts_srv_off_cmd, - "bts-service-off", - "Stop the systemd lc15bts.service\n") -{ - int *action = vty->index; - *action |= SENSOR_ACT_BTS_SRV_OFF; - return CMD_SUCCESS; -} - -DEFUN(cfg_no_action_bts_srv_off, cfg_no_action_bts_srv_off_cmd, - "no bts-service-off", - NO_STR "Stop the systemd lc15bts.service\n") -{ - int *action = vty->index; - *action &= ~SENSOR_ACT_BTS_SRV_OFF; - return CMD_SUCCESS; -} - -DEFUN(show_mgr, show_mgr_cmd, "show manager", - SHOW_STR "Display information about the manager") -{ - int temp, volt, current, power, vswr; - vty_out(vty, "Warning alarm flags: 0x%08x%s", - s_mgr->lc15bts_ctrl.warn_flags, VTY_NEWLINE); - vty_out(vty, "Critical alarm flags: 0x%08x%s", - s_mgr->lc15bts_ctrl.crit_flags, VTY_NEWLINE); - vty_out(vty, "Preventive action retried: %d%s", - s_mgr->alarms.preventive_retry, VTY_NEWLINE); - vty_out(vty, "Temperature control state: %s%s", - lc15bts_mgr_sensor_get_state(s_mgr->state.state), VTY_NEWLINE); - vty_out(vty, "Current Temperatures%s", VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_SUPPLY, &temp); - vty_out(vty, " Main Supply : %4.2f Celsius%s", - temp/ 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_SOC, &temp); - vty_out(vty, " SoC : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_FPGA, &temp); - vty_out(vty, " FPGA : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_RMSDET, &temp); - vty_out(vty, " RMSDet : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_OCXO, &temp); - vty_out(vty, " OCXO : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_TX0, &temp); - vty_out(vty, " TX 0 : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_TX1, &temp); - vty_out(vty, " TX 1 : %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_PA0, &temp); - vty_out(vty, " Power Amp #0: %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - lc15bts_temp_get(LC15BTS_TEMP_PA1, &temp); - vty_out(vty, " Power Amp #1: %4.2f Celsius%s", - temp / 1000.0f, - VTY_NEWLINE); - - vty_out(vty, "Power Status%s", VTY_NEWLINE); - lc15bts_power_sensor_get(LC15BTS_POWER_SUPPLY, - LC15BTS_POWER_VOLTAGE, &volt); - lc15bts_power_sensor_get(LC15BTS_POWER_SUPPLY, - LC15BTS_POWER_CURRENT, ¤t); - lc15bts_power_sensor_get(LC15BTS_POWER_SUPPLY, - LC15BTS_POWER_POWER, &power); - vty_out(vty, " Main Supply : ON [%6.2f Vdc, %4.2f A, %6.2f W]%s", - volt /1000.0f, - current /1000.0f, - power /1000000.0f, - VTY_NEWLINE); - lc15bts_power_sensor_get(LC15BTS_POWER_PA0, - LC15BTS_POWER_VOLTAGE, &volt); - lc15bts_power_sensor_get(LC15BTS_POWER_PA0, - LC15BTS_POWER_CURRENT, ¤t); - lc15bts_power_sensor_get(LC15BTS_POWER_PA0, - LC15BTS_POWER_POWER, &power); - vty_out(vty, " Power Amp #0: %s [%6.2f Vdc, %4.2f A, %6.2f W]%s", - lc15bts_power_get(LC15BTS_POWER_PA0) ? "ON " : "OFF", - volt /1000.0f, - current /1000.0f, - power /1000000.0f, - VTY_NEWLINE); - lc15bts_power_sensor_get(LC15BTS_POWER_PA1, - LC15BTS_POWER_VOLTAGE, &volt); - lc15bts_power_sensor_get(LC15BTS_POWER_PA1, - LC15BTS_POWER_CURRENT, ¤t); - lc15bts_power_sensor_get(LC15BTS_POWER_PA1, - LC15BTS_POWER_POWER, &power); - vty_out(vty, " Power Amp #1: %s [%6.2f Vdc, %4.2f A, %6.2f W]%s", - lc15bts_power_get(LC15BTS_POWER_PA1) ? "ON " : "OFF", - volt /1000.0f, - current /1000.0f, - power /1000000.0f, - VTY_NEWLINE); - vty_out(vty, "VSWR Status%s", VTY_NEWLINE); - lc15bts_vswr_get(LC15BTS_VSWR_TX0, &vswr); - vty_out(vty, " VSWR TX 0: %f %s", - vswr / 1000.0f, - VTY_NEWLINE); - lc15bts_vswr_get(LC15BTS_VSWR_TX1, &vswr); - vty_out(vty, " VSWR TX 1: %f %s", - vswr / 1000.0f, - VTY_NEWLINE); - - return CMD_SUCCESS; -} - -DEFUN(show_thresh, show_thresh_cmd, "show thresholds", - SHOW_STR "Display information about the thresholds") -{ - vty_out(vty, "Temperature limits (Celsius)%s", VTY_NEWLINE); - vty_out(vty, " Main supply%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.supply_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.supply_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.supply_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " SoC%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.soc_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.soc_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.soc_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " FPGA%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.fpga_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.fpga_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.fpga_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " RMSDet%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.rmsdet_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.rmsdet_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.rmsdet_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " OCXO%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.ocxo_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.ocxo_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.ocxo_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " TX0%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.tx0_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.tx0_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.tx0_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " TX1%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.tx1_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.tx1_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.tx1_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " PA0%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.pa0_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.pa0_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.pa0_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " PA1%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->temp.pa1_temp_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->temp.pa1_temp_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->temp.pa1_temp_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, "Power limits%s", VTY_NEWLINE); - vty_out(vty, " Main supply (mV)%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->volt.supply_volt_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->volt.supply_volt_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " Warning min : %d%s",s_mgr->volt.supply_volt_limit.thresh_warn_min, VTY_NEWLINE); - vty_out(vty, " Critical min : %d%s",s_mgr->volt.supply_volt_limit.thresh_crit_min, VTY_NEWLINE); - vty_out(vty, " Main supply power (W)%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->pwr.supply_pwr_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->pwr.supply_pwr_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " PA0 power (W)%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->pwr.pa0_pwr_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->pwr.pa0_pwr_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " PA1 power (W)%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->pwr.pa1_pwr_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->pwr.pa1_pwr_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, "VSWR limits%s", VTY_NEWLINE); - vty_out(vty, " TX0%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->vswr.tx0_vswr_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->vswr.tx0_vswr_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, " TX1%s", VTY_NEWLINE); - vty_out(vty, " Critical max : %d%s",s_mgr->vswr.tx1_vswr_limit.thresh_crit_max, VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->vswr.tx1_vswr_limit.thresh_warn_max, VTY_NEWLINE); - vty_out(vty, "Days since last GPS 3D fix%s", VTY_NEWLINE); - vty_out(vty, " Warning max : %d%s",s_mgr->gps.gps_fix_limit.thresh_warn_max, VTY_NEWLINE); - - return CMD_SUCCESS; -} - -DEFUN(calibrate_clock, calibrate_clock_cmd, - "calibrate clock", - "Calibration commands\n" - "Calibrate clock against GPS PPS\n") -{ - if (lc15bts_mgr_calib_run(s_mgr) < 0) { - vty_out(vty, "%%Failed to start calibration.%s", VTY_NEWLINE); - return CMD_WARNING; - } - return CMD_SUCCESS; -} - -DEFUN(set_led_pattern, set_led_pattern_cmd, - "set led pattern <0-255>", - "Set LED pattern\n" - "Set LED pattern for debugging purpose only. This pattern will be overridden after 60 seconds by LED pattern of actual system state\n") -{ - int pattern_id = atoi(argv[0]); - - if ((pattern_id < 0) || (pattern_id > BLINK_PATTERN_MAX_ITEM)) { - vty_out(vty, "%%Invalid LED pattern ID. It must be in range of %d..%d %s", 0, BLINK_PATTERN_MAX_ITEM - 1, VTY_NEWLINE); - return CMD_WARNING; - } - - led_set(s_mgr, pattern_id); - return CMD_SUCCESS; -} - -DEFUN(force_mgr_state, force_mgr_state_cmd, - "force manager state <0-255>", - "Force BTS manager state\n" - "Force BTS manager state for debugging purpose only\n") -{ - int state = atoi(argv[0]); - - if ((state < 0) || (state > STATE_CRITICAL)) { - vty_out(vty, "%%Invalid BTS manager state. It must be in range of %d..%d %s", 0, STATE_CRITICAL, VTY_NEWLINE); - return CMD_WARNING; - } - - s_mgr->state.state = state; - return CMD_SUCCESS; -} - -#define LIMIT_TEMP(name, limit, expl, variable, criticity, min_max) \ -DEFUN(limit_temp_##name##_##variable, limit_temp_##name##_##variable##_cmd, \ - "limit temp " #name " " #criticity " " #min_max " <-200-200>", \ - "Limit to reach\n" expl) \ -{ \ - s_mgr->temp.limit.variable = atoi(argv[0]); \ - return CMD_SUCCESS; \ -} - -LIMIT_TEMP(supply, supply_temp_limit, "SUPPLY TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(supply, supply_temp_limit, "SUPPLY TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(supply, supply_temp_limit, "SUPPLY TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(soc, supply_temp_limit, "SOC TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(soc, supply_temp_limit, "SOC TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(soc, supply_temp_limit, "SOC TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(fpga, fpga_temp_limit, "FPGA TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(fpga, fpga_temp_limit, "FPGA TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(fpga, fpga_temp_limit, "FPGA TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(rmsdet, rmsdet_temp_limit, "RMSDET TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(rmsdet, rmsdet_temp_limit, "RMSDET TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(rmsdet, rmsdet_temp_limit, "RMSDET TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(ocxo, ocxo_temp_limit, "OCXO TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(ocxo, ocxo_temp_limit, "OCXO TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(ocxo, ocxo_temp_limit, "OCXO TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(tx0, tx0_temp_limit, "TX0 TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(tx0, tx0_temp_limit, "TX0 TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(tx0, tx0_temp_limit, "TX0 TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(tx1, tx1_temp_limit, "TX1 TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(tx1, tx1_temp_limit, "TX1 TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(tx1, tx1_temp_limit, "TX1 TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(pa0, pa0_temp_limit, "PA0 TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(pa0, pa0_temp_limit, "PA0 TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(pa0, pa0_temp_limit, "PA0 TEMP\n", thresh_warn_min, warning, min) -LIMIT_TEMP(pa1, pa1_temp_limit, "PA1 TEMP\n", thresh_warn_max, warning, max) -LIMIT_TEMP(pa1, pa1_temp_limit, "PA1 TEMP\n", thresh_crit_max, critical, max) -LIMIT_TEMP(pa1, pa1_temp_limit, "PA1 TEMP\n", thresh_warn_min, warning, min) -#undef LIMIT_TEMP - -#define LIMIT_VOLT(name, limit, expl, variable, criticity, min_max) \ -DEFUN(limit_volt_##name##_##variable, limit_volt_##name##_##variable##_cmd, \ - "limit " #name " " #criticity " " #min_max " <0-48000>", \ - "Limit to reach\n" expl) \ -{ \ - s_mgr->volt.limit.variable = atoi(argv[0]); \ - return CMD_SUCCESS; \ -} - -LIMIT_VOLT(supply, supply_volt_limit, "SUPPLY VOLT\n", thresh_warn_max, warning, max) -LIMIT_VOLT(supply, supply_volt_limit, "SUPPLY VOLT\n", thresh_crit_max, critical, max) -LIMIT_VOLT(supply, supply_volt_limit, "SUPPLY VOLT\n", thresh_warn_min, warning, min) -LIMIT_VOLT(supply, supply_volt_limit, "SUPPLY VOLT\n", thresh_crit_min, critical, min) -#undef LIMIT_VOLT - -#define LIMIT_PWR(name, limit, expl, variable, criticity, min_max) \ - DEFUN(limit_pwr_##name##_##variable, limit_pwr_##name##_##variable##_cmd, \ - "limit power " #name " " #criticity " " #min_max " <0-200>", \ - "Limit to reach\n" expl) \ -{ \ - s_mgr->pwr.limit.variable = atoi(argv[0]); \ - return CMD_SUCCESS; \ -} - -LIMIT_PWR(supply, supply_pwr_limit, "SUPPLY PWR\n", thresh_warn_max, warning, max) -LIMIT_PWR(supply, supply_pwr_limit, "SUPPLY PWR\n", thresh_crit_max, critical, max) -LIMIT_PWR(pa0, pa0_pwr_limit, "PA0 PWR\n", thresh_warn_max, warning, max) -LIMIT_PWR(pa0, pa0_pwr_limit, "PA0 PWR\n", thresh_crit_max, critical, max) -LIMIT_PWR(pa1, pa1_pwr_limit, "PA1 PWR\n", thresh_warn_max, warning, max) -LIMIT_PWR(pa1, pa1_pwr_limit, "PA1 PWR\n", thresh_crit_max, critical, max) -#undef LIMIT_PWR - -#define LIMIT_VSWR(name, limit, expl, variable, criticity, min_max) \ -DEFUN(limit_vswr_##name##_##variable, limit_vswr_##name##_##variable##_cmd, \ - "limit vswr " #name " " #criticity " " #min_max " <1000-200000>", \ - "Limit to reach\n" expl) \ -{ \ - s_mgr->vswr.limit.variable = atoi(argv[0]); \ - return CMD_SUCCESS; \ -} - -LIMIT_VSWR(tx0, tx0_vswr_limit, "TX0 VSWR\n", thresh_warn_max, warning, max) -LIMIT_VSWR(tx0, tx0_vswr_limit, "TX0 VSWR\n", thresh_crit_max, critical, max) -LIMIT_VSWR(tx1, tx1_vswr_limit, "TX1 VSWR\n", thresh_warn_max, warning, max) -LIMIT_VSWR(tx1, tx1_vswr_limit, "TX1 VSWR\n", thresh_crit_max, critical, max) -#undef LIMIT_VSWR - -#define LIMIT_GPSFIX(limit, expl, variable, criticity, min_max) \ -DEFUN(limit_gpsfix_##variable, limit_gpsfix_##variable##_cmd, \ - "limit gpsfix " #criticity " " #min_max " <0-365>", \ - "Limit to reach\n" expl) \ -{ \ - s_mgr->gps.limit.variable = atoi(argv[0]); \ - return CMD_SUCCESS; \ -} - -LIMIT_GPSFIX(gps_fix_limit, "GPS FIX\n", thresh_warn_max, warning, max) -#undef LIMIT_GPSFIX - -static void register_limit(int limit, uint32_t unit) -{ - switch (unit) { - case MGR_LIMIT_TYPE_VOLT: - install_element(limit, &cfg_thresh_volt_warn_min_cmd); - install_element(limit, &cfg_thresh_volt_crit_min_cmd); - break; - case MGR_LIMIT_TYPE_VSWR: - install_element(limit, &cfg_thresh_vswr_warn_max_cmd); - install_element(limit, &cfg_thresh_vswr_crit_max_cmd); - break; - case MGR_LIMIT_TYPE_PWR: - install_element(limit, &cfg_thresh_pwr_warn_max_cmd); - install_element(limit, &cfg_thresh_pwr_crit_max_cmd); - break; - default: - break; - } -} - -static void register_normal_action(int act) -{ - install_element(act, &cfg_action_pa0_on_cmd); - install_element(act, &cfg_no_action_pa0_on_cmd); - install_element(act, &cfg_action_pa1_on_cmd); - install_element(act, &cfg_no_action_pa1_on_cmd); - install_element(act, &cfg_action_bts_srv_on_cmd); - install_element(act, &cfg_no_action_bts_srv_on_cmd); -} - -static void register_action(int act) -{ - install_element(act, &cfg_action_pa0_off_cmd); - install_element(act, &cfg_no_action_pa0_off_cmd); - install_element(act, &cfg_action_pa1_off_cmd); - install_element(act, &cfg_no_action_pa1_off_cmd); - install_element(act, &cfg_action_bts_srv_off_cmd); - install_element(act, &cfg_no_action_bts_srv_off_cmd); -} - -static void register_hidden_commands() -{ - install_element(ENABLE_NODE, &limit_temp_supply_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_supply_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_supply_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_soc_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_soc_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_soc_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_fpga_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_fpga_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_fpga_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_rmsdet_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_rmsdet_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_rmsdet_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_ocxo_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_ocxo_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_ocxo_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_tx0_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_tx0_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_tx0_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_tx1_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_tx1_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_tx1_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_pa0_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_pa0_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_pa0_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_temp_pa1_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_temp_pa1_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_temp_pa1_thresh_warn_min_cmd); - - install_element(ENABLE_NODE, &limit_volt_supply_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_volt_supply_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_volt_supply_thresh_warn_min_cmd); - install_element(ENABLE_NODE, &limit_volt_supply_thresh_crit_min_cmd); - - install_element(ENABLE_NODE, &limit_pwr_supply_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_pwr_supply_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_pwr_pa0_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_pwr_pa0_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_pwr_pa1_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_pwr_pa1_thresh_crit_max_cmd); - - install_element(ENABLE_NODE, &limit_vswr_tx0_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_vswr_tx0_thresh_crit_max_cmd); - install_element(ENABLE_NODE, &limit_vswr_tx1_thresh_warn_max_cmd); - install_element(ENABLE_NODE, &limit_vswr_tx1_thresh_crit_max_cmd); - - install_element(ENABLE_NODE, &limit_gpsfix_thresh_warn_max_cmd); -} - -int lc15bts_mgr_vty_init(void) -{ - vty_init(&vty_info); - - install_element_ve(&show_mgr_cmd); - install_element_ve(&show_thresh_cmd); - - install_element(ENABLE_NODE, &calibrate_clock_cmd); - - install_node(&mgr_node, config_write_mgr); - install_element(CONFIG_NODE, &cfg_mgr_cmd); - - /* install the limit nodes */ - install_node(&limit_supply_temp_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_supply_temp_cmd); - - install_node(&limit_soc_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_soc_temp_cmd); - - install_node(&limit_fpga_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_fpga_temp_cmd); - - install_node(&limit_rmsdet_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_rmsdet_temp_cmd); - - install_node(&limit_ocxo_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_ocxo_temp_cmd); - - install_node(&limit_tx0_temp_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_tx0_temp_cmd); - - install_node(&limit_tx1_temp_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_tx1_temp_cmd); - - install_node(&limit_pa0_temp_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_pa0_temp_cmd); - - install_node(&limit_pa1_temp_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_pa1_temp_cmd); - - install_node(&limit_supply_volt_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_supply_volt_cmd); - register_limit(LIMIT_SUPPLY_VOLT_NODE, MGR_LIMIT_TYPE_VOLT); - - install_node(&limit_tx0_vswr_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_tx0_vswr_cmd); - register_limit(LIMIT_TX0_VSWR_NODE, MGR_LIMIT_TYPE_VSWR); - - install_node(&limit_tx1_vswr_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_tx1_vswr_cmd); - register_limit(LIMIT_TX1_VSWR_NODE, MGR_LIMIT_TYPE_VSWR); - - install_node(&limit_supply_pwr_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_supply_pwr_cmd); - register_limit(LIMIT_SUPPLY_PWR_NODE, MGR_LIMIT_TYPE_PWR); - - install_node(&limit_pa0_pwr_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_pa0_pwr_cmd); - register_limit(LIMIT_PA0_PWR_NODE, MGR_LIMIT_TYPE_PWR); - - install_node(&limit_pa1_pwr_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_pa1_pwr_cmd); - register_limit(LIMIT_PA1_PWR_NODE, MGR_LIMIT_TYPE_PWR); - - install_node(&limit_gps_fix_node, config_write_dummy); - install_element(MGR_NODE, &cfg_limit_gps_fix_cmd); - - /* install the normal node */ - install_node(&act_norm_node, config_write_dummy); - install_element(MGR_NODE, &cfg_action_normal_cmd); - register_normal_action(ACT_NORM_NODE); - - /* install the warning and critical node */ - install_node(&act_warn_node, config_write_dummy); - install_element(MGR_NODE, &cfg_action_warn_cmd); - register_action(ACT_WARN_NODE); - - install_node(&act_crit_node, config_write_dummy); - install_element(MGR_NODE, &cfg_action_critical_cmd); - register_action(ACT_CRIT_NODE); - - /* install LED pattern command for debugging purpose */ - install_element_ve(&set_led_pattern_cmd); - install_element_ve(&force_mgr_state_cmd); - - register_hidden_commands(); - - return 0; -} - -int lc15bts_mgr_parse_config(struct lc15bts_mgr_instance *manager) -{ - int rc; - - s_mgr = manager; - rc = vty_read_config_file(s_mgr->config_file, NULL); - if (rc < 0) { - fprintf(stderr, "Failed to parse the config file: '%s'\n", - s_mgr->config_file); - return rc; - } - - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_misc.c b/src/osmo-bts-litecell15/misc/lc15bts_misc.c deleted file mode 100644 index 467b9d0a..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_misc.c +++ /dev/null @@ -1,383 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_misc.c - * (C) 2012 by Harald Welte <laforge@gnumonks.org> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <getopt.h> -#include <fcntl.h> -#include <limits.h> -#include <time.h> -#include <sys/signal.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include <osmocom/core/talloc.h> -#include <osmocom/core/utils.h> -#include <osmocom/core/msgb.h> -#include <osmocom/core/application.h> -#include <osmocom/vty/telnet_interface.h> -#include <osmocom/vty/logging.h> - -#include "lc15bts_mgr.h" -#include "btsconfig.h" -#include "lc15bts_misc.h" -#include "lc15bts_par.h" -#include "lc15bts_mgr.h" -#include "lc15bts_temp.h" -#include "lc15bts_power.h" - -/********************************************************************* - * Temperature handling - *********************************************************************/ - -static const struct { - const char *name; - int has_max; - enum lc15bts_temp_sensor sensor; - enum lc15bts_par ee_par; -} temp_data[] = { - { - .name = "supply_temp", - .has_max = 1, - .sensor = LC15BTS_TEMP_SUPPLY, - .ee_par = LC15BTS_PAR_TEMP_SUPPLY_MAX, - }, { - .name = "soc_temp", - .has_max = 0, - .sensor = LC15BTS_TEMP_SOC, - .ee_par = LC15BTS_PAR_TEMP_SOC_MAX, - }, { - .name = "fpga_temp", - .has_max = 0, - .sensor = LC15BTS_TEMP_FPGA, - .ee_par = LC15BTS_PAR_TEMP_FPGA_MAX, - - }, { - .name = "rmsdet_temp", - .has_max = 1, - .sensor = LC15BTS_TEMP_RMSDET, - .ee_par = LC15BTS_PAR_TEMP_RMSDET_MAX, - }, { - .name = "ocxo_temp", - .has_max = 1, - .sensor = LC15BTS_TEMP_OCXO, - .ee_par = LC15BTS_PAR_TEMP_OCXO_MAX, - }, { - .name = "tx0_temp", - .has_max = 0, - .sensor = LC15BTS_TEMP_TX0, - .ee_par = LC15BTS_PAR_TEMP_TX0_MAX, - }, { - .name = "tx1_temp", - .has_max = 0, - .sensor = LC15BTS_TEMP_TX1, - .ee_par = LC15BTS_PAR_TEMP_TX1_MAX, - }, { - .name = "pa0_temp", - .has_max = 1, - .sensor = LC15BTS_TEMP_PA0, - .ee_par = LC15BTS_PAR_TEMP_PA0_MAX, - }, { - .name = "pa1_temp", - .has_max = 1, - .sensor = LC15BTS_TEMP_PA1, - .ee_par = LC15BTS_PAR_TEMP_PA1_MAX, - } -}; - -static const struct { - const char *name; - int has_max; - enum lc15bts_power_source sensor_source; - enum lc15bts_power_type sensor_type; - enum lc15bts_par ee_par; -} power_data[] = { - { - .name = "supply_volt", - .has_max = 1, - .sensor_source = LC15BTS_POWER_SUPPLY, - .sensor_type = LC15BTS_POWER_VOLTAGE, - .ee_par = LC15BTS_PAR_VOLT_SUPPLY_MAX, - }, { - .name = "supply_pwr", - .has_max = 1, - .sensor_source = LC15BTS_POWER_SUPPLY, - .sensor_type = LC15BTS_POWER_POWER, - .ee_par = LC15BTS_PAR_PWR_SUPPLY_MAX, - }, { - .name = "pa0_pwr", - .has_max = 1, - .sensor_source = LC15BTS_POWER_PA0, - .sensor_type = LC15BTS_POWER_POWER, - .ee_par = LC15BTS_PAR_PWR_PA0_MAX, - }, { - .name = "pa1_pwr", - .has_max = 1, - .sensor_source = LC15BTS_POWER_PA1, - .sensor_type = LC15BTS_POWER_POWER, - .ee_par = LC15BTS_PAR_PWR_PA1_MAX, - } -}; - -static const struct { - const char *name; - int has_max; - enum lc15bts_vswr_sensor sensor; - enum lc15bts_par ee_par; -} vswr_data[] = { - { - .name = "tx0_vswr", - .has_max = 0, - .sensor = LC15BTS_VSWR_TX0, - .ee_par = LC15BTS_PAR_VSWR_TX0_MAX, - }, { - .name = "tx1_vswr", - .has_max = 0, - .sensor = LC15BTS_VSWR_TX1, - .ee_par = LC15BTS_PAR_VSWR_TX1_MAX, - } -}; - -static const struct value_string power_unit_strs[] = { - { LC15BTS_POWER_POWER, "W" }, - { LC15BTS_POWER_VOLTAGE, "V" }, - { 0, NULL } -}; - -void lc15bts_check_temp(int no_rom_write) -{ - int temp_old[ARRAY_SIZE(temp_data)]; - int temp_cur[ARRAY_SIZE(temp_data)]; - int i, rc; - - for (i = 0; i < ARRAY_SIZE(temp_data); i++) { - int ret; - rc = lc15bts_par_get_int(tall_mgr_ctx, temp_data[i].ee_par, &ret); - temp_old[i] = ret * 1000; - - lc15bts_temp_get(temp_data[i].sensor, &temp_cur[i]); - if (temp_cur[i] < 0 && temp_cur[i] > -1000) { - LOGP(DTEMP, LOGL_ERROR, "Error reading temperature (%d): unexpected value %d\n", - temp_data[i].sensor, temp_cur[i]); - continue; - } - - LOGP(DTEMP, LOGL_DEBUG, "Current %s temperature: %d.%d C\n", - temp_data[i].name, temp_cur[i]/1000, temp_cur[i]%1000); - - if (temp_cur[i] > temp_old[i]) { - LOGP(DTEMP, LOGL_NOTICE, "New maximum %s " - "temperature: %d.%d C\n", temp_data[i].name, - temp_cur[i]/1000, temp_old[i]%1000); - - if (!no_rom_write) { - rc = lc15bts_par_set_int(tall_mgr_ctx, temp_data[i].ee_par, temp_cur[i]/1000); - if (rc < 0) - LOGP(DTEMP, LOGL_ERROR, "error writing new %s " - "max temp %d (%s)\n", temp_data[i].name, - rc, strerror(errno)); - } - } - } -} - -void lc15bts_check_power(int no_rom_write) -{ - int power_old[ARRAY_SIZE(power_data)]; - int power_cur[ARRAY_SIZE(power_data)]; - int i, rc; - int div_ratio; - - for (i = 0; i < ARRAY_SIZE(power_data); i++) { - int ret; - rc = lc15bts_par_get_int(tall_mgr_ctx, power_data[i].ee_par, &ret); - switch(power_data[i].sensor_type) { - case LC15BTS_POWER_VOLTAGE: - div_ratio = 1000; - break; - case LC15BTS_POWER_POWER: - div_ratio = 1000000; - break; - default: - div_ratio = 1000; - } - power_old[i] = ret * div_ratio; - - lc15bts_power_sensor_get(power_data[i].sensor_source, power_data[i].sensor_type, &power_cur[i]); - if (power_cur[i] < 0 && power_cur[i] > -1000) { - LOGP(DTEMP, LOGL_ERROR, "Error reading power (%d) (%d)\n", power_data[i].sensor_source, - power_data[i].sensor_type); - continue; - } - LOGP(DTEMP, LOGL_DEBUG, "Current %s power: %d.%d %s\n", - power_data[i].name, power_cur[i]/div_ratio, power_cur[i]%div_ratio, - get_value_string(power_unit_strs, power_data[i].sensor_type)); - - if (power_cur[i] > power_old[i]) { - LOGP(DTEMP, LOGL_NOTICE, "New maximum %s " - "power: %d.%d %s\n", power_data[i].name, - power_cur[i]/div_ratio, power_cur[i]%div_ratio, - get_value_string(power_unit_strs, power_data[i].sensor_type)); - - if (!no_rom_write) { - rc = lc15bts_par_set_int(tall_mgr_ctx, power_data[i].ee_par, power_cur[i]/div_ratio); - if (rc < 0) - LOGP(DTEMP, LOGL_ERROR, "error writing new %s " - "max power %d (%s)\n", power_data[i].name, - rc, strerror(errno)); - } - } - } -} - -void lc15bts_check_vswr(int no_rom_write) -{ - int vswr_old[ARRAY_SIZE(vswr_data)]; - int vswr_cur[ARRAY_SIZE(vswr_data)]; - int i, rc; - - for (i = 0; i < ARRAY_SIZE(vswr_data); i++) { - int ret; - rc = lc15bts_par_get_int(tall_mgr_ctx, vswr_data[i].ee_par, &ret); - vswr_old[i] = ret * 1000; - - lc15bts_vswr_get(vswr_data[i].sensor, &vswr_cur[i]); - if (vswr_cur[i] < 0 && vswr_cur[i] > -1000) { - LOGP(DTEMP, LOGL_ERROR, "Error reading vswr (%d)\n", vswr_data[i].sensor); - continue; - } - - LOGP(DTEMP, LOGL_DEBUG, "Current %s vswr: %d.%d\n", - vswr_data[i].name, vswr_cur[i]/1000, vswr_cur[i]%1000); - - if (vswr_cur[i] > vswr_old[i]) { - LOGP(DTEMP, LOGL_NOTICE, "New maximum %s " - "vswr: %d.%d C\n", vswr_data[i].name, - vswr_cur[i]/1000, vswr_old[i]%1000); - - if (!no_rom_write) { - rc = lc15bts_par_set_int(tall_mgr_ctx, vswr_data[i].ee_par, vswr_cur[i]/1000); - if (rc < 0) - LOGP(DTEMP, LOGL_ERROR, "error writing new %s " - "max vswr %d (%s)\n", vswr_data[i].name, - rc, strerror(errno)); - } - } - } -} - -/********************************************************************* - * Hours handling - *********************************************************************/ -static time_t last_update; - -int lc15bts_update_hours(int no_rom_write) -{ - time_t now = time(NULL); - int rc, op_hrs; - - /* first time after start of manager program */ - if (last_update == 0) { - last_update = now; - - rc = lc15bts_par_get_int(tall_mgr_ctx, LC15BTS_PAR_HOURS, &op_hrs); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, "Unable to read " - "operational hours: %d (%s)\n", rc, - strerror(errno)); - return rc; - } - - LOGP(DTEMP, LOGL_INFO, "Total hours of Operation: %u\n", - op_hrs); - - return 0; - } - - if (now >= last_update + 3600) { - rc = lc15bts_par_get_int(tall_mgr_ctx, LC15BTS_PAR_HOURS, &op_hrs); - if (rc < 0) { - LOGP(DTEMP, LOGL_ERROR, "Unable to read " - "operational hours: %d (%s)\n", rc, - strerror(errno)); - return rc; - } - - /* number of hours to increase */ - op_hrs += (now-last_update)/3600; - - LOGP(DTEMP, LOGL_INFO, "Total hours of Operation: %u\n", - op_hrs); - - if (!no_rom_write) { - rc = lc15bts_par_set_int(tall_mgr_ctx, LC15BTS_PAR_HOURS, op_hrs); - if (rc < 0) - return rc; - } - - last_update = now; - } - - return 0; -} - -/********************************************************************* - * Firmware reloading - *********************************************************************/ - -static const char *fw_sysfs[_NUM_FW] = { - [LC15BTS_FW_DSP0] = "/sys/kernel/debug/remoteproc/remoteproc0/recovery", - [LC15BTS_FW_DSP1] = "/sys/kernel/debug/remoteproc/remoteproc0/recovery", -}; - -int lc15bts_firmware_reload(enum lc15bts_firmware_type type) -{ - int fd; - int rc; - - switch (type) { - case LC15BTS_FW_DSP0: - case LC15BTS_FW_DSP1: - fd = open(fw_sysfs[type], O_WRONLY); - if (fd < 0) { - LOGP(DFW, LOGL_ERROR, "unable to open firmware device %s: %s\n", - fw_sysfs[type], strerror(errno)); - close(fd); - return fd; - } - rc = write(fd, "restart", 8); - if (rc < 8) { - LOGP(DFW, LOGL_ERROR, "short write during " - "fw write to %s\n", fw_sysfs[type]); - close(fd); - return -EIO; - } - close(fd); - default: - return -EINVAL; - } - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_misc.h b/src/osmo-bts-litecell15/misc/lc15bts_misc.h deleted file mode 100644 index 79e9e686..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_misc.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _LC15BTS_MISC_H -#define _LC15BTS_MISC_H - -#include <stdint.h> - -void lc15bts_check_temp(int no_rom_write); -void lc15bts_check_power(int no_rom_write); -void lc15bts_check_vswr(int no_rom_write); - -int lc15bts_update_hours(int no_rom_write); - -enum lc15bts_firmware_type { - LC15BTS_FW_DSP0, - LC15BTS_FW_DSP1, - _NUM_FW -}; - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_nl.c b/src/osmo-bts-litecell15/misc/lc15bts_nl.c deleted file mode 100644 index 39f64aae..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_nl.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Helper for netlink */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_nl.c - * (C) 2014 by Holger Hans Peter Freyther - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <arpa/inet.h> -#include <netinet/ip.h> - -#include <sys/socket.h> - -#include <linux/netlink.h> -#include <linux/rtnetlink.h> - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> - -#define NLMSG_TAIL(nmsg) \ - ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) - -/** - * In case one binds to 0.0.0.0/INADDR_ANY and wants to know which source - * address will be used when sending a message this function can be used. - * It will ask the routing code of the kernel for the PREFSRC - */ -int source_for_dest(const struct in_addr *dest, struct in_addr *loc_source) -{ - int fd, rc; - struct rtmsg *r; - struct rtattr *rta; - struct { - struct nlmsghdr n; - struct rtmsg r; - char buf[1024]; - } req; - - memset(&req, 0, sizeof(req)); - - fd = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE); - if (fd < 0) { - perror("nl socket"); - return -1; - } - - /* Send a rtmsg and ask for a response */ - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; - req.n.nlmsg_type = RTM_GETROUTE; - req.n.nlmsg_seq = 1; - - /* Prepare the routing request */ - req.r.rtm_family = AF_INET; - - /* set the dest */ - rta = NLMSG_TAIL(&req.n); - rta->rta_type = RTA_DST; - rta->rta_len = RTA_LENGTH(sizeof(*dest)); - memcpy(RTA_DATA(rta), dest, sizeof(*dest)); - - /* update sizes for dest */ - req.r.rtm_dst_len = sizeof(*dest) * 8; - req.n.nlmsg_len = NLMSG_ALIGN(req.n.nlmsg_len) + RTA_ALIGN(rta->rta_len); - - rc = send(fd, &req, req.n.nlmsg_len, 0); - if (rc != req.n.nlmsg_len) { - perror("short write"); - close(fd); - return -2; - } - - - /* now receive a response and parse it */ - rc = recv(fd, &req, sizeof(req), 0); - if (rc <= 0) { - perror("short read"); - close(fd); - return -3; - } - - if (!NLMSG_OK(&req.n, rc) || req.n.nlmsg_type != RTM_NEWROUTE) { - close(fd); - return -4; - } - - r = NLMSG_DATA(&req.n); - rc -= NLMSG_LENGTH(sizeof(*r)); - rta = RTM_RTA(r); - while (RTA_OK(rta, rc)) { - if (rta->rta_type != RTA_PREFSRC) { - rta = RTA_NEXT(rta, rc); - continue; - } - - /* we are done */ - memcpy(loc_source, RTA_DATA(rta), RTA_PAYLOAD(rta)); - close(fd); - return 0; - } - - close(fd); - return -5; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_nl.h b/src/osmo-bts-litecell15/misc/lc15bts_nl.h deleted file mode 100644 index 340cf117..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_nl.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_nl.h - * (C) 2014 by Holger Hans Peter Freyther - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -#pragma once - -struct in_addr; - -int source_for_dest(const struct in_addr *dest, struct in_addr *loc_source); diff --git a/src/osmo-bts-litecell15/misc/lc15bts_par.c b/src/osmo-bts-litecell15/misc/lc15bts_par.c deleted file mode 100644 index af9d030f..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_par.c +++ /dev/null @@ -1,232 +0,0 @@ -/* lc15bts - access to hardware related parameters */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_par.c - * (C) 2012 by Harald Welte <laforge@gnumonks.org> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <limits.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include <osmocom/core/utils.h> -#include <osmocom/core/talloc.h> - -#include "lc15bts_par.h" - -const struct value_string lc15bts_par_names[_NUM_LC15BTS_PAR+1] = { - { LC15BTS_PAR_TEMP_SUPPLY_MAX, "temp-supply-max" }, - { LC15BTS_PAR_TEMP_SOC_MAX, "temp-soc-max" }, - { LC15BTS_PAR_TEMP_FPGA_MAX, "temp-fpga-max" }, - { LC15BTS_PAR_TEMP_RMSDET_MAX, "temp-rmsdet-max" }, - { LC15BTS_PAR_TEMP_OCXO_MAX, "temp-ocxo-max" }, - { LC15BTS_PAR_TEMP_TX0_MAX, "temp-tx0-max" }, - { LC15BTS_PAR_TEMP_TX1_MAX, "temp-tx1-max" }, - { LC15BTS_PAR_TEMP_PA0_MAX, "temp-pa0-max" }, - { LC15BTS_PAR_TEMP_PA1_MAX, "temp-pa1-max" }, - { LC15BTS_PAR_VOLT_SUPPLY_MAX, "volt-supply-max" }, - { LC15BTS_PAR_PWR_SUPPLY_MAX, "pwr-supply-max" }, - { LC15BTS_PAR_PWR_PA0_MAX, "pwr-pa0-max" }, - { LC15BTS_PAR_PWR_PA1_MAX, "pwr-pa1-max" }, - { LC15BTS_PAR_VSWR_TX0_MAX, "vswr-tx0-max" }, - { LC15BTS_PAR_VSWR_TX1_MAX, "vswr-tx1-max" }, - { LC15BTS_PAR_GPS_FIX, "gps-fix" }, - { LC15BTS_PAR_SERNR, "serial-nr" }, - { LC15BTS_PAR_HOURS, "hours-running" }, - { LC15BTS_PAR_BOOTS, "boot-count" }, - { LC15BTS_PAR_KEY, "key" }, - { 0, NULL } -}; - -int lc15bts_par_is_int(enum lc15bts_par par) -{ - switch (par) { - case LC15BTS_PAR_TEMP_SUPPLY_MAX: - case LC15BTS_PAR_TEMP_SOC_MAX: - case LC15BTS_PAR_TEMP_FPGA_MAX: - case LC15BTS_PAR_TEMP_RMSDET_MAX: - case LC15BTS_PAR_TEMP_OCXO_MAX: - case LC15BTS_PAR_TEMP_TX0_MAX: - case LC15BTS_PAR_TEMP_TX1_MAX: - case LC15BTS_PAR_TEMP_PA0_MAX: - case LC15BTS_PAR_TEMP_PA1_MAX: - case LC15BTS_PAR_VOLT_SUPPLY_MAX: - case LC15BTS_PAR_VSWR_TX0_MAX: - case LC15BTS_PAR_VSWR_TX1_MAX: - case LC15BTS_PAR_SERNR: - case LC15BTS_PAR_HOURS: - case LC15BTS_PAR_BOOTS: - case LC15BTS_PAR_PWR_SUPPLY_MAX: - case LC15BTS_PAR_PWR_PA0_MAX: - case LC15BTS_PAR_PWR_PA1_MAX: - return 1; - default: - return 0; - } -} - -FILE *lc15bts_par_get_path(void *ctx, enum lc15bts_par par, const char* mode) -{ - char *fpath; - FILE *fp; - - if (par >= _NUM_LC15BTS_PAR) - return NULL; - - fpath = talloc_asprintf(ctx, "%s/%s", USER_ROM_PATH, get_value_string(lc15bts_par_names, par)); - if (!fpath) - return NULL; - - fp = fopen(fpath, mode); - if (!fp) - fprintf(stderr, "Failed to open %s due to '%s' error\n", fpath, strerror(errno)); - - talloc_free(fpath); - - return fp; -} - -int lc15bts_par_get_int(void *ctx, enum lc15bts_par par, int *ret) -{ - FILE *fp = lc15bts_par_get_path(ctx, par, "r"); - int rc; - - if (fp == NULL) { - return -errno; - } - - rc = fscanf(fp, "%d", ret); - if (rc != 1) { - fclose(fp); - return -EIO; - } - fclose(fp); - return 0; -} - -int lc15bts_par_set_int(void *ctx, enum lc15bts_par par, int val) -{ - FILE *fp = lc15bts_par_get_path(ctx, par, "w"); - int rc; - - if (fp == NULL) { - return -errno; - } - - rc = fprintf(fp, "%d", val); - if (rc < 0) { - fclose(fp); - return -EIO; - } - - fsync(fileno(fp)); - fclose(fp); - return 0; -} - -int lc15bts_par_get_buf(void *ctx, enum lc15bts_par par, uint8_t *buf, unsigned int size) -{ - FILE *fp = lc15bts_par_get_path(ctx, par, "rb"); - int rc; - - if (fp == NULL) { - return -errno; - } - - rc = fread(buf, 1, size, fp); - - fclose(fp); - - return rc; -} - -int lc15bts_par_set_buf(void *ctx, enum lc15bts_par par, const uint8_t *buf, unsigned int size) -{ - FILE *fp = lc15bts_par_get_path(ctx, par, "wb"); - int rc; - - if (fp == NULL) { - return -errno; - } - - rc = fwrite(buf, 1, size, fp); - - fsync(fileno(fp)); - fclose(fp); - - return rc; -} - -int lc15bts_par_get_gps_fix(time_t *ret) -{ - char fpath[PATH_MAX]; - FILE *fp; - int rc; - - snprintf(fpath, sizeof(fpath)-1, "%s/%s", USER_ROM_PATH, get_value_string(lc15bts_par_names, LC15BTS_PAR_GPS_FIX)); - fpath[sizeof(fpath)-1] = '\0'; - - fp = fopen(fpath, "r"); - if (fp == NULL) { - return -errno; - } - - rc = fscanf(fp, "%lld", (long long *)ret); - if (rc != 1) { - fclose(fp); - return -EIO; - } - fclose(fp); - - return 0; -} - -int lc15bts_par_set_gps_fix(time_t val) -{ - char fpath[PATH_MAX]; - FILE *fp; - int rc; - - snprintf(fpath, sizeof(fpath)-1, "%s/%s", USER_ROM_PATH, get_value_string(lc15bts_par_names, LC15BTS_PAR_GPS_FIX)); - fpath[sizeof(fpath)-1] = '\0'; - - fp = fopen(fpath, "w"); - if (fp == NULL) { - return -errno; - } - - rc = fprintf(fp, "%lld", (long long)val); - if (rc < 0) { - fclose(fp); - return -EIO; - } - fsync(fileno(fp)); - fclose(fp); - - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_par.h b/src/osmo-bts-litecell15/misc/lc15bts_par.h deleted file mode 100644 index 74295653..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_par.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _LC15BTS_PAR_H -#define _LC15BTS_PAR_H - -#include <osmocom/core/utils.h> - -#define USER_ROM_PATH "/mnt/storage/var/run/lc15bts-mgr" - -enum lc15bts_par { - LC15BTS_PAR_TEMP_SUPPLY_MAX, - LC15BTS_PAR_TEMP_SOC_MAX, - LC15BTS_PAR_TEMP_FPGA_MAX, - LC15BTS_PAR_TEMP_RMSDET_MAX, - LC15BTS_PAR_TEMP_OCXO_MAX, - LC15BTS_PAR_TEMP_TX0_MAX, - LC15BTS_PAR_TEMP_TX1_MAX, - LC15BTS_PAR_TEMP_PA0_MAX, - LC15BTS_PAR_TEMP_PA1_MAX, - LC15BTS_PAR_VOLT_SUPPLY_MAX, - LC15BTS_PAR_PWR_SUPPLY_MAX, - LC15BTS_PAR_PWR_PA0_MAX, - LC15BTS_PAR_PWR_PA1_MAX, - LC15BTS_PAR_VSWR_TX0_MAX, - LC15BTS_PAR_VSWR_TX1_MAX, - LC15BTS_PAR_GPS_FIX, - LC15BTS_PAR_SERNR, - LC15BTS_PAR_HOURS, - LC15BTS_PAR_BOOTS, - LC15BTS_PAR_KEY, - _NUM_LC15BTS_PAR -}; - -extern const struct value_string lc15bts_par_names[_NUM_LC15BTS_PAR+1]; - -int lc15bts_par_get_int(void *ctx, enum lc15bts_par par, int *ret); -int lc15bts_par_set_int(void *ctx, enum lc15bts_par par, int val); -int lc15bts_par_get_buf(void *ctx, enum lc15bts_par par, uint8_t *buf, unsigned int size); -int lc15bts_par_set_buf(void *ctx, enum lc15bts_par par, const uint8_t *buf, unsigned int size); - -int lc15bts_par_is_int(enum lc15bts_par par); -int lc15bts_par_get_gps_fix(time_t *ret); -int lc15bts_par_set_gps_fix(time_t val); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_power.c b/src/osmo-bts-litecell15/misc/lc15bts_power.c deleted file mode 100644 index 1a37d8e6..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_power.c +++ /dev/null @@ -1,210 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <limits.h> - -#include "lc15bts_power.h" - -#define LC15BTS_PA_VOLTAGE 24000000 - -#define PA_SUPPLY_MIN_SYSFS "/var/lc15/pa-supply/min_microvolts" -#define PA_SUPPLY_MAX_SYSFS "/var/lc15/pa-supply/max_microvolts" - -static const char *power_enable_devs[_NUM_POWER_SOURCES] = { - [LC15BTS_POWER_PA0] = "/var/lc15/pa-state/pa0/state", - [LC15BTS_POWER_PA1] = "/var/lc15/pa-state/pa1/state", -}; - -static const char *power_sensor_devs[_NUM_POWER_SOURCES] = { - [LC15BTS_POWER_SUPPLY] = "/var/lc15/pwr-sense/main-supply/", - [LC15BTS_POWER_PA0] = "/var/lc15/pwr-sense/pa0/", - [LC15BTS_POWER_PA1] = "/var/lc15/pwr-sense/pa1/", -}; - -static const char *power_sensor_type_str[_NUM_POWER_TYPES] = { - [LC15BTS_POWER_POWER] = "power", - [LC15BTS_POWER_VOLTAGE] = "voltage", - [LC15BTS_POWER_CURRENT] = "current", -}; - -int lc15bts_power_sensor_get( - enum lc15bts_power_source source, - enum lc15bts_power_type type, - int *power) -{ - char buf[PATH_MAX]; - char pwrstr[10]; - int fd, rc; - - if (source >= _NUM_POWER_SOURCES) - return -EINVAL; - - if (type >= _NUM_POWER_TYPES) - return -EINVAL; - - snprintf(buf, sizeof(buf)-1, "%s%s", power_sensor_devs[source], power_sensor_type_str[type]); - buf[sizeof(buf)-1] = '\0'; - - fd = open(buf, O_RDONLY); - if (fd < 0) - return fd; - - rc = read(fd, pwrstr, sizeof(pwrstr)); - pwrstr[sizeof(pwrstr)-1] = '\0'; - if (rc < 0) { - close(fd); - return rc; - } - if (rc == 0) { - close(fd); - return -EIO; - } - close(fd); - *power = atoi(pwrstr); - return 0; -} - - -int lc15bts_power_set( - enum lc15bts_power_source source, - int en) -{ - int fd; - int rc; - - if ((source != LC15BTS_POWER_PA0) - && (source != LC15BTS_POWER_PA1) ) { - return -EINVAL; - } - - fd = open(PA_SUPPLY_MAX_SYSFS, O_WRONLY); - if (fd < 0) { - return fd; - } - rc = write(fd, "32000000", 9); - close( fd ); - - if (rc != 9) { - return -1; - } - - fd = open(PA_SUPPLY_MIN_SYSFS, O_WRONLY); - if (fd < 0) { - return fd; - } - - /* TODO NTQ: Make the voltage configurable */ - rc = write(fd, "24000000", 9); - close( fd ); - - if (rc != 9) { - return -1; - } - - fd = open(power_enable_devs[source], O_WRONLY); - if (fd < 0) { - return fd; - } - rc = write(fd, en?"1":"0", 2); - close( fd ); - - if (rc != 2) { - return -1; - } - - if (en) usleep(50*1000); - - return 0; -} - -int lc15bts_power_get( - enum lc15bts_power_source source) -{ - int fd; - int rc; - int retVal = 0; - char enstr[10]; - - fd = open(power_enable_devs[source], O_RDONLY); - if (fd < 0) { - return fd; - } - - rc = read(fd, enstr, sizeof(enstr)); - enstr[rc-1] = '\0'; - - close(fd); - - if (rc < 0) { - return rc; - } - if (rc == 0) { - return -EIO; - } - - rc = strcmp(enstr, "enabled"); - if(rc == 0) { - retVal = 1; - } - - return retVal; -} - -static const char *vswr_devs[_NUM_VSWR_SENSORS] = { - [LC15BTS_VSWR_TX0] = "/var/lc15/vswr/tx0/vswr", - [LC15BTS_VSWR_TX1] = "/var/lc15/vswr/tx1/vswr", -}; - -int lc15bts_vswr_get(enum lc15bts_vswr_sensor sensor, int *vswr) -{ - char buf[PATH_MAX]; - char vswrstr[8]; - int fd, rc; - - if (sensor < 0 || sensor >= _NUM_VSWR_SENSORS) - return -EINVAL; - - snprintf(buf, sizeof(buf)-1, "%s", vswr_devs[sensor]); - buf[sizeof(buf)-1] = '\0'; - - fd = open(buf, O_RDONLY); - if (fd < 0) - return fd; - - rc = read(fd, vswrstr, sizeof(vswrstr)); - vswrstr[sizeof(vswrstr)-1] = '\0'; - if (rc < 0) { - close(fd); - return rc; - } - if (rc == 0) { - close(fd); - return -EIO; - } - close(fd); - *vswr = atoi(vswrstr); - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_power.h b/src/osmo-bts-litecell15/misc/lc15bts_power.h deleted file mode 100644 index b48cfdcd..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_power.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _LC15BTS_POWER_H -#define _LC15BTS_POWER_H - -enum lc15bts_power_source { - LC15BTS_POWER_SUPPLY, - LC15BTS_POWER_PA0, - LC15BTS_POWER_PA1, - _NUM_POWER_SOURCES -}; - -enum lc15bts_power_type { - LC15BTS_POWER_POWER, - LC15BTS_POWER_VOLTAGE, - LC15BTS_POWER_CURRENT, - _NUM_POWER_TYPES -}; - -int lc15bts_power_sensor_get( - enum lc15bts_power_source source, - enum lc15bts_power_type type, - int *volt); - -int lc15bts_power_set( - enum lc15bts_power_source source, - int en); - -int lc15bts_power_get( - enum lc15bts_power_source source); - -enum lc15bts_vswr_sensor { - LC15BTS_VSWR_TX0, - LC15BTS_VSWR_TX1, - _NUM_VSWR_SENSORS -}; - -int lc15bts_vswr_get(enum lc15bts_vswr_sensor sensor, int *vswr); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_swd.c b/src/osmo-bts-litecell15/misc/lc15bts_swd.c deleted file mode 100644 index eac64d66..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_swd.c +++ /dev/null @@ -1,178 +0,0 @@ -/* Systemd service wd notification for Litecell 1.5 BTS management daemon */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include "misc/lc15bts_mgr.h" -#include "misc/lc15bts_swd.h" -#include <osmocom/core/logging.h> - -/* Needed for service watchdog notification */ -#include <systemd/sd-daemon.h> - -/* This is the period used to verify if all events have been registered to be allowed - to notify the systemd service watchdog -*/ -#define SWD_PERIOD 30 - -static void swd_start(struct lc15bts_mgr_instance *mgr); -static void swd_process(struct lc15bts_mgr_instance *mgr); -static void swd_close(struct lc15bts_mgr_instance *mgr); -static void swd_state_reset(struct lc15bts_mgr_instance *mgr, int reason); -static int swd_run(struct lc15bts_mgr_instance *mgr, int from_loop); -static void swd_loop_run(void *_data); - -enum swd_state { - SWD_INITIAL, - SWD_IN_PROGRESS, -}; - -enum swd_result { - SWD_FAIL_START, - SWD_FAIL_NOTIFY, - SWD_SUCCESS, -}; - -static void swd_start(struct lc15bts_mgr_instance *mgr) -{ - swd_process(mgr); -} - -static void swd_process(struct lc15bts_mgr_instance *mgr) -{ - int rc = 0, notify = 0; - - /* Did we get all needed conditions ? */ - if (mgr->swd.swd_eventmasks == mgr->swd.swd_events) { - /* Ping systemd service wd if enabled */ - rc = sd_notify(0, "WATCHDOG=1"); - LOGP(DSWD, LOGL_NOTICE, "Watchdog notification attempt\n"); - notify = 1; - } - else { - LOGP(DSWD, LOGL_NOTICE, "Missing watchdog events: e:0x%016llx,m:0x%016llx\n",mgr->swd.swd_events,mgr->swd.swd_eventmasks); - } - - if (rc < 0) { - LOGP(DSWD, LOGL_ERROR, - "Failed to notify system service watchdog: %d\n", rc); - swd_state_reset(mgr, SWD_FAIL_NOTIFY); - return; - } - else { - /* Did we notified the watchdog? */ - if (notify) { - mgr->swd.swd_events = 0; - /* Makes sure we really cleared it in case any event was notified at this same moment (it would be lost) */ - if (mgr->swd.swd_events != 0) - mgr->swd.swd_events = 0; - } - } - - swd_state_reset(mgr, SWD_SUCCESS); - return; -} - -static void swd_close(struct lc15bts_mgr_instance *mgr) -{ -} - -static void swd_state_reset(struct lc15bts_mgr_instance *mgr, int outcome) -{ - if (mgr->swd.swd_from_loop) { - mgr->swd.swd_timeout.data = mgr; - mgr->swd.swd_timeout.cb = swd_loop_run; - osmo_timer_schedule(&mgr->swd.swd_timeout, SWD_PERIOD, 0); - } - - mgr->swd.state = SWD_INITIAL; - swd_close(mgr); -} - -static int swd_run(struct lc15bts_mgr_instance *mgr, int from_loop) -{ - if (mgr->swd.state != SWD_INITIAL) { - LOGP(DSWD, LOGL_ERROR, "Swd is already in progress.\n"); - return -1; - } - - mgr->swd.swd_from_loop = from_loop; - - /* From now on everything will be handled from the failure */ - mgr->swd.state = SWD_IN_PROGRESS; - swd_start(mgr); - return 0; -} - -static void swd_loop_run(void *_data) -{ - int rc; - struct lc15bts_mgr_instance *mgr = _data; - - LOGP(DSWD, LOGL_NOTICE, "Going to check for watchdog notification.\n"); - rc = swd_run(mgr, 1); - if (rc != 0) { - swd_state_reset(mgr, SWD_FAIL_START); - } -} - -/* 'swd_num_events' configures the number of events to be monitored before notifying the - systemd service watchdog. It must be in the range of [1,64]. Events are notified - through the function 'lc15bts_swd_event' -*/ -int lc15bts_swd_init(struct lc15bts_mgr_instance *mgr, int swd_num_events) -{ - /* Checks for a valid number of events to validate */ - if (swd_num_events < 1 || swd_num_events > 64) - return(-1); - - mgr->swd.state = SWD_INITIAL; - mgr->swd.swd_timeout.data = mgr; - mgr->swd.swd_timeout.cb = swd_loop_run; - osmo_timer_schedule(&mgr->swd.swd_timeout, 0, 0); - - if (swd_num_events == 64){ - mgr->swd.swd_eventmasks = 0xffffffffffffffffULL; - } - else { - mgr->swd.swd_eventmasks = ((1ULL << swd_num_events) - 1); - } - mgr->swd.swd_events = 0; - mgr->swd.num_events = swd_num_events; - - return 0; -} - -/* Notifies that the specified event 'swd_event' happened correctly; - the value must be in the range of [0,'swd_num_events'[ (see lc15bts_swd_init). - For example, if 'swd_num_events' was 64, 'swd_event' events are numbered 0 to 63. - WARNING: if this function can be used from multiple threads at the same time, - it must be protected with a kind of mutex to avoid losing event notification. -*/ -int lc15bts_swd_event(struct lc15bts_mgr_instance *mgr, enum mgr_swd_events swd_event) -{ - /* Checks for a valid specified event (smaller than max possible) */ - if ((int)(swd_event) < 0 || (int)(swd_event) >= mgr->swd.num_events) - return(-1); - - mgr->swd.swd_events = mgr->swd.swd_events | ((unsigned long long int)(1) << (int)(swd_event)); - - /* !!! Uncomment following line to debug events notification */ - LOGP(DSWD, LOGL_DEBUG,"Swd event notified: %d\n", (int)(swd_event)); - - return 0; -} diff --git a/src/osmo-bts-litecell15/misc/lc15bts_swd.h b/src/osmo-bts-litecell15/misc/lc15bts_swd.h deleted file mode 100644 index b78a2c2a..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_swd.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _LC15BTS_SWD_H -#define _LC15BTS_SWD_H - -int lc15bts_swd_init(struct lc15bts_mgr_instance *mgr, int swd_num_events); -int lc15bts_swd_event(struct lc15bts_mgr_instance *mgr, enum mgr_swd_events swd_event); - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_temp.c b/src/osmo-bts-litecell15/misc/lc15bts_temp.c deleted file mode 100644 index 45602dcc..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_temp.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdint.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <limits.h> - -#include <osmocom/core/utils.h> - -#include "lc15bts_temp.h" - -static const char *temp_devs[_NUM_TEMP_SENSORS] = { - [LC15BTS_TEMP_SUPPLY] = "/var/lc15/temp/main-supply/temp", - [LC15BTS_TEMP_SOC] = "/var/lc15/temp/cpu/temp", - [LC15BTS_TEMP_FPGA] = "/var/lc15/temp/fpga/temp", - [LC15BTS_TEMP_RMSDET] = "/var/lc15/temp/rmsdet/temp", - [LC15BTS_TEMP_OCXO] = "/var/lc15/temp/ocxo/temp", - [LC15BTS_TEMP_TX0] = "/var/lc15/temp/tx0/temp", - [LC15BTS_TEMP_TX1] = "/var/lc15/temp/tx1/temp", - [LC15BTS_TEMP_PA0] = "/var/lc15/temp/pa0/temp", - [LC15BTS_TEMP_PA1] = "/var/lc15/temp/pa1/temp", -}; - -int lc15bts_temp_get(enum lc15bts_temp_sensor sensor, int *temp) -{ - char buf[PATH_MAX]; - char tempstr[8]; - int fd, rc; - - if (sensor < 0 || sensor >= _NUM_TEMP_SENSORS) - return -EINVAL; - - snprintf(buf, sizeof(buf)-1, "%s", temp_devs[sensor]); - buf[sizeof(buf)-1] = '\0'; - - fd = open(buf, O_RDONLY); - if (fd < 0) - return fd; - - rc = read(fd, tempstr, sizeof(tempstr)); - tempstr[sizeof(tempstr)-1] = '\0'; - if (rc < 0) { - close(fd); - return rc; - } - if (rc == 0) { - close(fd); - return -EIO; - } - close(fd); - *temp = atoi(tempstr); - return 0; -} - diff --git a/src/osmo-bts-litecell15/misc/lc15bts_temp.h b/src/osmo-bts-litecell15/misc/lc15bts_temp.h deleted file mode 100644 index 35d81f1b..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_temp.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _LC15BTS_TEMP_H -#define _LC15BTS_TEMP_H - -enum lc15bts_temp_sensor { - LC15BTS_TEMP_SUPPLY, - LC15BTS_TEMP_SOC, - LC15BTS_TEMP_FPGA, - LC15BTS_TEMP_RMSDET, - LC15BTS_TEMP_OCXO, - LC15BTS_TEMP_TX0, - LC15BTS_TEMP_TX1, - LC15BTS_TEMP_PA0, - LC15BTS_TEMP_PA1, - _NUM_TEMP_SENSORS -}; - -enum lc15bts_temp_type { - LC15BTS_TEMP_INPUT, - LC15BTS_TEMP_LOWEST, - LC15BTS_TEMP_HIGHEST, - LC15BTS_TEMP_FAULT, - _NUM_TEMP_TYPES -}; - -int lc15bts_temp_get(enum lc15bts_temp_sensor sensor, int *temp); - - -#endif diff --git a/src/osmo-bts-litecell15/misc/lc15bts_util.c b/src/osmo-bts-litecell15/misc/lc15bts_util.c deleted file mode 100644 index 430ce0f7..00000000 --- a/src/osmo-bts-litecell15/misc/lc15bts_util.c +++ /dev/null @@ -1,164 +0,0 @@ -/* lc15bts-util - access to hardware related parameters */ - -/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> - * - * Based on sysmoBTS: - * sysmobts_misc.c - * (C) 2012-2013 by Harald Welte <laforge@gnumonks.org> - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <errno.h> -#include <getopt.h> -#include <osmocom/core/talloc.h> -#include <osmocom/core/msgb.h> - -#include "lc15bts_par.h" - -void *tall_util_ctx; - -enum act { - ACT_GET, - ACT_SET, -}; - -static enum act action; -static char *write_arg; -static int void_warranty; - -static void print_help() -{ - const struct value_string *par = lc15bts_par_names; - - printf("lc15bts-util [--void-warranty -r | -w value] param_name\n"); - printf("Possible param names:\n"); - - for (; par->str != NULL; par += 1) { - if (!lc15bts_par_is_int(par->value)) - continue; - printf(" %s\n", par->str); - } -} - -static int parse_options(int argc, char **argv) -{ - while (1) { - int option_idx = 0, c; - static const struct option long_options[] = { - { "help", 0, 0, 'h' }, - { "read", 0, 0, 'r' }, - { "void-warranty", 0, 0, 1000}, - { "write", 1, 0, 'w' }, - { 0, 0, 0, 0 } - }; - - c = getopt_long(argc, argv, "rw:h", - long_options, &option_idx); - if (c == -1) - break; - switch (c) { - case 'r': - action = ACT_GET; - break; - case 'w': - action = ACT_SET; - write_arg = optarg; - break; - case 'h': - print_help(); - return -1; - break; - case 1000: - printf("Will void warranty on write.\n"); - void_warranty = 1; - break; - default: - return -1; - } - } - - return 0; -} - -int main(int argc, char **argv) -{ - const char *parname; - enum lc15bts_par par; - int rc, val; - - tall_util_ctx = talloc_named_const(NULL, 1, "lc15 utils"); - msgb_talloc_ctx_init(tall_util_ctx, 0); - - rc = parse_options(argc, argv); - if (rc < 0) - exit(2); - - if (optind >= argc) { - fprintf(stderr, "You must specify the parameter name\n"); - exit(2); - } - parname = argv[optind]; - - rc = get_string_value(lc15bts_par_names, parname); - if (rc < 0) { - fprintf(stderr, "`%s' is not a valid parameter\n", parname); - exit(2); - } else - par = rc; - - switch (action) { - case ACT_GET: - rc = lc15bts_par_get_int(tall_util_ctx, par, &val); - if (rc < 0) { - fprintf(stderr, "Error %d\n", rc); - goto err; - } - printf("%d\n", val); - break; - case ACT_SET: - rc = lc15bts_par_get_int(tall_util_ctx, par, &val); - if (rc < 0) { - fprintf(stderr, "Error %d\n", rc); - goto err; - } - if (val != 0xFFFF && val != 0xFF && val != 0xFFFFFFFF && !void_warranty) { - fprintf(stderr, "Parameter is already set!\r\n"); - goto err; - } - rc = lc15bts_par_set_int(tall_util_ctx, par, atoi(write_arg)); - if (rc < 0) { - fprintf(stderr, "Error %d\n", rc); - goto err; - } - printf("Success setting %s=%d\n", parname, - atoi(write_arg)); - break; - default: - fprintf(stderr, "Unsupported action\n"); - goto err; - } - - exit(0); - -err: - exit(1); -} - |