Compare commits

..

26 Commits

Author SHA1 Message Date
Tzafrir Cohen
3693ad815b xpp_fxloader: handle empty span-type.conf
If we have /etc/dahdi/span-types.conf but it doesn't have any
line, we should avoid using the option -S to astribank_hexload.
Fix the test for this.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 77730a9059)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
e9a04c7a50 no astribank_is_starting with hotplug asterisk
Don't run the final astribank_is_starting if asterisk is hotpluggable.

Likewise, if there's no xpp_order file, waiting is pointless as the hook
can't count Astribanks.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 3f55dd78de)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
b37bcfb3b4 astribank_hook: remove useless 'time'
* 'time' was added here for debugging and never actually needed.
* It actually causes a minor bashism issue.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 283f01bd67)
2015-06-04 16:08:25 -05:00
Oron Peled
42f3e120ff xpp: waitfor_xpds: Always remove Astribank semaphore
If we waited -- no Astribanks are "in initialization"

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 631d32680f)
2015-06-04 16:08:25 -05:00
Oron Peled
48bb9e54f7 xpp/astribank_hook: remove Astribank initialization
If this is the last seen Astribank

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 44fe560f3b)
2015-06-04 16:08:25 -05:00
Oron Peled
605914d817 xpp: waitfor_xpds: documentation
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 1a78b71fac)
2015-06-04 16:08:25 -05:00
Oron Peled
bcd25eea36 xpp: can use modern Asterisk hotplug support
* New asynchronous behavior is used only when two conditions are met:
  - Finding new $ASTERISK_SUPPORTS_DAHDI_HOTPLUG=yes in /etc/dahdi/init.conf
    This should be set only when Asterisk support hotplug and configured
    to use it (no_failed_channels==1).
  - DAHDI auto_assign_spans==0

* Adapt /usr/share/dahdi/astribank_hook:
  - Refactor old twinstar behavior into functions
  - Add new behavior in a function (just enable the Asrribank watchdog)
  - Call the correct function.

* Adapt init script:
  If asynchronous behavior is on, don't wait for all Astribanks to
  finish initialization (it's enough that we saw all/some of them)

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
(cherry picked from commit f11b937659)
2015-06-04 16:08:25 -05:00
Oron Peled
c7dc48e534 xpp: waitfor_xpds: assume astribank_is_starting exists
It's in the same package (dahdi-tools) for a long time

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit cd6083b6ce)
2015-06-04 16:08:25 -05:00
Oron Peled
0ae73f0497 xpp: waitfor_xpds: expansion error with no ABs
Fix an exansion error in case there were no Astribanks on the system.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 0eb77e626e)
2015-06-04 16:08:25 -05:00
Oron Peled
93f85f7e6f xpp: astribank_is_starting: improve '-v' output
Do print a message if no semaphore exists. It means that either there
are no Astribanks, or existing Astribanks were already initialized.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 2e1c15baa3)
2015-06-04 16:08:25 -05:00
Russ Meyerriecks
e14958442d tonezone: Fix regression in Australian tone patch
Initialize db to 1.0 instead of doing it in a few, but not all, logic contexts.

Reported-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 094bb2c1e8)
2015-06-04 16:08:25 -05:00
Oron Peled
f3b18f7832 xpp: revert USB "clear_halt" change and better overrides.
Why:
 * Doing "clear_halt" is normally the right thing to do on startup.
 * The original observed problem is better fixed via USB bios settings.
 * Defaulting to no "clear_halt" cause more problems on other platform
   combinations (hardware/kernel).

The change:
 * We now reverted to do "clear_halt" by default.
 * The XTALK_OPTIONS may now contain either "use-clear-halt" (the default)
   or "no-use-clear-halt" to override for debugging/testing.

Original commit: ca7c04e9cb

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 9aee76a3a5)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
d4537e46ce xpp: astribank_hexload: allow empty span specs
DAHDI 2.9.2 added support for -S (span specs). However if this option
was not specified, it fails to run.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-08-04 09:35:52 +03:00
Tzafrir Cohen
60401c5f49 xpp_fxloader: rename variable: default_law -> law
The variable 'default_law' was the result of a partial renaming of the
original variable 'law'. Let's keep all of them in sync.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-08-04 09:35:52 +03:00
Armen Karlozian
a109763160 tonezone: Fix congestion tone for Australia
The Congestion tone in Australia must be reduced by 10 to 15 dB
at every other cadence and the frequencies for both at cadences are 425 Hz.

From: Armen Karlozian <armeniki@hotmail.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-08-01 16:04:00 -05:00
Shaun Ruffell
6c40704fec zonedata: Ensure all zones have a default DAHDI_TONE_DIALRECALL.
The default 'us' tone is most likely better than silence when Asterisk tries to
generate the recall tone on a DAHDI channel.

Internal-Issue-ID: DAHTOOL-63
Reported-By: Igor Kravets
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-08-01 15:53:48 -05:00
Russ Meyerriecks
95e9dd71d8 dahdi_cfg: Reduce mass ioctls on non-existing channels
Logic was calling DAHDI_SPECIFY ioctl on all channels up to maximum channel
limit. Added a short circuit to prevent the ioctl on channels that aren't
configured.

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
2014-07-23 16:53:38 -05:00
Russ Meyerriecks
df47721962 dahdi_cfg: minor: Rename fo_real to dry_run
Minor readability change

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
2014-07-23 16:52:59 -05:00
Russ Meyerriecks
4e14561508 wcte43xp: Teach tools about te436 and te236 products
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
2014-07-18 10:41:54 -05:00
Shaun Ruffell
49361e5ce7 dahdi_cfg: Warn if idle bits are set on invalid channel type.
Hopefully will save a little time in the future if anyone ever types into
/etc/dahdi/system.conf:

  bchan=1-15,17-30:1101

when they meant:

  cas=1-15,17-30:1101

in the future.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-07-09 15:55:37 -05:00
Shaun Ruffell
8045f7f493 dahdi_cfg: Unlink semaphore on early exit.
If dahdi_cfg is terminated while holding the named semaphore, it is possible to
leave it behind and all subsequenct invocations of dahdi_cfg will block waiting
for it.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-07-07 17:06:16 -05:00
Tzafrir Cohen
64e7c688d3 Makefile: A typo in a comment
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-30 13:47:23 +03:00
Oron Peled
b28ec382bb added autoconfig.h to .gitignore
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:34:24 +03:00
Oron Peled
412c3f0fe3 xpp: support per-port E1/T1 EC
* Added optional '-S <span-spec>' argument to astribank_hexload:
  - Allow passing PRI span specification to EC firmware loader.
  - The span specifications is whitespace/comma separate list
    of items.
  - Each item is: <span>:<type> (Example: 3:T1)
  - The <span> may use shell-like globbing (e.g: *:E1 or [12]:T1)
  - Any span not matched in the span specification will be set
    as without the new '-S' option (i.e: depends on the '-A' option).

* Adapted xpp_fxloader:
  - Read specification for both device label and wildcard from
    /etc/dahdi/span-types.conf
  - If the result is non-empty, pass it as '-S <span-spec>' to
    the EC firmware loader.
2014-06-29 16:34:21 +03:00
Oron Peled
fc459c374c xpp: set EC firmware according to PRI settings:
* Read first from modern configuration files
  (/etc/dahdi/span-types.conf)
  - Support either exact label match or complete '*' match in the
    configuration file.

* Fallback to legacy /etc/dahdi/xpp.conf

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:34:17 +03:00
Oron Peled
ca09f327ed xpp: better dahdi_registration
Improvements to the xpp tool dahdi_registration:

* Use the new xpp driver with support for dahdi_registration sysfs
  attribute in each device.

* Wait for UDEV to finish handling span assignments (via
  dahdi_waitfor_span_assignments).

* Still supports legacy drivers without this, by falling back
  to old style iterative "registration" on each xpd.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:30:34 +03:00
23 changed files with 590 additions and 106 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@
*.asciidoc
*.html
build_tools/menuselect-deps
autoconfig.h
config.log
config.status
dahdi_cfg

View File

@@ -213,7 +213,7 @@ README.html: README system.conf.asciidoc init.conf.asciidoc tonezones.txt \
README.Astribank.html: xpp/README.Astribank
$(ASCIIDOC) -o $@ -n -a toc -a toclevels=4 $<
# on Debian: this requires the full groof, not just groff-base.
# on Debian: this requires the full groff, not just groff-base.
%.8.html: %.8
man -Thtml $^ >$@

View File

@@ -144,6 +144,14 @@ hotplug_exit_after_load() {
# Initialize the Xorcom Astribank (xpp/) using perl utiliites:
xpp_startup() {
if [ "$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" = yes ]; then
aas_param='/sys/module/dahdi/parameters/auto_assign_spans'
aas=`cat "$aas_param" 2>/dev/null`
if [ "$aas" = 0 ]; then
echo 1>&2 "Don't wait for Astribanks (use Asterisk hotplug-support)"
return 0
fi
fi
# do nothing if there are no astribank devices:
if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi

View File

@@ -29,6 +29,7 @@
#include <stdio.h>
#include <getopt.h>
#include <signal.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
@@ -108,7 +109,7 @@ static int fiftysixkhdlc[DAHDI_MAX_CHANNELS];
static int spans=0;
static int fo_real = 1;
static int dry_run = 0;
static int verbose = 0;
@@ -761,7 +762,16 @@ static int chanconfig(char *keyword, char *args)
} else {
fprintf(stderr, "Huh? (%s)\n", keyword);
}
if (is_digital)
if (cc[x].sigtype != DAHDI_SIG_CAS &&
cc[x].sigtype != DAHDI_SIG_DACS &&
cc[x].sigtype != DAHDI_SIG_DACS_RBS) {
if (NULL != idle) {
fprintf(stderr, "WARNING: idlebits are not valid on %s channels.\n", sig[x]);
}
}
if (is_digital)
chan2span[x] = current_span;
else
current_span = 0;
@@ -816,8 +826,9 @@ static int apply_fiftysix(void)
int chanfd;
for (x = 1; x < DAHDI_MAX_CHANNELS; x++) {
if (skip_channel(x))
if (skip_channel(x) || !cc[x].sigtype)
continue;
chanfd = open("/dev/dahdi/channel", O_RDWR);
if (chanfd == -1) {
fprintf(stderr,
@@ -1540,15 +1551,27 @@ static int span_restrict(char *str)
return 1;
}
static const char *SEM_NAME = "dahdi_cfg";
static sem_t *lock = SEM_FAILED;
static void signal_handler(int signal)
{
if (SEM_FAILED != lock) {
sem_unlink(SEM_NAME);
}
/* The default handler should have been restored before this handler was
* called, so we can let the "normal" processing finish the cleanup. */
raise(signal);
}
int main(int argc, char *argv[])
{
int c;
char *buf;
char *key, *value;
int x,found;
sem_t *lock = SEM_FAILED;
const char *SEM_NAME = "dahdi_cfg";
int exit_code = 0;
struct sigaction act;
while((c = getopt(argc, argv, "fthc:vsd::C:S:")) != -1) {
switch(c) {
@@ -1568,7 +1591,7 @@ int main(int argc, char *argv[])
force++;
break;
case 't':
fo_real = 0;
dry_run = 1;
break;
case 's':
stopmode = 1;
@@ -1661,15 +1684,28 @@ finish:
if (verbose) {
printconfig(fd);
}
if (!fo_real)
exit(0);
if (dry_run)
exit(0);
if (debug & DEBUG_APPLY) {
printf("About to open Master device\n");
fflush(stdout);
}
sigemptyset(&act.sa_mask);
act.sa_handler = signal_handler;
act.sa_flags = SA_RESETHAND;
if (sigaction(SIGTERM, &act, NULL) == -1) {
perror("Failed to install SIGTERM handler.");
exit(1);
}
if (sigaction(SIGINT, &act, NULL) == -1) {
perror("Failed to install SIGINT handler.");
exit(1);
}
lock = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1);
if (SEM_FAILED == lock) {
perror("Unable to create 'dahdi_cfg' mutex");

View File

@@ -17,6 +17,7 @@
#XPP_FIRMWARE_DIR=/usr/share/dahdi
#XPP_HOTPLUG_DISABLED=yes
#XPP_HOTPLUG_DAHDI=yes
#ASTERISK_SUPPORTS_DAHDI_HOTPLUG=yes
# Disable udev handling:
#DAHDI_UDEV_DISABLE_DEVICES=yes

View File

@@ -15,6 +15,8 @@ wct4xxp
# Digium TE435
# Digium TE235
# Digium TE436
# Digium TE236
wcte43x
# Digium TE120P: PCI single-port T1/E1/J1

View File

@@ -89,18 +89,20 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
int firstnobang = -1;
int freq1, freq2, time;
int modulate = 0;
float db = 1.0;
float gain;
int used = 0;
dup = strdup(t->data);
s = strtok(dup, ",");
while(s && strlen(s)) {
/* Handle optional ! which signifies don't start here*/
if (s[0] == '!')
if (s[0] == '!') {
s++;
else if (firstnobang < 0) {
} else if (firstnobang < 0) {
PRINT_DEBUG("First no bang: %s\n", s);
firstnobang = *count;
}
if (sscanf(s, "%d+%d/%d", &freq1, &freq2, &time) == 3) {
/* f1+f2/time format */
PRINT_DEBUG("f1+f2/time format: %d, %d, %d\n", freq1, freq2, time);
@@ -118,6 +120,15 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
} else if (sscanf(s, "%d/%d", &freq1, &time) == 2) {
PRINT_DEBUG("f1/time format: %d, %d\n", freq1, time);
freq2 = 0;
} else if (sscanf(s, "%d@/%d", &freq1, &time) == 2) {
/* The "@" character has been added to enable an
* approximately -20db tone generation of any frequency This has been done
* primarily to generate the Australian congestion tone.
* Example: "425/375,0/375,425@/375,0/375"
*/
PRINT_DEBUG("f1 reduced amplitude/time format: %d, %d\n", freq1,time);
db = 0.3;
freq2 = 0;
} else if (sscanf(s, "%d", &freq1) == 1) {
PRINT_DEBUG("f1 format: %d\n", freq1);
firstnobang = *count;
@@ -137,7 +148,7 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
td = data;
/* Bring it down -8 dbm */
gain = pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0;
gain = db*(pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0);
td->fac1 = 2.0 * cos(2.0 * M_PI * (freq1 / 8000.0)) * 32768.0;
td->init_v2_1 = sin(-4.0 * M_PI * (freq1 / 8000.0)) * gain;

View File

@@ -54,7 +54,7 @@ OCT_DEFINES = \
-DcOCT6100_MAX_ECHO_CHANNELS=672 \
-DcOCT6100_MAX_MIXER_EVENTS=1344
ECHO_LOADER_SRC = echo_loader.c
ECHO_LOADER_SRC = echo_loader.c parse_span_specs.c
ECHO_LOADER = $(ECHO_LOADER_SRC:.c=.o)
endif

View File

@@ -7,7 +7,7 @@ astribank_hexload \- Xorcom Astribank (xpp) firmware loader
.B astribank_hexload \-D \fIdevice-path\fR \-p [\fIoptions\fR] \fIhexfile1 .. hexfile4\fR
.B astribank_hexload \-D \fIdevice-path\fR \-O [-A] [\fIoptions\fR] \fIimagefile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-O [-A] [-S \fIspan-specs\fR] [\fIoptions\fR] \fIimagefile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-o [\fIoptions\fR]
@@ -29,7 +29,7 @@ It can be used to load either an FPGA firmware or a PIC
firmware. It is normally run by the script xpp_fxloader.
.SH OPTIONS
.B \-D
.B \-D
.I device-path
.RS
Required. The device to read from/write to. This is
@@ -95,13 +95,38 @@ use for BRI and E1. If not set, the default mu-Law (G.711u), which is
what you'd normally use for FXS, FXO and T1.
.RE
.B \-S \fIspan-specs\fR
.RS
This option should only be used when loading Octasic echo canceller firmware
and only if the first Astribank module is PRI.
Its goal is to allow specifying different \fIline-mode\fR (E1/T1/J1) in different
ports of the PRI module. \fBastribank_hexload\fR use the \fIspan-specs\fR argument
to select aLaw/uLaw for each of the PRI ports in the module.
The \fIspan-specs\fR is a list of items separated by whitespace or commas.
Each item is composed of a port selector, colon and a \fIline-mode\fR specifier.
This syntax follows the syntax of specifiers in \fB/etc/dahdi/span-types.conf\fR.
Examples:
.RS
3:E1 \- The 3'rd port is E1.
*:T1 \- Any unspecified port is T1 (wildcard match).
1:T1,2:T1,*:E1 \- First and second ports are T1, the rest are E1.
.RE
If the \fB\-S\fR is not given, the PRI default is determined by the existance of the \fB\-A-fR option.
.RE
.SH SEE ALSO
fxload(8), lsusb(8), astribank_tool(8)
.SH AUTHOR
This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com> .
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU General Public License, Version 2 any
the terms of the GNU General Public License, Version 2 any
later version published by the Free Software Foundation.
On Debian systems, the complete text of the GNU General Public

View File

@@ -39,6 +39,7 @@
#define DBG_MASK 0x80
#define MAX_HEX_LINES 64000
#define HAVE_OCTASIC 1
#define DEF_SPAN_SPEC_FORMAT "*:%c1" /* %c: 'E' or 'T' */
static char *progname;
@@ -50,6 +51,7 @@ static void usage()
#if HAVE_OCTASIC
fprintf(stderr, "\t\t[-O] # Load Octasic firmware\n");
fprintf(stderr, "\t\t[-o] # Show Octasic version\n");
fprintf(stderr, "\t\t[-S <pri-spec>] # Set PRI type specification string\n");
#endif
fprintf(stderr, "\t\t[-F] # Load FPGA firmware\n");
fprintf(stderr, "\t\t[-p] # Load PIC firmware\n");
@@ -164,11 +166,13 @@ int main(int argc, char *argv[])
int opt_ecver = 0;
#if HAVE_OCTASIC
int opt_alaw = 0;
const char *span_spec = NULL;
char def_span_spec[sizeof(DEF_SPAN_SPEC_FORMAT)];
#endif
int opt_dest = 0;
int opt_sum = 0;
enum dev_dest dest = DEST_NONE;
const char options[] = "vd:D:EFOopA";
const char options[] = "vd:D:EFOopAS:";
int iface_num;
int ret;
@@ -210,6 +214,9 @@ int main(int argc, char *argv[])
case 'A':
opt_alaw = 1;
break;
case 'S':
span_spec = optarg;
break;
#endif
case 'p':
opt_pic = 1;
@@ -247,6 +254,13 @@ int main(int argc, char *argv[])
ERR("Missing device path.\n");
usage();
}
# ifdef HAVE_OCTASIC
if (!span_spec) {
snprintf(def_span_spec, sizeof(def_span_spec),
DEF_SPAN_SPEC_FORMAT, opt_alaw? 'E' : 'T');
span_spec = def_span_spec;
}
#endif
if(opt_dest) {
/*
* MPP Interface
@@ -290,7 +304,7 @@ int main(int argc, char *argv[])
}
#if HAVE_OCTASIC
} else if (opt_echo) {
if((ret = load_echo(astribank, argv[optind], opt_alaw)) < 0) {
if((ret = load_echo(astribank, argv[optind], opt_alaw, span_spec)) < 0) {
ERR("%s: Loading ECHO's failed\n", devpath);
return 1;
}

View File

@@ -16,6 +16,8 @@ PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
set -e
LOCK="/var/lock/twinstar_startup"
[ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf
# For lab testing
@@ -32,17 +34,38 @@ if [ "$XPP_HOTPLUG_DAHDI" != yes ]; then
fi
export XPPORDER_CONF="$dahdi_conf/xpp_order"
if [ ! -r "$XPPORDER_CONF" ]; then
(
echo "Skip($ACTION): No '$XPPORDER_CONF'"
echo "Removing uneeded startup semaphore"
astribank_is_starting -v -r 2>&1
) 2>&1 | $LOGGER
exit 0
fi
export DAHDI_CFG_CMD="dahdi_cfg -c $dahdi_conf/system.conf"
export CALLED_FROM_ATRIBANK_HOOK=yes
can_full_async() {
# Can we work aynchronously:
# - Need modern Asterisk that accept hotplug DAHDI devices.
# - Need DAHDI with "auto_assign_spans" == 0
if [ "$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" = yes ]; then
aas_param='/sys/module/dahdi/parameters/auto_assign_spans'
aas=`cat "$aas_param" 2>/dev/null`
if [ "$aas" = 0 ]; then
return 0
else
$LOGGER "No async operation ($aas_param != 0)"
fi
else
$LOGGER "No async operation (ASTERISK_SUPPORTS_DAHDI_HOTPLUG!=yes)"
fi
return 1
}
check_xpporder_conf() {
if [ ! -r "$XPPORDER_CONF" ]; then
(
echo "Skip($ACTION): No '$XPPORDER_CONF'"
echo "Removing uneeded startup semaphore"
astribank_is_starting -v -r 2>&1
) 2>&1 | $LOGGER
exit 0
fi
}
clean_lines() {
sed -e 's/#.*//' -e 'y/\t/ /' -e 's/^ *//' -e 's/ *$//' -e '$s/$/\n/' "$XPPORDER_CONF"
}
@@ -64,10 +87,6 @@ matched_devices() {
done
}
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
NUM_GOOD=`matched_devices | wc -l`
LOCK="/var/lock/twinstar_startup"
# Wait until udev finished processing our requests
# so we know the device files were actually created
# before trying dahdi_cfg et-al.
@@ -77,10 +96,10 @@ wait_for_udev() {
echo "Waiting for udev to settle down..."
if [ -x /sbin/udevsettle ]; then
# Old system, stand-alone udevsettle command
time /sbin/udevsettle --timeout="$UDEV_SETTLE_MAX_TIME"
/sbin/udevsettle --timeout="$UDEV_SETTLE_MAX_TIME"
elif [ -x /sbin/udevadm ]; then
# Assume modern system, udevadm has settle parameter
if ! time /sbin/udevadm settle --timeout="$UDEV_SETTLE_MAX_TIME"
if ! /sbin/udevadm settle --timeout="$UDEV_SETTLE_MAX_TIME"
then
echo "udevadm failed ($?)."
echo "Fallback to sleep $UDEV_SETTLE_MAX_TIME seconds."
@@ -110,13 +129,9 @@ start_dahdi() {
rm -f "$LOCK"
}
#echo "$0: $ACTION($XBUS_NAME)" | $LOGGER
case "$ACTION" in
add)
;;
remove)
;;
online)
old_synchronous_start() {
NUM_GOOD=`matched_devices | wc -l`
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
if [ "$NUM_GOOD" -eq "$NUM_WANTED" ]; then
(
@@ -142,8 +157,11 @@ online)
fi
) < /dev/null 2>&1 | $LOGGER &
fi
;;
offline)
}
old_synchronous_stop() {
NUM_GOOD=`matched_devices | wc -l`
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
if [ "$NUM_GOOD" -eq 0 ]; then
echo "All Astribanks offline" | $LOGGER
@@ -152,6 +170,59 @@ offline)
fi
rm -f "$LOCK"
fi
}
ab_list() {
find /sys/devices -name idVendor 2>/dev/null | \
xargs grep -H 'e4e4' 2>/dev/null | \
sed -e 's/idVendor.*/idProduct/' | xargs grep -H '11[3456]' | \
sed 's,/[^/]*$,,' || :
}
tws_watchdog_enable() {
devdir="/sys$DEVPATH"
label=`cat "$devdir/label"`
connector=`cat "$devdir/connector"`
xbus=`echo "$devdir" | sed 's,.*/,,'`
prefix="${xbus}: [${label}] @${connector}"
TWS_NOAUTOJUMPFILE="$TWS_DIR/twinstar_no_autojump"
if [ -e "$TWS_NOAUTOJUMPFILE" ]; then
$LOGGER "$prefix: ignore wd (found $TWS_NOAUTOJUMPFILE)"
else
# Re-arm Astribank watchdog
transportdir="$devdir/transport"
busnum=`cat "$transportdir/busnum" 2>/dev/null || :`
devnum=`cat "$transportdir/devnum" 2>/dev/null || :`
devaddr=`printf "%03d/%03d" "$busnum" "$devnum"`
$LOGGER "$prefix: enabling twinstar watchdog"
astribank_tool -D "$devaddr" -w 1 2>&1 | $LOGGER
fi
}
#echo "$0: $ACTION($XBUS_NAME)" | $LOGGER
case "$ACTION" in
add)
;;
remove)
ab=`ab_list | wc -l`
if [ "$ab" -eq 0 ]; then
$LOGGER "$prefix: No more Astribanks -- remove astribank_is_starting semaphore"
astribank_is_starting -v -r 2>&1 | $LOGGER
fi
;;
online)
if can_full_async; then
tws_watchdog_enable
else
old_synchronous_start
fi
;;
offline)
if can_full_async; then
: # Nothing to do
else
old_synchronous_stop
fi
;;
*)
echo "$0: Unknown ACTION='$ACTION'" | $LOGGER

View File

@@ -125,6 +125,8 @@ static int absem_detected(void)
if((absem = absem_get(0)) < 0) {
if(debug)
fprintf(stderr, "%s: absem does not exist\n", progname);
if(verbose)
printf("No Astribanks are initializing\n");
return absem;
}
if(debug)

View File

@@ -74,8 +74,6 @@ if(defined($on)) { # Translate to booleans
$should_output = 0 unless $verbose;
}
undef $on if $dahdi_autoreg and not $opts{'R'};
sub state2str($) {
return (shift)?"on":"off";
}
@@ -84,38 +82,41 @@ sub myprintf {
printf @_ if $should_output;
}
my @spans = Dahdi::spans;
foreach my $xbus (Dahdi::Xpp::xbuses($sorter)) {
myprintf "%-10s\t%3s-%s\t%s\n",
$xbus->name, $xbus->xpporder, $xbus->label, $xbus->connector;
next unless $xbus->status eq 'CONNECTED';
foreach my $xpd (Dahdi::Xpp::Xpd::telephony_devs($xbus->xpds())) {
my $prev = $xpd->dahdi_registration($on);
if(!defined($prev)) { # Failure
printf "%s: Failed %s\n", $xpd->fqn, $!;
next;
}
myprintf "\t%-10s: ", $xpd->fqn;
if(!defined($on)) { # Query only
my ($span) = grep { $_->name eq $xpd->fqn } @spans;
my $spanstr = ($span) ? ("Span " . $span->num) : "";
myprintf "%s %s\n", state2str($prev), $spanstr ;
next;
}
myprintf "%3s ==> %3s\n", state2str($prev), state2str($on);
my $prev = $xbus->dahdi_registration($on);
if(!defined($prev)) { # Failure
printf STDERR "%s: Failed %s\n", $xbus->name, $!;
next;
}
next unless defined($on) && $on;
my $reg_str;
if (defined $on) {
$reg_str = ($on) ? "registering" : "unregistering";
} else {
$reg_str = ($prev) ? "registered" : "unregistered";
}
myprintf "%-10s\t%3s-%s\t%s (%s)\n",
$xbus->name, $xbus->xpporder, $xbus->label, $xbus->connector,
$reg_str;
next unless $xbus->status eq 'CONNECTED';
# Only assign if no default assignment, or forced by '-R' option
if ($opts{'R'} || ! $default_auto_assign) {
# Emulate /etc/dahdi/assigned-spans.conf:
# - We iterate over $xbus according to /etc/dahdi/xpp_order
# - We "auto" assign all spans of current $xbus
my $devpath = sprintf "/sys/bus/dahdi_devices/devices/astribanks:xbus-%02d", $xbus->num;
myprintf "auto-assign $devpath\n";
my @cmd = ('dahdi_span_assignments', 'auto', $devpath);
system @cmd;
warn "Failed '@cmd' (status=$?)\n" if $?;
if (defined($on) && $on) {
if ($opts{'R'} || ! $default_auto_assign) {
# Emulate /etc/dahdi/assigned-spans.conf:
# - We iterate over $xbus according to /etc/dahdi/xpp_order
# - We "auto" assign all spans of current $xbus
my $devpath = sprintf "/sys/bus/dahdi_devices/devices/astribanks:xbus-%02d", $xbus->num;
my @cmd = ('dahdi_span_assignments', 'auto', $devpath);
system @cmd;
warn "Failed '@cmd' (status=$?)\n" if $?;
}
# wait for UDEV to do its stuff
system "dahdi_waitfor_span_assignments assigned";
}
foreach my $xpd (Dahdi::Xpp::Xpd::telephony_devs($xbus->xpds())) {
my $spanno = $xpd->xpd_getattr('span');
myprintf "\t%-10s: ", $xpd->fqn;
my $spanstr = ($spanno) ? ("Span " . $spanno) : "unassigned";
myprintf "%s\n", $spanstr ;
}
}
myprintf "# Sorted: $sort_order\n" if defined $sort_order;

View File

@@ -31,6 +31,7 @@
#include "echo_loader.h"
#include "debug.h"
#include <oct6100api/oct6100_api.h>
#include "parse_span_specs.h"
#define DBG_MASK 0x03
#define TIMEOUT 1000
@@ -560,7 +561,7 @@ inline int get_ver(struct astribank_device *astribank)
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_alaw)
UINT32 init_octasic(char *filename, struct astribank_device *astribank, struct span_specs *span_specs)
{
int cpld_ver;
struct echo_mod *echo_mod;
@@ -580,6 +581,8 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
/* Channel resources.*/
tOCT6100_CHANNEL_OPEN ChannelOpen;
UINT32 ulChanHndl;
enum tdm_codec tdm_codec;
int spanno;
if (test_send(astribank) < 0)
return cOCT6100_ERR_FATAL;
@@ -729,7 +732,17 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
/* Set the channel to work at the echo cancellation mode.*/
ChannelOpen.ulEchoOperationMode = cOCT6100_ECHO_OP_MODE_NORMAL;
pcmLaw = (is_alaw ? cOCT6100_PCM_A_LAW: cOCT6100_PCM_U_LAW);
spanno = nChan % 4;
assert(spanno >= 0 && spanno < MAX_SPANNO);
tdm_codec = span_specs->span_is_alaw[spanno];
if (tdm_codec == TDM_CODEC_UNKNOWN) {
AB_ERR(astribank, "Calculated bad alaw/ulaw on channel %d\n", nChan);
return cOCT6100_ERR_FATAL;
}
if (nChan < 4)
AB_INFO(astribank, "ECHO PRI port %d = %s\n", spanno+1, (tdm_codec == TDM_CODEC_ALAW) ? "alaw" : "ulaw");
pcmLaw = ((tdm_codec == TDM_CODEC_ALAW) ? cOCT6100_PCM_A_LAW: cOCT6100_PCM_U_LAW);
/* Configure the TDM interface.*/
ChannelOpen.TdmConfig.ulRinPcmLaw = pcmLaw;
@@ -825,15 +838,22 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw)
int load_echo(struct astribank_device *astribank, char *filename, int default_is_alaw, const char *span_spec)
{
int ret;
UINT32 octasic_status;
struct span_specs *span_specs;
AB_INFO(astribank, "Loading ECHOCAN Firmware: %s (%s)\n",
filename, (is_alaw) ? "alaw" : "ulaw");
span_specs = parse_span_specifications(span_spec, default_is_alaw);
if (!span_specs) {
AB_ERR(astribank, "ECHO parsing span specs failed\n");
return -EFAULT;
}
AB_INFO(astribank, "Loading ECHOCAN Firmware: %s (default %s)\n",
filename, (default_is_alaw) ? "alaw" : "ulaw");
usb_buffer_init(astribank, &usb_buffer);
octasic_status = init_octasic(filename, astribank, is_alaw);
octasic_status = init_octasic(filename, astribank, span_specs);
free_span_specifications(span_specs);
if (octasic_status != cOCT6100_ERR_OK) {
AB_ERR(astribank, "ECHO %s burning failed (%08X)\n",
filename, octasic_status);

View File

@@ -26,7 +26,7 @@
#include "astribank_usb.h"
int spi_send(struct astribank_device *astribank, uint16_t addr, uint16_t data, int recv_answer, int ver);
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw);
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw, const char *span_spec);
int echo_ver(struct astribank_device *astribank);
#endif /* ECHO_LOADER_H */

152
xpp/parse_span_specs.c Normal file
View File

@@ -0,0 +1,152 @@
/*
* Written by Oron Peled <oron@actcom.co.il>
* Copyright (C) 2014, Xorcom
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <regex.h>
#include <fnmatch.h>
#include <sys/time.h>
#include "parse_span_specs.h"
void free_span_specifications(struct span_specs *span_specs)
{
if (span_specs) {
if (span_specs->buf)
free(span_specs->buf);
free(span_specs);
}
}
static enum tdm_codec is_alaw_span_type(const char *span_type)
{
assert(span_type);
if (strcmp(span_type, "E1") == 0)
return TDM_CODEC_ALAW;
else if (strcmp(span_type, "T1") == 0)
return TDM_CODEC_ULAW;
return TDM_CODEC_UNKNOWN;
}
struct span_specs *parse_span_specifications(const char *spec_string, int default_is_alaw)
{
struct span_specs *span_specs;
char *p;
int spanno;
int i;
if (!spec_string)
return NULL;
/* Allocate and Initialize */
span_specs = calloc(sizeof(char *), MAX_SPANNO);
if (!span_specs)
goto err;
for (spanno = 0; spanno < MAX_SPANNO; spanno++)
span_specs->span_is_alaw[spanno] = TDM_CODEC_UNKNOWN;
span_specs->buf = strdup(spec_string);
if (!span_specs->buf)
goto err;
for (i = 0;; i++) {
char *curr_item;
char *tokenize_key;
char *key;
char *value;
enum tdm_codec is_alaw;
int matched;
/* Split to items */
p = (i == 0) ? span_specs->buf : NULL;
p = strtok_r(p, " \t,", &curr_item);
if (!p)
break;
/* Split to <span>:<type> */
key = strtok_r(p, ":", &tokenize_key);
if (!key) {
fprintf(stderr,
"Missing ':' (item #%d inside '%s')\n",
i+1, spec_string);
goto err;
}
value = strtok_r(NULL, ":", &tokenize_key);
if (!value) {
fprintf(stderr,
"Missing value after ':' (item #%d inside '%s')\n",
i+1, spec_string);
goto err;
}
/* Match span specification and set alaw/ulaw */
is_alaw = is_alaw_span_type(value);
if (is_alaw == TDM_CODEC_UNKNOWN) {
fprintf(stderr,
"Illegal span type '%s' (item #%d inside '%s')\n",
value, i+1, spec_string);
goto err;
}
matched = 0;
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
char tmpbuf[BUFSIZ];
snprintf(tmpbuf, sizeof(tmpbuf), "%d", spanno + 1);
if (fnmatch(p, tmpbuf, 0) == 0) {
matched++;
span_specs->span_is_alaw[spanno] = is_alaw;
}
}
if (!matched) {
fprintf(stderr,
"Span specification '%s' does not match any span (item #%d inside '%s')\n",
key, i+1, spec_string);
goto err;
}
}
/* Set defaults */
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
if (span_specs->span_is_alaw[spanno] == TDM_CODEC_UNKNOWN) {
span_specs->span_is_alaw[spanno] = default_is_alaw;
}
}
return span_specs;
err:
free_span_specifications(span_specs);
return NULL;
}
void print_span_specifications(struct span_specs *span_specs, FILE *output)
{
int spanno;
if (!span_specs)
return;
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
enum tdm_codec is_alaw;
is_alaw = span_specs->span_is_alaw[spanno];
fprintf(output, "%d %s\n",
spanno+1, (is_alaw == TDM_CODEC_ALAW) ? "alaw" : "ulaw");
}
}

43
xpp/parse_span_specs.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef PARSE_SPAN_SPECS_H
#define PARSE_SPAN_SPECS_H
/*
* Written by Oron Peled <oron@actcom.co.il>
* Copyright (C) 2014, Xorcom
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#define MAX_SPANNO 4 /* E1/T1 spans -- always in first unit. 1-based */
enum tdm_codec {
TDM_CODEC_UNKNOWN,
TDM_CODEC_ULAW,
TDM_CODEC_ALAW,
};
struct span_specs {
char *buf;
enum tdm_codec span_is_alaw[MAX_SPANNO];
};
struct span_specs *parse_span_specifications(const char *spec_string, int default_is_alaw);
void free_span_specifications(struct span_specs *span_specs);
void print_span_specifications(struct span_specs *span_specs, FILE *output);
#endif /* PARSE_SPAN_SPECS_H */

View File

@@ -105,6 +105,7 @@ my %pci_ids = (
# from wcte435/235
'd161:800e' => { DRIVER => 'wcte43x', DESCRIPTION => 'Wildcard TE435/235' },
'd161:8013' => { DRIVER => 'wcte43x', DESCRIPTION => 'Wildcard TE436/236' },
# from wcb4xxp
'd161:b410' => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Digium Wildcard B410P' },

View File

@@ -146,6 +146,40 @@ sub new($$) {
return $self;
}
sub dahdi_registration($$) {
my $xbus = shift;
my $on = shift;
my $result;
my $file = sprintf("%s/dahdi_registration", $xbus->sysfs_dir);
# Handle old drivers without dahdi_registration xbus attribute
if (! -f $file) {
warn "Old xpp driver without dahdi_registration support. Emulating it using xpd/span support\n";
my @xpds = sort { $a->id <=> $b->id } $xbus->xpds();
my $prev;
foreach my $xpd (@xpds) {
$prev = $xpd->dahdi_registration($on);
}
return $prev;
}
# First query
open(F, "$file") or die "Failed to open $file for reading: $!";
$result = <F>;
chomp $result;
close F;
if(defined($on) and $on ne $result) { # Now change
open(F, ">$file") or die "Failed to open $file for writing: $!";
print F ($on)?"1":"0";
if(!close(F)) {
if($! == 17) { # EEXISTS
# good
} else {
undef $result;
}
}
}
return $result;
}
sub pretty_xpds($) {
my $xbus = shift;
my @xpds = sort { $a->id <=> $b->id } $xbus->xpds();

View File

@@ -52,7 +52,7 @@ ab_serial_nums() {
}
detected_serial_nums() {
for i in /sys/bus/astribanks/devices/*/transport; do
for i in `ls -1d /sys/bus/astribanks/devices/*/transport 2>/dev/null`; do
s=`cat "$i/serial" 2>/dev/null` || :
if [ "$s" = '' ]; then
echo "NO-SERIAL"
@@ -94,14 +94,13 @@ if ! dahdi_hardware="`which dahdi_hardware 2>/dev/null`"; then
echo >&2 "$0: Missing dahdi_hardware"
exit 0
fi
if ! astribank_is_starting="`which astribank_is_starting 2>/dev/null`"; then
echo >&2 "$0: Missing astribank_is_starting"
exit 0
fi
# Just make sure
if [ "`$dahdi_hardware | grep xpp_usb`" != "" ]; then
astribank_is_starting -v -a
fi
if ! astribank_is_starting; then
# No Astribanks ever seen -- nothing to do
exit 0
fi
@@ -149,13 +148,16 @@ cat /sys/bus/astribanks/devices/*/waitfor_xpds 2> /dev/null || :
# Wait for device to stabilize and XPD's to finish initalizations
echo 1>&2 "Astribanks initializing spans"
if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then
if [ "$CALLED_FROM_ATRIBANK_HOOK" = '' ]; then
if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' -a \
"$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" != 'yes' ]; then
if [ -f /etc/dahdi/xpp_order ]; then
# Now we can wait until the hotplug run would remove the semaphore
echo -n 1>&2 "Other DAHDI initializations... "
astribank_is_starting -v -w 1>&2
else
echo 1>&2 "WARNING: No ASTERISK_SUPPORTS_DAHDI_HOTPLUG" \
" and no /etc/dahdi/xpp_order"
fi
else
# Non-hotplug -- Sequential initialization, remove semaphore
astribank_is_starting -v -r 1>&2
fi
# All Astribanks initialized -- remove semaphore
astribank_is_starting -v -r 1>&2

View File

@@ -68,6 +68,7 @@ FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/dahdi}"
ASTRIBANK_HEXLOAD=${ASTRIBANK_HEXLOAD:-/usr/sbin/astribank_hexload}
ASTRIBANK_TOOL=${ASTRIBANK_TOOL:-/usr/sbin/astribank_tool}
XPP_CONFIG="${XPP_CONFIG:-/etc/dahdi/xpp.conf}"
SPAN_TYPES_CONFIG="${SPAN_TYPES_CONFIG:-/etc/dahdi/span-types.conf}"
XPP_UDEV_SLEEP_TIME="${XPP_UDEV_SLEEP_TIME:-15}"
USB_RECOV="${USB_RECOV:-USB_RECOV.hex}"
@@ -270,6 +271,15 @@ usb_firmware_all_devices() {
wait_renumeration $numdevs 'e4e4/11[3456]1/*' "usb_firmware_all_devices"
}
filter_span_types() {
l="$1"
sed < "$SPAN_TYPES_CONFIG" 2>/dev/null \
-e 's/#.*//' \
-e 's/[ \t]*$//' \
-e 's/^[ \t]*//' \
-e '/^$/d' | awk -vlabel="$l" '$1 == label { print $2 }' | tr -s ', \t\n' ','
}
load_fw_device() {
dev="$1"
fw="$2"
@@ -279,33 +289,62 @@ load_fw_device() {
FPGA_1161*.hex)
echo_file="$FIRMWARE_DIR/OCT6104E-256D.ima"
law=''
law_str='uLaw'
dev_short=`echo "$dev" | sed -e 's,.*/usb/*,,'`
abtool_output=`$ASTRIBANK_TOOL -D "$dev" -Q 2>&1`
ec_card_type=`echo "$abtool_output" | grep 'CARD 4' | sed -e 's/.*type=//' -e 's/\..*//'`
caps_num=`echo "$abtool_output" | grep 'ECHO ports' | sed -e 's/.*: *//'`
if [ "$ec_card_type" = '5' ]; then
debug "ECHO burning into $dev: $echo_file"
debug "ECHO($dev_short): Firmware $echo_file"
card_type=`echo "$abtool_output" | grep 'CARD 0' | sed -e 's/.*type=//' -e 's/\..*//'`
case "$card_type" in
3) law="-A";;
4)
pri_protocol=''
if [ -r "$XPP_CONFIG" ]; then
pri_protocol=`awk '/^pri_protocol/ {print $2}' $XPP_CONFIG`
dev_lsusb=`echo "$dev_short" | tr '/' ':'`
# Try modern configuration
if [ -r "$SPAN_TYPES_CONFIG" ]; then
# Try exact match by label
label=`lsusb -s "$dev_lsusb" -v 2>/dev/null | awk '$1 == "iSerial" && $2 == 3 { print $3 }'`
if [ "$label" != '' ]; then
label="usb:$label"
debug "ECHO($dev_short): Search span-types.conf for [$label]"
pri_spec=`filter_span_types "${label}"`
if [ "$pri_spec" != '' ]; then
debug "ECHO($dev_short): Found definitions for [$label] -- '$pri_spec'"
fi
else
debug "ECHO($dev_short): Device without a label"
fi
# Check wildcard match
pri_spec_wildcard=`filter_span_types '*'`
if [ "$pri_spec_wildcard" != '' ]; then
debug "ECHO($dev_short): Found definitions for wildcard -- $pri_spec_wildcard"
fi
pri_spec_params=""
if [ "$pri_spec$pri_spec_wildcard" != '' ]; then
pri_spec=`echo "$pri_spec_wildcard $pri_spec" | tr -s ' \t\n' ','`
pri_spec_params="-S $pri_spec"
debug "ECHO($dev_short): pri_spec_params='$pri_spec_params'"
fi
fi
# "E1" or empty (implied E1) means aLaw
if [ "$pri_protocol" != 'T1' ]; then
law='-A'
# Fallback to legacy xpp.conf
default_pri_protocol=''
law=''
if [ -r "$XPP_CONFIG" ]; then
default_pri_protocol=`awk '/^pri_protocol/ {print $2}' $XPP_CONFIG`
if [ "$default_pri_protocol" != '' ]; then
debug "ECHO($dev_short): Found legacy xpp.conf setting -- $default_pri_protocol"
# "E1" or empty (implied E1) means aLaw
if [ "$default_pri_protocol" != 'T1' ]; then
law='-A'
fi
fi
fi
;;
esac
if [ "$law" = '-A' ]; then
law_str="aLaw"
fi
caps_num=`echo "$abtool_output" | grep 'ECHO ports' | sed -e 's/.*: *//'`
debug "ECHO: 1st module is $law_str, $caps_num channels allowed."
debug "ECHO($dev_short): $caps_num channels allowed."
if [ "$caps_num" != '0' ]; then
run_astribank_hexload -D "$dev" -O $law "$echo_file"
run_astribank_hexload -D "$dev" -O $law $pri_spec_params "$echo_file"
else
echo "WARNING: ECHO burning was skipped (no capabilities)"
fi

View File

@@ -67,6 +67,8 @@ static void xusb_init();
* variable of that name. Existing options:
*
* - "use-clear-halt" -- force USB "clear_halt" operation during
* device initialization (this is the default)
* - "no-use-clear-halt" -- force no USB "clear_halt" operation during
* device initialization
* - "no-lock" -- prevent using global sempahore to serialize libusb
* initialization. Previously done via "XUSB_NOLOCK"
@@ -888,7 +890,7 @@ static void xusb_init()
}
/* XTALK option handling */
static int use_clear_halt = 0;
static int use_clear_halt = 1;
static int libusb_no_lock = 0;
static int xtalk_one_option(const char *option_string)
@@ -897,6 +899,10 @@ static int xtalk_one_option(const char *option_string)
use_clear_halt = 1;
return 0;
}
if (strcmp(option_string, "no-use-clear-halt") == 0) {
use_clear_halt = 0;
return 0;
}
if (strcmp(option_string, "no-lock") == 0) {
libusb_no_lock = 1;
return 0;

View File

@@ -59,11 +59,18 @@ struct tone_zone builtin_zones[] =
.description = "Australia",
.ringcadence = { 400, 200, 400, 2000 },
.tones = {
{ DAHDI_TONE_DIALTONE, "413+438" },
{ DAHDI_TONE_DIALTONE, "415+440" },
{ DAHDI_TONE_BUSY, "425/375,0/375" },
{ DAHDI_TONE_RINGTONE, "413+438/400,0/200,413+438/400,0/2000" },
/* XXX Congestion: Should reduce by 10 db every other cadence XXX */
{ DAHDI_TONE_CONGESTION, "425/375,0/375,420/375,0/375" },
/* The Australian congestion tone is 425Hz, 375ms On, 375ms Off, with the
* second cadence being half the amplitude of the first; so the first cadence
* is approximately -10dB with the second one being -20dB. Using the update
* ToneZone.c file, this can be accomplished by adding the "@" symbol in front
* of the frequency to reduce amplification, as in the following entry for
* Congestion:
*/
{ DAHDI_TONE_CONGESTION, "425/375,0/375,425@/375,0/375" },
{ DAHDI_TONE_CALLWAIT, "425/100,0/200,425/200,0/4400" },
{ DAHDI_TONE_DIALRECALL, "413+428" },
{ DAHDI_TONE_RECORDTONE, "!425/1000,!0/15000,425/360,0/15000" },
@@ -928,6 +935,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_RECORDTONE, "1400/400,0/15000" },
{ DAHDI_TONE_INFO, "950/330,1440/330,1800/330,0/1000" },
{ DAHDI_TONE_STUTTER, "!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -948,6 +957,8 @@ struct tone_zone builtin_zones[] =
/* This should actually be 950+1400+1800, but we only support 2 tones at a time */
{ DAHDI_TONE_INFO, "!950+1400/300,!0/1000,!950+1400/300,!0/1000,!950+1400/1000,0" },
{ DAHDI_TONE_STUTTER, "!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,450" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -996,6 +1007,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_INFO, "950/333,1400/333,1800/333,0/1000" },
/* STUTTER TONE - not specified */
{ DAHDI_TONE_STUTTER, "!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -1044,6 +1057,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_INFO, "950/330,1450/330,1850/330,0/1000" },
/* STUTTER TONE */
{ DAHDI_TONE_STUTTER, "380+420" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,