[zaptel-commits] tzafrir: branch 1.4 r2477 - in /branches/1.4/xpp: ./ firmwares/ utils/ utils/...

zaptel-commits at lists.digium.com zaptel-commits at lists.digium.com
Sun Apr 29 15:12:50 MST 2007


Author: tzafrir
Date: Sun Apr 29 17:12:49 2007
New Revision: 2477

URL: http://svn.digium.com/view/zaptel?view=rev&rev=2477
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.4/xpp/ChangeLog   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/ChangeLog
    branches/1.4/xpp/init_card_3_26   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/init_card_3_26
    branches/1.4/xpp/init_card_4_26   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/init_card_4_26
    branches/1.4/xpp/init_card_6_26   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/init_card_6_26
    branches/1.4/xpp/init_card_7_26   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/init_card_7_26
    branches/1.4/xpp/utils/xpp_blink   (props changed)
      - copied unchanged from r2475, branches/1.2/xpp/utils/xpp_blink
Removed:
    branches/1.4/xpp/init_card_3_24
    branches/1.4/xpp/init_card_4_24
    branches/1.4/xpp/init_card_6_24
    branches/1.4/xpp/init_card_7_24
    branches/1.4/xpp/utils/adj_clock.8
    branches/1.4/xpp/utils/adj_clock.c
Modified:
    branches/1.4/xpp/.version
    branches/1.4/xpp/README.Astribank
    branches/1.4/xpp/calibrate_slics
    branches/1.4/xpp/card_bri.c
    branches/1.4/xpp/card_fxo.c
    branches/1.4/xpp/card_fxs.c
    branches/1.4/xpp/card_global.c
    branches/1.4/xpp/card_global.h
    branches/1.4/xpp/firmwares/FPGA_1141.hex
    branches/1.4/xpp/firmwares/FPGA_1151.hex
    branches/1.4/xpp/firmwares/FPGA_FXS.hex
    branches/1.4/xpp/firmwares/USB_1130.hex
    branches/1.4/xpp/firmwares/USB_1140.hex
    branches/1.4/xpp/firmwares/USB_1150.hex
    branches/1.4/xpp/utils/Makefile
    branches/1.4/xpp/utils/fpga_load.8
    branches/1.4/xpp/utils/fpga_load.c
    branches/1.4/xpp/utils/genzaptelconf
    branches/1.4/xpp/utils/genzaptelconf.8
    branches/1.4/xpp/utils/hexfile.c
    branches/1.4/xpp/utils/hexfile.h
    branches/1.4/xpp/utils/lszaptel
    branches/1.4/xpp/utils/xpp_fxloader
    branches/1.4/xpp/utils/xpp_sync
    branches/1.4/xpp/utils/zconf/Zaptel.pm
    branches/1.4/xpp/utils/zconf/Zaptel/Chans.pm
    branches/1.4/xpp/utils/zconf/Zaptel/Span.pm
    branches/1.4/xpp/utils/zconf/Zaptel/Xpp.pm
    branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
    branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
    branches/1.4/xpp/utils/zt_registration
    branches/1.4/xpp/xbus-core.c
    branches/1.4/xpp/xpd.h
    branches/1.4/xpp/xpp_usb.c
    branches/1.4/xpp/xpp_zap.c
    branches/1.4/xpp/xpp_zap.h
    branches/1.4/xpp/xproto.c
    branches/1.4/xpp/xproto.h

Modified: branches/1.4/xpp/.version
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/.version?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/.version (original)
+++ branches/1.4/xpp/.version Sun Apr 29 17:12:49 2007
@@ -1,1 +1,1 @@
-trunk-r3495
+trunk-r3814

Propchange: branches/1.4/xpp/ChangeLog
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: branches/1.4/xpp/ChangeLog
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: branches/1.4/xpp/ChangeLog
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: branches/1.4/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/README.Astribank?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/README.Astribank (original)
+++ branches/1.4/xpp/README.Astribank Sun Apr 29 17:12:49 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.4/xpp/calibrate_slics
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/calibrate_slics?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/calibrate_slics (original)
+++ branches/1.4/xpp/calibrate_slics Sun Apr 29 17:12:49 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.4/xpp/card_bri.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_bri.c?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/card_bri.c (original)
+++ branches/1.4/xpp/card_bri.c Sun Apr 29 17:12:49 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.4/xpp/card_fxo.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_fxo.c?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/card_fxo.c (original)
+++ branches/1.4/xpp/card_fxo.c Sun Apr 29 17:12:49 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.4/xpp/card_fxs.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_fxs.c?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/card_fxs.c (original)
+++ branches/1.4/xpp/card_fxs.c Sun Apr 29 17:12:49 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.4/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_global.c?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/card_global.c (original)
+++ branches/1.4/xpp/card_global.c Sun Apr 29 17:12:49 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.4/xpp/card_global.h
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_global.h?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/card_global.h (original)
+++ branches/1.4/xpp/card_global.h Sun Apr 29 17:12:49 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.4/xpp/firmwares/FPGA_1141.hex
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/firmwares/FPGA_1141.hex?view=diff&rev=2477&r1=2476&r2=2477
==============================================================================
--- branches/1.4/xpp/firmwares/FPGA_1141.hex (original)
+++ branches/1.4/xpp/firmwares/FPGA_1141.hex Sun Apr 29 17:12:49 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
-:8004800000EFEEFEEEEEEFEEFEEEEEEFEEFEEEEE000000004AA4441F14F44141155111000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA44415511100CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000008F84F448489F95F559591F11F11111000000CFCCFCCCCCFFFEFEEFEF3F32F223238F84F494
-:8005000048481F11F1111100CFCCFCCCCCFFFEFEEFEF3F32F223230000FFFEFEEFEFFFFEFEEFEFFFFEFEEFEF00000000CFC4F44C4CFFF4F44F4F3553330000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C35533300CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004554444F42F22424C0
-:800580002AA2220000008F8CFCC8C8BFBFFFFBFB3F33F333334554442AA22200CFCCFCCCCCFFFFFFFFFF3F33F33333008F81F118189F9EFEE9E90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004AA4446AA6662AA222000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA4442AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFF9B
-:80060000FFFFFFFFFFFFFFFFFFFFFFFFFF00000000CFC4F44C4CCFC6F66C6C2AA2220000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C2AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F886862552220000008F8CFCC8C8BFBFFFFBFB3F33F333334F48F8843C
-:8006800084255222008F8CFCC8C8BFBFFFFBFB3F33F333330000BFBFFFFBFBBFBFFFFBFBBFBFFFFBFB000000004F48F884846F68F88686255222000000CFCCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F8868625F2
-:800700005222000000CFCCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F33333EAAEEE7F75F55757000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F75F557573F31F11313000000CFC8F88C8CDFDBFBBDBD1F13F331314F44F444443F31F1131300CFC8F88C8CDFDBFBBDBDE7
-:800780001F13F331310000DFDBFBBDBDDFDBFBBDBDDFDBFBBDBD000000004F44F444445F55F555551F11F111110000008F8CFCC8C88F8FFFF8F83AA3334F44F444441F11F11111008F8CFCC8C88F8FFFF8F83AA33300008F8FFFF8F88F8FFFF8F88F8FFFF8F8000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCDFDEFE28
-:80080000EDED1F12F221214F44F444441F13F3313100CFCCFCCCCCDFDEFEEDED1F12F221210000DFDEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCCFCFFFFCFC3AA3334F44F444441F13F3313100CFCCFCCCCCCFCFFFFCFC3AA3330000CFCFFFFCFCCFCFFFFCFCCFCFFFFCFC000091
-:80088000000000000000000000000000000000001F19F99191B55BBB000048180000000000000000000000000000000000000000000000000000002F8D020000000000000000000000000000001400000000000000000000000000007EBD000000000000000000000000000000000000000000000000000000000000FFE40F008084010076
-:800900000000000000000000000000140000000000000000000000000000DFBE060000000000000000000000000000000000000000000000000000000000F04FFE8002004001008004148002800414800200008002800400002148000000480000108204000021AFEB0500000000000000000000000000000000000000000000000000007F
-:80098000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F48180028000000002100000021001400100240010000400128000014882880080088280028002F150B008084010000200100000000000000120000400100000000000014000000000050358084410128004840818102214860E6
-:800A0000118002211A01148002211A041400B01281041480028004148828108204808802214800CF550648180028000000002100000021001400100240010000400128000014882800008088020000CFE40B0000000000000000000000000000000000000000000000000000000000F04FFE00008002000000000000002100000029010036
-:800A80000000000000000000000080080000F0BFED000000000000002100000000400100002001000000200200008228000000220000B0ED020000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000220000000000000071

[... 8308 lines stripped ...]


More information about the zaptel-commits mailing list