From: Álvaro Neira Ayuso <[email protected]>

I have extended the principal function that we use for requesting
information to the microcontroller for switching off/on the board
and the PA. And i have extended too with a function for requesting
the power status information of the board and the PA.

Signed-off-by: Alvaro Neira Ayuso <[email protected]>
---
 src/osmo-bts-sysmo/misc/sysmobts_misc.c |   81 +++++++++++++++++++++++++++++++
 src/osmo-bts-sysmo/misc/sysmobts_misc.h |   10 ++++
 2 files changed, 91 insertions(+)

diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.c 
b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
index 081b65f..310c681 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.c
@@ -114,6 +114,12 @@ struct msgb *sbts2050_ucinfo_get(struct uc *ucontrol, 
struct ucinfo info)
        case SBTS2050_TEMP_RQT:
                num = sizeof(command->cmd.tempGet);
                break;
+       case SBTS2050_PWR_RQT:
+               num = sizeof(command->cmd.pwrSetState);
+               break;
+       case SBTS2050_PWR_STATUS:
+               num = sizeof(command->cmd.pwrGetStatus);
+               break;
        default:
                return NULL;
        }
@@ -132,6 +138,17 @@ struct msgb *sbts2050_ucinfo_get(struct uc *ucontrol, 
struct ucinfo info)
                command->u8Id = info.id;
                command->u8Len = sizeof(command->cmd.tempGet);
                break;
+       case SBTS2050_PWR_RQT:
+               command->u8Id = info.id;
+               command->u8Len = sizeof(command->cmd.pwrSetState);
+               command->cmd.pwrSetState.u1MasterEn = !!info.master;
+               command->cmd.pwrSetState.u1SlaveEn  = !!info.slave;
+               command->cmd.pwrSetState.u1PwrAmpEn = !!info.pa;
+               break;
+       case SBTS2050_PWR_STATUS:
+               command->u8Id     = info.id;
+               command->u8Len    = sizeof(command->cmd.pwrGetStatus);
+               break;
        default:
                goto err;
        }
@@ -175,6 +192,70 @@ err:
 }
 
 /**********************************************************************
+ *     Get power status function
+ *********************************************************************/
+int sbts2050_uc_status(struct uc *ucontrol, enum sbts2050_status_rqt status)
+{
+       struct msgb *msg;
+       struct ucinfo info = {
+               .id = SBTS2050_PWR_STATUS,
+       };
+       rsppkt_t *response;
+
+       msg = sbts2050_ucinfo_get(ucontrol, info);
+
+       if (msg == NULL) {
+               LOGP(DTEMP, LOGL_ERROR, "Error switching off some unit");
+               return -1;
+       }
+
+       response = (rsppkt_t *)msg->data;
+
+       switch (status) {
+       case SBTS2050_STATUS_MASTER:
+               return response->rsp.pwrGetStatus.u1MasterEn;
+       case SBTS2050_STATUS_SLAVE:
+               return response->rsp.pwrGetStatus.u1SlaveEn;
+       case SBTS2050_STATUS_PA:
+               return response->rsp.pwrGetStatus.u1PwrAmpEn;
+       default:
+               return -1;
+       }
+       msgb_free(msg);
+}
+
+/**********************************************************************
+ *     Uc Power Switching handling
+ *********************************************************************/
+void sbts2050_uc_power(struct uc *ucontrol, int pmaster, int pslave, int ppa)
+{
+       struct msgb *msg;
+       struct ucinfo info = {
+               .id = 0x00,
+               .master = pmaster,
+               .slave = pslave,
+               .pa = ppa
+       };
+
+       msg = sbts2050_ucinfo_get(ucontrol, info);
+
+       if (msg == NULL) {
+               LOGP(DTEMP, LOGL_ERROR, "Error switching off some unit");
+               return;
+       }
+
+       LOGP(DTEMP, LOGL_DEBUG, "Switch off/on success:\n"
+                               "MASTER %s\n"
+                               "SLAVE %s\n"
+                               "PA %s\n",
+                               pmaster ? "ON" : "OFF",
+                               pslave ? "ON" : "OFF",
+                               ppa ? "ON" : "OFF");
+
+       msgb_free(msg);
+}
+
+/**********************************************************************
  *     Uc temperature handling
  *********************************************************************/
 void sbts2050_uc_check_temp(struct uc *ucontrol, int *temp_pa, int *temp_board)
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.h 
b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
index a0c57a4..9967853 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_misc.h
+++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.h
@@ -13,6 +13,12 @@ enum sysmobts_temp_type {
        _NUM_TEMP_TYPES
 };
 
+enum sbts2050_status_rqt {
+       SBTS2050_STATUS_MASTER,
+       SBTS2050_STATUS_SLAVE,
+       SBTS2050_STATUS_PA
+};
+
 struct uc {
        int id;
        int fd;
@@ -35,6 +41,10 @@ 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);
 
+void sbts2050_uc_power(struct uc *ucontrol, int pmaster, int pslave, int ppa);
+
+int sbts2050_uc_status(struct uc *ucontrol, enum sbts2050_status_rqt status);
+
 int sysmobts_update_hours(int no_epprom_write);
 
 enum sysmobts_firmware_type {


Reply via email to