aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-sysmo
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-08-21 16:25:22 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-08-21 16:25:22 +0200
commit631945a36790898a3c5832d21e36bf0f54ffc465 (patch)
tree5475f928da290d771a20276169a3786f14b3eda8 /src/osmo-bts-sysmo
parentffe1d2e1e0bc99debf5cc826c43632680d969825 (diff)
parent5e1363071f9e9951985ba1a21196c5548350fafc (diff)
Merge branch 'sysmocom/features/sysmobts-mgr'
Add some VTY code to show the temperature on all devices and to query the external micro controller for voltage/current and the temperature in the "show manager" command. It should probably be a "show system" command though.
Diffstat (limited to 'src/osmo-bts-sysmo')
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr.c53
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr_2050.c60
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c39
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_misc.h30
4 files changed, 133 insertions, 49 deletions
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
index 2864ec9b..f8b3302e 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
@@ -44,11 +44,53 @@
#include "misc/sysmobts_nl.h"
#include "misc/sysmobts_par.h"
+static int bts_type;
+static int trx_number;
+
static int no_eeprom_write = 0;
static int daemonize = 0;
static const char *cfgfile = "sysmobts-mgr.cfg";
void *tall_mgr_ctx;
+
+static int classify_bts(void)
+{
+ int rc;
+
+ rc = sysmobts_par_get_int(SYSMOBTS_PAR_MODEL_NR, &bts_type);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to get model number.\n");
+ return -1;
+ }
+
+ rc = sysmobts_par_get_int(SYSMOBTS_PAR_TRX_NR, &trx_number);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to get the trx number.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+int is_sbts2050(void)
+{
+ return bts_type == 2050;
+}
+
+int is_sbts2050_trx(int trx)
+{
+ return trx_number == trx;
+}
+
+int is_sbts2050_master(void)
+{
+ if (!is_sbts2050())
+ return 0;
+ if (!is_sbts2050_trx(0))
+ return 0;
+ return 1;
+}
+
static struct osmo_timer_list temp_timer;
static void check_temp_timer_cb(void *unused)
{
@@ -221,7 +263,6 @@ static void respond_to(struct sockaddr_in *src, struct osmo_fd *fd,
if (!fetched_info) {
uint8_t mac[6];
- int val;
/* fetch the MAC */
sysmobts_par_get_buf(SYSMOBTS_PAR_MAC, mac, sizeof(mac));
@@ -230,18 +271,16 @@ static void respond_to(struct sockaddr_in *src, struct osmo_fd *fd,
mac[3], mac[4], mac[5]);
/* fetch the model and trx number */
- sysmobts_par_get_int(SYSMOBTS_PAR_MODEL_NR, &val);
- switch(val) {
+ switch(bts_type) {
case 0:
case 0xffff:
case 1002:
model_name = "sysmoBTS 1002";
break;
case 2050:
- sysmobts_par_get_int(SYSMOBTS_PAR_TRX_NR, &val);
- if (val == 0)
+ if (trx_number == 0)
model_name = "sysmoBTS 2050 (master)";
- else if (val == 1)
+ else if (trx_number == 1)
model_name = "sysmoBTS 2050 (slave)";
else
model_name = "sysmoBTS 2050 (unknown)";
@@ -322,6 +361,8 @@ int main(int argc, char **argv)
msgb_set_talloc_ctx(tall_msgb_ctx);
mgr_log_init();
+ if (classify_bts() != 0)
+ exit(2);
osmo_init_ignore_signals();
signal(SIGINT, &signal_handler);
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr_2050.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr_2050.c
index e3cd104b..7de68954 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr_2050.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr_2050.c
@@ -28,6 +28,7 @@
#include <errno.h>
#include <unistd.h>
+#include <string.h>
#ifdef BUILD_SBTS2050
#include <sysmocom/femtobts/sbts2050_header.h>
@@ -51,7 +52,8 @@ struct ucinfo {
static struct uc ucontrol0 = {
.id = 0,
- .path = "/dev/ttyS0"
+ .path = "/dev/ttyS0",
+ .fd = -1,
};
/**********************************************************************
@@ -202,41 +204,43 @@ err:
/**********************************************************************
* Get power status function
*********************************************************************/
-int sbts2050_uc_get_status(enum sbts2050_status_rqt status)
+int sbts2050_uc_get_status(struct sbts2050_power_status *status)
{
struct msgb *msg;
const struct ucinfo info = {
.id = SBTS2050_PWR_STATUS,
};
rsppkt_t *response;
- int val_status;
+ memset(status, 0, sizeof(*status));
msg = sbts2050_ucinfo_get(&ucontrol0, &info);
if (msg == NULL) {
LOGP(DTEMP, LOGL_ERROR,
- "Error requesting power status: %d\n", status);
+ "Error requesting power status.\n");
return -1;
}
response = (rsppkt_t *)msg->data;
- switch (status) {
- case SBTS2050_STATUS_MASTER:
- val_status = response->rsp.pwrGetStatus.u1MasterEn;
- break;
- case SBTS2050_STATUS_SLAVE:
- val_status = response->rsp.pwrGetStatus.u1SlaveEn;
- break;
- case SBTS2050_STATUS_PA:
- val_status = response->rsp.pwrGetStatus.u1PwrAmpEn;
- break;
- default:
- msgb_free(msg);
- return -1;
- }
+ status->main_supply_current = response->rsp.pwrGetStatus.u8MainSupplyA / 64.f;
+
+ status->master_enabled = response->rsp.pwrGetStatus.u1MasterEn;
+ status->master_voltage = response->rsp.pwrGetStatus.u8MasterV / 32.f;
+ status->master_current = response->rsp.pwrGetStatus.u8MasterA / 64.f;;
+
+ status->slave_enabled = response->rsp.pwrGetStatus.u1SlaveEn;
+ status->slave_voltage = response->rsp.pwrGetStatus.u8SlaveV / 32.f;
+ status->slave_current = response->rsp.pwrGetStatus.u8SlaveA / 64.f;
+
+ status->pa_enabled = response->rsp.pwrGetStatus.u1PwrAmpEn;
+ status->pa_voltage = response->rsp.pwrGetStatus.u8PwrAmpV / 4.f;
+ status->pa_current = response->rsp.pwrGetStatus.u8PwrAmpA / 64.f;
+
+ status->pa_bias_voltage = response->rsp.pwrGetStatus.u8PwrAmpBiasV / 16.f;
+
msgb_free(msg);
- return val_status;
+ return 0;
}
/**********************************************************************
@@ -312,23 +316,7 @@ static void check_uctemp_timer_cb(void *data)
void sbts2050_uc_initialize(void)
{
- int val;
-
- if (sysmobts_par_get_int(SYSMOBTS_PAR_MODEL_NR, &val) < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to get Model number\n");
- return;
- }
-
- if (val != 2050)
- return;
-
- if (sysmobts_par_get_int(SYSMOBTS_PAR_TRX_NR, &val) < 0) {
- LOGP(DTEMP, LOGL_ERROR, "Failed to get the TRX number\n");
- return;
- }
-
- if (val != 0)
+ if (!is_sbts2050_master())
return;
ucontrol0.fd = osmo_serial_init(ucontrol0.path, 115200);
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c
index 50d8e152..1cabe44a 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c
@@ -96,6 +96,45 @@ DEFUN(cfg_mgr, cfg_mgr_cmd,
DEFUN(show_mgr, show_mgr_cmd, "show manager",
SHOW_STR "Display information about the manager")
{
+ vty_out(vty, "Current Temperatures%s", VTY_NEWLINE);
+ vty_out(vty, " Digital: %f Celcius%s",
+ sysmobts_temp_get(SYSMOBTS_TEMP_DIGITAL,
+ SYSMOBTS_TEMP_INPUT) / 1000.0f,
+ VTY_NEWLINE);
+ vty_out(vty, " RF: %f Celcius%s",
+ sysmobts_temp_get(SYSMOBTS_TEMP_RF,
+ SYSMOBTS_TEMP_INPUT) / 1000.0f,
+ VTY_NEWLINE);
+ if (is_sbts2050_master()) {
+ int temp_pa, temp_board;
+ struct sbts2050_power_status status;
+
+ sbts2050_uc_check_temp(&temp_pa, &temp_board);
+ vty_out(vty, " sysmoBTS 2050 PA: %d Celcius%s", temp_pa, VTY_NEWLINE);
+ vty_out(vty, " sysmoBTS 2050 PA: %d CelciusC%s", temp_board, VTY_NEWLINE);
+
+ sbts2050_uc_get_status(&status);
+ vty_out(vty, "Power Status%s", VTY_NEWLINE);
+ vty_out(vty, " Main Supply :(ON) [(24.00)Vdc, %4.2f A]%s",
+ status.main_supply_current, VTY_NEWLINE);
+ vty_out(vty, " Master SF : %s [%6.2f Vdc, %4.2f A]%s",
+ status.master_enabled ? "ON " : "OFF",
+ status.master_voltage, status.master_current,
+ VTY_NEWLINE);
+ vty_out(vty, " Slave SF : %s [%6.2f Vdc, %4.2f A]%s",
+ status.slave_enabled ? "ON" : "OFF",
+ status.slave_voltage, status.slave_current,
+ VTY_NEWLINE);
+ vty_out(vty, " Power Amp : %s [%6.2f Vdc, %4.2f A]%s",
+ status.pa_enabled ? "ON" : "OFF",
+ status.pa_voltage, status.pa_current,
+ VTY_NEWLINE);
+ vty_out(vty, " PA Bias : %s [%6.2f Vdc, ---- A]%s",
+ status.pa_enabled ? "ON" : "OFF",
+ status.pa_bias_voltage,
+ VTY_NEWLINE);
+ }
+
return CMD_SUCCESS;
}
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.h b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
index f3b85c2c..9d1bb47b 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.h
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
@@ -21,12 +21,6 @@ enum sysmobts_temp_type {
_NUM_TEMP_TYPES
};
-enum sbts2050_status_rqt {
- SBTS2050_STATUS_MASTER,
- SBTS2050_STATUS_SLAVE,
- SBTS2050_STATUS_PA
-};
-
int sysmobts_temp_get(enum sysmobts_temp_sensor sensor,
enum sysmobts_temp_type type);
@@ -43,9 +37,31 @@ enum sysmobts_firmware_type {
int sysmobts_firmware_reload(enum sysmobts_firmware_type type);
+int is_sbts2050(void);
+int is_sbts2050_trx(int);
+int is_sbts2050_master(void);
+
+struct sbts2050_power_status {
+ float main_supply_current;
+
+ int master_enabled;
+ float master_voltage;
+ float master_current;
+
+ int slave_enabled;
+ float slave_voltage;
+ float slave_current;
+
+ int pa_enabled;
+ float pa_voltage;
+ float pa_current;
+
+ float pa_bias_voltage;
+};
+
void sbts2050_uc_check_temp(int *temp_pa, int *temp_board);
void sbts2050_uc_set_power(int pmaster, int pslave, int ppa);
-int sbts2050_uc_get_status(enum sbts2050_status_rqt status);
+int sbts2050_uc_get_status(struct sbts2050_power_status *status);
void sbts2050_uc_initialize();
#endif