Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Serial Number lookup Support and Move EEPROM storage in USB Radio #81

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
117 changes: 86 additions & 31 deletions asterisk/channels/chan_usbradio.c
Expand Up @@ -210,20 +210,27 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision: 200511 $")
#define HID_RT_OUTPUT 0x02


#define EEPROM_START_ADDR 6
// EEPROM is 93C64 - 1024 Bits
// Devices are setup in 64 sections of 2 bytes
// Physical_Len == 64x2 or 128 Bytes
// CM108B and CM119B uses 0x00 - 0x32 ( 0-50 )

#define EEPROM_START_ADDR 0
#define EEPROM_END_ADDR 63
#define EEPROM_PHYSICAL_LEN 64
#define EEPROM_TEST_ADDR EEPROM_END_ADDR
#define EEPROM_MAGIC_ADDR 6
#define EEPROM_MAGIC 34329
#define EEPROM_CS_ADDR 62
#define EEPROM_RXMIXERSET 8
#define EEPROM_TXMIXASET 9
#define EEPROM_TXMIXBSET 10
#define EEPROM_RXVOICEADJ 11
#define EEPROM_RXCTCSSADJ 13
#define EEPROM_TXCTCSSADJ 15
#define EEPROM_RXSQUELCHADJ 16
#define EEPROM_ADDR_OFF 51 // Offset to start storing our variables, original was 0x00
#define EEPROM_OLD_ADDR_OFF 12 // Old offset 6 start addr, 6 to first used addr
#define EEPROM_MAGIC 34329 // Magic Number
#define EEPROM_MAGIC_ADDR 0 // Magic Address
#define EEPROM_RXMIXERSET 2
#define EEPROM_TXMIXASET 3
#define EEPROM_TXMIXBSET 4
#define EEPROM_RXVOICEADJ 5
#define EEPROM_RXCTCSSADJ 7
#define EEPROM_TXCTCSSADJ 9
#define EEPROM_RXSQUELCHADJ 10
#define EEPROM_CS_ADDR 62 // Checksum Address

/*! Global jitterbuffer configuration - by default, jb is disabled */
static struct ast_jb_conf default_jbconf =
Expand Down Expand Up @@ -546,6 +553,7 @@ struct chan_usbradio_pvt {
int boost; /* input boost, scaled by BOOST_SCALE */
char devicenum;
char devstr[128];
char serial[14];
int spkrmax;
int micmax;
int micplaymax;
Expand Down Expand Up @@ -785,6 +793,7 @@ static struct chan_usbradio_pvt usbradio_default = {
.usedtmf = 1,
.rxondelay = 0,
.txoffdelay = 0,
.serial = "",
};

/* DECLARE FUNCTION PROTOTYPES */
Expand Down Expand Up @@ -1116,7 +1125,7 @@ int i;
unsigned short cs;

cs = 0xffff;
buf[EEPROM_MAGIC_ADDR] = EEPROM_MAGIC;
buf[EEPROM_ADDR_OFF + EEPROM_MAGIC_ADDR] = EEPROM_MAGIC;
for(i = EEPROM_START_ADDR; i < EEPROM_CS_ADDR; i++)
{
write_eeprom(handle,i,buf[i]);
Expand Down Expand Up @@ -1238,6 +1247,7 @@ static int hid_device_mklist(void)
(dev->descriptor.idProduct == C119B_PRODUCT_ID) ||
((dev->descriptor.idProduct & 0xff00) == N1KDO_PRODUCT_ID) ||
(dev->descriptor.idProduct == C119_PRODUCT_ID)))

{
sprintf(devstr,"%s/%s", usb_bus->dirname,dev->filename);
for(i = 0;i < 32; i++)
Expand Down Expand Up @@ -1480,12 +1490,27 @@ static struct chan_usbradio_pvt *find_desc_usb(char *devstr)

if (!devstr)
ast_log(LOG_WARNING, "null dev\n");

for (o = usbradio_default.next; o && devstr && strcmp(o->devstr, devstr) != 0; o = o->next);

return o;
}

static int get_usb_serial(char *devstr, char *serial)
{
struct usb_device *usb_dev;
struct usb_dev_handle *usb_handle;
int length;

usb_dev = hid_device_init(devstr);
usb_handle = usb_open(usb_dev);
length = usb_get_string_simple(usb_handle, usb_dev->descriptor.iSerialNumber, serial, sizeof(serial));
usb_close(usb_handle);
usb_handle = NULL;
usb_dev = NULL;

return length;
}

static void *pulserthread(void *arg)
{
struct timeval now,then;
Expand Down Expand Up @@ -1535,7 +1560,7 @@ int i,j,k;
static void *hidthread(void *arg)
{
unsigned char buf[4],bufsave[4],keyed;
char txtmp, fname[200], *s;
char txtmp, fname[200], *s, serial[14];
int i,j,k,res;
struct usb_device *usb_dev;
struct usb_dev_handle *usb_handle;
Expand Down Expand Up @@ -1570,8 +1595,31 @@ static void *hidthread(void *arg)
if (o->index != (usb_dev->descriptor.idProduct & 0xf)) continue;
ast_log(LOG_NOTICE,"N1KDO port %d, USB device %s usbradio channel %s\n",
usb_dev->descriptor.idProduct & 0xf,s,o->name);

strcpy(o->devstr,s);

}

// Get the serial Number from the device
if (strlen(o->serial) > 0)
{
ast_log(LOG_NOTICE, "Checking for USB device with serial %s\n", o->serial);
for(s = usb_device_list; *s; s += strlen(s) + 1)
{
// Go through the list of usb devices, and get the serial numbers
if (get_usb_serial(s, serial) == 0) continue;
ast_log(LOG_NOTICE, "Device Serial %s vs %s\n", o->serial, serial);
if (strcmp(o->serial, serial) == 0)
{
// We found a device with the matching serial number
// Set the devstr to the matching device
ast_log(LOG_NOTICE, "Found device serial %s at %s for %s\n",o->serial, s, o->name);
strcpy(o->devstr,s);
break;
}
}
}

/* if our specified one exists in the list */
if ((!usb_list_check(o->devstr)) || (!find_desc_usb(o->devstr)))
{
Expand Down Expand Up @@ -1603,6 +1651,10 @@ static void *hidthread(void *arg)
continue;
}
ast_log(LOG_NOTICE,"Assigned USB device %s to usbradio channel %s\n",s,o->name);
if (get_usb_serial(s, serial) > 0)
{
strcpy(o->serial, serial);
}
strcpy(o->devstr,s);
}
i = usb_get_usbdev(o->devstr);
Expand Down Expand Up @@ -1636,7 +1688,6 @@ static void *hidthread(void *arg)
o->newname = 1;
o->spkrmax = amixer_max(o->devicenum,MIXER_PARAM_SPKR_PLAYBACK_VOL_NEW);
}

usb_handle = usb_open(usb_dev);
if (usb_handle == NULL) {
usleep(500000);
Expand Down Expand Up @@ -1856,19 +1907,19 @@ static void *hidthread(void *arg)
/* if CS okay */
if (!get_eeprom(usb_handle,o->eeprom))
{
if (o->eeprom[EEPROM_MAGIC_ADDR] != EEPROM_MAGIC)
if (o->eeprom[EEPROM_ADDR_OFF + EEPROM_MAGIC_ADDR] != EEPROM_MAGIC)
{
ast_log(LOG_NOTICE,"UNSUCCESSFUL: EEPROM MAGIC NUMBER BAD on channel %s\n",o->name);
}
else
{
o->rxmixerset = o->eeprom[EEPROM_RXMIXERSET];
o->txmixaset = o->eeprom[EEPROM_TXMIXASET];
o->txmixbset = o->eeprom[EEPROM_TXMIXBSET];
memcpy(&o->rxvoiceadj,&o->eeprom[EEPROM_RXVOICEADJ],sizeof(float));
memcpy(&o->rxctcssadj,&o->eeprom[EEPROM_RXCTCSSADJ],sizeof(float));
o->txctcssadj = o->eeprom[EEPROM_TXCTCSSADJ];
o->rxsquelchadj = o->eeprom[EEPROM_RXSQUELCHADJ];
o->rxmixerset = o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXMIXERSET];
o->txmixaset = o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXMIXASET];
o->txmixbset = o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXMIXBSET];
memcpy(&o->rxvoiceadj,&o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXVOICEADJ],sizeof(float));
memcpy(&o->rxctcssadj,&o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXCTCSSADJ],sizeof(float));
o->txctcssadj = o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXCTCSSADJ];
o->rxsquelchadj = o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXSQUELCHADJ];
ast_log(LOG_NOTICE,"EEPROM Loaded on channel %s\n",o->name);
mixer_write(o);
mult_set(o);
Expand Down Expand Up @@ -3503,6 +3554,7 @@ static int radio_tune(int fd, int argc, char *argv[])
ast_cli(fd,"Active radio interface is [%s]\n",usbradio_active);
ast_mutex_lock(&usb_dev_lock);
ast_cli(fd,"Device String is %s\n",o->devstr);
ast_cli(fd,"Device Serial is %s\n",o->serial);
ast_mutex_unlock(&usb_dev_lock);
ast_cli(fd,"Card is %i\n",usb_get_usbdev(o->devstr));
ast_cli(fd,"Output A is currently set to ");
Expand Down Expand Up @@ -4270,7 +4322,7 @@ static void tune_rxinput(int fd, struct chan_usbradio_pvt *o, int setsql, int in

if(o->rxcdtype==CD_XPMR_NOISE)
{
int normRssi=((32767-o->pmrChan->rxRssi)*x/32767);
int normRssi=((32767-o->pmrChan->rxRssi)*x/32767);

if((meas/(measnoise/10))>26){
ast_cli(fd,"WARNING: Insufficient high frequency noise from receiver.\n");
Expand Down Expand Up @@ -4418,6 +4470,7 @@ static void _menu_print(int fd, struct chan_usbradio_pvt *o)
ast_cli(fd,"Active radio interface is [%s]\n",usbradio_active);
ast_mutex_lock(&usb_dev_lock);
ast_cli(fd,"Device String is %s\n",o->devstr);
ast_cli(fd,"Device Serial is %s\n",o->serial);
ast_mutex_unlock(&usb_dev_lock);
ast_cli(fd,"Card is %i\n",usb_get_usbdev(o->devstr));
ast_cli(fd,"Output A is currently set to ");
Expand Down Expand Up @@ -4959,6 +5012,7 @@ static void tune_write(struct chan_usbradio_pvt *o)

fprintf(fp,"; name=%s\n",o->name);
fprintf(fp,"; devicenum=%i\n",o->devicenum);
fprintf(fp,"devserial=%s\n", o->serial);
ast_mutex_lock(&usb_dev_lock);
fprintf(fp,"devstr=%s\n",o->devstr);
ast_mutex_unlock(&usb_dev_lock);
Expand All @@ -4981,13 +5035,13 @@ static void tune_write(struct chan_usbradio_pvt *o)
usleep(10000);
ast_mutex_lock(&o->eepromlock);
}
o->eeprom[EEPROM_RXMIXERSET] = o->rxmixerset;
o->eeprom[EEPROM_TXMIXASET] = o->txmixaset;
o->eeprom[EEPROM_TXMIXBSET] = o->txmixbset;
memcpy(&o->eeprom[EEPROM_RXVOICEADJ],&o->rxvoiceadj,sizeof(float));
memcpy(&o->eeprom[EEPROM_RXCTCSSADJ],&o->rxctcssadj,sizeof(float));
o->eeprom[EEPROM_TXCTCSSADJ] = o->txctcssadj;
o->eeprom[EEPROM_RXSQUELCHADJ] = o->rxsquelchadj;
o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXMIXERSET] = o->rxmixerset;
o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXMIXASET] = o->txmixaset;
o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXMIXBSET] = o->txmixbset;
memcpy(&o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXVOICEADJ],&o->rxvoiceadj,sizeof(float));
memcpy(&o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXCTCSSADJ],&o->rxctcssadj,sizeof(float));
o->eeprom[EEPROM_ADDR_OFF + EEPROM_TXCTCSSADJ] = o->txctcssadj;
o->eeprom[EEPROM_ADDR_OFF + EEPROM_RXSQUELCHADJ] = o->rxsquelchadj;
o->eepromctl = 2; /* request a write */
ast_mutex_unlock(&o->eepromlock);
}
Expand Down Expand Up @@ -5516,6 +5570,7 @@ static struct chan_usbradio_pvt *store_config(struct ast_config *cfg, char *ctg,
M_UINT("rxsquelchadj", o->rxsquelchadj)
M_UINT("fever", o->fever)
M_STR("devstr", o->devstr)
M_STR("devserial", o->serial)
M_END(;
);
}
Expand Down