Compare commits

..

28 Commits

Author SHA1 Message Date
Shaun Ruffell
c4a840c6dc Use autotagged externals
git-svn-id: http://svn.astersk.org/svn/dahdi/tools/tags/2.5.1@10674 17933a7a-c749-41c5-a318-cba88f637d49
2012-04-18 17:17:50 +00:00
Shaun Ruffell
df996bf1c8 Importing files for 2.5.1 release.
git-svn-id: http://svn.astersk.org/svn/dahdi/tools/tags/2.5.1@10673 17933a7a-c749-41c5-a318-cba88f637d49
2012-04-18 17:17:37 +00:00
Shaun Ruffell
b71ef5c784 Creating tag for the release of dahdi-tools-2.5.1
git-svn-id: http://svn.astersk.org/svn/dahdi/tools/tags/2.5.1@10672 17933a7a-c749-41c5-a318-cba88f637d49
2012-04-18 17:17:08 +00:00
Oron Peled
c4fe52e769 xpp: astribank_hook: wait for udev to settle
When running the astribank_hook (only on Astribanks, in XPP_HOTPLUG_DAHDI
mode), wait for all other Astribanks to create all the required device
files.

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10585

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10595 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-22 18:58:39 +00:00
Tzafrir Cohen
c57672cd88 xpp: astribank_allow: useless debug on write
Remove a useless debug message in the "write" operation.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10549

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10554 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-20 11:43:35 +00:00
Tzafrir Cohen
c256218779 xpp: fix build warnings
Unlike original: also fixed fpga_load.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10543

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10546 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-20 06:02:41 +00:00
Tzafrir Cohen
261869a437 xpp: oct612x: fix build warnings
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10542

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10545 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-20 05:54:32 +00:00
Oron Peled
57749f1c26 xpp: Update product ID's in Dahdi::Hardware::USB
Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10505

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10514 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:22:05 +00:00
Oron Peled
6da1f767e5 xpp: fix manpage of astribank_hexload
* Fixed 'astribanks_tool' string

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10503

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10513 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:21:27 +00:00
Oron Peled
3a147a35c2 xpp: Customizable license markers
* License strings markers (BEGIN.../END...) can be customized
* By default, generate a "generic" license markers
* We accept any (paired) markers from the valid list

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10502

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10512 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:21:06 +00:00
Oron Peled
a8c8435ea8 xpp: bugfix: handle echo_loader errors
* I/O errors of the device were not propagated up by echo_loader
* As a result, Octasic load failure did not prevented USB renumeration
* Make consistent return values:
  - In our functions: ret < 0 is error
  - In Octasic functions (UINT32): return Octasic error codes
* All error paths prints error messages (so we see how the error propagates)
* Also changed error order testing in init_octasic():
  Return status should be tested before the values of by-reference parameters

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10499

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10510 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:19:34 +00:00
Oron Peled
0124097dfc xpp: echo_loader.c: add AB id to messages
* Define new macros AB_INFO(), AB_ERR() that prefix their message
  with the astribank information (usb device + serial number)
* Replace all INFO()/ERR() messages in echo_loader.c with the new macros

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10498

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10509 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:18:10 +00:00
Oron Peled
a09b124790 xpp: xpp_fxloader: improve output
* Replaced (almost) all $LOGGER to echo:
  - In interactive use -- that what we want anyway
  - When called from UDEV, the subprocess stdout/stderr is piped to
    $LOGGER anyway (at the end of the script)
  - No need for many $LOGGER instances (each with its own pid)

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10495

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10508 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:17:46 +00:00
Oron Peled
c5b905b1bf xpp: clean 'Extrainfo' EEPROM field
* Extrainfo field contains junk data
* Caused by:
  - The field is initialized to 0xFF values
  - There was no null termination (and no room to add it)
* New code:
  - Ensure that show_extrainfo() have null termination even if EEPROM
    field is full.
  - Replace trailing 0xFF characters with '\0' when reading this field
  - Since our default burned EEPROM contain Extrainfo field full of
    0xFF characters, this would make them look as null filled.

Internal Issue-Id: #1341
Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10491

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10507 17933a7a-c749-41c5-a318-cba88f637d49
2012-03-15 21:17:10 +00:00
Oron Peled
e0485bafc0 xpp: improved waitfor_xpds
* Fix an issue due to long firmware load time:
  - When one Astribank has an echo canceler (long firmware loading) and
    and another one does not.
  - The EC-less Astribank finishes initialization before the Astribank
    with EC is detected.
  - Thus waitfor_xpds terminates too early.

* We now iteratively build two sets of serial numbers:
  - One from wha we see in all Xorcom (e4e4:11[3456]x) USB devices.
  - The other is those that were detected in the driver.
  - Only when the two sets are equal (and > 0) we know we are done.
  - This is resilient to many problems (e.g: disconnect/reconnect of
    same device during initialization).

* The progress output was also improved: Now each detected AB
  show the total number so far.

* The timeout was also increased to 100sec

* Woraround for an Astribank with no serial (but just a single one on
  the system).

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10465

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10467 17933a7a-c749-41c5-a318-cba88f637d49
2012-02-22 20:23:16 +00:00
Tzafrir Cohen
d6dafbdcea xpp: two extra product IDs: 1112, 1164
Two extra USB product IDs used in some odd maintenance scenarios.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10371 17933a7a-c749-41c5-a318-cba88f637d49
2011-12-04 17:26:14 +00:00
Tzafrir Cohen
d1d22bf4f6 xpp: xpp_fxloader: regressions from r10355
* Avoid a duplicated run of udev on some systems.
* Fix usage of astribank_tool's output.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10370 17933a7a-c749-41c5-a318-cba88f637d49
2011-12-04 17:25:49 +00:00
Tzafrir Cohen
cdbea31d0b Fix GCC 4.6 "set but not used" warnings
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10357 17933a7a-c749-41c5-a318-cba88f637d49
2011-11-30 10:27:19 +00:00
Tzafrir Cohen
b229de1beb xpp: recovery firmware in xpp_fxloader
USB_RECOV.hex is an extra firmware that may be useful for recovering
from certain Astribank hardware faults in some scenarios. This adds
support for either loading it manually
('/usr/share/dahdi/xpp_fxloader recover-sb') or through udev, *if*
the required udev rules were set on the system.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10356 17933a7a-c749-41c5-a318-cba88f637d49
2011-11-30 10:25:40 +00:00
Tzafrir Cohen
04d6bc2893 xpp: Serialized Parallel load; E-Main-3 firmware
This introduces support for loading multiple firmwares in parallel also
for the case of a manual load. This is anyway the case for an automatic
load from udev.

* libusb needs to scan the bus all too often. This causes occasional
  failures for opening devices.
* Thus introduce a semaphore to serialize uses of libusb.

E-Main-3 firmware differs by a different value of bcdDevice:

* Read this from the sysfs devices tree.
* Fall back to lsusb -v (much slower) is sysfs not available.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10355 17933a7a-c749-41c5-a318-cba88f637d49
2011-11-30 10:25:16 +00:00
Tzafrir Cohen
ff25216d3a xpp: astribank_hexload: we need more lines
* Newer firmwares may have more lines.
* While we're at it, add better debug printing.
* Remove some unused debugging code.

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10354 17933a7a-c749-41c5-a318-cba88f637d49
2011-11-30 10:23:44 +00:00
Shaun Ruffell
2f10cda05a dahdi_genconf: Use 'dahdi_scan' to determine span_type for B410P cards.
The wcb4xxp driver does not put enough information in the proc filesystem to
determine if the ports are in TE or NT mode.  Previously the ports would
always just setup the dahdi-channels.conf file in TE mode. After this change
the dahdi_scan utility is used to detect if the ports are in TE or NT mode and
setup dahdi-channels.conf appropriately.

Internal-Issue-ID: DAHTOOL-54
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10214

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10256 17933a7a-c749-41c5-a318-cba88f637d49
2011-10-21 22:12:49 +00:00
Shaun Ruffell
e9ea988620 dahdi_genconf: Assume spans with unknown term types are software selectable.
Resolves a regression on the 2.5 branch that would result in:

  $ dahdi_genconf
  dahdi_genconf: missing default group (termtype=UNKNOWN)

E1 / T1 spans use software configuration to set CPE / NET mode. This
patch will just assume that a termtype is software selectable if it was
"UNKNOWN" when first scanning the span.

Internal-Issue-ID: DAHTOOL-55
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Tested-by: David Purdue <support@noojee.com.au>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10213

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10255 17933a7a-c749-41c5-a318-cba88f637d49
2011-10-21 22:12:45 +00:00
Tzafrir Cohen
0245fef736 xpp: waitfor_xpds: higher and configurable timeout
On several pathological cases we may need to wait more than 40 seconds.
Make that timeout configurable.

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10188 17933a7a-c749-41c5-a318-cba88f637d49
2011-09-07 07:11:14 +00:00
Tzafrir Cohen
e8c7b0042e README.Astribank: HWEC and build instructions
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10187 17933a7a-c749-41c5-a318-cba88f637d49
2011-09-07 07:10:53 +00:00
Tzafrir Cohen
ff04c5db31 xpp: pri_termtype: match complete SPAN patterns
Match complete span patterns, to avoid pattern 'SPAN/1' from matching
e.g. span 12 (SPAN/12).

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10186 17933a7a-c749-41c5-a318-cba88f637d49
2011-09-07 07:10:28 +00:00
Tzafrir Cohen
b3824291d5 Extra README fixes: 'th' and ztcfg
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10185 17933a7a-c749-41c5-a318-cba88f637d49
2011-09-07 07:09:47 +00:00
Tzafrir Cohen
58afc8f173 Create a branch for 2.5
git-svn-id: http://svn.astersk.org/svn/dahdi/tools/branches/2.5@10108 17933a7a-c749-41c5-a318-cba88f637d49
2011-08-10 17:22:00 +00:00
42 changed files with 848 additions and 1392 deletions

View File

@@ -1 +1 @@
2.6.0
2.5.1

264
ChangeLog
View File

@@ -1,23 +1,141 @@
2012-01-03 Shaun Ruffell <sruffell@digium.com>
2012-04-18 Shaun Ruffell <sruffell@digium.com>
* dahdi-tools version 2.6.0 released.
* dahdi-tools version 2.5.1 released.
2011-12-04 17:08 +0000 [r10366-10368] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2012-03-22 18:58 +0000 [r10595] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/astribank_hook: xpp: astribank_hook: wait for udev to settle
When running the astribank_hook (only on Astribanks, in
XPP_HOTPLUG_DAHDI mode), wait for all other Astribanks to create
all the required device files. Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Acked-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10585
2012-03-20 11:43 +0000 [r10545-10554] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/astribank_license.c: xpp: astribank_allow: useless debug on
write Remove a useless debug message in the "write" operation.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10549
* xpp/astribank_license.c, xpp/echo_loader.c, xpp/xtalk/xtalk.c,
xpp/astribank_allow.c, xpp/fpga_load.c: xpp: fix build warnings
Unlike original: also fixed fpga_load. Signed-off-by: Tzafrir
Cohen <tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10543
* xpp/oct612x/octdeviceapi/oct6100api/oct6100_miscellaneous_priv.h,
xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_chip_open.c,
xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c,
xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_tsst.c,
xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_interrupts.c,
xpp/oct612x/octdeviceapi/oct6100api/oct6100_api/oct6100_conf_bridge.c:
xpp: oct612x: fix build warnings Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10542
2012-03-15 21:22 +0000 [r10507-10514] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Hardware/USB.pm: xpp: Update product ID's
in Dahdi::Hardware::USB Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Acked-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10505
* xpp/astribank_hexload.8: xpp: fix manpage of astribank_hexload *
Fixed 'astribanks_tool' string Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10503
* xpp/astribank_license.c (added), xpp/astribank_allow.8,
xpp/astribank_license.h (added), xpp/Makefile,
xpp/astribank_allow.c: xpp: Customizable license markers *
License strings markers (BEGIN.../END...) can be customized * By
default, generate a "generic" license markers * We accept any
(paired) markers from the valid list Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Acked-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10502
* xpp/echo_loader.c: xpp: bugfix: handle echo_loader errors * I/O
errors of the device were not propagated up by echo_loader * As a
result, Octasic load failure did not prevented USB renumeration *
Make consistent return values: - In our functions: ret < 0 is
error - In Octasic functions (UINT32): return Octasic error codes
* All error paths prints error messages (so we see how the error
propagates) * Also changed error order testing in init_octasic():
Return status should be tested before the values of by-reference
parameters Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10499
* xpp/echo_loader.c, xpp/astribank_usb.h: xpp: echo_loader.c: add
AB id to messages * Define new macros AB_INFO(), AB_ERR() that
prefix their message with the astribank information (usb device +
serial number) * Replace all INFO()/ERR() messages in
echo_loader.c with the new macros Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Acked-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10498
* xpp/xpp_fxloader: xpp: xpp_fxloader: improve output * Replaced
(almost) all $LOGGER to echo: - In interactive use -- that what
we want anyway - When called from UDEV, the subprocess
stdout/stderr is piped to $LOGGER anyway (at the end of the
script) - No need for many $LOGGER instances (each with its own
pid) Signed-off-by: Oron Peled <oron.peled@xorcom.com> Acked-by:
Tzafrir Cohen <tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10495
* xpp/mpp.h, xpp/mpptalk.c, xpp/mpptalk_defs.h: xpp: clean
'Extrainfo' EEPROM field * Extrainfo field contains junk data *
Caused by: - The field is initialized to 0xFF values - There was
no null termination (and no room to add it) * New code: - Ensure
that show_extrainfo() have null termination even if EEPROM field
is full. - Replace trailing 0xFF characters with '\0' when
reading this field - Since our default burned EEPROM contain
Extrainfo field full of 0xFF characters, this would make them
look as null filled. Internal Issue-Id: #1341 Signed-off-by: Oron
Peled <oron.peled@xorcom.com> Acked-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10491
2012-02-22 20:23 +0000 [r10467] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/waitfor_xpds: xpp: improved waitfor_xpds * Fix an issue due
to long firmware load time: - When one Astribank has an echo
canceler (long firmware loading) and and another one does not. -
The EC-less Astribank finishes initialization before the
Astribank with EC is detected. - Thus waitfor_xpds terminates too
early. * We now iteratively build two sets of serial numbers: -
One from wha we see in all Xorcom (e4e4:11[3456]x) USB devices. -
The other is those that were detected in the driver. - Only when
the two sets are equal (and > 0) we know we are done. - This is
resilient to many problems (e.g: disconnect/reconnect of same
device during initialization). * The progress output was also
improved: Now each detected AB show the total number so far. *
The timeout was also increased to 100sec * Woraround for an
Astribank with no serial (but just a single one on the system).
Signed-off-by: Oron Peled <oron.peled@xorcom.com> Acked-by:
Tzafrir Cohen <tzafrir.cohen@xorcom.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10465
2011-12-04 17:26 +0000 [r10370-10371] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/astribank_usb.c: xpp: two extra product IDs: 1112, 1164 Two
extra USB product IDs used in some odd maintenance scenarios.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/xpp_fxloader: xpp: xpp_fxloader: regressions from r10348 *
* xpp/xpp_fxloader: xpp: xpp_fxloader: regressions from r10355 *
Avoid a duplicated run of udev on some systems. * Fix usage of
astribank_tool's output. Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
2011-11-30 20:15 +0000 [r10348-10358] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-11-30 10:27 +0000 [r10354-10357] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Hardware/PCI.pm: DAHDI-perl: Fix PCI ID
for Rhino R4T1 (0b0b:0305) (Closes issue DAHTOOL-56)
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* dahdi_cfg.c, dahdi_maint.c: Fix GCC 4.6 "set but not used"
warnings Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/xpp_fxloader: xpp: recovery firmware in xpp_fxloader
USB_RECOV.hex is an extra firmware that may be useful for
@@ -27,7 +145,7 @@
*if* the required udev rules were set on the system.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/xpp_fxloader, xpp/xtalk/xusb.c: xpp: Serialized Parallel
* xpp/xtalk/xusb.c, xpp/xpp_fxloader: xpp: Serialized Parallel
load; E-Main-3 firmware This introduces support for loading
multiple firmwares in parallel also for the case of a manual
load. This is anyway the case for an automatic load from udev. *
@@ -39,89 +157,15 @@
available. Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
2011-11-21 15:25 +0000 [r10343] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/astribank_hexload.c: xpp: astribank_hexload: we need more
lines * Newer firmwares may have more lines. * While we're at it,
add better debug printing. * Remove some unused debugging code.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-11-02 Shaun Ruffell <sruffell@digium.com>
2011-10-21 Shaun Ruffell <sruffell@digium.com>
* dahdi-tools version 2.6.0-rc1 released.
* dahdi-tools version 2.5.0.2 released.
2011-11-02 21:57 +0000 [r10311] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* dahdi_maint.c, dahdi_cfg.c: Fix GCC 4.6 "set but not used"
warnings Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-11-02 20:55 +0000 [r10308] Shaun Ruffell <sruffell@digium.com>
* xpp/perl_modules/Dahdi/Span.pm: dahdi_genconf: Allow it to
recognize the TE8xx 8-port cards. Signed-off-by: Shaun Ruffell
<sruffell@digium.com>
2011-11-02 20:10 +0000 [r10306] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* doc/dahdi_cfg.8, dahdi_cfg.c: dahdi_cfg: add '-S <spanno>' and
'-C <chan-ranges>' * dahdi_cfg -S <num>: only apply changes to
span <num>. * If span is analog (no 'span=<num>,<channels>,...'
statement in system.conf), we need to set range: -C <channels> *
With the <basechan> and <channels> attributes in sysfs we easily
configure each device on the fly. Simply run: dahdi_cfg -S
<spanno> -C <basechan>+<channels>-1 from udev script
Signed-off-by: Oron Peled <oron.peled@xorcom.com> Acked-by:
Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-11-01 18:10 +0000 [r10293] Russ Meyerriecks <rmeyerreicks@digium.com>
* Makefile, dahdi_pcap.c (added): dahdi_pcap: Imported user space
utility for managing pcap streams This utility will export packet
captures for channels in dahdi. It requires CONFIG_DAHDI_MIRROR
to be defined in dahdi-linux as it uses the unsupported
DAHDI_MIRROR ioctl interface. Internal-Issue-ID: DAHTOOL-49 From:
Torrey Searle <tsearle@gmail.com> Signed-off-by: Russ Meyerriecks
<rmeyerriecks@digium.com> Acked-by: Shaun Ruffell
<sruffell@digium.com>
2011-10-23 14:43 +0000 [r10264-10267] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Hardware/PCI.pm: dahdi_perl: Use
$Dahdi::sys_base for sysfs pathes Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm: xpp_order
generator: ignore EC XPD The xpp_order configuration generator
should only loop over telephony devices, not all spans.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Config/Gen/Chandahdi.pm: chandahdi gen:
extens can have any num of digits Don't force extens we generate
to have exactly 4 digits (simple formatting limitation).
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/astribank_hexload.8, xpp/astribank_tool.8,
xpp/astribank_allow.8: Typos in man pages: toolyou Signed-off-by:
Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-09-29 17:00 +0000 [r10213-10216] Shaun Ruffell <sruffell@digium.com>
* dahdi_test.c: dahdi_test: Enforce range from 0.0% - 100.0% for
accuracy. Also makes sure that the percentage output from the
verbose and non-verbose modes of timer_test are the same and
print a cumulative accuracy which smooths out the jitter for each
pass. If the time it takes to read in 1 second worth of data is
longer than 1 second accuracy will be 0%. (closes issue #18573)
Reported by: smurfix Signed-off-by: Shaun Ruffell
<sruffell@digium.com>
* dahdi_maint.c: dahdi_maint: Print 'unsupported' warning if
framing errors is -1. Warn the user if attempting to monitor a
statistic that the particular board driver does not appear to be
collecting. The wcte12xp in r10212 in now fills in -1 for any
statistic it does not collect and other digital cards can do the
same. Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2011-10-21 22:12 +0000 [r10255-10256] Shaun Ruffell <sruffell@digium.com>
* xpp/perl_modules/Dahdi/Span.pm: dahdi_genconf: Use 'dahdi_scan'
to determine span_type for B410P cards. The wcb4xxp driver does
@@ -131,7 +175,8 @@
change the dahdi_scan utility is used to detect if the ports are
in TE or NT mode and setup dahdi-channels.conf appropriately.
Internal-Issue-ID: DAHTOOL-54 Signed-off-by: Shaun Ruffell
<sruffell@digium.com>
<sruffell@digium.com> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10214
* xpp/perl_modules/Dahdi/Span.pm: dahdi_genconf: Assume spans with
unknown term types are software selectable. Resolves a regression
@@ -141,58 +186,37 @@
patch will just assume that a termtype is software selectable if
it was "UNKNOWN" when first scanning the span. Internal-Issue-ID:
DAHTOOL-55 Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Tested-by: David Purdue <support@noojee.com.au>
Tested-by: David Purdue <support@noojee.com.au> Origin:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10213
2011-09-09 13:45 +0000 [r10194-10198] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* dahdi_maint.c, doc/dahdi_maint.8 (added): Man page for
dahdi_maint Fix dahdi_maint's usage message while we're at it.
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* doc/dahdi_monitor.8: Update the dahdi-monitor man page
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/dahdi_hardware, xpp/dahdi_genconf, xpp/lsdahdi: fix typos in
some xpp utils Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
2011-09-05 09:05 +0000 [r10177] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-09-07 07:11 +0000 [r10188] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/waitfor_xpds: xpp: waitfor_xpds: higher and configurable
timeout On several pathological cases we may need to wait more
than 40 seconds. Make that timeout configurable.
2011-08-25 10:32 +0000 [r10153] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-09-07 Shaun Ruffell <sruffell@digium.com>
* xpp/perl_modules/Dahdi/Hardware/USB.pm: dahdi-perl: Also get USB
loaded driver from usbfs Signed-off-by: Oron Peled
<oron.peled@xorcom.com> Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
* dahdi-tools version 2.5.0.1 released.
2011-08-18 15:38 +0000 [r10142] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2011-09-07 07:11 +0000 [r10185-10188] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Config/Gen/Freepbxdb.pm (added):
dahdi-perl: Freepbxdb config generator Use 'dahdi_genconf
freepbxdb' to generate the required astdb entries for Asterisk to
use the extensions generated by dahdi_genconf. Requires asterisk
to be running. This module is intended for testing as it bypasses
standard FreePBX functions only and hence may not work properly
with Freepbx. Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
2011-08-10 15:31 +0000 [r10104] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/waitfor_xpds: xpp: waitfor_xpds: higher and configurable
timeout On several pathological cases we may need to wait more
than 40 seconds. Make that timeout configurable.
* xpp/README.Astribank: README.Astribank: HWEC and build
instructions Signed-off-by: Tzafrir Cohen
<tzafrir.cohen@xorcom.com>
2011-08-09 13:11 +0000 [r10101] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* xpp/perl_modules/Dahdi/Span.pm: xpp: pri_termtype: match complete
SPAN patterns Match complete span patterns, to avoid pattern
'SPAN/1' from matching e.g. span 12 (SPAN/12). Signed-off-by:
Tzafrir Cohen <tzafrir.cohen@xorcom.com>
* README: Extra README fixes: 'th' and ztcfg Signed-off-by: Tzafrir
Cohen <tzafrir.cohen@xorcom.com>
2011-08-05 Shaun Ruffell <sruffell@digium.com>
* dahdi-tools version 2.5.0 released.

View File

@@ -176,9 +176,6 @@ $(LTZ_SO): $(LTZ_SO_OBJS)
dahdi_cfg: $(LTZ_A)
dahdi_cfg: LIBS+=-lm
dahdi_pcap:
$(CC) $(CFLAGS) dahdi_pcap.c -lpcap -o $@ $<
fxstest: $(LTZ_SO)
fxstest: LIBS+=-lm
@@ -348,7 +345,6 @@ clean:
rm -f core
rm -f dahdi_cfg-shared fxstest
rm -rf $(GENERATED_DOCS) *.asciidoc tonezones.txt
rm -f dahdi_pcap
distclean: dist-clean

View File

@@ -85,13 +85,6 @@ static struct dahdi_lineconfig lc[DAHDI_MAX_SPANS];
static struct dahdi_chanconfig cc[DAHDI_MAX_CHANNELS];
static int current_span = 0;
static int only_span = 0;
static int restrict_channels = 0;
static int selected_channels[DAHDI_MAX_CHANNELS];
static int chan2span[DAHDI_MAX_CHANNELS];
static int declared_spans[DAHDI_MAX_SPANS];
static struct dahdi_attach_echocan ae[DAHDI_MAX_CHANNELS];
static struct dahdi_dynamic_span zds[NUM_DYNAMIC];
@@ -235,35 +228,6 @@ static char *trim(char *buf)
return buf;
}
static int skip_channel(int x)
{
int spanno = chan2span[x];
if (restrict_channels) {
if (!selected_channels[x])
return 1;
/* sanity check */
if (only_span) {
if (spanno != 0 && only_span != spanno) {
fprintf(stderr,
"Only span %d. Skip selected channel %d from span %d\n",
only_span, x, spanno);
return 1;
}
}
} else {
if (only_span && !declared_spans[only_span]) {
fprintf(stderr,
"Error: analog span %d given to '-S', without '-C' restriction.\n",
only_span);
exit(1);
}
if (only_span && only_span != spanno)
return 1;
}
return 0;
}
static int parseargs(char *input, char *output[], int maxargs, char sep)
{
char *c;
@@ -346,8 +310,6 @@ int spanconfig(char *keyword, char *args)
error("Span number should be a valid span number, not '%s'\n", realargs[0]);
return -1;
}
current_span = span;
declared_spans[span] = 1;
res = sscanf(realargs[1], "%d", &timing);
if ((res != 1) || (timing < 0) || (timing > MAX_TIMING)) {
error("Timing should be a number from 0 to %d, not '%s'\n",
@@ -519,7 +481,6 @@ static int chanconfig(char *keyword, char *args)
int master=0;
int dacschan = 0;
char *idle;
int is_digital;
bzero(chans, sizeof(chans));
strtok(args, ":");
idle = strtok(NULL, ":");
@@ -531,7 +492,6 @@ static int chanconfig(char *keyword, char *args)
if (res <= 0)
return -1;
for (x=1;x<DAHDI_MAX_CHANNELS;x++) {
is_digital = 0;
if (chans[x]) {
if (slineno[x]) {
error("Channel %d already configured as '%s' at line %d\n", x, sig[x], slineno[x]);
@@ -577,7 +537,6 @@ static int chanconfig(char *keyword, char *args)
return -1;
cc[x].sigtype = DAHDI_SIG_CAS;
sig[x] = sigtype_to_str(cc[x].sigtype);
is_digital = 1;
} else if (!strcasecmp(keyword, "dacs")) {
/* Setup channel for monitor */
cc[x].idlebits = dacschan;
@@ -588,7 +547,6 @@ static int chanconfig(char *keyword, char *args)
cc[dacschan].sigtype = DAHDI_SIG_DACS;
sig[x] = sigtype_to_str(cc[dacschan].sigtype);
dacschan++;
is_digital = 1;
} else if (!strcasecmp(keyword, "dacsrbs")) {
/* Setup channel for monitor */
cc[x].idlebits = dacschan;
@@ -598,7 +556,6 @@ static int chanconfig(char *keyword, char *args)
cc[dacschan].idlebits = x;
cc[dacschan].sigtype = DAHDI_SIG_DACS_RBS;
sig[x] = sigtype_to_str(cc[dacschan].sigtype);
is_digital = 1;
dacschan++;
} else if (!strcasecmp(keyword, "unused")) {
cc[x].sigtype = 0;
@@ -606,7 +563,6 @@ static int chanconfig(char *keyword, char *args)
} else if (!strcasecmp(keyword, "indclear") || !strcasecmp(keyword, "bchan")) {
cc[x].sigtype = DAHDI_SIG_CLEAR;
sig[x] = sigtype_to_str(cc[x].sigtype);
is_digital = 1;
} else if (!strcasecmp(keyword, "clear")) {
sig[x] = sigtype_to_str(DAHDI_SIG_CLEAR);
if (master) {
@@ -616,7 +572,6 @@ static int chanconfig(char *keyword, char *args)
cc[x].sigtype = DAHDI_SIG_CLEAR;
master = x;
}
is_digital = 1;
} else if (!strcasecmp(keyword, "rawhdlc")) {
sig[x] = sigtype_to_str(DAHDI_SIG_HDLCRAW);
if (master) {
@@ -626,7 +581,6 @@ static int chanconfig(char *keyword, char *args)
cc[x].sigtype = DAHDI_SIG_HDLCRAW;
master = x;
}
is_digital = 1;
} else if (!strcasecmp(keyword, "nethdlc")) {
sig[x] = sigtype_to_str(DAHDI_SIG_HDLCNET);
memset(cc[x].netdev_name, 0, sizeof(cc[x].netdev_name));
@@ -640,7 +594,6 @@ static int chanconfig(char *keyword, char *args)
}
master = x;
}
is_digital = 1;
} else if (!strcasecmp(keyword, "fcshdlc")) {
sig[x] = sigtype_to_str(DAHDI_SIG_HDLCFCS);
if (master) {
@@ -650,26 +603,18 @@ static int chanconfig(char *keyword, char *args)
cc[x].sigtype = DAHDI_SIG_HDLCFCS;
master = x;
}
is_digital = 1;
} else if (!strcasecmp(keyword, "dchan")) {
sig[x] = "D-channel";
cc[x].sigtype = DAHDI_SIG_HDLCFCS;
is_digital = 1;
} else if (!strcasecmp(keyword, "hardhdlc")) {
sig[x] = "Hardware assisted D-channel";
cc[x].sigtype = DAHDI_SIG_HARDHDLC;
is_digital = 1;
} else if (!strcasecmp(keyword, "mtp2")) {
sig[x] = "MTP2";
cc[x].sigtype = DAHDI_SIG_MTP2;
is_digital = 1;
} else {
fprintf(stderr, "Huh? (%s)\n", keyword);
}
if (is_digital)
chan2span[x] = current_span;
else
current_span = 0;
}
}
return 0;
@@ -721,8 +666,6 @@ static void apply_fiftysix(void)
int chanfd;
for (x = 1; x < DAHDI_MAX_CHANNELS; x++) {
if (skip_channel(x))
continue;
chanfd = open("/dev/dahdi/channel", O_RDWR);
if (chanfd == -1) {
fprintf(stderr,
@@ -1271,8 +1214,6 @@ static void printconfig(int fd)
"Configuration\n"
"======================\n\n", vi.version, vi.echo_canceller);
for (x = 0; x < spans; x++) {
if (only_span && only_span != x)
continue;
printf("SPAN %d: %3s/%4s Build-out: %s\n",
lc[x].span,
(lc[x].lineconfig & DAHDI_CONFIG_D4 ? "D4" :
@@ -1290,8 +1231,6 @@ static void printconfig(int fd)
if (verbose > 1) {
printf("\nChannel map:\n\n");
for (x=1;x<DAHDI_MAX_CHANNELS;x++) {
if (skip_channel(x))
continue;
if ((cc[x].sigtype != DAHDI_SIG_SLAVE) && (cc[x].sigtype)) {
configs++;
ps = 0;
@@ -1315,8 +1254,6 @@ static void printconfig(int fd)
}
} else {
for (x=1;x<DAHDI_MAX_CHANNELS;x++) {
if (skip_channel(x))
continue;
if (cc[x].sigtype)
configs++;
}
@@ -1411,39 +1348,11 @@ static void usage(char *argv0, int exitcode)
" -h -- Generate this help statement\n"
" -s -- Shutdown spans only\n"
" -t -- Test mode only, do not apply\n"
" -C <chan_list> -- Only configure specified channels\n"
" -S <spanno> -- Only configure specified span\n"
" -v -- Verbose (more -v's means more verbose)\n"
,c);
exit(exitcode);
}
static int chan_restrict(char *str)
{
if (apply_channels(selected_channels, str) < 0)
return 0;
restrict_channels = 1;
return 1;
}
static int span_restrict(char *str)
{
long spanno;
char *endptr;
spanno = strtol(str, &endptr, 10);
if (endptr == str) {
fprintf(stderr, "Missing valid span number after '-S'\n");
return 0;
}
if (*endptr != '\0') {
fprintf(stderr, "Extra garbage after span number in '-S'\n");
return 0;
}
only_span = spanno;
return 1;
}
int main(int argc, char *argv[])
{
int c;
@@ -1451,7 +1360,7 @@ int main(int argc, char *argv[])
char *key, *value;
int x,found;
while((c = getopt(argc, argv, "fthc:vsd::C:S:")) != -1) {
while((c = getopt(argc, argv, "fthc:vsd::")) != -1) {
switch(c) {
case 'c':
filename=optarg;
@@ -1474,14 +1383,6 @@ int main(int argc, char *argv[])
case 's':
stopmode = 1;
break;
case 'C':
if (!chan_restrict(optarg))
usage(argv[0], 1);
break;
case 'S':
if (!span_restrict(optarg))
usage(argv[0], 1);
break;
case 'd':
if (optarg)
debug = atoi(optarg);
@@ -1564,8 +1465,6 @@ finish:
}
if (stopmode) {
for (x=0;x<spans;x++) {
if (only_span && x != only_span)
continue;
if (ioctl(fd, DAHDI_SHUTDOWN, &lc[x].span)) {
fprintf(stderr, "DAHDI shutdown failed: %s\n", strerror(errno));
close(fd);
@@ -1575,8 +1474,6 @@ finish:
exit(1);
}
for (x=0;x<spans;x++) {
if (only_span && x != only_span)
continue;
if (ioctl(fd, DAHDI_SPANCONFIG, lc + x)) {
fprintf(stderr, "DAHDI_SPANCONFIG failed on span %d: %s (%d)\n", lc[x].span, strerror(errno), errno);
close(fd);
@@ -1594,14 +1491,7 @@ finish:
struct dahdi_params current_state;
int master;
int needupdate = force;
if (skip_channel(x)) {
if (debug & DEBUG_APPLY) {
printf("Skip device %d\n", x);
fflush(stdout);
}
continue;
}
if (debug & DEBUG_APPLY) {
printf("Configuring device %d\n", x);
fflush(stdout);
@@ -1754,8 +1644,6 @@ finish:
}
}
for (x=0;x<spans;x++) {
if (only_span && x != only_span)
continue;
if (ioctl(fd, DAHDI_STARTUP, &lc[x].span)) {
fprintf(stderr, "DAHDI startup failed: %s\n", strerror(errno));
close(fd);

View File

@@ -53,14 +53,12 @@ void display_help(char *argv0, int exitcode)
fprintf(stderr, " -h, --help display help\n");
fprintf(stderr, " -s, --span <span num> specify the span\n");
fprintf(stderr, " -l, --loopback <localhost|networkline|"\
"networkpayload|loopup|"\
"loopdown|off>\n"\
"networkpayload|off>\n"\
"\t\tlocalhost - loop back towards host\n"\
"\t\tnetworkline - network line loopback\n"\
"\t\tnetworkpayload - network payload loopback\n"\
"\t\tloopup - transmit loopup signal\n"\
"\t\tloopdown - transmit loopdown signal\n"\
"\t\toff - end loopback mode\n");
"\t\tloopdown - transmit loopdown signal\n");
fprintf(stderr, " -i, --insert <fas|multi|crc|cas|prbs|bipolar>"\
"\n\t\tinsert an error of a specific type\n");
fprintf(stderr, " -r, --reset "\
@@ -108,10 +106,10 @@ int main(int argc, char *argv[])
while ((c = getopt_long(argc, argv, "hj:l:p:s:i:g:r",
long_options, &option_index)) != -1) {
switch (c) {
case 'h':
case 'h': /* local host loopback */
display_help(argv[0], 0);
break;
case 'l': /* loopback */
case 'l': /* network line loopback */
larg = optarg;
doloopback = 1;
break;
@@ -140,7 +138,7 @@ int main(int argc, char *argv[])
if (!(doloopback || iflag || gflag || rflag)) {
s.spanno = span;
res = ioctl(ctl, DAHDI_SPANSTAT, &s);
if (res || ((__u32)-1 == s.fecount))
if (res)
printf("Error counters not supported by the driver"\
" for this span\n");
printf("Span %d:\n", span);

View File

@@ -1,332 +0,0 @@
/*
* Capturing a pcap from the DAHDI interface
*
* Copyright (C) 2011 Torrey Searle
*
* ISDN support added by Horacio Peña
* Command line cleanups by Sverker Abrahamsson
*
* Requirements:
* - pcap development library
* - DAHDI_MIRROR ioctl which isn't enabled by default in dahdi-linux
* To enable this unsupported feature, #define CONFIG_DAHDI_MIRROR
* in dahdi-linux
* - To build this program call the 'make dahdi_pcap' target
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2 as published by the
* Free Software Foundation. See the LICENSE file included with
* this program for more details.
*/
#include <stdio.h>
#include <fcntl.h>
#include <dahdi/user.h>
#include <sys/time.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <pcap.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <getopt.h>
#define BLOCK_SIZE 512
#define MAX_CHAN 16
//char ETH_P_LAPD[2] = {0x00, 0x30};
struct mtp2_phdr {
u_int8_t sent;
u_int8_t annex_a_used;
u_int16_t link_number;
};
struct lapd_sll_hdr {
u_int16_t sll_pkttype; /* packet type */
u_int16_t sll_hatype;
u_int16_t sll_halen;
u_int8_t sll_addr[8];
u_int8_t sll_protocol[2]; /* protocol, should be ETH_P_LAPD */
};
struct chan_fds {
int rfd;
int tfd;
int chan_id;
int proto;
char tx_buf[BLOCK_SIZE * 4];
int tx_len;
char rx_buf[BLOCK_SIZE * 4];
int rx_len;
};
int make_mirror(long type, int chan)
{
int res = 0;
int fd = 0;
struct dahdi_bufferinfo bi;
fd = open("/dev/dahdi/pseudo", O_RDONLY);
memset(&bi, 0, sizeof(bi));
bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
bi.numbufs = 32;
bi.bufsize = BLOCK_SIZE;
ioctl(fd, DAHDI_SET_BUFINFO, &bi);
res = ioctl(fd, type, &chan);
if(res)
{
printf("error setting channel err=%d!\n", res);
return -1;
}
return fd;
}
int log_packet(struct chan_fds * fd, char is_read, pcap_dumper_t * dump)
{
unsigned char buf[BLOCK_SIZE * 4];
int res = 0;
struct pcap_pkthdr hdr;
struct mtp2_phdr * mtp2 = (struct mtp2_phdr *)buf;
struct lapd_sll_hdr * lapd = (struct lapd_sll_hdr *)buf;
unsigned char *dataptr = buf;
int datasize = sizeof(buf);
if(fd->proto == DLT_LINUX_LAPD)
{
dataptr += sizeof(struct lapd_sll_hdr);
datasize -= sizeof(struct lapd_sll_hdr);
}
else
{
dataptr += sizeof(struct mtp2_phdr);
datasize -= sizeof(struct mtp2_phdr);
}
memset(buf, 0, sizeof(buf));
if(is_read)
{
res = read(fd->rfd, dataptr, datasize);
if(fd->rx_len > 0 && res == fd->rx_len && !memcmp(fd->rx_buf, dataptr, res) )
{
//skipping dup
return 0;
}
memcpy(fd->rx_buf, dataptr, res);
fd->rx_len = res;
}
else
{
res = read(fd->tfd, dataptr, datasize);
if(fd->tx_len > 0 && res == fd->tx_len && !memcmp(fd->tx_buf, dataptr, res) )
{
//skipping dup
return 0;
}
memcpy(fd->tx_buf, dataptr, res);
fd->tx_len = res;
}
gettimeofday(&hdr.ts, NULL);
if(res > 0)
{
if(fd->proto == DLT_LINUX_LAPD)
{
hdr.caplen = res+sizeof(struct lapd_sll_hdr)-2;
hdr.len = res+sizeof(struct lapd_sll_hdr)-2;
lapd->sll_pkttype = 3;
lapd->sll_hatype = 0;
lapd->sll_halen = res;
// lapd->sll_addr = ???
lapd->sll_protocol[0] = 0x00;
lapd->sll_protocol[1] = 0x30;
}
else
{
hdr.caplen = res+sizeof(struct mtp2_phdr);
hdr.len = res+sizeof(struct mtp2_phdr);
if(is_read)
{
mtp2->sent = 0;
mtp2->annex_a_used = 0;
}
else
{
mtp2->sent = 1;
mtp2->annex_a_used = 0;
}
mtp2->link_number = htons(fd->chan_id);
}
pcap_dump((u_char*)dump, &hdr, buf);
pcap_dump_flush(dump);
}
return 1;
}
void usage()
{
printf("Usage: dahdi_pcap [OPTIONS]\n");
printf("Capture packets from DAHDI channels to pcap file\n\n");
printf("Options:\n");
printf(" -p, --proto=[mtp2|lapd] The protocol to capture, default mtp2\n");
printf(" -c, --chan=<channels> Comma separated list of channels to capture from, max %d. Mandatory\n", MAX_CHAN);
printf(" -f, --file=<filename> The pcap file to capture to. Mandatory\n");
printf(" -h, --help Display this text\n");
}
int main(int argc, char **argv)
{
struct chan_fds chans[MAX_CHAN];
char *filename = NULL;
int num_chans = 0;
int max_fd = 0;
int proto = DLT_MTP2_WITH_PHDR;
int i;
int packetcount;
int c;
while (1) {
int option_index = 0;
static struct option long_options[] = {
{"proto", required_argument, 0, 'p'},
{"chan", required_argument, 0, 'c'},
{"file", required_argument, 0, 'f'},
{"help", 0, 0, 'h'},
{0, 0, 0, 0}
};
c = getopt_long(argc, argv, "p:c:f:?",
long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 'p':
// Protocol
if(strcasecmp("LAPD", optarg)==0)
{
proto = DLT_LINUX_LAPD;
}
else if(argc > 0 && strcasecmp("MTP2", argv[1])==0)
{
proto = DLT_MTP2_WITH_PHDR;
}
break;
case 'c':
// TODO Should it be possible to override protocol per channel?
// Channels, comma separated list
while(optarg != NULL && num_chans < MAX_CHAN)
{
int chan = atoi(strsep(&optarg, ","));
chans[num_chans].tfd = make_mirror(DAHDI_TXMIRROR, chan);
chans[num_chans].rfd = make_mirror(DAHDI_RXMIRROR, chan);
chans[num_chans].chan_id = chan;
chans[num_chans].proto = proto;
if(chans[num_chans].tfd > max_fd)
{
max_fd = chans[num_chans].tfd;
}
if(chans[num_chans].rfd > max_fd)
{
max_fd = chans[num_chans].rfd;
}
num_chans++;
}
max_fd++;
break;
case 'f':
// File to capture to
filename=optarg;
break;
case 'h':
default:
// Usage
usage();
exit(0);
}
}
if((num_chans == 0) || (filename == NULL)) {
usage();
exit(0);
}
else
{
printf("Capturing protocol %s on channels ", (proto == DLT_MTP2_WITH_PHDR ? "mtp2":"lapd"));
for(i = 0; i < num_chans; i++)
{
printf("%d", chans[i].chan_id);
if(i<num_chans-1)
{
printf(", ");
}
}
printf(" to file %s\n", filename);
}
pcap_t * pcap = pcap_open_dead(chans[0].proto, BLOCK_SIZE*4);
pcap_dumper_t * dump = pcap_dump_open(pcap, filename);
packetcount=0;
while(1)
{
fd_set rd_set;
FD_ZERO(&rd_set);
for(i = 0; i < num_chans; i++)
{
FD_SET(chans[i].tfd, &rd_set);
FD_SET(chans[i].rfd, &rd_set);
}
select(max_fd, &rd_set, NULL, NULL, NULL);
for(i = 0; i < num_chans; i++)
{
if(FD_ISSET(chans[i].rfd, &rd_set))
{
packetcount += log_packet(&chans[i], 1, dump);
}
if(FD_ISSET(chans[i].tfd, &rd_set))
{
packetcount += log_packet(&chans[i], 0, dump);
}
}
printf("Packets captured: %d\r", packetcount);
fflush(stdout);
}
return 0;
}

View File

@@ -40,32 +40,17 @@
#define SIZE 8000
static int verbose;
static int pass = 0;
static float best = 0.0;
static float worst = 100.0;
static double total = 0.0;
static double total_time = 0.0;
static double total_count = 0.0;
static inline float _fmin(float a, float b)
{
return (a < b) ? a : b;
}
static double calculate_accuracy(double count, double ms)
{
return ((count - _fmin(count, fabs(count - ms))) / count) * 100.0;
}
static double delay_total = 0.0;
void hup_handler(int sig)
{
double accuracy = calculate_accuracy(total_count, total_time);
printf("\n--- Results after %d passes ---\n", pass);
printf("Best: %.3f%% -- Worst: %.3f%% -- Average: %f%%\n",
best, worst, pass ? total/pass : 100.00);
printf("Cummulative Accuracy (not per pass): %0.3f\n",
pass ? accuracy : 0.0);
printf("Best: %.3f -- Worst: %.3f -- Average: %f, Difference: %f\n",
best, worst, pass ? total/pass : 100.00, pass ? delay_total/pass : 100);
exit(0);
}
@@ -94,7 +79,9 @@ int main(int argc, char *argv[])
int count = 0;
int seconds = 0;
int curarg = 1;
int verbose = 0;
char buf[8192];
float score;
float ms;
struct timeval start, now;
fd = open("/dev/dahdi/pseudo", O_RDWR);
@@ -153,23 +140,23 @@ int main(int argc, char *argv[])
ms += (now.tv_sec - start.tv_sec) * 8000;
ms += (now.tv_usec - start.tv_usec) / 125.0;
if (count >= SIZE) {
const double percent = calculate_accuracy(count, ms);
double percent = 100.0 * (count - ms) / count;
if (verbose) {
printf("\n%d samples in %0.3f system clock sample intervals (%.3f%%)",
count, ms, percent);
count, ms, 100 - percent);
} else if (pass > 0 && (pass % 8) == 0) {
printf("\n");
}
if (percent > best)
best = percent;
if (percent < worst)
worst = percent;
score = 100.0 - fabs(percent);
if (score > best)
best = score;
if (score < worst)
worst = score;
if (!verbose)
printf("%.3f%% ", percent);
total += percent;
printf("%.3f%% ", score);
total += score;
delay_total += 100 - percent;
fflush(stdout);
total_count += count;
total_time += ms;
count = 0;
pass++;
}

View File

@@ -4,7 +4,7 @@
dahdi_cfg \- configures DAHDI kernel modules from /etc/dahdi/system.conf
.SH SYNOPSIS
.B dahdi_cfg [\-c \fICFG_FILE\fB] [\-S\fINUM\fB [-S\fICHANS\fB]] [\-s] [\-f] [\-t] [\-v [\-v ... ] ]
.B dahdi_cfg [\-c \fICFG_FILE\fB] [\-s] [\-f] [\-t] [\-v [\-v ... ] ]
.B dahdi_cfg \-h
@@ -26,25 +26,11 @@ Use an alternative configuration file instead of
.I /etc/dahdi/system.conf
.RE
.B \-C \fICHANNELS
.RS
Only apply changes to channels in the specified range. Only
applicable when \-S is in use.
.RE
.B \-s
.RS
Only shutdown spans.
.RE
.B \-S \fISPAN
.RS
Only apply changes to span no. \fISPAN\fR. For a digital span (with
a 'span=' line in the configuration file) this will do. For an analog
span you'll have to explicitly tell dahdi_cfg the range of channels,
using \-C .
.RE
.B \-f
.RS
Always configure every channel, even if it appears not to have changed.

View File

@@ -1,62 +0,0 @@
.TH "DAHDI_MAINT" "8" "9 Sep 2011" "" ""
.SH NAME
dahdi_maint \- Sets Dahdi spans into maintenance mode, e.g.: loopback
.SH SYNOPSIS
.B dahdi_maint \-s \fInum\fB [options]
.B dahdi_maint <\-h|\-\-help>
.SH DESCRIPTION
dahdi_maint uses the DAHDI_MAINT interface to set a Dahdi span (port
of a Dahdi adapter card) into loopback mode or similar maintenance mode.
.SH OPTIONS
.B \-s \-\-span \fInum\fR
.RS
The span number. Required.
.RE
.B \-l \-\-loopback <localhost|networkline|networkpayload|loopup|loopdown|off>
.RS
Loopback type. One of:
.IP localhost 4
loop back towards host
.IP networkline 4
network line loopback
.IP networkpayload 4
network payload loopback
.IP loopup 4
transmit loopup signal
.IP loopdown 4
transmit loopdown signal
.IP off 4
end loopback mode
.RE
.B \-i \-\-insert <fas|multi|crc|cas|prbs|bipolar>
.RS
Insert an error of a specific type
.RE
.SH EXAMPLES
Enable network line loopback on span 1:
dahdi_maint -s 1 --loopback networkline
Disable network line loopback on span 1:
dahdi_maint -s 1 --loopback off
.SH SEE ALSO
.PP
dahdi_tool(8), dahdi_cfg(8), asterisk(8).
.SH AUTHOR
.PP
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 later
version published by the Free Software Foundation.

View File

@@ -1,139 +1,37 @@
.TH "DAHDI_MONITOR" "8" "9 Sep 2011" "" ""
.TH "DAHDI_MONITOR" "8" "16 June 2008" "" ""
.SH NAME
dahdi_monitor \- checks the Rx/Tx levels of a DAHDI channels
dahdi_monitor \- checks the rx/tx levels of DAHDI channels
.SH SYNOPSIS
.B dahdi_monitor \fInum\fB [\-v[v]]
.B dahdi_monitor \fInum\fB [\-o] [<\-f|\-F> \fIFILE\fB]
.B dahdi_monitor \fInum\fB [[<\-r|\-R> \fIFILE\fB]] [[<\-t|\-T> \fIFILE\fB]]
.B dahdi_monitor \fIchannel number\fB [\-v] [\-f \fIFILE\fB]
.SH DESCRIPTION
dahdi_monitor monitors a Dahdi channel. It can record the output to a
file, play it to the speaker, or visualize the audio levels on the
terminal.
Recorded audio files are by default raw signed linear PCM. If the file
name ends with ".wav", the recorded file will be a WAV file.
The visual display shows the current audio level at both the Rx
(audio Received by Asterisk) and
Tx (audio Transmitted by Asterisk)
To exit the program, press Ctrl-C.
dahdi_monitor monitors a DAHDI channel. It gives you a visual
representation of the sound strengths and makes it easy to see if
the received or transmitted signals are too high or out of
balance
.SH OPTIONS
The first (mandatory) parameter is the number of the channel
to monitor.
.B \-m
.RS
Multiple channels. Don't multiplex both Rx and Tx in a single channel.
Normally there's a different option that you need that implies it.
.RE
.B \-o
.RS
Plays the output to OSS (/dev/dsp). Requires -m not to be used.
.RE
.B \-v
.RS
Display Visual audio levels. With two v-s, Verbose mode is enabled, that
shows the actual levels as numbers. Note that this requires a terminal
wider than 80 columns to be properly displayed.
Implies -m.
Display visual audio levels.
.RE
.B \-f \fIFILE
.RS
Record the content of the channel (Tx + Rx) to a file.
Write output to FILE
.RE
.B \-F \fIFILE
.RS
Record the content of the channel (Tx + Rx) before the echo canceler
to a file.
.RE
.B \-r \fIFILE
.RS
Record the content of the Rx channel to a file.
Implies -m.
.RE
.B \-R \fIFILE
.RS
Record the content of the R channel before the echo canceler to a file.
Implies -m.
.RE
.B \-s \fIFILE
.RS
Record the content of the Tx and Rx of the channel to a file.
.RE
.B \-S \fIFILE
.RS
Records a stereo of both Tx and Rx of the channel before the echo
canceler to a file.
.RE
.B \-t \fIFILE
.RS
Record the content of the Tx channel to a file.
Implies -m.
.RE
.B \-T \fIFILE
.RS
Record the content of the Tx channel before the echo canceler to a file.
Implies -m.
.RE
.SH EXAMPLES
Visualize audio levels on DAHDI channel 2:
dahdi_monitor 2 -v
Record channel 3 to a file:
dahdi_monitor 3 -f output.raw
This will create a raw PCM file (signed-linear, 8kHz, mono, 16 bits per
sample). Both the Tx and Rx will be multiplexed in a single channel.
It can be converted to a WAV file using e.g.:
sox -s -c1 -2 -r8000 output.raw output.wav
Record Tx and Rx of channel 5 to separate files. This time directly to
WAV files:
dahdi_monitor 5 -r output_rx.wav -t output_tx.wav
Record channel 8 to a stereo file (Tx and Rx on its two channels):
dahdi_monitor 8 -s output.raw
Converting it to a WAV file:
sox -s -c2 -2 -r8000 output.raw output.wav
Some extra, yet undocumented, options.
.SH SEE ALSO
.PP
dahdi_tool(8), dahdi_cfg(8).
dahdi_tool(8), dahdi_cfg(8), asterisk(8).
.SH AUTHOR
.PP

View File

@@ -74,7 +74,7 @@ ASTRIBANK_OBJS = astribank_usb.o mpptalk.o $(XTALK_OBJS)
ABHEXLOAD_OBJS = astribank_hexload.o hexfile.o pic_loader.o $(ECHO_LOADER) $(ASTRIBANK_OBJS) $(OCT_HERE_OBJS)
ABTOOL_OBJS = astribank_tool.o $(ASTRIBANK_OBJS)
ABALLOW_OBJS = astribank_allow.o $(ASTRIBANK_OBJS)
ABALLOW_OBJS = astribank_allow.o astribank_license.o $(ASTRIBANK_OBJS)
TARGETS = .perlcheck astribank_is_starting
PROG_INSTALL = astribank_is_starting

View File

@@ -33,7 +33,7 @@ information used by Xorcom to generate/modify licensed capabilities.
Required. The device to read from/write to. This is
\fIbus_num\fR/\fIdevice_num\fR, where \fIbus_num\fR and \fIdevice_num\fR
are the first two numbers in the output of lsusb(8) or dahdi_hardware(8).
On older versions of this tool you needed a complete path to the device,
On older versions of this toolyou needed a complete path to the device,
which would be /dev/bus/usb/\fIbus_num\fR/\fIdevice_num\fR, or
/proc/bus/usb/\fIbus_num\fR/\fIdevice_num\fR.
.RE
@@ -48,6 +48,16 @@ Write capabilities to EEPROM, otherwise read capabilities
License filename (stdin/stdout if not specified)
.RE
.B \-m \fInum\fR
.RS
Choose the numeric code of license markers to generate.
This code select the type of \fIBEGIN\fR.../\fIEND\fR... strings
that delimit the license body.
Valid marker codes are listed with the \fB-h\fR option.
The default (and first) code is \fB1\fR. Zero is illegal value.
.RE
.B \-v
.RS
Increase verbosity. May be used multiple times.

View File

@@ -34,6 +34,7 @@
#include "mpp.h"
#include "mpptalk.h"
#include <debug.h>
#include "astribank_license.h"
static const char rcsid[] = "$Id$";
@@ -49,6 +50,8 @@ static void usage()
fprintf(stderr, "\t\t[-d mask] # Debug mask (0xFF for everything)\n");
fprintf(stderr, "\t\t[-w] # Write capabilities to EEPROM, otherwise read capabilities\n");
fprintf(stderr, "\t\t[-f filename] # License filename (stdin/stdout if not specified)\n\n");
fprintf(stderr, "\t\t[-m num] # Numeric code of License markers to generate\n");
license_markers_help("\t", stderr);
exit(1);
}
@@ -70,216 +73,6 @@ static int capabilities_burn(
return 0;
}
static int bin_to_file(void *buf, int len, FILE *f)
{
static int bytes_on_line;
unsigned char *p = buf;
if (buf == NULL) {
if (bytes_on_line != 0) {
if (fprintf(f, "\n") != 1)
return -1;
bytes_on_line = 0;
}
return 0;
}
int i;
for (i = 0; i < len; i++) {
if (fprintf(f, "%02x", *p++) != 2)
return -1;
bytes_on_line++;
if (bytes_on_line >= 16) {
if (fprintf(f, "\n") != 1)
return -1;
bytes_on_line = 0;
}
}
return 0;
}
static int write_to_file(struct eeprom_table *eeprom_table, struct capabilities *caps, struct capkey *key, FILE *f)
{
fprintf(f, "-----BEGIN XORCOM LICENSE BLOCK-----\n");
fprintf(f, "Version: 1.0\n");
fprintf(f, "Timestamp: %u\n", caps->timestamp);
fprintf(f, "Serial: %.*s\n", LABEL_SIZE, eeprom_table->label);
fprintf(f, "Capabilities.Port.FXS: %d\n", caps->ports_fxs);
fprintf(f, "Capabilities.Port.FXO: %d\n", caps->ports_fxo);
fprintf(f, "Capabilities.Port.BRI: %d\n", caps->ports_bri);
fprintf(f, "Capabilities.Port.PRI: %d\n", caps->ports_pri);
fprintf(f, "Capabilities.Port.ECHO: %d\n", caps->ports_echo);
fprintf(f, "Capabilities.Twinstar: %d\n", CAP_EXTRA_TWINSTAR(caps));
fprintf(f, "Data:\n");
bin_to_file(eeprom_table, sizeof(*eeprom_table), f);
bin_to_file(caps, sizeof(*caps), f);
bin_to_file(key, sizeof(*key), f);
bin_to_file(NULL, 0, f);
fprintf(f, "-----END XORCOM LICENSE BLOCK-----\n");
return 0;
}
/*
* Removes whitespace on both sizes of the string.
* Returns a pointer to the first non-space char. The string
* is modified in place to trim trailing whitespace.
* If the whole string is whitespace, returns NULL.
*/
char *trim(char *s)
{
int len = strlen(s);
while (len > 0 && isspace(s[len-1])) {
len--;
}
if (len == 0)
return NULL;
s[len] = '\0';
while (isspace(*s))
s++;
/* *s is not a space, since in this case we'd return NULL above */
return s;
}
int get_key_value(char *line, char **key, char **value)
{
char *p = strchr(line, ':');
if (p == NULL)
return -1;
*p = '\0';
*key = trim(line);
*value = trim(p + 1);
return 0;
}
static int hex_digit_to_int(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
else if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
else
return -1;
}
static int str_to_bin(char *line, void *buf, int maxlen)
{
static int offset;
unsigned char *p = buf;
if (strlen(line) % 2 != 0)
return -1;
while (offset < maxlen && *line) {
uint8_t value;
char c = hex_digit_to_int(*line++);
if (c < 0 || *line == '\0')
return -1;
value = c << 4;
c = hex_digit_to_int(*line++);
if (c < 0)
return -1;
value |= c;
p[offset++] = value;
}
if (offset == maxlen && *line)
return -1;
return offset;
}
static int read_from_file(struct eeprom_table *eeprom_table, struct capabilities *caps, struct capkey *capkey, FILE *f)
{
char buf[256];
char *line, *key, *value;
int state = 0;
int lineno = 0;
struct table {
struct eeprom_table eeprom_table;
struct capabilities capabilities;
struct capkey capkey;
} PACKED table;
memset(&table, 0, sizeof(struct table));
/*
* states:
* 0: start - before BEGIN_LICENSE_BLOCK line. on BEGIN_LICENSE_BLOCK line goto 1.
* 1: read Version, goto 2. if not version line then error.
* 2: after BEGIN line. split line into key:value. if line is Data:, goto 3.
* 3: read binary data. if line is END_LICENSE_BLOCK goto 4.
* 4: END_LICENSE_BLOCK - ignore lines.
*/
while (fgets(buf, 256, f) != NULL) {
lineno++;
int len = strlen(buf);
if (len > 0 && buf[len-1] != '\n') {
ERR("Line %d: Line too long\n", lineno);
return -1;
}
line = trim(buf);
if (line == NULL) {
if (state > 0 && state < 4) {
ERR("Line %d: Empty line\n", lineno);
return -1;
}
else
continue;
}
switch (state) {
case 0:
if (strcmp(line, "-----BEGIN XORCOM LICENSE BLOCK-----") == 0)
state = 1;
else {
ERR("Line %d: Invalid license begin block\n", lineno);
return -1;
}
break;
case 1:
if (get_key_value(line, &key, &value) < 0) {
ERR("Line %d: Can't parse line\n", lineno);
return -1;
}
if (strcmp(key, "Version") == 0) {
if (strcmp(value, "1.0") == 0) {
state = 2;
} else {
ERR("Line %d: Unknown license file version '%s', need version '1.0'\n", lineno, value);
return -1;
}
} else {
ERR("Line %d: No license file version\n", lineno);
return -1;
}
break;
case 2:
if (get_key_value(line, &key, &value) < 0) {
ERR("Line %d: Can't parse line\n", lineno);
return -1;
}
if (strcmp(key, "Data") == 0) {
state = 3;
break;
}
break;
case 3:
if (strcmp(line, "-----END XORCOM LICENSE BLOCK-----") == 0) {
state = 4;
break;
}
if (str_to_bin(line, &table, sizeof(table)) < 0) {
ERR("Line %d: Error in data block\n", lineno);
return -1;
}
break;
case 4:
break;
}
}
if (state != 4) {
ERR("Invalid license file\n");
return -1;
}
memcpy(eeprom_table, &table.eeprom_table, sizeof(*eeprom_table));
memcpy(caps, &table.capabilities, sizeof(*caps));
memcpy(capkey, &table.capkey, sizeof(*capkey));
return 0;
}
int main(int argc, char *argv[])
{
char *devpath = NULL;
@@ -287,8 +80,9 @@ int main(int argc, char *argv[])
struct eeprom_table eeprom_table;
struct capabilities caps;
struct capkey key;
const char options[] = "vd:D:wf:";
const char options[] = "vd:D:wf:m:";
int do_write = 0;
unsigned int marker = LICENSE_MARKER_GENERIC;
FILE *file;
char *filename = NULL;
int ret;
@@ -317,6 +111,11 @@ int main(int argc, char *argv[])
case 'f':
filename = optarg;
break;
case 'm':
marker = strtoul(optarg, NULL, 0);
if (!license_marker_valid(marker))
usage();
break;
case 'h':
default:
ERR("Unknown option '%c'\n", c);
@@ -343,6 +142,7 @@ int main(int argc, char *argv[])
return 1;
}
if (do_write) {
unsigned int used_marker;
/* update capabilities based on input file */
file = stdin;
if (filename) {
@@ -352,7 +152,7 @@ int main(int argc, char *argv[])
return 1;
}
}
ret = read_from_file(&eeprom_table, &caps, &key, file);
ret = read_from_file(&eeprom_table, &caps, &key, &used_marker, file);
if (ret < 0) {
ERR("Failed to read capabilities from file: %d\n", ret);
return 1;
@@ -372,7 +172,7 @@ int main(int argc, char *argv[])
return 1;
}
}
ret = write_to_file(&eeprom_table, &caps, &key, file);
ret = write_to_file(&eeprom_table, &caps, &key, marker, file);
if (ret < 0) {
ERR("Failed to write capabilities to file: %d\n", ret);
return 1;

View File

@@ -1,19 +1,19 @@
.TH "ASTRIBANK_HEXLOAD" "8" "30 May 2011" "" ""
.SH NAME
astribank_tool \- Xorcom Astribank (xpp) firmware loader
astribank_hexload \- Xorcom Astribank (xpp) firmware loader
.SH SYNOPSIS
.B astribank_tool \-D \fIdevice-path\fR \-F [\fIoptions\fR] \fIhexfile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-F [\fIoptions\fR] \fIhexfile\fR
.B astribank_tool \-D \fIdevice-path\fR \-p [\fIoptions\fR] \fIhexfile1 .. hexfile4\fR
.B astribank_hexload \-D \fIdevice-path\fR \-p [\fIoptions\fR] \fIhexfile1 .. hexfile4\fR
.B astribank_tool \-D \fIdevice-path\fR \-O [-A] [\fIoptions\fR] \fIimagefile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-O [-A] [\fIoptions\fR] \fIimagefile\fR
.B astribank_tool \-D \fIdevice-path\fR \-o [\fIoptions\fR]
.B astribank_hexload \-D \fIdevice-path\fR \-o [\fIoptions\fR]
.B astribank_tool \-D \fIdevice-path\fR \-E [\fIoptions\fR] \fIhexfile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-E [\fIoptions\fR] \fIhexfile\fR
.B astribank_tool \-h
.B astribank_hexload \-h
.SH DESCRIPTION
.B astribank_hexload
@@ -31,7 +31,7 @@ firmware. It is normally run by the script xpp_fxloader.
Required. The device to read from/write to. This is
\fIbus_num\fR/\fIdevice_num\fR, where \fIbus_num\fR and \fIdevice_num\fR
are the first two numbers in the output of lsusb(8) or dahdi_hardware(8).
On older versions of this tool you needed a complete path to the device,
On older versions of this toolyou needed a complete path to the device,
which would be /dev/bus/usb/\fIbus_num\fR/\fIdevice_num\fR, or
/proc/bus/usb/\fIbus_num\fR/\fIdevice_num\fR.
.RE

View File

@@ -68,7 +68,34 @@ 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.
wait_for_udev() {
UDEV_SETTLE_MAX_TIME=10
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"
elif [ -x /sbin/udevadm ]; then
# Assume modern system, udevadm has settle parameter
if ! time /sbin/udevadm settle --timeout="$UDEV_SETTLE_MAX_TIME"
then
echo "udevadm failed ($?)."
echo "Fallback to sleep $UDEV_SETTLE_MAX_TIME seconds."
sleep "$UDEV_SETTLE_MAX_TIME"
fi
else
echo "No udevsettle/udevadm."
echo "Fallback to sleep $UDEV_SETTLE_MAX_TIME seconds."
sleep "$UDEV_SETTLE_MAX_TIME"
fi
sleep 1 # Wait a bit more (races)
}
start_dahdi() {
wait_for_udev
script=/etc/init.d/dahdi
echo "Starting $script."
"$script" start | logger -i -t "$script"

340
xpp/astribank_license.c Normal file
View File

@@ -0,0 +1,340 @@
/*
* Written by Oron Peled <oron@actcom.co.il>
* Copyright (C) 2012, 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 <errno.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <debug.h>
#include "astribank_license.h"
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
static const struct boundary {
const char *name;
const char *markers[2];
} boundaries[] = {
[LICENSE_MARKER_NONE] = { /* Skip 0 */
},
[LICENSE_MARKER_XORCOM] = {
"Xorcom",
{
"-----BEGIN XORCOM LICENSE BLOCK-----",
"-----END XORCOM LICENSE BLOCK-----",
},
},
[LICENSE_MARKER_GENERIC] = {
"Generic",
{
"-----BEGIN TELEPHONY DEVICE LICENSE BLOCK-----",
"-----END TELEPHONY DEVICE LICENSE BLOCK-----",
}
},
};
void license_markers_help(const char *prefix, FILE *fp)
{
int i;
fprintf(fp, "%sValid license markers:\n", prefix);
for (i = LICENSE_MARKER_NONE + 1; i < ARRAY_SIZE(boundaries); i++) {
const struct boundary *b = &boundaries[i];
if (b->markers[0] != 0)
fprintf(fp, "%s\t%d - %s\n", prefix, i, b->name);
}
}
int license_marker_valid(unsigned int which)
{
if (which >= ARRAY_SIZE(boundaries))
return 0;
if (boundaries[which].markers[0] == NULL)
return 0;
return 1;
}
static const char *marker_string(unsigned int which, int end_marker)
{
int selector = (end_marker) ? 1 : 0;
if (license_marker_valid(which)) {
return boundaries[which].markers[selector];
}
ERR("gen_marker: invalid marker %d\n", which);
return NULL;
}
static int marker_find(const char *str, int end_marker)
{
int selector = (end_marker) ? 1 : 0;
int i;
for (i = LICENSE_MARKER_NONE + 1; i < ARRAY_SIZE(boundaries); i++) {
const struct boundary *b = &boundaries[i];
const char *marker_str = b->markers[selector];
#if 0
DBG("marker_find(%s,%d)[%d]: %s\n",
str, end_marker, i, marker_str);
#endif
if (!marker_str)
continue;
if (strcmp(str, marker_str) == 0)
return i;
}
return 0;
}
static int bin_to_file(void *buf, int len, FILE *f)
{
static int bytes_on_line;
unsigned char *p = buf;
if (buf == NULL) {
if (bytes_on_line != 0) {
if (fprintf(f, "\n") != 1)
return -1;
bytes_on_line = 0;
}
return 0;
}
int i;
for (i = 0; i < len; i++) {
if (fprintf(f, "%02x", *p++) != 2)
return -1;
bytes_on_line++;
if (bytes_on_line >= 16) {
if (fprintf(f, "\n") != 1)
return -1;
bytes_on_line = 0;
}
}
return 0;
}
int write_to_file(
struct eeprom_table *eeprom_table,
struct capabilities *caps,
struct capkey *key,
unsigned int marker,
FILE *f)
{
fprintf(f, "%s\n", marker_string(marker, 0));
fprintf(f, "Version: 1.0\n");
fprintf(f, "Timestamp: %u\n", caps->timestamp);
fprintf(f, "Serial: %.*s\n", LABEL_SIZE, eeprom_table->label);
fprintf(f, "Capabilities.Port.FXS: %d\n", caps->ports_fxs);
fprintf(f, "Capabilities.Port.FXO: %d\n", caps->ports_fxo);
fprintf(f, "Capabilities.Port.BRI: %d\n", caps->ports_bri);
fprintf(f, "Capabilities.Port.PRI: %d\n", caps->ports_pri);
fprintf(f, "Capabilities.Port.ECHO: %d\n", caps->ports_echo);
fprintf(f, "Capabilities.Twinstar: %d\n", CAP_EXTRA_TWINSTAR(caps));
fprintf(f, "Data:\n");
bin_to_file(eeprom_table, sizeof(*eeprom_table), f);
bin_to_file(caps, sizeof(*caps), f);
bin_to_file(key, sizeof(*key), f);
bin_to_file(NULL, 0, f);
fprintf(f, "%s\n", marker_string(marker, 1));
return 0;
}
/*
* Removes whitespace on both sizes of the string.
* Returns a pointer to the first non-space char. The string
* is modified in place to trim trailing whitespace.
* If the whole string is whitespace, returns NULL.
*/
static char *trim(char *s)
{
int len = strlen(s);
while (len > 0 && isspace(s[len-1])) {
len--;
}
if (len == 0)
return NULL;
s[len] = '\0';
while (isspace(*s))
s++;
/* *s is not a space, since in this case we'd return NULL above */
return s;
}
static int get_key_value(char *line, char **key, char **value)
{
char *p = strchr(line, ':');
if (p == NULL)
return -1;
*p = '\0';
*key = trim(line);
*value = trim(p + 1);
return 0;
}
static int hex_digit_to_int(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
else if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
else
return -1;
}
static int str_to_bin(char *line, void *buf, int maxlen)
{
static int offset;
unsigned char *p = buf;
if (strlen(line) % 2 != 0)
return -1;
while (offset < maxlen && *line) {
uint8_t value;
char c = hex_digit_to_int(*line++);
if (c < 0 || *line == '\0')
return -1;
value = c << 4;
c = hex_digit_to_int(*line++);
if (c < 0)
return -1;
value |= c;
p[offset++] = value;
}
if (offset == maxlen && *line)
return -1;
return offset;
}
int read_from_file(
struct eeprom_table *eeprom_table,
struct capabilities *caps,
struct capkey *capkey,
unsigned int *used_marker,
FILE *f)
{
char buf[256];
char *line, *key, *value;
int lineno = 0;
unsigned int license_marker_begin = 0;
unsigned int license_marker_end;
struct table {
struct eeprom_table eeprom_table;
struct capabilities capabilities;
struct capkey capkey;
} PACKED table;
enum PARSE_STATES {
STATE_BEFORE_LICENSE = 0,
STATE_EXPECT_VERSION = 1,
STATE_EXPECT_DATA = 2,
STATE_READ_DATA = 3,
STATE_AFTER_LICENSE = 4,
} state = STATE_BEFORE_LICENSE;
memset(&table, 0, sizeof(struct table));
/*
* states:
* 0: start - before BEGIN_LICENSE_BLOCK line. on BEGIN_LICENSE_BLOCK line goto 1.
* 1: read Version, goto 2. if not version line then error.
* 2: after BEGIN line. split line into key:value. if line is Data:, goto 3.
* 3: read binary data. if line is END_LICENSE_BLOCK goto 4.
* 4: END_LICENSE_BLOCK - ignore lines.
*/
while (fgets(buf, 256, f) != NULL) {
lineno++;
int len = strlen(buf);
if (len > 0 && buf[len-1] != '\n') {
ERR("Line %d: Line too long\n", lineno);
return -1;
}
line = trim(buf);
if (line == NULL) {
if (state > STATE_BEFORE_LICENSE && state < STATE_AFTER_LICENSE) {
ERR("Line %d: Empty line\n", lineno);
return -1;
}
else
continue;
}
switch (state) {
case STATE_BEFORE_LICENSE:
license_marker_begin = marker_find(line, 0);
if (license_marker_begin)
state = STATE_EXPECT_VERSION;
else {
ERR("Line %d: Invalid license begin block\n", lineno);
return -1;
}
break;
case STATE_EXPECT_VERSION:
if (get_key_value(line, &key, &value) < 0) {
ERR("Line %d: Can't parse line\n", lineno);
return -1;
}
if (strcmp(key, "Version") == 0) {
if (strcmp(value, "1.0") == 0) {
state = STATE_EXPECT_DATA;
} else {
ERR("Line %d: Unknown license file version '%s', need version '1.0'\n", lineno, value);
return -1;
}
} else {
ERR("Line %d: No license file version\n", lineno);
return -1;
}
break;
case STATE_EXPECT_DATA:
if (get_key_value(line, &key, &value) < 0) {
ERR("Line %d: Can't parse line\n", lineno);
return -1;
}
if (strcmp(key, "Data") == 0) {
state = STATE_READ_DATA;
break;
}
break;
case STATE_READ_DATA:
license_marker_end = marker_find(line, 1);
if (license_marker_end) {
if (license_marker_end != license_marker_begin) {
ERR("Line %d: End marker != Begin marker\n", lineno);
return -1;
}
state = STATE_AFTER_LICENSE;
break;
}
if (str_to_bin(line, &table, sizeof(table)) < 0) {
ERR("Line %d: Error in data block\n", lineno);
return -1;
}
break;
case STATE_AFTER_LICENSE:
break;
}
}
if (state != STATE_AFTER_LICENSE) {
ERR("Invalid license file\n");
return -1;
}
memcpy(eeprom_table, &table.eeprom_table, sizeof(*eeprom_table));
memcpy(caps, &table.capabilities, sizeof(*caps));
memcpy(capkey, &table.capkey, sizeof(*capkey));
return 0;
}

29
xpp/astribank_license.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef ASTRIBANK_ALLOW_H
#define ASTRIBANK_ALLOW_H
#include "mpp.h"
enum license_markers {
LICENSE_MARKER_NONE = 0,
LICENSE_MARKER_XORCOM = 1,
LICENSE_MARKER_GENERIC = 2,
};
int license_marker_valid(unsigned int which);
void license_markers_help(const char *prefix, FILE *fp);
int write_to_file(
struct eeprom_table *eeprom_table,
struct capabilities *caps,
struct capkey *key,
unsigned int marker,
FILE *f);
int read_from_file(
struct eeprom_table *eeprom_table,
struct capabilities *caps,
struct capkey *capkey,
unsigned int *used_marker,
FILE *f);
#endif /* ASTRIBANK_ALLOW_H */

View File

@@ -20,7 +20,7 @@ to the \-D command line option).
Required. The device to read from/write to. This is
\fIbus_num\fR/\fIdevice_num\fR, where \fIbus_num\fR and \fIdevice_num\fR
are the first two numbers in the output of lsusb(8) or dahdi_hardware(8).
On older versions of this tool you needed a complete path to the device,
On older versions of this toolyou needed a complete path to the device,
which would be /dev/bus/usb/\fIbus_num\fR/\fIdevice_num\fR, or
/proc/bus/usb/\fIbus_num\fR/\fIdevice_num\fR.
.RE

View File

@@ -98,4 +98,16 @@ int eeprom_fill(struct eeprom_table *eprm,
int astribank_has_twinstar(struct astribank_device *astribank);
int label_isvalid(const char *label);
#define AB_REPORT(report_type, astribank, fmt, ...) \
report_type("%s [%s]: " fmt, \
xusb_devpath((astribank)->xusb), \
xusb_serial((astribank)->xusb), \
## __VA_ARGS__)
#define AB_INFO(astribank, fmt, ...) \
AB_REPORT(INFO, astribank, fmt, ## __VA_ARGS__)
#define AB_ERR(astribank, fmt, ...) \
AB_REPORT(ERR, astribank, fmt, ## __VA_ARGS__)
#endif /* ASTRIBANK_USB_H */

View File

@@ -111,7 +111,7 @@ __END__
=head1 NAME
dahdi_genconf - Generate configuration for Dahdi channels.
dahdi_genconf - Generate configuration for dahdi channels.
=head1 SYNOPSIS
@@ -126,7 +126,7 @@ It uses two information sources:
=item Hardware
The actual Dahdi hardware is automatically detected on the host.
The actual dahdi hardware is automatically detected on the host.
=item /etc/dahdi/genconf_parameters
@@ -137,7 +137,7 @@ variable.
=back
The dahdi_genconf script can generate various kinds of configuration files
as specified by the generator arguments. Each generator is a perl class
as specificed by the generator arguments. Each generator is a perl classes
in Dahdi::Config::Gen namespace. The generator names on the command line
are the class names in lowercase.
@@ -177,14 +177,14 @@ Currently, chandahdi is affected.
=item *
F<genconf_parameters> parsing is done via C<Dahdi::Config::Params>.
An object representing the parsed data is instantiated by:
An object representing the parsed data is instanciated by:
C<Dahdi::Config::Params-E<gt>new()>.
The C<item()> method of this object contains all the hard coded
defaults of the configuration directives.
=item *
A configuration object is instantiated by C<Dahdi::Config::Gen-E<gt>new($params)>.
A configuration object is instanciated by C<Dahdi::Config::Gen-E<gt>new($params)>.
The mapping of configuration directives into semantic configuration is
done in the constructor.

View File

@@ -72,7 +72,7 @@ sub show_disconnected(%) {
# FIXME: For verbose display we also need to see the XPP devices.
# If no spans are registered, this won't happen. A brute-force
# method for making it happen:
# methood for making it happe:
Dahdi::Xpp::xbuses if ($opts{'v'});
my @devices = Dahdi::Hardware->device_list;
@@ -139,7 +139,7 @@ dahdi_hardware [-v][-x]
=item -v
Verbose output - show spans used by each device etc. Currently only
Verbose ouput - show spans used by each device etc. Currently only
implemented for the Xorcom Astribank.
=item -x
@@ -150,7 +150,7 @@ Show disconnected Astribank unit, if any.
=head1 DESCRIPTION
Show all Dahdi hardware devices. Devices are recognized according to
Show all dahdi hardware devices. Devices are recognized according to
lists of PCI and USB IDs in Dahdi::Hardware::PCI.pm and
Dahdi::Hardware::USB.pm . For PCI it is possible to detect by
sub-vendor and sub-product ID as well.

View File

@@ -123,9 +123,7 @@ static void usb_buffer_showstatistics(struct astribank_device *astribank, struct
long usec;
usec = usb_buffer_usec(ub);
INFO("%s [%s]: Octasic statistics: packet_size=[%d, %ld, %d] packets=%d, bytes=%ld msec=%ld usec/packet=%d\n",
xusb_devpath(astribank->xusb),
xusb_serial(astribank->xusb),
AB_INFO(astribank, "Octasic statistics: packet_size=[%d, %ld, %d] packets=%d, bytes=%ld msec=%ld usec/packet=%ld\n",
ub->min_send,
ub->total_bytes / ub->num_sends,
ub->max_send,
@@ -144,7 +142,7 @@ static int usb_buffer_flush(struct astribank_device *astribank, struct usb_buffe
return 0;
ret = xusb_send(astribank->xusb, ub->data, ub->curr, TIMEOUT);
if(ret < 0) {
ERR("xusb_send failed: %d\n", ret);
AB_ERR(astribank, "xusb_send failed: %d\n", ret);
return ret;
}
DBG("%s: Written %d bytes\n", __func__, ret);
@@ -179,7 +177,7 @@ static int usb_buffer_append(struct astribank_device *astribank, struct usb_buff
char *buf, int len)
{
if (ub->curr + len >= ub->max_len) {
ERR("%s: buffer too small ub->curr=%d, len=%d, ub->max_len=%d\n",
AB_ERR(astribank, "%s: buffer too small ub->curr=%d, len=%d, ub->max_len=%d\n",
__func__, ub->curr, len, ub->max_len);
return -ENOMEM;
}
@@ -211,13 +209,13 @@ static int usb_buffer_send(struct astribank_device *astribank, struct usb_buffer
return ret;
ret = xusb_recv(astribank->xusb, buf, PACKET_SIZE, TIMEOUT);
if(ret <= 0) {
ERR("No USB packs to read: %s\n", strerror(-ret));
AB_ERR(astribank, "No USB packs to read: %s\n", strerror(-ret));
return -EINVAL;
}
DBG("%s: %d bytes recv\n", __func__, ret);
phead = (struct xpp_packet_header *)buf;
if(phead->header.op != SPI_RCV_XOP && phead->header.op != TST_RCV_XOP) {
ERR("Got unexpected reply OP=0x%02X\n", phead->header.op);
AB_ERR(astribank, "Got unexpected reply OP=0x%02X\n", phead->header.op);
dump_packet(LOG_ERR, DBG_MASK, "hexline[ERR]", buf, ret);
return -EINVAL;
}
@@ -260,7 +258,7 @@ int spi_send(struct astribank_device *astribank, uint16_t addr, uint16_t data, i
ret = usb_buffer_send(astribank, &usb_buffer, buf, pack_len, TIMEOUT, recv_answer);
if(ret < 0) {
ERR("usb_buffer_send failed: %d\n", ret);
AB_ERR(astribank, "usb_buffer_send failed: %d\n", ret);
return ret;
}
DBG("%s: Written %d bytes\n", __func__, ret);
@@ -287,15 +285,16 @@ int test_send(struct astribank_device *astribank)
ret = usb_buffer_send(astribank, &usb_buffer, buf, pack_len, TIMEOUT, 1);
if(ret < 0) {
ERR("usb_buffer_send failed: %d\n", ret);
AB_ERR(astribank, "usb_buffer_send failed: %d\n", ret);
return ret;
}
DBG("%s: Written %d bytes\n", __func__, ret);
return ret;
}
void echo_send_data(struct astribank_device *astribank, const unsigned int addr, const unsigned int data)
int echo_send_data(struct astribank_device *astribank, const unsigned int addr, const unsigned int data)
{
int ret;
/* DBG("SEND: %04X -> [%04X]\n", data, addr);
DBG("\t\t[%04X] <- %04X\n", 0x0008, (addr >> 20));
DBG("\t\t[%04X] <- %04X\n", 0x000A, (addr >> 4) & ((1 << 16) - 1));
@@ -304,25 +303,48 @@ void echo_send_data(struct astribank_device *astribank, const unsigned int addr,
*/
DBG("SND:\n");
spi_send(astribank, 0x0008, (addr >> 20) , 0, 0);
spi_send(astribank, 0x000A, (addr >> 4) & ((1 << 16) - 1) , 0, 0);
spi_send(astribank, 0x0004, data , 0, 0);
spi_send(astribank, 0x0000, (((addr >> 1) & 0x7) << 9) |
ret = spi_send(astribank, 0x0008, (addr >> 20) , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x000A, (addr >> 4) & ((1 << 16) - 1) , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x0004, data , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x0000, (((addr >> 1) & 0x7) << 9) |
(1 << 8) | (3 << 12) | 1 , 0, 0);
if (ret < 0)
goto failed;
return cOCT6100_ERR_OK;
failed:
AB_ERR(astribank, "echo_send_data: spi_send failed (ret = %d)\n", ret);
return ret;
}
unsigned int echo_recv_data(struct astribank_device *astribank, const unsigned int addr)
int echo_recv_data(struct astribank_device *astribank, const unsigned int addr)
{
unsigned int data = 0x00;
unsigned int ret;
int ret;
DBG("RCV:\n");
spi_send(astribank, 0x0008, (addr >> 20) , 0, 0);
spi_send(astribank, 0x000A, (addr >> 4) & ((1 << 16) - 1) , 0, 0);
spi_send(astribank, 0x0000, (((addr >> 1) & 0x7) << 9) |
ret = spi_send(astribank, 0x0008, (addr >> 20) , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x000A, (addr >> 4) & ((1 << 16) - 1) , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x0000, (((addr >> 1) & 0x7) << 9) |
(1 << 8) | 1 , 0, 0);
if (ret < 0)
goto failed;
ret = spi_send(astribank, 0x0004, data , 1, 0);
if (ret < 0)
goto failed;
return ret;
failed:
AB_ERR(astribank, "echo_recv_data: spi_send failed (ret = %d)\n", ret);
return ret;
}
int load_file(char *filename, unsigned char **ppBuf, UINT32 *pLen)
@@ -418,9 +440,13 @@ UINT32 Oct6100UserDriverWriteApi(tPOCT6100_WRITE_PARAMS f_pWriteParams)
const unsigned int data = f_pWriteParams->usWriteData;
const struct echo_mod *echo_mod = (struct echo_mod *)(f_pWriteParams->pProcessContext);
struct astribank_device *astribank = echo_mod->astribank;
int ret;
echo_send_data(astribank, addr, data);
ret = echo_send_data(astribank, addr, data);
if (ret < 0) {
ERR("echo_send_data failed (ret = %d)\n", ret);
return cOCT6100_ERR_FATAL_DRIVER_WRITE_API;
}
return cOCT6100_ERR_OK;
}
@@ -434,9 +460,15 @@ UINT32 Oct6100UserDriverWriteSmearApi(tPOCT6100_WRITE_SMEAR_PARAMS f_pSmearParam
unsigned int i;
for (i = 0; i < len; i++) {
int ret;
addr = f_pSmearParams->ulWriteAddress + (i << 1);
data = f_pSmearParams->usWriteData;
echo_send_data(astribank, addr, data);
ret = echo_send_data(astribank, addr, data);
if (ret < 0) {
ERR("echo_send_data failed (ret = %d)\n", ret);
return cOCT6100_ERR_FATAL_DRIVER_WRITE_API;
}
}
return cOCT6100_ERR_OK;
}
@@ -451,9 +483,15 @@ UINT32 Oct6100UserDriverWriteBurstApi(tPOCT6100_WRITE_BURST_PARAMS f_pBurstParam
unsigned int i;
for (i = 0; i < len; i++) {
int ret;
addr = f_pBurstParams->ulWriteAddress + (i << 1);
data = f_pBurstParams->pusWriteData[i];
echo_send_data(astribank, addr, data);
ret = echo_send_data(astribank, addr, data);
if (ret < 0) {
ERR("echo_send_data failed (ret = %d)\n", ret);
return cOCT6100_ERR_FATAL_DRIVER_WRITE_API;
}
}
return cOCT6100_ERR_OK;
}
@@ -463,8 +501,14 @@ UINT32 Oct6100UserDriverReadApi(tPOCT6100_READ_PARAMS f_pReadParams)
const unsigned int addr = f_pReadParams->ulReadAddress;
const struct echo_mod *echo_mod = (struct echo_mod *)f_pReadParams->pProcessContext;
struct astribank_device *astribank = echo_mod->astribank;
int ret;
*f_pReadParams->pusReadData = echo_recv_data(astribank, addr);
ret = echo_recv_data(astribank, addr);
if (ret < 0) {
ERR("echo_recv_data failed (%d)\n", ret);
return cOCT6100_ERR_FATAL_DRIVER_READ_API;
}
*f_pReadParams->pusReadData = ret;
return cOCT6100_ERR_OK;
}
@@ -477,8 +521,15 @@ UINT32 Oct6100UserDriverReadBurstApi(tPOCT6100_READ_BURST_PARAMS f_pBurstParams)
unsigned int i;
for (i = 0;i < len; i++) {
unsigned int ret;
addr = f_pBurstParams->ulReadAddress + (i << 1);
f_pBurstParams->pusReadData[i] = echo_recv_data(astribank, addr);
ret = echo_recv_data(astribank, addr);
if (ret < 0) {
ERR("echo_recv_data failed (%d)\n", ret);
return cOCT6100_ERR_FATAL_DRIVER_READ_API;
}
f_pBurstParams->pusReadData[i] = ret;
}
return cOCT6100_ERR_OK;
}
@@ -486,7 +537,7 @@ UINT32 Oct6100UserDriverReadBurstApi(tPOCT6100_READ_BURST_PARAMS f_pBurstParams)
inline int get_ver(struct astribank_device *astribank)
{
return spi_send(astribank, 0, 0, 1, 1);
return spi_send(astribank, 0, 0, 1, 1);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -511,18 +562,16 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
tOCT6100_CHANNEL_OPEN ChannelOpen;
UINT32 ulChanHndl;
test_send(astribank);
if (test_send(astribank) < 0)
return cOCT6100_ERR_FATAL;
cpld_ver = get_ver(astribank);
INFO("%s [%s]: Check EC_CPLD version: %d\n",
xusb_devpath(astribank->xusb),
xusb_serial(astribank->xusb),
cpld_ver);
AB_INFO(astribank, "Check EC_CPLD version: %d\n", cpld_ver);
if (cpld_ver < 0)
return cpld_ver;
return cOCT6100_ERR_FATAL;
else if (cpld_ver == EC_VER_TEST) {
INFO("+---------------------------------------------------------+\n");
INFO("| WARNING: TEST HARDWARE IS ON THE BOARD INSTEAD OF EC!!! |\n");
INFO("+---------------------------------------------------------+\n");
AB_INFO(astribank, "+---------------------------------------------------------+\n");
AB_INFO(astribank, "| WARNING: TEST HARDWARE IS ON THE BOARD INSTEAD OF EC!!! |\n");
AB_INFO(astribank, "+---------------------------------------------------------+\n");
return cOCT6100_ERR_OK;
}
@@ -537,10 +586,10 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
memset(&OpenChip, 0, sizeof(tOCT6100_CHIP_OPEN));
if (!(echo_mod = malloc(sizeof(struct echo_mod)))) {
ERR("cannot allocate memory for echo_mod\n");
return 1;
AB_ERR(astribank, "cannot allocate memory for echo_mod\n");
return cOCT6100_ERR_FATAL;
}
DBG("allocated mem for echo_mod\n");
DBG("allocated mem for echo_mod\n");
memset(echo_mod, 0, sizeof(struct echo_mod));
@@ -548,7 +597,7 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
ulResult = Oct6100ChipOpenDef( &OpenChip );
if (ulResult != cOCT6100_ERR_OK) {
ERR("Oct6100ChipOpenDef failed: result=%X\n", ulResult);
AB_ERR(astribank, "Oct6100ChipOpenDef failed: result=%X\n", ulResult);
return ulResult;
}
@@ -593,14 +642,14 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
&pbyImageData,
&ulImageByteSize );
if (pbyImageData == NULL || ulImageByteSize == 0){
ERR("Bad pbyImageData or ulImageByteSize\n");
return 1;
}
if ( ulResult != 0 ) {
ERR("Failed load_file %s (%08X)\n", filename, ulResult);
AB_ERR(astribank, "Failed load_file %s (%08X)\n", filename, ulResult);
return ulResult;
}
if (pbyImageData == NULL || ulImageByteSize == 0){
AB_ERR(astribank, "Bad pbyImageData or ulImageByteSize\n");
return cOCT6100_ERR_FATAL;
}
/* Assign the image file.*/
OpenChip.pbyImageFile = pbyImageData;
@@ -613,7 +662,7 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
ulResult = Oct6100GetInstanceSize(&OpenChip, &InstanceSize );
if (ulResult != cOCT6100_ERR_OK)
{
ERR("Oct6100GetInstanceSize failed (%08X)\n", ulResult);
AB_ERR(astribank, "Oct6100GetInstanceSize failed (%08X)\n", ulResult);
return ulResult;
}
@@ -622,14 +671,14 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
echo_mod->astribank = astribank;
if (!pApiInstance) {
ERR("Out of memory (can't allocate %d bytes)!\n", InstanceSize.ulApiInstanceSize);
return 1;
AB_ERR(astribank, "Out of memory (can't allocate %d bytes)!\n", InstanceSize.ulApiInstanceSize);
return cOCT6100_ERR_FATAL;
}
/* Perform actual open of chip */
ulResult = Oct6100ChipOpen(pApiInstance, &OpenChip);
if (ulResult != cOCT6100_ERR_OK) {
ERR("Oct6100ChipOpen failed: result=%X\n", ulResult);
AB_ERR(astribank, "Oct6100ChipOpen failed: result=%X\n", ulResult);
return ulResult;
}
DBG("%s: OCT6100 is open\n", __func__);
@@ -687,7 +736,7 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
ulResult = Oct6100ChannelOpen( pApiInstance,
&ChannelOpen );
if (ulResult != cOCT6100_ERR_OK) {
ERR("Found error on chan %d\n", nChan);
AB_ERR(astribank, "Found error on chan %d\n", nChan);
return ulResult;
}
}
@@ -736,7 +785,7 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
ulResult = Oct6100ChannelOpen( pApiInstance,
&ChannelOpen );
if (ulResult != cOCT6100_ERR_OK) {
ERR("Found error on chan %d\n", nChan);
AB_ERR(astribank, "Found error on chan %d\n", nChan);
return ulResult;
}
}
@@ -752,24 +801,21 @@ 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 iLen;
int ret;
unsigned char *pbyFileData = NULL;
const char *devstr;
UINT32 octasic_status;
devstr = xusb_devpath(astribank->xusb);
INFO("%s [%s]: Loading ECHOCAN Firmware: %s (%s)\n",
devstr, xusb_serial(astribank->xusb), filename,
(is_alaw) ? "alaw" : "ulaw");
AB_INFO(astribank, "Loading ECHOCAN Firmware: %s (%s)\n",
filename, (is_alaw) ? "alaw" : "ulaw");
usb_buffer_init(astribank, &usb_buffer);
ret = init_octasic(filename, astribank, is_alaw);
if (ret) {
ERR("ECHO %s burning failed (%08X)\n", filename, ret);
octasic_status = init_octasic(filename, astribank, is_alaw);
if (octasic_status != cOCT6100_ERR_OK) {
AB_ERR(astribank, "ECHO %s burning failed (%08X)\n",
filename, octasic_status);
return -ENODEV;
}
ret = usb_buffer_flush(astribank, &usb_buffer);
if (ret < 0) {
ERR("ECHO %s buffer flush failed (%d)\n", filename, ret);
AB_ERR(astribank, "ECHO %s buffer flush failed (%d)\n", filename, ret);
return -ENODEV;
}
usb_buffer_showstatistics(astribank, &usb_buffer);

View File

@@ -557,7 +557,6 @@ int match_usb_device_identity(const struct usb_config_descriptor *config_desc,
const struct astribank_type *my_usb_device_identify(const char devpath[], struct my_usb_device *mydev)
{
struct usb_device_descriptor *dev_desc;
struct usb_config_descriptor *config_desc;
int i;
@@ -570,7 +569,6 @@ const struct astribank_type *my_usb_device_identify(const char devpath[], struct
ERR("Bailing out\n");
return 0;
}
dev_desc = &mydev->dev->descriptor;
config_desc = mydev->dev->config;
for(i = 0; i < sizeof(astribank_types)/sizeof(astribank_types[0]); i++) {
if(match_usb_device_identity(config_desc, &astribank_types[i])) {
@@ -592,7 +590,6 @@ int my_usb_device_init(const char devpath[], struct my_usb_device *mydev, const
struct usb_interface *interface;
struct usb_interface_descriptor *iface_desc;
struct usb_endpoint_descriptor *endpoint;
int ret;
int i;
assert(mydev != NULL);
@@ -638,10 +635,10 @@ int my_usb_device_init(const char devpath[], struct my_usb_device *mydev, const
mydev->abtype = abtype;
mydev->my_ep_in = abtype->my_ep_in;
mydev->my_ep_out = abtype->my_ep_out;
ret = get_usb_string(mydev->iManufacturer, BUFSIZ, dev_desc->iManufacturer, mydev->handle);
ret = get_usb_string(mydev->iProduct, BUFSIZ, dev_desc->iProduct, mydev->handle);
ret = get_usb_string(mydev->iSerialNumber, BUFSIZ, dev_desc->iSerialNumber, mydev->handle);
ret = get_usb_string(mydev->iInterface, BUFSIZ, iface_desc->iInterface, mydev->handle);
get_usb_string(mydev->iManufacturer, BUFSIZ, dev_desc->iManufacturer, mydev->handle);
get_usb_string(mydev->iProduct, BUFSIZ, dev_desc->iProduct, mydev->handle);
get_usb_string(mydev->iSerialNumber, BUFSIZ, dev_desc->iSerialNumber, mydev->handle);
get_usb_string(mydev->iInterface, BUFSIZ, iface_desc->iInterface, mydev->handle);
INFO("ID=%04X:%04X Manufacturer=[%s] Product=[%s] SerialNumber=[%s] Interface=[%s]\n",
dev_desc->idVendor,
dev_desc->idProduct,

View File

@@ -48,7 +48,7 @@ __END__
=head1 NAME
lsdahdi - List all Dahdi channels with their types and spans.
lsdahdi - List all dahdi channels with their types and spans.
=head1 SYNOPSIS

View File

@@ -83,7 +83,7 @@ struct capkey {
} PACKED;
struct extrainfo {
char text[24];
char text[EXTRAINFO_SIZE];
} PACKED;
struct mpp_header {

View File

@@ -366,7 +366,17 @@ int mpp_extrainfo_get(struct astribank_device *astribank, struct extrainfo *info
}
assert(reply->header.op == MPP_EXTRAINFO_GET_REPLY);
if(info) {
int i;
memcpy(info, (void *)&CMD_FIELD(reply, MPP, EXTRAINFO_GET_REPLY, info), sizeof(*info));
/*
* clean non-printing characters
*/
for (i = sizeof(*info) - 1; i >= 0; i--) {
if (info->text[i] != (char)0xFF)
break;
info->text[i] = '\0';
}
}
free_command(reply);
return 0;
@@ -876,7 +886,11 @@ void show_astribank_status(struct astribank_device *astribank, FILE *fp)
void show_extrainfo(const struct extrainfo *extrainfo, FILE *fp)
{
fprintf(fp, "Extrainfo: : %s\n", (const char *)(extrainfo->text));
char buf[EXTRAINFO_SIZE + 1];
memcpy(buf, extrainfo->text, EXTRAINFO_SIZE);
buf[EXTRAINFO_SIZE] = '\0'; /* assure null termination */
fprintf(fp, "Extrainfo: : '%s'\n", buf);
}
int twinstar_show(struct astribank_device *astribank, FILE *fp)

View File

@@ -108,4 +108,6 @@ enum dev_dest {
DEST_EEPROM = 0x02,
};
#define EXTRAINFO_SIZE 24
#endif /* MPPTALK_DEFS_H */

View File

@@ -1500,7 +1500,6 @@ UINT32 Oct6100ApiReserveChannelResources(
IN tPOCT6100_CHANNEL_OPEN f_pChannelOpen,
OUT tPOCT6100_API_ECHO_CHAN_INDEX f_pChanIndexConf )
{
tPOCT6100_SHARED_INFO pSharedInfo;
tPOCT6100_CHANNEL_OPEN_TDM pTdmConfig;
tPOCT6100_CHANNEL_OPEN_CODEC pCodecConfig;
@@ -1526,9 +1525,6 @@ UINT32 Oct6100ApiReserveChannelResources(
BOOL fExtToneChanEntry = FALSE;
BOOL fExtToneTsiEntry = FALSE;
BOOL fExtToneMixerEntry = FALSE;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
/* Obtain a local pointer to the configuration structures.*/
pTdmConfig = &f_pChannelOpen->TdmConfig;
@@ -1951,7 +1947,6 @@ UINT32 Oct6100ApiWriteChannelStructs(
UINT32 ulResult;
UINT32 ulDwordAddress;
UINT32 ulDwordData;
BOOL fConversionEnabled = FALSE;
BOOL fProgramAdpcmMem;
UINT32 ulCompType = 0;
UINT32 ulPcmLaw;
@@ -2036,62 +2031,50 @@ UINT32 Oct6100ApiWriteChannelStructs(
break;
case cOCT6100_G726_40KBPS:
ulCompType = 0x3;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_32KBPS:
ulCompType = 0x2;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_24KBPS:
ulCompType = 0x1;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_16KBPS:
ulCompType = 0x0;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_2C_ENCODED:
ulCompType = 0x4;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_3C_ENCODED:
ulCompType = 0x5;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_4C_ENCODED:
ulCompType = 0x6;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_ENCODED:
ulCompType = 0x9;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G726_ENCODED:
ulCompType = 0xA;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_2C_ENCODED:
ulCompType = 0xC;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_3C_ENCODED:
ulCompType = 0xD;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_4C_ENCODED:
ulCompType = 0xE;
fConversionEnabled = TRUE;
break;
default:
return cOCT6100_ERR_FATAL_D4;
@@ -2182,67 +2165,54 @@ UINT32 Oct6100ApiWriteChannelStructs(
break;
case cOCT6100_G726_40KBPS:
ulCompType = 0x3;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_32KBPS:
ulCompType = 0x2;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_24KBPS:
ulCompType = 0x1;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_16KBPS:
ulCompType = 0x0;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_4_1:
ulCompType = 0xD;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_3_2:
ulCompType = 0xA;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_2_3:
ulCompType = 0x6;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_4_0:
ulCompType = 0xE;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_3_1:
ulCompType = 0xB;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_2_2:
ulCompType = 0x7;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_24KBPS_3_0:
ulCompType = 0xC;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_24KBPS_2_1:
ulCompType = 0x8;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_16KBPS_2_0:
ulCompType = 0x9;
fConversionEnabled = TRUE;
break;
default:
@@ -3807,10 +3777,8 @@ UINT32 Oct6100ApiCheckChannelModify(
/* Check the TDM config.*/
if ( f_pChannelModify->fTdmConfigModified == TRUE )
{
tPOCT6100_CHANNEL_MODIFY_TDM pModifyTdm;
tPOCT6100_CHANNEL_OPEN_TDM pOpenTdm;
pModifyTdm = &f_pChannelModify->TdmConfig;
pOpenTdm = &f_pTempChanOpen->TdmConfig;
ulResult = Oct6100ApiCheckTdmConfig( f_pApiInstance,
@@ -4706,7 +4674,6 @@ UINT32 Oct6100ApiModifyChannelStructs(
tOCT6100_WRITE_PARAMS WriteParams;
tPOCT6100_API_CHANNEL_CODEC pApiCodecConf;
tPOCT6100_API_CHANNEL_TDM pApiTdmConf;
tPOCT6100_API_CHANNEL_VQE pApiVqeConf;
UINT32 ulResult;
UINT16 usReadData;
@@ -4717,8 +4684,6 @@ UINT32 Oct6100ApiModifyChannelStructs(
UINT32 ulToneConfIndex;
BOOL fClearPlayoutPointers = FALSE;
BOOL fConversionEnabled = FALSE;
/* Obtain local pointer to shared portion of instance. */
@@ -4740,7 +4705,6 @@ UINT32 Oct6100ApiModifyChannelStructs(
/* Obtain local pointer to the configuration structures of the tPOCT6100_API_CHANNEL structure. */
pApiCodecConf = &pChanEntry->CodecConfig;
pApiTdmConf = &pChanEntry->TdmConfig;
pApiVqeConf = &pChanEntry->VqeConfig;
/*=======================================================================*/
/* Init the RIN and SIN TSST index */
@@ -5090,62 +5054,50 @@ UINT32 Oct6100ApiModifyChannelStructs(
break;
case cOCT6100_G726_40KBPS:
ulCompType = 0x3;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_32KBPS:
ulCompType = 0x2;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_24KBPS:
ulCompType = 0x1;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_16KBPS:
ulCompType = 0x0;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_2C_ENCODED:
ulCompType = 0x4;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_3C_ENCODED:
ulCompType = 0x5;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_4C_ENCODED:
ulCompType = 0x6;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_ENCODED:
ulCompType = 0x9;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G726_ENCODED:
ulCompType = 0xA;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_2C_ENCODED:
ulCompType = 0xC;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_3C_ENCODED:
ulCompType = 0xD;
fConversionEnabled = TRUE;
break;
case cOCT6100_G711_G727_4C_ENCODED:
ulCompType = 0xE;
fConversionEnabled = TRUE;
break;
default:
@@ -5262,67 +5214,54 @@ UINT32 Oct6100ApiModifyChannelStructs(
break;
case cOCT6100_G726_40KBPS:
ulCompType = 0x3;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_32KBPS:
ulCompType = 0x2;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_24KBPS:
ulCompType = 0x1;
fConversionEnabled = TRUE;
break;
case cOCT6100_G726_16KBPS:
ulCompType = 0x0;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_4_1:
ulCompType = 0xD;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_3_2:
ulCompType = 0xA;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_40KBPS_2_3:
ulCompType = 0x6;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_4_0:
ulCompType = 0xE;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_3_1:
ulCompType = 0xB;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_32KBPS_2_2:
ulCompType = 0x7;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_24KBPS_3_0:
ulCompType = 0xC;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_24KBPS_2_1:
ulCompType = 0x8;
fConversionEnabled = TRUE;
break;
case cOCT6100_G727_16KBPS_2_0:
ulCompType = 0x9;
fConversionEnabled = TRUE;
break;
default:
@@ -8885,7 +8824,6 @@ UINT32 Oct6100ApiWriteVqeNlpMemory(
{
tPOCT6100_API_CHANNEL pChanEntry;
tPOCT6100_SHARED_INFO pSharedInfo;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_BUFFER_PLAYOUT_STOP BufferPlayoutStop;
UINT32 ulResult;
UINT32 ulTempData;
@@ -8899,10 +8837,6 @@ UINT32 Oct6100ApiWriteVqeNlpMemory(
pSharedInfo = f_pApiInstance->pSharedInfo;
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/* Obtain a pointer to the new buffer's list entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pChanEntry, f_usChanIndex );
@@ -9856,7 +9790,6 @@ UINT32 Oct6100ApiWriteVqeAfMemory(
{
tPOCT6100_API_CHANNEL pChanEntry;
tPOCT6100_SHARED_INFO pSharedInfo;
tOCT6100_WRITE_PARAMS WriteParams;
UINT32 ulResult;
UINT32 ulTempData;
UINT32 ulAfConfigBaseAddress;
@@ -9868,10 +9801,6 @@ UINT32 Oct6100ApiWriteVqeAfMemory(
pSharedInfo = f_pApiInstance->pSharedInfo;
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/* Obtain a pointer to the new buffer's list entry. */
mOCT6100_GET_CHANNEL_ENTRY_PNT( pSharedInfo, pChanEntry, f_usChanIndex );
@@ -12338,12 +12267,8 @@ UINT32 Oct6100ApiWriteDebugChanMemory(
IN UINT16 f_usRinRoutTsiIndex,
IN UINT16 f_usSinSoutTsiIndex )
{
tPOCT6100_SHARED_INFO pSharedInfo;
UINT32 ulResult;
/* Obtain pointer to local portion of the instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
/*==============================================================================*/
/* Write the VQE configuration of the debug channel. */

View File

@@ -3569,9 +3569,7 @@ UINT32 Oct6100ApiBootSdram(
tPOCT6100_SHARED_INFO pSharedInfo;
tPOCT6100_API_CHIP_CONFIG pChipConfig;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
UINT32 ulResult;
UINT16 usReadData;
UINT16 usWriteData23E;
UINT16 usWriteData230;
UINT32 i;
@@ -3587,11 +3585,6 @@ UINT32 Oct6100ApiBootSdram(
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
ReadParams.pProcessContext = f_pApiInstance->pProcessContext;
ReadParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
ReadParams.pusReadData = &usReadData;
usWriteData23E = 0x0000;
usWriteData230 = 0x0000;
@@ -4995,7 +4988,6 @@ UINT32 Oct6100ApiRunEgo(
OUT PUINT32 f_aulEntry )
{
tPOCT6100_SHARED_INFO pSharedInfo;
tPOCT6100_API_CHIP_CONFIG pChipConfig;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
UINT32 ulResult;
@@ -5008,9 +5000,6 @@ UINT32 Oct6100ApiRunEgo(
/* Get local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
/* Get local pointer to the chip configuration structure. */
pChipConfig = &f_pApiInstance->pSharedInfo->ChipConfig;
/* Set the process context and user chip ID parameters once and for all. */
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
@@ -5210,7 +5199,6 @@ UINT32 Oct6100ApiInitChannels(
tPOCT6100_SHARED_INFO pSharedInfo;
UINT32 i;
UINT32 ulResult;
tOCT6100_WRITE_BURST_PARAMS BurstParams;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
UINT16 usReadData;
@@ -5220,7 +5208,6 @@ UINT32 Oct6100ApiInitChannels(
UINT32 ulFeatureBitOffset;
UINT32 ulFeatureFieldLength;
UINT32 ulMask;
UINT16 ausWriteData[ 4 ];
UINT16 usLoopCount = 0;
UINT16 usWriteData = 0;
UINT16 usMclkRead;
@@ -5235,11 +5222,6 @@ UINT32 Oct6100ApiInitChannels(
WriteParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId;
BurstParams.pProcessContext = f_pApiInstance->pProcessContext;
BurstParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId;
BurstParams.pusWriteData = ausWriteData;
ReadParams.pProcessContext = f_pApiInstance->pProcessContext;
ReadParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId;

View File

@@ -2893,7 +2893,6 @@ UINT32 Oct6100ApiBridgeAddParticipantToChannel(
tPOCT6100_API_CHANNEL pSourceChanEntry;
tPOCT6100_API_CHANNEL pDestinationChanEntry;
tPOCT6100_API_FLEX_CONF_PARTICIPANT pSourceParticipant;
tPOCT6100_API_FLEX_CONF_PARTICIPANT pDestinationParticipant;
tPOCT6100_SHARED_INFO pSharedInfo;
@@ -2914,7 +2913,6 @@ UINT32 Oct6100ApiBridgeAddParticipantToChannel(
mOCT6100_GET_CONF_BRIDGE_ENTRY_PNT( f_pApiInstance->pSharedInfo, pBridgeEntry, f_usBridgeIndex );
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pSourceChanEntry, f_usSourceChannelIndex );
mOCT6100_GET_FLEX_CONF_PARTICIPANT_ENTRY_PNT( f_pApiInstance->pSharedInfo, pSourceParticipant, pSourceChanEntry->usFlexConfParticipantIndex );
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pDestinationChanEntry, f_usDestinationChannelIndex );
mOCT6100_GET_FLEX_CONF_PARTICIPANT_ENTRY_PNT( f_pApiInstance->pSharedInfo, pDestinationParticipant, pDestinationChanEntry->usFlexConfParticipantIndex );
@@ -5069,12 +5067,9 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
tPOCT6100_API_MIXER_EVENT pTempEntry;
tPOCT6100_API_MIXER_EVENT pLoadTempEntry;
tPOCT6100_API_MIXER_EVENT pLastEventEntry;
tPOCT6100_API_MIXER_EVENT pLastLoadOrAccumulateEventEntry;
tPOCT6100_API_CHANNEL pSourceChanEntry;
tPOCT6100_API_CHANNEL pDestinationChanEntry;
tPOCT6100_API_FLEX_CONF_PARTICIPANT pSourceParticipant;
tPOCT6100_API_FLEX_CONF_PARTICIPANT pDestinationParticipant;
tPOCT6100_SHARED_INFO pSharedInfo;
@@ -5083,7 +5078,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
UINT32 ulResult;
UINT32 ulLoopCount;
UINT16 usLastLoadEventIndex;
UINT16 usLoadOrAccumulateEventIndex;
UINT16 usTempEventIndex;
UINT16 usPreviousEventIndex;
@@ -5091,7 +5085,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
UINT16 usReadData;
BOOL fLastEvent = FALSE;
BOOL fSoutCopyEvent = FALSE;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
@@ -5107,8 +5100,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
mOCT6100_GET_CONF_BRIDGE_ENTRY_PNT( f_pApiInstance->pSharedInfo, pBridgeEntry, f_usBridgeIndex );
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pSourceChanEntry, f_usSourceChannelIndex );
mOCT6100_GET_FLEX_CONF_PARTICIPANT_ENTRY_PNT( f_pApiInstance->pSharedInfo, pSourceParticipant, pSourceChanEntry->usFlexConfParticipantIndex );
mOCT6100_GET_CHANNEL_ENTRY_PNT( f_pApiInstance->pSharedInfo, pDestinationChanEntry, f_usDestinationChannelIndex );
mOCT6100_GET_FLEX_CONF_PARTICIPANT_ENTRY_PNT( f_pApiInstance->pSharedInfo, pDestinationParticipant, pDestinationChanEntry->usFlexConfParticipantIndex );
@@ -5127,8 +5118,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
mOCT6100_GET_MIXER_EVENT_ENTRY_PNT( pSharedInfo, pTempEntry, usTempEventIndex );
pLastEventEntry = pLoadEventEntry;
pLastLoadOrAccumulateEventEntry = pLoadEventEntry;
usLastLoadEventIndex = usTempEventIndex;
usLastEventIndex = usTempEventIndex;
while( pTempEntry->usEventType != cOCT6100_MIXER_CONTROL_MEM_SUB_STORE &&
@@ -5224,9 +5213,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
}
}
pLastLoadOrAccumulateEventEntry = pTempEntry;
usLastLoadEventIndex = usTempEventIndex;
/* Go to the next entry into the list. */
usTempEventIndex = pTempEntry->usNextEventPtr;
mOCT6100_GET_MIXER_EVENT_ENTRY_PNT( pSharedInfo, pTempEntry, usTempEventIndex );
@@ -5362,7 +5348,6 @@ UINT32 Oct6100ApiBridgeRemoveParticipantFromChannel(
if ( pTempEntry->usEventType == cOCT6100_MIXER_CONTROL_MEM_COPY )
{
/* No more previous bridges. */
fSoutCopyEvent = TRUE;
}
/* Now modify the previous last Store or Sub-Store or Head-Node event from another bridge/channel. */
@@ -7412,7 +7397,6 @@ UINT32 Oct6100ApiGetPrevLastSubStoreEvent(
IN UINT16 f_usBridgeFirstLoadEventPtr,
OUT PUINT16 f_pusLastSubStoreEventIndex )
{
tPOCT6100_API_CONF_BRIDGE pBridgeEntry;
tPOCT6100_API_MIXER_EVENT pTempMixerEntry;
UINT16 usNextEventPtr;
UINT16 usHeadEventPtr;
@@ -7421,9 +7405,6 @@ UINT32 Oct6100ApiGetPrevLastSubStoreEvent(
UINT16 usCurrentPtr;
UINT32 ulResult = cOCT6100_ERR_OK;
/* Get current entry to obtain the link to the previous entry.*/
mOCT6100_GET_CONF_BRIDGE_ENTRY_PNT( f_pApiInstance->pSharedInfo, pBridgeEntry, f_usBridgeIndex );
/* Since we have flexible bridges, we have to */
/* run down the list and check for the appropriate event. */

View File

@@ -798,7 +798,6 @@ UINT32 Oct6100ApiReadIntrptRegs(
tPOCT6100_API_CHIP_ERROR_STATS pErrorStats;
tPOCT6100_API_INTRPT_MANAGE pIntrptManage;
tOCT6100_READ_PARAMS ReadParams;
tOCT6100_WRITE_PARAMS WriteParams;
UINT32 ulResult;
UINT16 usReadData;
@@ -820,13 +819,6 @@ UINT32 Oct6100ApiReadIntrptRegs(
ReadParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
ReadParams.pusReadData = &usReadData;
/* Set some parameters of write struct. */
WriteParams.pProcessContext = f_pApiInstance->pProcessContext;
WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId;
/* CPU registers. */
if ( (f_ulRegister210h & 0x00001) != 0 )
{
@@ -1296,7 +1288,6 @@ UINT32 Oct6100ApiWriteIeRegs(
{
tPOCT6100_API_INTRPT_MANAGE pIntrptManage;
tOCT6100_WRITE_PARAMS WriteParams;
tOCT6100_READ_PARAMS ReadParams;
UINT32 ulResult;
/* Get some local pointers. */
@@ -1307,12 +1298,6 @@ UINT32 Oct6100ApiWriteIeRegs(
WriteParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId;
/* Set some parameters of read struct. */
ReadParams.pProcessContext = f_pApiInstance->pProcessContext;
ReadParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId;
/*==================================================================================*/
WriteParams.ulWriteAddress = 0x104;
WriteParams.usWriteData = 0x0000;

View File

@@ -175,12 +175,9 @@ UINT32 Oct6100ApiValidateTsst(
{
tPOCT6100_SHARED_INFO pSharedInfo;
tPOCT6100_API_CHIP_CONFIG pChipConfig;
PUINT32 pulTsstAlloc;
/* Obtain local pointer to shared portion of instance. */
pSharedInfo = f_pApiInstance->pSharedInfo;
mOCT6100_GET_TSST_ALLOC_PNT( f_pApiInstance->pSharedInfo, pulTsstAlloc );
/* Obtain local pointer to chip configuration. */
pChipConfig = &pSharedInfo->ChipConfig;

View File

@@ -84,14 +84,12 @@ $Octasic_Revision: 20 $
{ \
PVOID _pProcessContext; \
UINT32 _ulUserChipId; \
UINT32 _ulWriteAddress; \
UINT16 _usWriteData; \
UINT32 _ulWriteLength; \
\
/* Store the data that is to be passed to the user. */ \
_pProcessContext = SmearParams.pProcessContext; \
_ulUserChipId = SmearParams.ulUserChipId; \
_ulWriteAddress = SmearParams.ulWriteAddress; \
_usWriteData = SmearParams.usWriteData; \
_ulWriteLength = SmearParams.ulWriteLength; \
\

View File

@@ -168,7 +168,7 @@ sub gen_channel($$) {
die "missing context for chan #$num type $type" unless $context;
$callerid = ($type eq 'FXO')
? 'asreceived'
: sprintf "\"Channel %d\" <%d>", $num, $exten;
: sprintf "\"Channel %d\" <%04d>", $num, $exten;
if($type eq 'IN') {
$immediate = 'yes';
}
@@ -182,7 +182,7 @@ sub gen_channel($$) {
printf ";;; line=\"%d %s%s%s\"\n", $num, $chan->fqn, $signalling, $info;
printf "signalling=$sig\n";
printf "callerid=$callerid\n";
printf "mailbox=%d\n", $exten unless $type eq 'FXO';
printf "mailbox=%04d\n", $exten unless $type eq 'FXO';
if(defined $group) {
printf "group=$group\n";
}

View File

@@ -1,116 +0,0 @@
package Dahdi::Config::Gen::Freepbxdb;
# Written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
# Copyright (C) 2011, Xorcom
# This program is free software; you can redistribute and/or
# modify it under the same terms as Perl itself.
use strict;
use Socket;
use Dahdi::Config::Gen qw(is_true);
sub new($$$) {
my $pack = shift || die;
my $gconfig = shift || die;
my $genopts = shift || die;
my $self = {
GCONFIG => $gconfig,
GENOPTS => $genopts,
};
bless $self, $pack;
return $self;
}
sub gen_channel($$) {
my $self = shift || die;
my $chan = shift || die;
my $gconfig = $self->{GCONFIG};
my $type = $chan->type;
my $num = $chan->num;
die "channel $num type $type is not an analog channel\n" if $chan->span->is_digital();
my $exten = $gconfig->{'base_exten'} + $num;
my $callerid = sprintf "\"Channel %d\" <%04d>", $num, $exten;
my @cmds = ();
#push @cmds, "database put DEVICE/$exten default_user $exten";
#push @cmds, "database put DEVICE/$exten dial ZAP/$num";
push @cmds, "database put DEVICE/$exten dial DAHDI/$num";
#push @cmds, "database put DEVICE/$exten type fixed";
push @cmds, "database put DEVICE/$exten user $exten";
push @cmds, "database put AMPUSER/$exten device $exten";
push @cmds, "database put AMPUSER/$exten cidname $callerid";
return @cmds;
}
sub generate($) {
my $self = shift || die;
my $gconfig = $self->{GCONFIG};
my $genopts = $self->{GENOPTS};
#$gconfig->dump;
my $ast_sock = '/var/run/asterisk/asterisk.ctl';
my @spans = @_;
my @cmds = ();
warn "Empty configuration -- no spans\n" unless @spans;
print "Configuring FXSs for FreePBX\n" if $genopts->{verbose};
foreach my $span (@spans) {
next if $span->is_digital;
foreach my $chan ($span->chans()) {
next unless ($chan->type eq 'FXS');
push @cmds, $self->gen_channel($chan);
}
}
#open(CMDS,"|$command >/dev/null") or
socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!";
connect(SOCK, sockaddr_un($ast_sock)) ||
die "$0: Freepbxdb: Failed connecting to $ast_sock\n: $!";
foreach (@cmds) {
# Note: commands are NULL-terminated:
print SOCK "$_\0";
sleep 0.001;
}
close(SOCK) or
die "$0: Freepbxdb: Failed sending commands ($ast_sock): $!\n";
}
1;
__END__
=head1 NAME
freepbxdb - Generate astdb configuration required by FreePBX
=head1 SYNOPSIS
use Dahdi::Config::Gen::Freepbxdb;
my $cfg = new Dahdi::Config::Gen::Freepbxdb(\%global_config, \%genopts);
$cfg->generate(@span_list);
=head1 DESCRIPTION
Updates the Asterisk DB entries for FXS channels detected. Requires
Asterisk running.
The configuration generated here bypasses FreePBX's standard configuration
and allows using a simple dialplan snippet such as:
[from-internal-custom](+)
exten => _4XXX,1,Dial(DAHDI/${EXTEN:1})
This may come in handy in testing. At least until FreePBX will provide a
simple automated interface to do the same.
=head1 OPTIONS
None, so far.
=head1 FILES
=over
=item C</var/run/asterisk/asterisk.sock>
The socket to which commands are sent. FIXME: make this a parameter.
=back

View File

@@ -30,7 +30,7 @@ sub get_sorted_xbuses(@) {
my @sorted_xbuses;
foreach my $xbus (@xbuses) {
my $last_spanno;
foreach my $xpd (Dahdi::Xpp::Xpd::telephony_devs($xbus->xpds())) {
foreach my $xpd ($xbus->xpds) {
my $spanno = $xpd->spanno;
if(!$spanno) {
printf STDERR "%s: Is not registered. Skipping.\n", $xpd->fqn;

View File

@@ -133,7 +133,7 @@ my %pci_ids = (
'0b0b:0105' => { DRIVER => 'r1t1', DESCRIPTION => 'Rhino R1T1' },
'0b0b:0205' => { DRIVER => 'r4fxo', DESCRIPTION => 'Rhino R14FXO' },
'0b0b:0206' => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB4FXO 4-channel FXO analog telphony card' },
'0b0b:0305' => { DRIVER => 'rxt1', DESCRIPTION => 'Rhino R4T1' },
'0b0b:0305' => { DRIVER => 'r1t1', DESCRIPTION => 'Rhino R1T1' },
'0b0b:0405' => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino R8FXX' },
'0b0b:0406' => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB8FXX 8-channel modular analog telphony card' },
'0b0b:0505' => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino R24FXX' },
@@ -203,7 +203,7 @@ sub scan_devices($) {
$pci_devs{$name}{DRIVER} = '';
}
while(<$Dahdi::sys_base/bus/pci/drivers/*/[0-9]*>) {
while(</sys/bus/pci/drivers/*/[0-9]*>) {
m,^(.*?)/([^/]+)/([^/]+)$,;
my $prefix = $1;
my $drvname = $2;

View File

@@ -34,6 +34,7 @@ my %usb_ids = (
'e4e4:1161' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-modular USB-firmware' },
'e4e4:1162' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-modular FPGA-firmware' },
'e4e4:1163' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-TwinStar monitor' },
'e4e4:1164' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-EEPROM burner' },
# Sangoma USB FXO:
'10c4:8461' => { DRIVER => 'wanpipe', DESCRIPTION => 'Sangoma WANPIPE USB-FXO Device' },
@@ -183,7 +184,6 @@ sub scan_devices($) {
my @lines = split(/\n/);
my ($tline) = grep(/^T/, @lines);
my ($pline) = grep(/^P/, @lines);
my ($dline) = grep(/^I/, @lines);
my ($sline) = grep(/^S:.*SerialNumber=/, @lines);
my ($busnum,$devnum) = ($tline =~ /Bus=(\w+)\W.*Dev#=\s*(\w+)\W/);
my $devname = sprintf("%03d/%03d", $busnum, $devnum);
@@ -194,10 +194,6 @@ sub scan_devices($) {
$serial = $1;
#$serial =~ s/[[:^print:]]/_/g;
}
my $loaded;
if ($dline =~ /Driver=(\w+)/) {
$loaded = $1;
}
my $model = $usb_ids{"$vendor:$product"};
next unless defined $model;
my $d = Dahdi::Hardware::USB->new(
@@ -208,7 +204,6 @@ sub scan_devices($) {
SERIAL => $serial,
DESCRIPTION => $model->{DESCRIPTION},
DRIVER => $model->{DRIVER},
LOADED => $loaded,
);
push(@devices, $d);
}

View File

@@ -144,7 +144,7 @@ my @pri_strings = (
'Wildcard TE120P', # wcte12xp
'Wildcard TE121', # wcte12xp
'Wildcard TE122', # wcte12xp
'T[248]XXP \(PCI\) Card ', # wct4xxp
'T[24]XXP \(PCI\) Card ', # wct4xxp
'R[24]T1 \(PCI\) Card', # rxt1
'Rhino R1T1 (E1)/PRA Card', # r1t1
'Rhino R1T1 (T1)/PRI Card', # r1t1

View File

@@ -29,14 +29,53 @@ set -e
# For lab testing
mydir=`dirname $0`
PATH="${mydir}:${PATH}"
XPP_WAIT_AB_TIMEOUT=80
XPP_WAIT_AB_TIMEOUT=100
[ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf
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,/[^/]*$,,' || :
}
ab_serial_nums() {
ab_list | \
sed 's,$,/serial,' | \
xargs grep -H '' 2>/dev/null | \
sed 's,.*/serial:,,' | \
sed 's/^$/NO-SERIAL/' | \
sort -u
}
detected_serial_nums() {
cat /sys/bus/astribanks/devices/*/transport/serial 2> /dev/null | \
sed 's/^$/NO-SERIAL/' | \
sort -u || :
}
calc_union() {
echo "$@" | tr -s ' ' '\n' | sort -u
}
detected_ab_list() {
# Only check /sys info (don't use /proc anymore).
ab=`find /sys/bus/astribanks/devices/xbus-*/ -name waitfor_xpds 2> /dev/null || :`
echo $ab
find /sys/bus/astribanks/devices/*/ -name waitfor_xpds 2> /dev/null || :
}
waitfor_ab_initialization() {
oldab=''
while
if ! ab=`detected_ab_list`; then
exit 1
fi
test "$oldab" != "$ab"
do
oldab="$ab"
cat $ab
#echo -n 1>&2 "_"
done
}
# Any hardware?
@@ -55,10 +94,25 @@ if ! astribank_is_starting; then
exit 0
fi
# Wait for driver and first device
serial_nums=`ab_serial_nums`
# Loop until detected (hopefully) all astribanks and they are initialized
echo -n 1>&2 "Astribanks detection "
tries="$XPP_WAIT_AB_TIMEOUT"
while [ ! -e "/sys/bus/astribanks/devices/xbus-00" ]
last_detected=0
while
new_serial_nums=`ab_serial_nums`
detected_serial_nums=`detected_serial_nums`
curr_union=`calc_union $curr_union $serial_nums $new_serial_nums`
num_detected=`detected_ab_list | wc -l`
if [ "$num_detected" != "$last_detected" ]; then
# Visual feedback (number of detected AB so far)
echo -n 1>&2 "[$num_detected]"
last_detected="$num_detected"
waitfor_ab_initialization > /dev/null
fi
# Break only when we have something and it's stable
test "$curr_union" != "$detected_serial_nums" -o "$detected_serial_nums" = ''
do
if [ "$tries" -le 0 ]; then
echo 1>&2 "TIMEOUT"
@@ -67,21 +121,15 @@ do
echo -n 1>&2 "."
sleep 1
: $((tries-=1))
serial_nums="$new_serial_nums"
done
# Finished: Show a nice output
echo ""
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"
while
if ! ab=`ab_list`; then
exit 1
fi
test "$oldab" != "$ab"
do
oldab="$ab"
cat $ab
done
if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then
if [ "$CALLED_FROM_ATRIBANK_HOOK" = '' ]; then
# Now we can wait until the hotplug run would remove the semaphore

View File

@@ -56,7 +56,7 @@ else
fi
debug() {
[ "$DEBUG" != "" ] && $LOGGER "$@"
[ "$DEBUG" != "" ] && echo >&2 "$@"
return 0
}
@@ -104,10 +104,10 @@ find_dev() {
run_fxload() {
sleep_if_race
fxload -t fx2 $* 2>&1 1>/dev/null | $LOGGER
fxload -t fx2 $* 2>&1 1>/dev/null
status=$PIPESTATUS
if [ $status != 0 ]; then
$LOGGER "fxload failed with status $status"
echo >&2 "fxload failed with status $status"
exit 55
fi
}
@@ -240,20 +240,20 @@ usb_firmware_device() {
run_astribank_hexload() {
debug "Running: $ASTRIBANK_HEXLOAD $*"
$ASTRIBANK_HEXLOAD "$@" | $LOGGER
$ASTRIBANK_HEXLOAD "$@"
status=$PIPESTATUS
if [ $status != 0 ]; then
$LOGGER "$ASTRIBANK_HEXLOAD failed with status $status"
echo >&2 "$ASTRIBANK_HEXLOAD failed with status $status"
exit 77
fi
}
run_astribank_tool() {
debug "Running: $ASTRIBANK_TOOL $*"
$ASTRIBANK_TOOL "$@" | $LOGGER
$ASTRIBANK_TOOL "$@"
status=$PIPESTATUS
if [ $status != 0 ]; then
$LOGGER "$ASTRIBANK_TOOL failed with status $status"
echo >&2 "$ASTRIBANK_TOOL failed with status $status"
exit 77
fi
}
@@ -385,7 +385,7 @@ wait_renumeration() {
}
fpga_firmware_all_devices() {
echo "Loading FPGA firmwares" | $LOGGER
echo "Loading FPGA firmwares"
devs=`filter_devs 'e4e4/11[3456]1/*'`
n=`echo "$devs" | wc -l`
echo "$devs" | (
@@ -395,14 +395,14 @@ fpga_firmware_all_devices() {
sleep 1
echo "Wait for FPGA loading processes"
wait
) 2>&1 | $LOGGER
)
wait_renumeration $numdevs 'e4e4/11[3456]2/*' "fpga_firmware_device"
}
reset_fpga() {
devices=`filter_devs 'e4e4/11[3456][124]/*'`
totaldevs=`numdevs 'e4e4/11[3456][124]/*'`
$LOGGER -- "Reseting devices [$totaldevs devices]"
echo >&2 -- "Reseting devices [$totaldevs devices]"
echo "$devices" | grep -v '^$' | while read id_str dev
do
(
@@ -461,15 +461,15 @@ list)
;;
xppdetect|load|usb)
numdevs=`numdevs 'e4e4/11[3456][0134]/*'`
$LOGGER -- "--------- FIRMWARE LOADING: ($1) [$numdevs devices]"
echo >&2 -- "--------- FIRMWARE LOADING: ($1) [$numdevs devices]"
usb_firmware_all_devices 2>&1 | $LOGGER
usb_firmware_all_devices
if [ "$1" != 'usb' ]
then
fpga_firmware_all_devices
fi
$LOGGER -- "--------- FIRMWARE IS LOADED"
echo >&2 -- "--------- FIRMWARE IS LOADED"
exit 0
;;
recover-sb)
@@ -524,18 +524,18 @@ udev_delayed_load() {
sleep 1
done
if [ $usb_dev_writable != 1 ]; then
$LOGGER "Device $DEVICE not writable. Can't load firmware."
echo >&2 "Device $DEVICE not writable. Can't load firmware."
return;
fi
$LOGGER "Trying to find what to do for product $PRODUCT, device $DEVICE"
echo >&2 "Trying to find what to do for product $PRODUCT, device $DEVICE"
case "$PRODUCT" in
4b4/8613/*)
# This case is for a potentially-broken Astribank.
# In most systems you should not set udev rules for those to
# get here, as this is actually the ID of a Cypress dev-kit:
FIRM_USB="$FIRMWARE_DIR/$USB_RECOV"
$LOGGER "Loading recovery firmware '$FIRM_USB' into '$DEVICE'"
echo >&2 "Loading recovery firmware '$FIRM_USB' into '$DEVICE'"
run_fxload -D "$DEVICE" -I "$FIRM_USB"
;;
e4e4/11[3456]0/*|e4e4/1163/*)

View File

@@ -243,16 +243,17 @@ static int send_command(struct xtalk_device *xtalk_dev, struct xtalk_command *cm
{
int ret;
int len;
char *buf;
void *priv = xtalk_dev->transport_priv;
len = cmd->header.len;
cmd->header.seq = xtalk_dev->tx_sequenceno;
buf = (char *)cmd;
//printf("%s: len=%d\n", __FUNCTION__, len);
#if 0
extern FILE *fp;
char *buf;
buf = (char *)cmd;
if(fp) {
int i;