diff options
-rw-r--r-- | include/openbsc/abis_nm.h | 7 | ||||
-rw-r--r-- | src/abis_nm.c | 16 | ||||
-rw-r--r-- | src/bs11_config.c | 12 |
3 files changed, 35 insertions, 0 deletions
diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index 73bb19c48..5c1ae8ed1 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -379,6 +379,7 @@ enum abis_nm_attr { NM_ATT_BS11_PLL = 0xf2, NM_ATT_BS11_RX_OFFSET = 0xf3, NM_ATT_BS11_ANT_TYPE = 0xf4, + NM_ATT_BS11_PLL_MODE = 0xfc, NM_ATT_BS11_PASSWORD = 0xfd, }; #define NM_ATT_BS11_FILE_DATA NM_ATT_EVENT_TYPE @@ -472,6 +473,11 @@ enum abis_bs11_trx_power { BS11_TRX_POWER_DCS_160mW= 0x0d, }; +enum abis_bs11_li_pll_mode { + BS11_LI_PLL_LOCKED = 2, + BS11_LI_PLL_STANDALONE = 3, +}; + enum abis_bs11_phase { BS11_STATE_SOFTWARE_RQD = 0x01, BS11_STATE_LOAD_SMU_INTENDED = 0x11, @@ -548,6 +554,7 @@ int abis_nm_bs11_set_trx_power(struct gsm_bts_trx *trx, u_int8_t level); int abis_nm_bs11_get_trx_power(struct gsm_bts_trx *trx); int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on); int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password); +int abis_nm_bs11_set_pll_locked(struct gsm_bts *bts, int locked); int abis_nm_bs11_get_state(struct gsm_bts *bts); int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname, u_int8_t win_size, int forced, gsm_cbfn *cbfn); diff --git a/src/abis_nm.c b/src/abis_nm.c index 7a9a3f586..3cbfd8466 100644 --- a/src/abis_nm.c +++ b/src/abis_nm.c @@ -1733,6 +1733,22 @@ int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password) return abis_nm_sendmsg(bts, msg); } +/* change the BS-11 PLL Mode to either locked (E1 derived) or standalone */ +int abis_nm_bs11_set_pll_locked(struct gsm_bts *bts, int locked) +{ + struct abis_om_hdr *oh; + struct msgb *msg; + + msg = nm_msgb_alloc(); + oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE); + fill_om_fom_hdr(oh, 3, NM_MT_BS11_SET_ATTR, NM_OC_BS11, + BS11_OBJ_LI, 0x00, 0x00); + msgb_tlv_put(msg, NM_ATT_BS11_PLL_MODE, 1, + locked ? BS11_LI_PLL_LOCKED : BS11_LI_PLL_STANDALONE); + + return abis_nm_sendmsg(bts, msg); +} + int abis_nm_bs11_get_state(struct gsm_bts *bts) { return __simple_cmd(bts, NM_MT_BS11_GET_STATE); diff --git a/src/bs11_config.c b/src/bs11_config.c index b603e8bf1..7f759853c 100644 --- a/src/bs11_config.c +++ b/src/bs11_config.c @@ -459,6 +459,16 @@ static int handle_state_resp(enum abis_bs11_phase state) sleep(1); abis_nm_bs11_factory_logon(g_bts, 0); command = NULL; + } else if (!strcmp(command, "pll-e1-locked")) { + abis_nm_bs11_set_pll_locked(g_bts, 1); + sleep(1); + abis_nm_bs11_factory_logon(g_bts, 0); + command = NULL; + } else if (!strcmp(command, "pll-standalone")) { + abis_nm_bs11_set_pll_locked(g_bts, 0); + sleep(1); + abis_nm_bs11_factory_logon(g_bts, 0); + command = NULL; } else if (!strcmp(command, "oml-tei")) { abis_nm_bs11_conn_oml_tei(g_bts, 0, 1, 0xff, TEI_OML); command = NULL; @@ -615,6 +625,8 @@ static void print_help(void) printf("\tsoftware\tDownload Software (only in administrative state)\n"); printf("\tcreate-trx1\tCreate objects for TRX1 (Danger: Your BS-11 might overheat)\n"); printf("\tdelete-trx1\tDelete objects for TRX1\n"); + printf("\tpll-e1-locked\tSet the PLL to be locked to E1 clock\n"); + printf("\tpll-standalone\tSet the PLL to be in standalone mode\n"); printf("\toml-tei\tSet OML E1 TS and TEI\n"); } |