[osmo-bts PATCH v2 1/2] misc/sysmobts_misc.c: Read temperature from microcontroller

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Alvaro Neira anayuso at sysmocom.de
Mon Mar 10 21:38:33 UTC 2014


From: Álvaro Neira Ayuso <anayuso at 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 at sysmocom.de>
---
v2: Removed and fixed the reanilization of the new timer, fixed the function
write for consider the value 0 and fixed some leak in the new function for
checking the temperature from the uc.

 src/osmo-bts-sysmo/misc/sysmobts_mgr.c  |   42 ++++++++
 src/osmo-bts-sysmo/misc/sysmobts_misc.c |  164 +++++++++++++++++++++++++++++++
 src/osmo-bts-sysmo/misc/sysmobts_misc.h |   19 ++++
 3 files changed, 225 insertions(+)

diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
index 171f79b..cff15d9 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
@@ -35,6 +35,7 @@
 #include <osmocom/core/application.h>
 #include <osmocom/core/timer.h>
 #include <osmocom/core/msgb.h>
+#include <osmocom/core/serial.h>
 #include <osmocom/vty/telnet_interface.h>
 #include <osmocom/vty/logging.h>
 
@@ -53,6 +54,44 @@ 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 *data)
+{
+	int temp_pa = 0, temp_board = 0;
+	struct uc *ucontrol0 = data;
+
+	sbts2050_uc_check_temp(ucontrol0, &temp_pa, &temp_board);
+
+	osmo_timer_schedule(&temp_uc_timer, TEMP_TIMER_SECS, 0);
+}
+
+static void initialize_sbts2050(void)
+{
+	static struct uc ucontrol0 = {
+		.id = 0,
+		.path = "/dev/ttyS0"
+	};
+	int val;
+
+	ucontrol0.fd = osmo_serial_init(ucontrol0.path, 115200);
+	if (ucontrol0.fd < 0)
+		return;
+
+	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)
+			return;
+	}
+	temp_uc_timer.cb = check_uctemp_timer_cb;
+	temp_uc_timer.data = &ucontrol0;
+	check_uctemp_timer_cb(&ucontrol0);
+}
+
 static struct osmo_timer_list temp_timer;
 static void check_temp_timer_cb(void *unused)
 {
@@ -309,6 +348,9 @@ int main(int argc, char **argv)
 	hours_timer.cb = hours_timer_cb;
 	hours_timer_cb(NULL);
 
+	/* start uc temperature check timer */
+	initialize_sbts2050();
+
 	/* handle broadcast messages for ipaccess-find */
 	fd.cb = ipaccess_bcast;
 	rc = osmo_sock_init_ofd(&fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP,
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.c b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
index c043045..13957a4 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
@@ -32,6 +32,7 @@
 
 #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>
@@ -39,7 +40,170 @@
 #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
+ *********************************************************************/
+static int hand_serial_read(int fd, struct msgb *msg, int numbytes)
+{
+	int rc, bread = 0;
+
+	if (numbytes > msgb_tailroom(msg))
+		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;
+}
+
+static 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 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;
+	}
+
+	add_parity(command);
+
+	if (hand_serial_write(ucontrol->fd, msg) < 0)
+		goto err;
+
+	msgb_reset(msg);
+
+	FD_ZERO(&fdread);
+	FD_SET(ucontrol->fd, &fdread);
+
+	num = SIZE_HEADER_RSP;
+	while (1) {
+		rc = select(ucontrol->fd+1, &fdread, NULL, NULL, &tout);
+		if (rc > 0) {
+			if (hand_serial_read(ucontrol->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;
+	}
+
+	return msg;
+
+err:
+	close(ucontrol->fd);
+	msgb_free(msg);
+	return NULL;
+}
+
+/**********************************************************************
+ *	Uc temperature handling
+ *********************************************************************/
+void sbts2050_uc_check_temp(struct uc *ucontrol, int *temp_pa, int *temp_board)
+{
+	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;
+
+	*temp_board = response->rsp.tempGet.i8BrdTemp;
+	*temp_pa = response->rsp.tempGet.i8PaTemp;
+
+	LOGP(DTEMP, LOGL_DEBUG, "Temperature Board: %+3d C\n"
+				"Tempeture PA: %+3d C\n",
+				 response->rsp.tempGet.i8BrdTemp,
+				 response->rsp.tempGet.i8PaTemp);
+	msgb_free(msg);
+}
 
 /*********************************************************************
  * Temperature handling
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.h b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
index 8f7da47..bdaaaf7 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,28 @@ enum sysmobts_temp_type {
 	_NUM_TEMP_TYPES
 };
 
+struct uc {
+	int id;
+	int fd;
+	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 *temp_pa, int *temp_board);
+
 int sysmobts_update_hours(int no_epprom_write);
 
 enum sysmobts_firmware_type {





More information about the OpenBSC mailing list