osmo-bts/src/osmo-bts-lc15/misc/lc15bts_bid.c

163 lines
4.0 KiB
C

/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com>
*
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include "lc15bts_bid.h"
#define BOARD_REV_SYSFS "/var/lc15/platform/revision"
#define BOARD_OPT_SYSFS "/var/lc15/platform/option"
static const int option_type_mask[_NUM_OPTION_TYPES] = {
[LC15BTS_OPTION_OCXO] = 0x07,
[LC15BTS_OPTION_FPGA] = 0x03,
[LC15BTS_OPTION_PA] = 0x01,
[LC15BTS_OPTION_BAND] = 0x03,
[LC15BTS_OPTION_TX_ISO_BYP] = 0x01,
[LC15BTS_OPTION_RX_DUP_BYP] = 0x01,
[LC15BTS_OPTION_RX_PB_BYP] = 0x01,
[LC15BTS_OPTION_RX_DIV] = 0x01,
[LC15BTS_OPTION_RX1A] = 0x01,
[LC15BTS_OPTION_RX1B] = 0x01,
[LC15BTS_OPTION_RX2A] = 0x01,
[LC15BTS_OPTION_RX2B] = 0x01,
[LC15BTS_OPTION_DDR_32B] = 0x01,
[LC15BTS_OPTION_DDR_ECC] = 0x01,
[LC15BTS_OPTION_LOG_DET] = 0x01,
[LC15BTS_OPTION_DUAL_LOG_DET] = 0x01,
};
static const int option_type_shift[_NUM_OPTION_TYPES] = {
[LC15BTS_OPTION_OCXO] = 0,
[LC15BTS_OPTION_FPGA] = 3,
[LC15BTS_OPTION_PA] = 5,
[LC15BTS_OPTION_BAND] = 6,
[LC15BTS_OPTION_TX_ISO_BYP] = 8,
[LC15BTS_OPTION_RX_DUP_BYP] = 9,
[LC15BTS_OPTION_RX_PB_BYP] = 10,
[LC15BTS_OPTION_RX_DIV] = 11,
[LC15BTS_OPTION_RX1A] = 12,
[LC15BTS_OPTION_RX1B] = 13,
[LC15BTS_OPTION_RX2A] = 14,
[LC15BTS_OPTION_RX2B] = 15,
[LC15BTS_OPTION_DDR_32B] = 16,
[LC15BTS_OPTION_DDR_ECC] = 17,
[LC15BTS_OPTION_LOG_DET] = 18,
[LC15BTS_OPTION_DUAL_LOG_DET] = 19,
};
static int board_rev = -1;
static int board_option = -1;
static inline bool read_board(const char *src, const char *spec, void *dst)
{
FILE *fp = fopen(src, "r");
if (!fp) {
fprintf(stderr, "Failed to open %s due to '%s' error\n", src, strerror(errno));
return false;
}
if (fscanf(fp, spec, dst) != 1) {
fclose(fp);
fprintf(stderr, "Failed to read %s due to '%s' error\n", src, strerror(errno));
return false;
}
fclose(fp);
return true;
}
int lc15bts_rev_get(void)
{
char rev;
if (board_rev != -1) {
return board_rev;
}
if (!read_board(BOARD_REV_SYSFS, "%c", &rev))
return -1;
board_rev = rev;
return board_rev;
}
int lc15bts_model_get(void)
{
int opt;
if (board_option != -1)
return board_option;
if (!read_board(BOARD_OPT_SYSFS, "%X", &opt))
return -1;
board_option = opt;
return board_option;
}
int lc15bts_option_get(enum lc15bts_option_type type)
{
int rc;
int option;
if (type >= _NUM_OPTION_TYPES) {
return -EINVAL;
}
if (board_option == -1) {
rc = lc15bts_model_get();
if (rc < 0) return rc;
}
option = (board_option >> option_type_shift[type])
& option_type_mask[type];
return option;
}
const char* get_hwversion_desc()
{
int rev;
int model;
size_t len;
static char model_name[64] = {0, };
len = snprintf(model_name, sizeof(model_name), "NuRAN Litecell 1.5 BTS");
rev = lc15bts_rev_get();
if (rev >= 0) {
len += snprintf(model_name + len, sizeof(model_name) - len,
" Rev %c", (char)rev);
}
model = lc15bts_model_get();
if (model >= 0) {
snprintf(model_name + len, sizeof(model_name) - len,
"%s (%05X)", model_name, model);
}
return model_name;
}