Files
openbts/TransceiverRAD1/FactoryCalibration.cpp
2014-07-16 23:57:22 +02:00

257 lines
5.4 KiB
C++

/*
* Copyright 2013, 2014 Range Networks, Inc.
*
* This software is distributed under multiple licenses;
* see the COPYING file in the main directory for licensing
* information for this specific distribution.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
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.
*/
#include <FactoryCalibration.h>
int FactoryCalibration::hexval (char ch)
{
if ('0' <= ch && ch <= '9') {
return ch - '0';
}
if ('a' <= ch && ch <= 'f') {
return ch - 'a' + 10;
}
if ('A' <= ch && ch <= 'F') {
return ch - 'A' + 10;
}
return -1;
}
unsigned char * FactoryCalibration::hex_string_to_binary(const char *string, int *lenptr)
{
int sl = strlen (string);
if (sl & 0x01){
// fprintf (stderr, "%s: odd number of chars in <hex-string>\n", prog_name);
return 0;
}
int len = sl / 2;
*lenptr = len;
unsigned char *buf = new unsigned char [len];
for (int i = 0; i < len; i++){
int hi = hexval (string[2 * i]);
int lo = hexval (string[2 * i + 1]);
if (hi < 0 || lo < 0){
// fprintf (stderr, "%s: invalid char in <hex-string>\n", prog_name);
delete [] buf;
return 0;
}
buf[i] = (hi << 4) | lo;
}
return buf;
}
bool FactoryCalibration::i2c_write(int i2c_addr, char *hex_string)
{
int len = 0;
unsigned char *buf = hex_string_to_binary (hex_string, &len);
if (buf == 0) {
return false;
}
return core->writeI2c(i2c_addr, buf, len);
}
std::string FactoryCalibration::i2c_read(int i2c_addr, int len)
{
unsigned char *buf = new unsigned char [len];
bool result = core->readI2c(i2c_addr, buf, len);
if (!result) {
return "";
}
char hex[64];
for (int i = 0; i < len; i++){
sprintf (hex+(2*i), "%02x", buf[i]);
}
return std::string(hex);
}
unsigned int FactoryCalibration::hex2dec(std::string hex)
{
unsigned int dec;
std::stringstream tempss;
tempss << std::hex << hex;
tempss >> dec;
return dec;
}
unsigned int FactoryCalibration::getValue(std::string name) {
if (name.compare("sdrsn")==0) {
return sdrsn;
} else if (name.compare("rfsn")==0) {
return rfsn;
// TODO : (mike) I thought these should be DEC comparisons but only HEX vals are matching,
// too rushed for 3.1 to figure out why I'm dumb
} else if (name.compare("band")==0) {
// BAND_85="85" # dec 133
if (band == 85) {
return 850;
// BAND_90="90" # dec 144
} else if (band == 90) {
return 900;
// BAND_18="18" # dec 24
} else if (band == 18) {
return 1800;
// BAND_19="19" # dec 25
} else if (band == 19) {
return 1900;
// BAND_21="21" # dec 33
} else if (band == 21) {
return 2100;
// BAND_MB="ab" # dec 171
} else if (band == 0xab) {
return 0;
// TODO : anything to handle here? for now pretend they have a multi-band
} else {
return 0;
}
} else if (name.compare("freq")==0) {
return freq;
} else if (name.compare("rxgain")==0) {
return rxgain;
} else if (name.compare("txgain")==0) {
return txgain;
// TODO : need a better error condition here
} else {
return 0;
}
}
void FactoryCalibration::readEEPROM(int deviceID) {
core = new rnrad1Core(
deviceID,
RAD1_CMD_INTERFACE,
RAD1_CMD_ALTINTERFACE,
"fpga.rbf",
"ezusb.ihx",
false
);
bool ret;
std::string temp;
std::string temp1;
/*
SDR_ADDR="0x50"
BASEST="df"
MKR_ST="ff"
./RAD1Cmd i2c_write $SDR_ADDR $BASEST$MKR_ST
sleep 1
*/
ret = i2c_write(0x50, "dfff");
sleep(1);
// std::cout << "i2c_write = " << ret << std::endl;
/*
TEMP=$( ./RAD1Cmd i2c_read $SDR_ADDR 16 )
sleep 1
*/
temp = i2c_read(0x50, 16);
sleep(1);
// std::cout << "i2c_read 16 = " << temp << std::endl;
/*
TEMP=$( ./RAD1Cmd i2c_read $SDR_ADDR 32 )
*/
temp = i2c_read(0x50, 32);
// std::cout << "i2c_read 32 = " << temp << std::endl;
/*
# parse SDR serial number
TEMP1=$( echo "$TEMP" | cut -c 1-4 )
SDRSN=$( printf '%d' 0x$TEMP1 )
echo "SDR Serial Number [$SDRSN] hex was [$TEMP1]"
*/
temp1 = temp.substr(0, 4);
sdrsn = hex2dec(temp1);
// std::cout << "SDR Serial Number [" << sdrsn << "] hex was [" << temp1 << "]" << std::endl;
/*
# parse RF serial number
TEMP1=$( echo "$TEMP" | cut -c 5-8 )
RFSN=$( printf '%d' 0x$TEMP1 )
echo "RF Serial Number [$RFSN] hex was [$TEMP1]"
*/
temp1 = temp.substr(4, 4);
rfsn = hex2dec(temp1);
// std::cout << "RF Serial Number [" << rfsn << "] hex was [" << temp1 << "]" << std::endl;
/*
# BAND
BAND=$( echo "$TEMP" | cut -c 9-10 )
echo "RF BAND [$BAND]"
*/
temp1 = temp.substr(8, 2);
band = atoi(temp1.c_str());
// std::cout << "RF BAND [" << band << "]" << std::endl;
/*
# Frequency Setting
TEMP1=$( echo "$TEMP" | cut -c 11-12 )
FREQ=$( printf '%d' 0x$TEMP1 )
echo "FREQ [$FREQ]"
*/
temp1 = temp.substr(10, 2);
freq = hex2dec(temp1);
// std::cout << "FREQ [" << freq << "] hex was [" << temp1 << "]" << std::endl;
/*
# RxGAIN
TEMP1=$( echo "$TEMP" | cut -c 13-14 )
RXGN=$( printf '%d' 0x$TEMP1 )
echo "RxGAIN [$RXGN]"
*/
temp1 = temp.substr(12, 2);
rxgain = hex2dec(temp1);
// std::cout << "RxGAIN [" << rxgain << "] hex was [" << temp1 << "]" << std::endl;
/*
# TxGAIN
TEMP1=$( echo "$TEMP" | cut -c 15-16 )
TXGN=$( printf '%d' 0x$TEMP1 )
echo "ATTEN [$TXGN]"
*/
temp1 = temp.substr(14, 2);
txgain = hex2dec(temp1);
// std::cout << "TxGAIN/ATTEN [" << txgain << "] hex was [" << temp1 << "]" << std::endl;
core->~rnrad1Core();
return;
}