[zaptel-commits] tzafrir: branch 1.2 r2475 - in /branches/1.2: ./
xpp/ xpp/firmwares/ xpp/util...
zaptel-commits at lists.digium.com
zaptel-commits at lists.digium.com
Sun Apr 29 13:19:13 MST 2007
Author: tzafrir
Date: Sun Apr 29 15:19:13 2007
New Revision: 2475
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2475
Log:
xpp rev. 3814:
* Protocol no. 2.6: syncing improvements.
* Support for 8-port Astribank BRI.
* Firmware unloading now works:
rmmod xpp_usb; /etc/hotplug/usb/xpp_fxloader reset
* Defaults of kernel parameters are now part of parameter description.
* World-readable kernel parameters.
* No need for extra patch beyond bristuff for Astribank BRI.
* Default poll intervals changed: 500 in BRI and FXO.
* Allow changing FXS polls interval at run time.
* BRI initalization fixed on SUSE (path to logger).
* When using the SUSE zaptel rpm package, set modules_var=ZAPTEL_MODULES in
/etc/sysconfig/zaptel .
* zt_registration not verbose by default.
* xpp_sync warns if FXO is sync slave.
* Fixed genzaptelconf -z (zapscan output emulation).
* PCM fixes.
* Solves "multiple ticks" bug. No need for pcm_tasklets workaround.
Added:
branches/1.2/xpp/ChangeLog (with props)
branches/1.2/xpp/utils/xpp_blink (with props)
Removed:
branches/1.2/xpp/utils/adj_clock.8
branches/1.2/xpp/utils/adj_clock.c
Modified:
branches/1.2/Makefile
branches/1.2/xpp/.version
branches/1.2/xpp/README.Astribank
branches/1.2/xpp/calibrate_slics
branches/1.2/xpp/card_bri.c
branches/1.2/xpp/card_fxo.c
branches/1.2/xpp/card_fxs.c
branches/1.2/xpp/card_global.c
branches/1.2/xpp/card_global.h
branches/1.2/xpp/firmwares/FPGA_1141.hex
branches/1.2/xpp/firmwares/FPGA_1151.hex
branches/1.2/xpp/firmwares/FPGA_FXS.hex
branches/1.2/xpp/firmwares/USB_1130.hex
branches/1.2/xpp/firmwares/USB_1140.hex
branches/1.2/xpp/firmwares/USB_1150.hex
branches/1.2/xpp/init_card_6_26
branches/1.2/xpp/init_card_7_26
branches/1.2/xpp/utils/Makefile
branches/1.2/xpp/utils/fpga_load.8
branches/1.2/xpp/utils/fpga_load.c
branches/1.2/xpp/utils/genzaptelconf
branches/1.2/xpp/utils/genzaptelconf.8
branches/1.2/xpp/utils/hexfile.c
branches/1.2/xpp/utils/hexfile.h
branches/1.2/xpp/utils/lszaptel
branches/1.2/xpp/utils/xpp_fxloader
branches/1.2/xpp/utils/xpp_sync
branches/1.2/xpp/utils/zconf/Zaptel.pm
branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm
branches/1.2/xpp/utils/zconf/Zaptel/Span.pm
branches/1.2/xpp/utils/zconf/Zaptel/Xpp.pm
branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
branches/1.2/xpp/utils/zt_registration
branches/1.2/xpp/xbus-core.c
branches/1.2/xpp/xpd.h
branches/1.2/xpp/xpp_usb.c
branches/1.2/xpp/xpp_zap.c
branches/1.2/xpp/xpp_zap.h
branches/1.2/xpp/xproto.c
branches/1.2/xpp/xproto.h
branches/1.2/zaptel.init
Modified: branches/1.2/Makefile
URL: http://svn.digium.com/view/zaptel/branches/1.2/Makefile?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/Makefile (original)
+++ branches/1.2/Makefile Sun Apr 29 15:19:13 2007
@@ -142,10 +142,14 @@
LIBTONEZONE_SO_MAJOR_VER:=1
LIBTONEZONE_SO_MINOR_VER:=0
+MANDIR = /usr/share/man/man8
+MAN_PAGES_BASE = ztcfg
BINS=ztcfg torisatool makefw ztmonitor ztspeed zttest fxotune
ifneq (,$(wildcard /usr/include/newt.h))
BINS+=zttool
-endif
+MAN_PAGES_BASE += zttool
+endif
+MAN_PAGES = $(MAN_PAGES_BASE%=doc/%.8)
ifeq ($(BUILDVER),linux24)
all: prereq $(MODULESO) wct4xxp/wct4xxp.o $(BINS) $(LIBTONEZONE_SO)
@@ -354,6 +358,9 @@
install -D -m 755 sethdlc $(INSTALL_PREFIX)/sbin/sethdlc ; \
fi
if [ -f zttool ]; then install -D -m 755 zttool $(INSTALL_PREFIX)/sbin/zttool; fi
+ install -d $(INSTALL_PREFIX)$(MANDIR)
+ install -m 644 $(MAN_PAGES) $(INSTALL_PREFIX)$(MANDIR)
+ exit 1
ifeq ($(BUILDVER),linux26)
for x in $(MODULESKO); do \
rm -f $(INSTALL_PREFIX)/lib/modules/$(KVERS)/extra/$$x ; \
Modified: branches/1.2/xpp/.version
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/.version?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/.version (original)
+++ branches/1.2/xpp/.version Sun Apr 29 15:19:13 2007
@@ -1,1 +1,1 @@
-trunk-r3495
+trunk-r3814
Added: branches/1.2/xpp/ChangeLog
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/ChangeLog?view=auto&rev=2475
==============================================================================
--- branches/1.2/xpp/ChangeLog (added)
+++ branches/1.2/xpp/ChangeLog Sun Apr 29 15:19:13 2007
@@ -1,0 +1,56 @@
+Thu, 19 Apr 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3814
+ * No need for extra patch beyond bristuff for Astribank BRI.
+ * Protocol no. 2.6: syncing improvements.
+ * Default poll intervals changed: 500 in BRI and FXO.
+ * Allow changing FXS polls interval at run time.
+ * BRI initalization fixed on SUSE (path to logger).
+ * When using the SUSE zaptel rpm package, set modules_var=ZAPTEL_MODULES in
+ /etc/sysconfig/zaptel .
+ * zt_registration not verbose by default.
+ * xpp_sync warns if FXO is sync slave.
+ * Extra PCM metrics data in /proc/xpp/XBUS-NN/summary .
+ * Extra USB metrics data in /proc/xpp/XBUS-NN/usb_info .
+
+Wed, 11 Apr 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3768
+ * Removed "go away" notice and solved sync of a restarted device.
+ * Resetting firmware: rmmod xpp_usb; /etc/hotplug/usb/xpp_fxloader reset
+ * Perl modules use strict.
+ * genzaptelconf -F will not generate zapata configuration for NT spans.
+ * genzaptelconf uses perl utilities to start.
+ * Initial support for 2nd XHFC (BRI) chip.
+
+Sun, 1 Apr 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3712
+ * New protocol version (2.5).
+ * Luckily firmware unloading now works.
+ * Solves "multiple ticks" bug. No need for pcm_tasklets workaround.
+ * genzaptelconf -z will generate zapscan.conf for the asterisk-gui.
+ * Fixed hardware detection for the BRI.
+
+Wed, 14 Mar 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3608
+ * Initial verssion of firmware unloading.
+ * PCM bugfixes.
+ * Defaults of kernel parameters are now part of parameter description.
+ * Removed zaptel sync code for now.
+ * genzaptelconf will detect vzaphfc.
+ * genzaptelconf defaults to ptmp for BRI.
+ * Documentation updates.
+
+Mon, 26 Feb 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3517
+ * genzaptelconf now uses ls for FXS lines by default .
+ * World-readable kernel parameters.
+
+Thu, 22 Feb 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3440
+ * /proc/xpp/sync: 'm 0' is, while depracated, can still be used.
+ * New firmware with PCM improvements.
+ * Improvements to the xpp helper scripts.
+ * Bug fixes.
+ * zaptel/perl is now installed by xpp/utils/Makefile.
+
+Wed, 14 Feb 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3365
+ * Kewlstart support on the FXS ports (already existed on the FXO ports).
+ * The format of /proc/xpp/sync has changed (still self-documented).
+ * Better notification of FXS lines that were off-hook on registration time.
+ * Parallel polling of Astribanks (faster startup when there are multiple
+ devices)
+ * zconf: scripts and perl modules to automate the work with Zaptel and the
+ Astribank. Current scripts: zt_registration, xpp_sync.
Propchange: branches/1.2/xpp/ChangeLog
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/1.2/xpp/ChangeLog
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: branches/1.2/xpp/ChangeLog
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: branches/1.2/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/README.Astribank?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/README.Astribank (original)
+++ branches/1.2/xpp/README.Astribank Sun Apr 29 15:19:13 2007
@@ -35,6 +35,12 @@
make -C xpp/utils install
+Though this should be done automatically on zaptel >= 1.4.1 .
+
+Also consider editing xpp/utils/Makefile and removing the commant before
+the line that begins with PERLLIBDIR. This will install some perl modules
+and utilities that will help you with the usage of the Astribank.
+
Alternatively, do the following manually:
All firmware files should be copied to a new directory:
@@ -43,26 +49,45 @@
The xpp_fxloader and xpp_fxloader.usermap should be copied to:
/etc/hotplug/usb/
-In addition, the file xpp/xpp_modprobe contains optional modprobe settings.
-It may be copied verbatim into /etc/modprobe.conf or (better) copied to
-/etc/modprobe.d/ .
-
-
Note that loading through udev is not yet provided. Run
/etc/hotplug/usb/xpp_fxloader load
to load firmware.
-The FXS calibration script requires the perl module Time::HiRes. This
-modules is already packaged for most distributions including Debian, Fedora,
-RedHat and CentOS. To test for the existance of this module run:
- perl -MTime::HiRes -e ''
-
-This should run cleanly (without output) if the module exists and issue
-a long error message otherwise. At least in RedHat, CentOS and Fedora-2
-until Fedora-5 it is in a package named perl-Time-HiRes. In Debian and
-Fedora-6 it is bundled with perl.
+LEDs Indication:
+"""""""""""""""
+The Astribank has 4 global indication leds and one or two per-port leds.
+In the Astribank 16 and in the Astribank BRI (USB product IDs 113x and
+114x, respectively) the indication leds will normally be in the side.
+
+In the 1U models (USB product IDs 115x) the indication leds will normally
+be the first (leftmost) red leds of the device. Don't mistake them for
+per-port leds.
+
+The first led is the "Power" led. It is lit if the unit gets power.
+The second led is the "Active" led, which is lit when there is there at
+least one "active" (in a call / off-hook, though the meaning of this is
+different in BRI).
+The last led is called "Hardware OK", but is actually only lit if the
+hardware is not OK.
+
+The third led is the "Sync" led. If it blinks, the device is in sync
+with the driver on the computer. If the device is the synchronization
+source for all the Astribank devices it will blink a quick single blink.
+If the device gets synchronization from the driver, it will blink in a
+more steady blink.
+
+"Double blink" indicates that the unit has an FXO module, and still is
+getting synchronization from the computer, and does not provide
+synchronization.
+
+The per-port green led on analog (both FXS and FXO) indicate that the
+port is off-hook.
+
+On the BRI, the green led blinks when the port is TE and has layer-1
+connectivity to the other party, and the orange led blinks when the unit
+is in NT mode and has layer-1 connectivity to the other party.
DEVICE STARTUP:
@@ -180,6 +205,13 @@
the FPGA firmware.
+Firmware Resetting (Experimental):
+"""""""""""""""""""""""""""""""""
+Newer versions of the USB firmware can now be reset using 'fpga_load -r'.
+This will only work when the device is not used by the driver, so you may
+need to 'rmmod xpp_usb' in order to reset the firmware.
+
+
Loading The Modules:
"""""""""""""""""""
Here is what should happen:
@@ -234,9 +266,10 @@
hardwiring those values in the driver itself would not be a good idea.
before registering a XPD as a span in Zaptel, we run an initialization
-script: /usr/share/zaptel/initialize_registers . If this fails (e.g:
-because the script is not there, or is not executable), you will get an
-error message in the logs [FIXME: quote error message] that the
+script: /usr/share/zaptel/init_card_N_MM (N is 3 for an FXS span and 4
+for an FXO span, MM is a version number, and currently stands at 24).
+If this fails (e.g: because the script is not there, or is not
+executable), you will get an error message in the logs that the
invocation has failed. The XPD will then be removed (you won't see that
a directory for that XPD under the relevant /proc/xpp/XBUS-* directory)
and not be registered with Zaptel.
@@ -257,6 +290,8 @@
to disable automatic registration at startup. You will then need to
register the spans manually.
+For your convenience the command zt_registration
+
SAMPLE CONFIGURATIONS:
""""""""""""""""""""""
@@ -271,6 +306,24 @@
fxoks=1-14
fxsks=15-22
+
+ Astribank 4 BRI
+ # Assumed ports settings:
+ # Ports 1,3: TE
+ # Ports 2,4: NT
+ span=1,1,1,ccs,ami
+ span=2,0,1,ccs,ami
+ span=3,2,1,ccs,ami
+ span=4,0,1,ccs,ami
+ bchan=1-2
+ dchan=3
+ bchan=4-5
+ dchan=6
+ bchan=7-8
+ dchan=9
+ bchan=10-11
+ dchan=12
+
/etc/asterisk/zapata.conf
@@ -286,11 +339,11 @@
channel => 1-8
; output ports:
- context=astribank-outputs
+ context=astbank-outputs
channel => 9-10
; input ports:
immediate=yes
- context=astribank-inputs
+ context=astbank-inputs
channel => 11-14
immediate=no
@@ -306,11 +359,11 @@
channel => 1-8
; output ports:
- context=astribank-outputs
+ context=astbank-outputs
channel => 9-10
; input ports:
immediate=yes
- context=astribank-inputs
+ context=astbank-inputs
channel => 11-14
immediate=no
@@ -319,6 +372,37 @@
context=from-pstn
callerid=asreceived
channel => 15-22
+
+ Astribank 4 BRI:
+
+ ; Assumed ports settings:
+ ; Ports 1,3: TE
+ ; Ports 2,4: NT
+ [channels]
+ switchtype = euroisdn
+ callerid = asreceived
+
+ ; TE ports:
+ signalling = bri_cpe_ptmp
+ ;signalling = bri_cpe
+ context = from-pstn
+ group = 1,11
+ channel => 1,2
+
+ group = 1,13
+ channel => 7,8
+
+ ; NT ports:
+ signalling = bri_cpe_ptmp
+ ;signalling = bri_cpe
+ context = from-pstn
+ group = 2,12
+ channel => 1,2
+
+ group = 2,14
+ channel => 7,8
+
+
See also the output of genzaptelconf for examples of mailbox and
callerid, and for channel numbers that will match your specific settings.
@@ -345,25 +429,28 @@
13 XPP_IN/0-12 FXOKS (In use)
14 XPP_IN/0-13 FXOKS (In use)
-Sample dialplan (extentions.conf) for all the above:
+Sample dialplan (extensions.conf) for all the above:
[phones-zap]
; 401 will dial to channel 1, 420, to zaptel channel 20, etc.
exten => _4XX,1,Dial(ZAP/${EXTEN:1})
-[trunk-9]
-; Dial through the first FXO port availble.
-; This assumes that all FXO ports are in group 0 and all others are not,
-; as in the sample zapata.conf for 8FXS/8FXO below, and as is generated
-; by genzaptelconf by default.
-exten => 9.,Dial(Zap/g0/${EXTEN:1})
-
+[trunk]
+; A number that begins with 9: dial it through a trunk
+; (we put FXO channels and TE channels in group 0).
+; The leading 9 is stripped.
+exten => _9.,1,Dial(Zap/g0/${EXTEN:1})
+; dialing a number that begins with 81 will dial it through
+; span 1, etc. The two leading digits are stripped.
+; (Each digital span is also added to group 10+span number ).
+exten => _8X.,1,Dial(Zap/g1${EXTEN:1:1}/${EXTEN:2})
+
[from-internal]
; The context of FXS ports: analog phones.
; They are allowed to dial to all other phones
include => phones-zap
; They are also allowed to call through the trunk:
-include => trunk-9
+include => trunk
[from-pstn]
; Calls from the PSTN enter here. Redirect calls to an IVR
@@ -371,7 +458,7 @@
; redirect calls to Zaptel channel 1:
exten => s,1,Dial(Zap/1)
-[astribank-inputs]
+[astbank-inputs]
exten => s,1,Set(ZAP_CHAN=Cut(${CHANNEL},-,1))
exten => s,n,Set(ZAP_CHAN=Cut(${ZAP_CHAN},/,2))
; 11 is the number of the first input port. At least in the sample
@@ -382,7 +469,7 @@
; Alternatively:
;exten => s,n,System(run something)
-; No. We did not forget the context astribank-outputs. Output
+; No. We did not forget the context astbank-outputs. Output
; ports only get calls from the PBX. Thus they don't need a context
; of their own.
@@ -404,16 +491,22 @@
source. Host-synchronization is currently the default but for better
sound quality you should synchronize from the Astribank.
-/proc/xpp/XBUS-n gives information about device number n (starting from
-0). under it, /proc/XBUS-n/XPD-m gives information regarding span number
+/proc/xpp/XBUS-nn gives information about device number nn (starting from
+00). under it, /proc/XBUS-nn/XPD-mm gives information regarding span number
m in that device.
-/proc/xpp/XBUS-n/XPD-m/zt_registration is a read-write file for
+/proc/xpp/XBUS-nn/XPD-mm/zt_registration is a read-write file for
manually registering/unregistering the span with Zaptel. A span will
register automatically when generated, though. Span unregistration may
fail if some channels from the span are used (e.g: by Asterisk).
Registration is by writing 1 and unregistration is by writing 0 to the
file.
+
+ watch -n1 cat /proc/xpp/XBUS-00/XPD-00/summary
+
+This shows which ports are off-hook, which are ringing, etc. It also
+shows the current audio sample in both direction, which is useful to
+see if there is something going at all.
(There are a bunch of other status files under /proc/xpp/ )
Modified: branches/1.2/xpp/calibrate_slics
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/calibrate_slics?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/calibrate_slics (original)
+++ branches/1.2/xpp/calibrate_slics Sun Apr 29 15:19:13 2007
@@ -5,7 +5,6 @@
#
use strict;
-use Time::HiRes qw (time alarm sleep);
my $SlicsFile = "$ENV{XPP_BASE}/$ENV{XPD_BUS}/$ENV{XPD_NAME}/slics";
@@ -21,6 +20,11 @@
$debug = 1;
}
+sub mysleep($) {
+ my $timeout = shift;
+ select(undef,undef,undef,$timeout);
+}
+
sub logger($) {
print STDERR "LOG: @_\n";
system("logger @_");
@@ -37,7 +41,7 @@
die("Failed writing to slics file $SlicsFile");
print SLICS $write_str;
close(SLICS);
- sleep(0.001);
+ mysleep(0.001);
}
@@ -48,7 +52,7 @@
write_to_slic_file(
sprintf("%d R%s %02X", $read_slic, $direct, $read_reg));
- sleep(0.001);
+ mysleep(0.001);
open(SLICS,$SlicsFile) or
die("Failed reading from slics file $SlicsFile");
#awk '/^SLIC_REPLY:/{print $5}' $SLICS | cut -dx -f2
@@ -214,7 +218,7 @@
# start calibration:
my $calibration_in_progress = 1;
write_reg(31, $write_reg, 'D', 0x1F);
- sleep $ManualCalibrationSleepTime;
+ mysleep $ManualCalibrationSleepTime;
# wait until all slics have finished calibration, or for timeout
while ($calibration_in_progress) {
@@ -231,7 +235,7 @@
}
debug($debug_calib_str);
# TODO: unnecessary sleep in the last round:
- sleep $ManualCalibrationSleepTime;
+ mysleep $ManualCalibrationSleepTime;
}
}
@@ -254,8 +258,10 @@
);
# wait until all slics have finished calibration, or for timeout
- my $end_time=time() + 2;
- my $timeout=0;
+ my $sleep_cnt = 0;
+ # time periods in seconds:
+ my $sleep_time = 0.1;
+ my $timeout_time = 2;
CALIB_LOOP: for my $slic (@SlicNums) {
debug("checking slic $slic");
while(1) {
@@ -264,14 +270,13 @@
debug("slic $slic calibrated");
last;
}
- my $time=time();
- if ( $time > $end_time) {
- $timeout=1;
- debug("Exiting on timeout: $end_time < $time.");
+ if ( $sleep_cnt > $timeout_time/$sleep_time) {
+ debug("Auto Calibration: Exiting on timeout: $timeout_time.");
last CALIB_LOOP;
}
debug("auto_calibrate not done yet: slic #$slic\n");
- sleep(0.1);
+ mysleep(0.1);
+ $sleep_cnt++;
}
}
#log_calib_params();
Modified: branches/1.2/xpp/card_bri.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_bri.c?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/card_bri.c (original)
+++ branches/1.2/xpp/card_bri.c Sun Apr 29 15:19:13 2007
@@ -40,8 +40,8 @@
#error CONFIG_ZAPATA_BRI_DCHANS is not defined
#endif
-DEF_PARM(int, print_dbg, 0, 0600, "Print DBG statements"); /* must be before zap_debug.h */
-DEF_PARM(uint, poll_interval, 100, 0600, "Poll channel state interval in milliseconds (0 - disable)");
+DEF_PARM(int, print_dbg, 0, 0644, "Print DBG statements"); /* must be before zap_debug.h */
+DEF_PARM(uint, poll_interval, 500, 0644, "Poll channel state interval in milliseconds (0 - disable)");
enum xhfc_states {
ST_RESET = 0, /* G/F0 */
@@ -129,6 +129,8 @@
byte reg;
} su_rd_sta_t;
+#define REG30_LOST 3 /* in polls */
+
#define BRI_DCHAN_SIGCAP ( \
ZT_SIG_EM | \
ZT_SIG_CLEAR | \
@@ -165,6 +167,15 @@
BRI_LED_BLINK_FAST = 0x3 /* 1/4 a second blink cycle */
};
+#define LED_STATE_NAME(x) [ BRI_ ## x ] = #x
+static const char *led_state_names[] = {
+ LED_STATE_NAME(LED_OFF),
+ LED_STATE_NAME(LED_ON),
+ LED_STATE_NAME(LED_BLINK_SLOW),
+ LED_STATE_NAME(LED_BLINK_FAST),
+};
+#undef LED_STATE_NAME
+
enum bri_led_names {
GREEN_LED = 0,
RED_LED = 1
@@ -194,7 +205,7 @@
int t4; /* timer 4 for deactivation */
ulong l1_flags;
bool reg30_good;
- ulong last_reg30_reply;
+ uint reg30_ticks;
/*
* D-Chan: buffers + extra state info.
@@ -225,7 +236,7 @@
static /* 0x0F */ DECLARE_CMD(BRI, REGISTER_REQUEST, byte chipsel, bool writing, bool do_subreg, byte regnum, byte subreg, byte data_low, byte data_high);
#define DEBUG_BUF_SIZE (100)
-static void dump_hex_buf(xpd_t *xpd, char *msg, byte *buf, int len)
+static void dump_hex_buf(xpd_t *xpd, char *msg, byte *buf, size_t len)
{
char debug_buf[DEBUG_BUF_SIZE + 1];
int i;
@@ -372,6 +383,7 @@
xframe_t *xframe;
xpacket_t *pack;
reg_cmd_t *reg_cmd;
+ int ret;
BUG_ON(len < 0);
/*
@@ -400,7 +412,10 @@
if(print_dbg)
dump_xframe("SEND_BRI_MULTI", xbus, xframe);
#endif
- return xframe_send(xbus, xframe);
+ ret = xframe_send(xbus, xframe);
+ if(ret < 0)
+ NOTICE("%s: %s: failed sending xframe\n", __FUNCTION__, xbus->busname);
+ return ret;
}
/*
@@ -412,6 +427,7 @@
struct zt_chan *dchan;
int len;
int eoframe;
+ int ret;
priv = xpd->priv;
BUG_ON(!priv);
@@ -463,7 +479,11 @@
priv->txframe_begin = 1;
else
priv->txframe_begin = 0;
- return send_bri_multibyte(xpd, priv->dchan_tbuf, len, eoframe);
+ ret = send_bri_multibyte(xpd, priv->dchan_tbuf, len, eoframe);
+ if(ret < 0)
+ NOTICE("%s/%s: %s: failed sending xframe\n",
+ __FUNCTION__, xpd->xbus->busname, xpd->xpdname);
+ return ret;
}
/*---------------- BRI: Methods -------------------------------------------*/
@@ -539,7 +559,7 @@
* FPGA firmware limitation:
* Force HOST sync *before* sending PCM
*/
- CALL_PROTO(GLOBAL, SYNC_SOURCE, xbus, NULL, 1, 0);
+ CALL_PROTO(GLOBAL, SYNC_SOURCE, xbus, NULL, SYNC_MODE_HOST, 0);
DBG("done: %s/%s\n", xbus->busname, xpd->xpdname);
priv->initialized = 1;
CALL_PROTO(BRI, SET_LED, xbus, xpd, GREEN_LED, BRI_LED_ON);
@@ -656,9 +676,10 @@
if((priv->tick_counter % LED_TICKS) == 0) {
int i;
- if(priv->reg30_good && time_before(priv->last_reg30_reply + HZ/2, jiffies)) {
+ if(priv->reg30_good && priv->reg30_ticks > poll_interval * REG30_LOST) {
/* No reply for 1/2 a second */
- ERR("%s/%s: Lost state tracking\n", xbus->busname, xpd->xpdname);
+ ERR("%s/%s: Lost state tracking for %d ticks\n",
+ xbus->busname, xpd->xpdname, priv->reg30_ticks);
priv->reg30_good = 0;
}
if(!priv->reg30_good) {
@@ -676,6 +697,7 @@
}
tx_dchan(xpd);
priv->tick_counter++;
+ priv->reg30_ticks++;
return 0;
}
@@ -694,6 +716,7 @@
static int BRI_span_startup(xpd_t *xpd)
{
struct BRI_priv_data *priv;
+ struct zt_chan *dchan;
BUG_ON(!xpd);
priv = xpd->priv;
@@ -701,8 +724,18 @@
DBG("%s/%s: STARTUP\n", xpd->xbus->busname, xpd->xpdname);
write_state_register(xpd, 0); /* Enable L1 state machine */
CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 1);
- if(SPAN_REGISTERED(xpd))
+ if(SPAN_REGISTERED(xpd)) {
+ dchan = &xpd->span.chans[2];
xpd->span.flags |= ZT_FLAG_RUNNING;
+ /*
+ * Zaptel (wrongly) assume that D-Channel need HDLC decoding
+ * and during zaptel registration override our flags.
+ *
+ * Don't Get Mad, Get Even: Now we override zaptel :-)
+ */
+ dchan->flags |= ZT_FLAG_BRIDCHAN;
+ dchan->flags &= ~ZT_FLAG_HDLC;
+ }
return 0;
}
@@ -817,8 +850,9 @@
BUG_ON(!priv);
XFRAME_NEW(xframe, pack, xbus, BRI, SET_LED, xpd->id);
#if 1
- DBG("%s/%s: %s %d\n", xbus->busname, xpd->xpdname,
- (red_led)?"RED":"GREEN", to_led_state);
+ DBG("%s/%s: %s %s (%d)\n", xbus->busname, xpd->xpdname,
+ (red_led)?"RED":"GREEN",
+ led_state_names[to_led_state], to_led_state);
#endif
bri_leds = &RPACKET_FIELD(pack, BRI, SET_LED, bri_leds);
bri_leds->state = to_led_state;
@@ -860,7 +894,7 @@
BUG_ON(!priv);
xbus = xpd->xbus;
new_state.reg = reg_x30;
- priv->last_reg30_reply = jiffies;
+ priv->reg30_ticks = 0;
priv->reg30_good = 1;
if((xpd->type == XPD_TYPE_BRI_TE && new_state.bits.v_su_sta == ST_TE_ACTIVATED) ||
(xpd->type == XPD_TYPE_BRI_NT && new_state.bits.v_su_sta == ST_NT_ACTIVATED)) {
@@ -868,7 +902,17 @@
update_xpd_status(xpd, ZT_ALARM_NONE);
} else {
priv->ledcontrol[which_led] = BRI_LED_OFF;
+ /*
+ * Do NOT notify Zaptel about the disconnection.
+ * If we do, Asterisk stops transmitting on the D-channel and
+ * we can't reactivate layer-1.
+ * Without the notification, Asterisk thinks that we are active
+ * (although the PSTN stopped layer-1) and on call setup, sends
+ * us D-channel data, which triggers the layer-1 activation.
+ */
+#if 0
update_xpd_status(xpd, ZT_ALARM_RED);
+#endif
}
if (priv->state_register.bits.v_su_sta == new_state.bits.v_su_sta)
return; /* same same */
@@ -1098,7 +1142,7 @@
} else
len += sprintf(page + len, "Unkown\n");
len += sprintf(page + len, "Tick Counter: %d\n", priv->tick_counter);
- len += sprintf(page + len, "Last Poll Reply at: %ld\n", priv->last_reg30_reply);
+ len += sprintf(page + len, "Last Poll Reply: %d ticks ago\n", priv->reg30_ticks);
len += sprintf(page + len, "reg30_good=%d\n", priv->reg30_good);
len += sprintf(page + len, "Drop Counter: %d\n", priv->drop_counter);
for(led = 0; led < NUM_LEDS; led++) {
Modified: branches/1.2/xpp/card_fxo.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_fxo.c?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/card_fxo.c (original)
+++ branches/1.2/xpp/card_fxo.c Sun Apr 29 15:19:13 2007
@@ -33,9 +33,9 @@
static const char rcsid[] = "$Id$";
-DEF_PARM(int, print_dbg, 0, 0600, "Print DBG statements");
-DEF_PARM(uint, poll_battery_interval, 100, 0600, "Poll battery interval in milliseconds (0 - disable)");
-DEF_PARM(int, ring_debounce, 50, 0600, "Number of ticks to debounce a false RING indication");
+DEF_PARM(int, print_dbg, 0, 0644, "Print DBG statements");
+DEF_PARM(uint, poll_battery_interval, 500, 0644, "Poll battery interval in milliseconds (0 - disable)");
+DEF_PARM(int, ring_debounce, 50, 0644, "Number of ticks to debounce a false RING indication");
/* Signaling is opposite (fxs signalling for fxo card) */
#if 1
@@ -684,6 +684,7 @@
BIT_CLR(priv->polarity, chipsel);
priv->polarity_counter[chipsel] = 0;
/* Inform Zaptel */
+ DBG("%s/%s/%d: Send ZT_EVENT_POLARITY\n", xpd->xbus->busname, xpd->xpdname, chipsel);
zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_POLARITY);
#if 0
/*
@@ -710,6 +711,7 @@
if (IS_SET(xpd->offhook, chipsel) && data_low < 3) {
priv->current_counter[chipsel]++;
if (priv->current_counter[chipsel] >= 10) {
+ DBG("%s/%s/%d: Power Denial Hangup\n", xpd->xbus->busname, xpd->xpdname, chipsel);
priv->current_counter[chipsel] = 0;
do_sethook(xpd, chipsel, 0);
update_line_status(xpd, chipsel, 0);
@@ -832,6 +834,10 @@
len += sprintf(page + len, "\n\t%-17s: ", "battery");
for_each_line(xpd, i) {
len += sprintf(page + len, "%2d ", IS_SET(priv->battery, i));
+ }
+ len += sprintf(page + len, "\n\t%-17s: ", "polarity");
+ for_each_line(xpd, i) {
+ len += sprintf(page + len, "%2d ", IS_SET(priv->polarity, i));
}
len += sprintf(page + len, "\n");
spin_unlock_irqrestore(&xpd->lock, flags);
Modified: branches/1.2/xpp/card_fxs.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_fxs.c?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/card_fxs.c (original)
+++ branches/1.2/xpp/card_fxs.c Sun Apr 29 15:19:13 2007
@@ -33,9 +33,9 @@
static const char rcsid[] = "$Id$";
-DEF_PARM(int, print_dbg, 0, 0600, "Print DBG statements"); /* must be before zap_debug.h */
-DEF_PARM_BOOL(poll_digital_inputs, 1, 0600, "Poll Digital Inputs");
-DEF_PARM_BOOL(reversepolarity, 0, 0600, "Reverse Line Polarity");
+DEF_PARM(int, print_dbg, 0, 0644, "Print DBG statements"); /* must be before zap_debug.h */
+DEF_PARM(uint, poll_digital_inputs, 1000, 0644, "Poll Digital Inputs");
+DEF_PARM_BOOL(reversepolarity, 0, 0644, "Reverse Line Polarity");
/* Signaling is opposite (fxo signalling for fxs card) */
#if 1
@@ -782,7 +782,6 @@
static int FXS_card_tick(xbus_t *xbus, xpd_t *xpd)
{
- static int rate_limit = 0;
struct FXS_priv_data *priv;
BUG_ON(!xpd);
@@ -790,9 +789,8 @@
BUG_ON(!priv);
#if POLL_DIGITAL_INPUTS
if(poll_digital_inputs && xpd->id == 0) {
- if((rate_limit++ % 1000) == 0) {
+ if((xpd->timer_count % poll_digital_inputs) == 0)
poll_inputs(xbus, xpd);
- }
}
#endif
handle_fxs_leds(xpd);
@@ -1335,8 +1333,8 @@
{
INFO("%s revision %s\n", THIS_MODULE->name, XPP_VERSION);
#ifdef POLL_DIGITAL_INPUTS
- INFO("FEATURE: %s with DIGITAL INPUTS support (%s activated)\n",
- THIS_MODULE->name, (poll_digital_inputs) ? "is" : "is not");
+ INFO("FEATURE: %s with DIGITAL INPUTS support (polled every %d msec)\n",
+ THIS_MODULE->name, poll_digital_inputs);
#else
INFO("FEATURE: %s without DIGITAL INPUTS support\n", THIS_MODULE->name);
#endif
Modified: branches/1.2/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_global.c?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/card_global.c (original)
+++ branches/1.2/xpp/card_global.c Sun Apr 29 15:19:13 2007
@@ -30,7 +30,7 @@
static const char rcsid[] = "$Id$";
-DEF_PARM(charp,initdir, "/usr/share/zaptel", 0600, "The directory of card initialization scripts");
+DEF_PARM(charp,initdir, "/usr/share/zaptel", 0644, "The directory of card initialization scripts");
extern int print_dbg;
static bool pcm_valid(xpd_t *xpd, xpacket_t *pack);
@@ -62,22 +62,16 @@
/*
* The XPD parameter is totaly ignored by the driver and firmware as well.
*/
-/* 0x19 */ HOSTCMD(GLOBAL, SYNC_SOURCE, bool setit, bool is_master)
+/* 0x19 */ HOSTCMD(GLOBAL, SYNC_SOURCE, enum sync_mode mode, int drift)
{
xframe_t *xframe;
xpacket_t *pack;
- byte mask = 0;
BUG_ON(!xbus);
- if(is_master)
- mask |= BIT(0);
- if(!setit)
- mask |= BIT(1);
- DBG("%s: setit=%s is_master=%s\n",
- xbus->busname,
- (setit)?"yes":"no", (is_master)?"yes":"no");
+ DBG("%s: mode=0x%X drift=%d\n", xbus->busname, mode, drift);
XFRAME_NEW(xframe, pack, xbus, GLOBAL, SYNC_SOURCE, 0);
- RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, mask) = mask;
+ RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, sync_mode) = mode;
+ RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, drift) = drift;
xframe_send(xbus, xframe);
return 0;
}
@@ -122,15 +116,37 @@
/* FIXME: work around temporary hardware bug */
xpp_line_t lines = RPACKET_FIELD(pack, GLOBAL, PCM_READ, lines);
const byte *pcm = RPACKET_FIELD(pack, GLOBAL, PCM_READ, pcm);
+ xpd_addr_t addr = RPACKET_FIELD(pack, GLOBAL, PCM_READ, addr);
volatile u_char *readchunk;
volatile u_char *r;
unsigned long flags;
int i;
xpp_line_t old_lines = lines;
- bool is_bri;
+ int unit;
int subunit;
+ struct timeval now;
+ long sec_diff;
+ long usec_diff;
BUG_ON(!xbus);
+ do_gettimeofday(&now);
+ sec_diff = now.tv_sec - xbus->last_rx_sync.tv_sec;
+ usec_diff = sec_diff * 1000000 + (now.tv_usec - xbus->last_rx_sync.tv_usec);
+ if(unlikely(abs(sec_diff) > 2)) {
+ DBG("%s: PCM RX timing restart (sec_diff=%ld)\n",
+ xbus->busname, sec_diff);
+ } else {
+ if(abs(usec_diff - 1000) > TICK_TOLERANCE) {
+ if(print_dbg && printk_ratelimit())
+ DBG("%s: Bad PCM RX timing: usec_diff=%ld.\n",
+ xbus->busname, usec_diff);
+ }
+ if(usec_diff > xbus->max_rx_sync)
+ xbus->max_rx_sync = usec_diff;
+ if(usec_diff < xbus->min_rx_sync)
+ xbus->min_rx_sync = usec_diff;
+ }
+ xbus->last_rx_sync = now;
if(!xpd) {
#if 0
int xpd_num = XPD_NUM(pack->addr);
@@ -149,18 +165,24 @@
xbus->busname, xpd->xpdname, old_lines, lines, xpd->addr.subunit);
return -EPROTO;
}
- is_bri = (xpd->type == XPD_TYPE_BRI_NT || xpd->type == XPD_TYPE_BRI_TE);
- do {
- spin_lock_irqsave(&xpd->lock, flags);
- if (xpd->timer_count & 1) {
+ unit = xpd->addr.unit;
+ for(subunit = 0; subunit < MAX_SUBUNIT; subunit++, lines >>= SUBUNIT_PCM_SHIFT) {
+ xpd_t *tmp_xpd;
+
+ tmp_xpd = xpd_by_addr(xbus, unit, subunit);
+ if(!tmp_xpd || !tmp_xpd->card_present)
+ continue;
+ if(lines == 0)
+ break; /* Optimize */
+ spin_lock_irqsave(&tmp_xpd->lock, flags);
+ if (tmp_xpd->timer_count & 1) {
/* First part */
- r = readchunk = xpd->readchunk;
+ r = readchunk = tmp_xpd->readchunk;
} else {
- r = readchunk = xpd->readchunk + ZT_CHUNKSIZE * CHANNELS_PERXPD;
+ r = readchunk = tmp_xpd->readchunk + ZT_CHUNKSIZE * CHANNELS_PERXPD;
}
-
/* Copy PCM and put each channel in its index */
- for_each_line(xpd, i) {
+ for_each_line(tmp_xpd, i) {
if(IS_SET(lines, i)) {
memcpy((u_char *)r, pcm, ZT_CHUNKSIZE);
//memset((u_char *)r, 0x5A, ZT_CHUNKSIZE); // DEBUG
@@ -168,40 +190,26 @@
}
r += ZT_CHUNKSIZE;
}
-
- XPD_COUNTER(xpd, PCM_READ)++;
+ XPD_COUNTER(tmp_xpd, PCM_READ)++;
XBUS_COUNTER(xbus, PCM_READ)++;
- spin_unlock_irqrestore(&xpd->lock, flags);
- got_pcm_from(xpd);
-
- if (!is_bri)
+ spin_unlock_irqrestore(&tmp_xpd->lock, flags);
+ if (!IS_BRI(tmp_xpd)) /* only BRI has subunits */
break;
- /*
- * Handle BRI subunits
- */
- lines >>= SUBUNIT_PCM_SHIFT; /* B1, B2, D, E */
- if (lines == 0)
- break;
- for(subunit = xpd->addr.subunit + 1; subunit < MAX_SUBUNIT; subunit++) {
- xpd_t *tmp_xpd;
-
- tmp_xpd = xpd_by_addr(xbus, xpd->addr.unit, subunit);
- if(!tmp_xpd || !tmp_xpd->card_present)
- continue;
- xpd = tmp_xpd;
- break;
- }
- if(subunit == MAX_SUBUNIT && printk_ratelimit())
- NOTICE("%s/%s: subunit=%d lines=0x%04X\n", xbus->busname, xpd->xpdname, subunit, lines);
- } while (1);
-
+ }
+ /*
+ * Firmware marks the sync packets.
+ * This is out of the loop, so we don't send multiple times
+ * for BRI subunits.
+ */
+ if(addr.sync_master)
+ got_sync_from(xpd);
return 0;
}
HANDLER_DEF(GLOBAL, SYNC_REPLY)
{
- byte mask = RPACKET_FIELD(pack, GLOBAL, SYNC_REPLY, mask);
- bool setit = mask & 0x01;
+ byte mode = RPACKET_FIELD(pack, GLOBAL, SYNC_REPLY, sync_mode);
+ byte drift = RPACKET_FIELD(pack, GLOBAL, SYNC_REPLY, drift);
BUG_ON(!xbus);
if(!xpd) {
@@ -209,10 +217,8 @@
NOTICE("%s: received %s for non-existing xpd: addr=0x%02X\n", __FUNCTION__, cmd->name, xpd_num);
return -EPROTO;
}
- DBG("%s/%s: mask=0x%X %s\n",
- xpd->xbus->busname, xpd->xpdname,
- mask,
- (setit) ? "SET SYNC MASTER" : "");
+ DBG("%s/%s: mode=0x%X drift=%d\n", xpd->xbus->busname, xpd->xpdname,
+ mode, drift);
dump_packet("SYNC_REPLY", pack, 1);
return 0;
}
Modified: branches/1.2/xpp/card_global.h
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_global.h?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/card_global.h (original)
+++ branches/1.2/xpp/card_global.h Sun Apr 29 15:19:13 2007
@@ -43,10 +43,12 @@
byte pcm[PCM_CHUNKSIZE];
);
DEF_RPACKET_DATA(GLOBAL, SYNC_SOURCE,
- byte mask;
+ byte sync_mode;
+ byte drift;
);
DEF_RPACKET_DATA(GLOBAL, SYNC_REPLY,
- byte mask;
+ byte sync_mode;
+ byte drift;
);
DEF_RPACKET_DATA(GLOBAL, ERROR_CODE,
byte errorcode;
@@ -55,9 +57,15 @@
} info;
);
+enum sync_mode {
+ SYNC_MODE_HOST = 0x00,
+ SYNC_MODE_AB = 0x01, /* Astribank sync */
+ SYNC_MODE_PLL = 0x03, /* Adjust XPD's PLL according to HOST */
+ SYNC_MODE_QUERY = 0x80,
+};
/* 0x04 */ DECLARE_CMD(GLOBAL, DESC_REQ, int xpd_num);
-/* 0x19 */ DECLARE_CMD(GLOBAL, SYNC_SOURCE, bool setit, bool is_master);
+/* 0x19 */ DECLARE_CMD(GLOBAL, SYNC_SOURCE, enum sync_mode mode, int drift);
/* 0x11 */ DECLARE_CMD(GLOBAL, PCM_WRITE, xpp_line_t lines, volatile byte *buf);
extern xproto_table_t PROTO_TABLE(GLOBAL);
Modified: branches/1.2/xpp/firmwares/FPGA_1141.hex
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/firmwares/FPGA_1141.hex?view=diff&rev=2475&r1=2474&r2=2475
==============================================================================
--- branches/1.2/xpp/firmwares/FPGA_1141.hex (original)
+++ branches/1.2/xpp/firmwares/FPGA_1141.hex Sun Apr 29 15:19:13 2007
@@ -1,8 +1,8 @@
#
-# $Id: FPGA_1141.hex 3415 2007-02-19 15:27:25Z dima $
+# $Id: FPGA_1141.hex 3810 2007-04-19 14:28:05Z dima $
#
:020000040000FA
-:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000B0E909006AD6FF4000B0E909006AD6FF4000B0E9090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111E8
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000882D0A006AD6FF4000882D0A006AD6FF4000882D0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B511115511115511115511191
:80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200001AA1111AA111001AA11100001AA1111AA11100001AA1111AA1111AA113
:80010000110000002552222552222F21F112122F21F112122552222552222552222552220000001AA111255222255222255222255222255222255222255222255222255222255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA100
:800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000AFA4F44A4A155111000000000000000000000000001AA1111AA1110000000000000000000000000000255222000000002552222552220000255222255222255222255222255222255222255222255222255222002552220011
@@ -10,632 +10,649 @@
:800280006DFDD6D66F6DFDD6D66F6DFDD6D600000000002F21F112122F21F112120000004F4CFCC4C46F6DFDD6D62F21F112128AA8882F21F11212004F44F444446F65F556562F21F1121200006F65F556567F7CFCC7C79F95F55959006F65F556566F65F55656000000008F8CFCC8C8AFACFCCACA255222000000CFCCFCCCCCCFCCFCCC87
:80030000CC008F8CFCC8C825522200CFCCFCCCCCCFCCFCCCCC000000CFCCFCCCCCCFCCFCCCCCCFCCFCCCCC00000000CFCCFCCCCCCFCCFCCCCC000000008F84F44848AFA4F44A4A255222CFCCFCCCCC0000CFC4F44C4CEFE4F44E4E2552220000EFE4F44E4EEFE4F44E4EEFE4F44E4E00000000CFC8F88C8CCFC8F88C8C000000008F8CFC45
:80038000C8C8AFACFCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFC8F88C8C000000008F8CFCC8C8AFACFCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFCBFBBC02
-:80040000BC3AA3330000008F8CFCC8C8AFADFDDADA2F21F11212CFC8F88C8C3AA33300CFCCFCCCCCEFEDFDDEDE2F21F112120000BFB2F22B2BAFABFBBABA00EFEDFDDEDEEFEDFDDEDEEFEDFDDEDE000000008AA888BAABBB3AA333000000CFCCFCCCCCEFEEFEEEEE2F22F222228AA8883AA33300CFCCFCCCCCEFEEFEEEEE2F22F2222200E8
[... 8629 lines stripped ...]
More information about the zaptel-commits
mailing list