From: Álvaro Neira Ayuso <anayuso(a)sysmocom.de>
Add function for requesting the temperature information to the
microcontroller. I have added a function that we can extend
for requesting more information but in this case we only need to
know the temperature.
I have added to a microcontroller temperature handling function
in the manager for monitoring this information.
Signed-off-by: Alvaro Neira Ayuso <anayuso(a)sysmocom.de>
---
src/osmo-bts-sysmo/misc/sysmobts_mgr.c | 29 +++++
src/osmo-bts-sysmo/misc/sysmobts_misc.c | 167 +++++++++++++++++++++++++++++++
src/osmo-bts-sysmo/misc/sysmobts_misc.h | 22 ++++
3 files changed, 218 insertions(+)
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
index 171f79b..71b889e 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
@@ -53,6 +53,31 @@ void *tall_mgr_ctx;
/* every 1 hours means 365*24 = 8760 EEprom writes per year (max) */
#define HOURS_TIMER_SECS (1 * 3600)
+static struct osmo_timer_list temp_uc_timer;
+static void check_uctemp_timer_cb(void *unused)
+{
+ struct uc ucontrol0 = {
+ .id = 0,
+ .path = "/dev/ttyS0"
+ };
+ int val;
+
+ if (sysmobts_par_get_int(SYSMOBTS_PAR_MODEL_NR, &val) < 0)
+ return;
+
+ if (val == 2050) {
+ if (sysmobts_par_get_int(SYSMOBTS_PAR_TRX_NR, &val) < 0)
+ return;
+
+ if (val == 0)
+ sbts2050_uc_check_temp(ucontrol0);
+ }
+
+ osmo_timer_schedule(&temp_uc_timer, TEMP_TIMER_SECS, 0);
+
+
+}
+
static struct osmo_timer_list temp_timer;
static void check_temp_timer_cb(void *unused)
{
@@ -305,6 +330,10 @@ int main(int argc, char **argv)
temp_timer.cb = check_temp_timer_cb;
check_temp_timer_cb(NULL);
+ /* start uc temperature check timer */
+ temp_uc_timer.cb = check_uctemp_timer_cb;
+ check_uctemp_timer_cb(NULL);
+
/* start operational hours timer */
hours_timer.cb = hours_timer_cb;
hours_timer_cb(NULL);
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.c
b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
index c043045..aee892d 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
@@ -32,6 +32,8 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/utils.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/serial.h>
#include <osmocom/core/application.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/logging.h>
@@ -39,7 +41,172 @@
#include "sysmobts_misc.h"
#include "sysmobts_par.h"
#include "sysmobts_mgr.h"
+#include "sbts2050_header.h"
+#define SERIAL_ALLOC_SIZE 300
+#define SIZE_HEADER_RSP 5
+#define SIZE_HEADER_CMD 4
+
+/**********************************************************************
+ * Functions read/write from serial interface
+ *********************************************************************/
+int hand_serial_read(int fd, struct msgb *msg, int numbytes)
+{
+ int rc, bread = 0;
+
+ if (numbytes > msg->data_len)
+ return -ENOSPC;
+
+ while (bread < numbytes) {
+ rc = read(fd, msg->tail, numbytes - bread);
+ if (rc < 0)
+ return -1;
+ if (rc == 0)
+ break;
+
+ bread += rc;
+ msgb_put(msg, rc);
+ }
+
+ return bread;
+}
+
+int hand_serial_write(int fd, struct msgb *msg)
+{
+ int rc, bwritten = 0;
+
+ while (msg->len > 0) {
+ rc = write(fd, msg->data, msg->len);
+ if (rc < 0)
+ return -1;
+
+ msgb_pull(msg, rc);
+ bwritten += rc;
+ }
+
+ return bwritten;
+}
+
+/**********************************************************************
+ * Functions request information to Microcontroller
+ *********************************************************************/
+static void add_parity(cmdpkt_t *command)
+{
+ int n;
+ uint8_t parity = 0x00;
+ for (n = 0; n < SIZE_HEADER_CMD+command->u8Len; n++)
+ parity ^= ((uint8_t *)command)[n];
+
+ command->cmd.raw[command->u8Len] = parity;
+}
+
+struct msgb *sbts2050_ucinfo_get(struct uc ucontrol, struct ucinfo info)
+{
+ int fd, num, rc;
+ cmdpkt_t *command;
+ rsppkt_t *response;
+ struct msgb *msg;
+ fd_set fdread;
+ struct timeval tout = {
+ .tv_sec = 10,
+ };
+
+ switch (info.id) {
+ case SBTS2050_TEMP_RQT:
+ num = sizeof(command->cmd.tempGet);
+ break;
+ default:
+ return NULL;
+ }
+ num = num + SIZE_HEADER_CMD+1;
+
+ msg = msgb_alloc(SERIAL_ALLOC_SIZE, "Message Microcontroller");
+ if (msg == NULL) {
+ LOGP(DTEMP, LOGL_ERROR, "Error creating msg\n");
+ return NULL;
+ }
+ command = (cmdpkt_t *) msgb_put(msg, num);
+
+ command->u16Magic = 0xCAFE;
+ switch (info.id) {
+ case SBTS2050_TEMP_RQT:
+ command->u8Id = info.id;
+ command->u8Len = sizeof(command->cmd.tempGet);
+ break;
+ default:
+ goto err_free;
+ }
+
+ add_parity(command);
+
+ fd = osmo_serial_init(ucontrol.path, 115200);
+ if (fd < 0)
+ goto err_free;
+
+ if (hand_serial_write(fd, msg) < 0)
+ goto err;
+
+ msgb_reset(msg);
+
+ FD_ZERO(&fdread);
+ FD_SET(fd, &fdread);
+
+ num = SIZE_HEADER_RSP;
+ while (1) {
+ rc = select(fd+1, &fdread, NULL, NULL, &tout);
+ if (rc > 0) {
+ if (hand_serial_read(fd, msg, num) < 0)
+ goto err;
+
+ response = (rsppkt_t *)msg->data;
+
+ if (response->u8Id != info.id || msg->len <= 0 ||
+ response->i8Error != RQT_SUCCESS)
+ goto err;
+
+ if (msg->len == SIZE_HEADER_RSP + response->u8Len + 1)
+ break;
+
+ num = response->u8Len + 1;
+ } else
+ goto err;
+ }
+ close(fd);
+
+ return msg;
+
+err:
+ close(fd);
+err_free:
+ msgb_free(msg);
+ return NULL;
+}
+
+/**********************************************************************
+ * Uc temperature handling
+ *********************************************************************/
+void sbts2050_uc_check_temp(struct uc ucontrol)
+{
+ rsppkt_t *response;
+ struct msgb *msg;
+ struct ucinfo info = {
+ .id = SBTS2050_TEMP_RQT,
+ };
+
+ msg = sbts2050_ucinfo_get(ucontrol, info);
+
+ if (msg == NULL) {
+ LOGP(DTEMP, LOGL_ERROR, "Error reading temperature\n");
+ return;
+ }
+
+ response = (rsppkt_t *)msg->data;
+
+ LOGP(DTEMP, LOGL_DEBUG, "Temperature Board: %+3d C\n"
+ "Tempeture PA: %+3d C\n",
+ response->rsp.tempGet.i8BrdTemp,
+ response->rsp.tempGet.i8PaTemp);
+}
/*********************************************************************
* Temperature handling
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.h
b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
index 8f7da47..f80df16 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.h
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
@@ -1,6 +1,8 @@
#ifndef _SYSMOBTS_MISC_H
#define _SYSMOBTS_MISC_H
+#define RQT_SUCCESS 0
+
enum sysmobts_temp_sensor {
SYSMOBTS_TEMP_DIGITAL = 1,
SYSMOBTS_TEMP_RF = 2,
@@ -13,11 +15,31 @@ enum sysmobts_temp_type {
_NUM_TEMP_TYPES
};
+enum sbts2050_ids_request {
+ SBTS2050_TEMP_RQT = 0x10
+};
+
+struct uc {
+ int id;
+ const char *path;
+};
+
+struct ucinfo {
+ uint16_t id;
+ int master;
+ int slave;
+ int pa;
+};
+
int sysmobts_temp_get(enum sysmobts_temp_sensor sensor,
enum sysmobts_temp_type type);
void sysmobts_check_temp(int no_eeprom_write);
+struct msgb *sbts2050_ucinfo_get(struct uc ucontrol, struct ucinfo info);
+
+void sbts2050_uc_check_temp(struct uc ucontrol);
+
int sysmobts_update_hours(int no_epprom_write);
enum sysmobts_firmware_type {