[svn-commits] kpfleming: branch linux/kpfleming/echocan_work r6357 - in /linux/team/kpflemi...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Apr 13 17:18:51 CDT 2009


Author: kpfleming
Date: Mon Apr 13 17:18:46 2009
New Revision: 6357

URL: http://svn.digium.com/svn-view/dahdi?view=rev&rev=6357
Log:
add support for echocan features, status and events

use CED detect feature to avoid using software CED detector when possible

respond to CED detection events by generating log messages (userspace events will come later)


Modified:
    linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi-base.c
    linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c
    linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c
    linux/team/kpfleming/echocan_work/include/dahdi/dahdi_config.h
    linux/team/kpfleming/echocan_work/include/dahdi/kernel.h

Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi-base.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi-base.c?view=diff&rev=6357&r1=6356&r2=6357
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi-base.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi-base.c Mon Apr 13 17:18:46 2009
@@ -4962,8 +4962,12 @@
 		chan->echostate = ECHO_STATE_IDLE;
 		chan->echolastupdate = 0;
 		chan->echotimer = 0;
-		echo_can_disable_detector_init(&chan->ec_state->txecdis);
-		echo_can_disable_detector_init(&chan->ec_state->rxecdis);
+		if (!ec->features.CED_tx_detect) {
+			echo_can_disable_detector_init(&chan->ec_state->txecdis);
+		}
+		if (!ec->features.CED_rx_detect) {
+			echo_can_disable_detector_init(&chan->ec_state->rxecdis);
+		}
 		spin_unlock_irqrestore(&chan->lock, flags);
 	}
 
@@ -5728,6 +5732,24 @@
 #endif
 }
 
+static void set_echocan_fax_mode(struct dahdi_chan *chan, unsigned int channo, const char *direction)
+{
+	if (chan->ec_state->features.NLP_toggle) {
+		module_printk(KERN_NOTICE, "Disabled echo canceller NLP because of tone (%s) on channel %d\n", direction, channo);
+		chan->ec_state->owner->echocan_NLP_toggle(chan->ec_state, 0);
+	} else {
+		module_printk(KERN_NOTICE, "Disabled echo canceller because of tone (%s) on channel %d\n", direction, channo);
+		chan->echocancel = 0;
+		chan->echostate = ECHO_STATE_IDLE;
+		chan->echolastupdate = 0;
+		chan->echotimer = 0;
+		chan->ec_state->owner->echocan_free(chan->ec_state);
+		chan->ec_state = NULL;
+		release_echocan(chan->ec_current);
+		chan->ec_current = NULL;
+	}
+}
+
 static inline void __dahdi_process_getaudio_chunk(struct dahdi_chan *ss, unsigned char *txb)
 {
 	/* We transmit data from our master channel */
@@ -5740,26 +5762,16 @@
 	/* Okay, now we've got something to transmit */
 	for (x=0;x<DAHDI_CHUNKSIZE;x++)
 		getlin[x] = DAHDI_XLAW(txb[x], ms);
-#ifndef NO_ECHOCAN_DISABLE
-	if (ms->ec_state) {
-		for (x=0;x<DAHDI_CHUNKSIZE;x++) {
-			/* Check for echo cancel disabling tone */
+
+	if (ms->ec_state && ms->ec_state->status.NLP_enabled && !ms->ec_state->features.CED_tx_detect) {
+		for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
 			if (echo_can_disable_detector_update(&ms->ec_state->txecdis, getlin[x])) {
-				module_printk(KERN_NOTICE, "Disabled echo canceller because of tone (tx) on channel %d\n", ss->channo);
-				ms->echocancel = 0;
-				ms->echostate = ECHO_STATE_IDLE;
-				ms->echolastupdate = 0;
-				ms->echotimer = 0;
-				ms->ec_state->owner->echocan_free(ms->ec_state);
-				ms->ec_state = NULL;
-				release_echocan(ms->ec_current);
-				ms->ec_current = NULL;
-				__qevent(ss, DAHDI_EVENT_EC_DISABLED);
+				set_echocan_fax_mode(ms, ss->channo, "tx");
 				break;
 			}
 		}
 	}
-#endif
+
 	if ((!ms->confmute && !ms->dialing) || (ms->flags & DAHDI_FLAG_PSEUDO)) {
 		/* Handle conferencing on non-clear channel and non-HDLC channels */
 		switch(ms->confmode & DAHDI_CONF_MODE_MASK) {
@@ -6544,6 +6556,24 @@
 	spin_unlock_irqrestore(&chan->lock, flags);
 }
 
+static void process_echocan_events(struct dahdi_chan *chan)
+{
+	if (chan->ec_state->events.CED_tx_detected) {
+		if (chan->ec_state->status.NLP_enabled) {
+			set_echocan_fax_mode(chan, chan->channo, "tx");
+		} else {
+			module_printk(KERN_NOTICE, "Detected CED tone (tx) on channel %d\n", chan->channo);
+		}
+	}
+	if (chan->ec_state->events.CED_rx_detected) {
+		if (chan->ec_state->status.NLP_enabled) {
+			set_echocan_fax_mode(chan, chan->channo, "rx");
+		} else {
+			module_printk(KERN_NOTICE, "Detected CED tone (rx) on channel %d\n", chan->channo);
+		}
+	}
+}
+
 static inline void __dahdi_ec_chunk(struct dahdi_chan *ss, unsigned char *rxchunk, const unsigned char *txchunk)
 {
 	short rxlin, txlin;
@@ -6596,7 +6626,11 @@
 				rxlins[x] = DAHDI_XLAW(rxchunk[x], ss);
 				txlins[x] = DAHDI_XLAW(txchunk[x], ss);
 			}
+			ss->ec_state->events.all = 0;
 			ss->ec_state->owner->echocan_array_update(ss->ec_state, rxlins, txlins);
+			if (ss->ec_state->events.all) {
+				process_echocan_events(ss);
+			}
 			for (x = 0; x < DAHDI_CHUNKSIZE; x++)
 				rxchunk[x] = DAHDI_LIN2X((int) rxlins[x], ss);
 		}
@@ -6691,24 +6725,15 @@
 		putlin[x] = DAHDI_XLAW(rxb[x], ms);
 	}
 
-#ifndef NO_ECHOCAN_DISABLE
-	if (ms->ec_state) {
-		for (x=0;x<DAHDI_CHUNKSIZE;x++) {
+	if (ms->ec_state && ms->ec_state->status.NLP_enabled && !ms->ec_state->features.CED_rx_detect) {
+		for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
 			if (echo_can_disable_detector_update(&ms->ec_state->rxecdis, putlin[x])) {
-				module_printk(KERN_NOTICE, "Disabled echo canceller because of tone (rx) on channel %d\n", ss->channo);
-				ms->echocancel = 0;
-				ms->echostate = ECHO_STATE_IDLE;
-				ms->echolastupdate = 0;
-				ms->echotimer = 0;
-				ms->ec_state->owner->echocan_free(ms->ec_state);
-				ms->ec_state = NULL;
-				release_echocan(ms->ec_current);
-				ms->ec_current = NULL;
+				set_echocan_fax_mode(ms, ss->channo, "rx");
 				break;
 			}
 		}
 	}
-#endif
+
 	/* if doing rx tone decoding */
 	if (ms->rxp1 && ms->rxp2 && ms->rxp3)
 	{

Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c?view=diff&rev=6357&r1=6356&r2=6357
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c Mon Apr 13 17:18:46 2009
@@ -85,6 +85,7 @@
 static void echo_can_free(struct dahdi_echocan_state *ec);
 static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, short *iref);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
+static void echocan_NLP_toggle(struct dahdi_echocan_state *ec, unsigned int enable);
 
 static const struct dahdi_echocan_factory my_factory = {
 	.name = "SEC",
@@ -92,10 +93,15 @@
 	.echocan_create = echo_can_create,
 };
 
+static const struct dahdi_echocan_features sec_features = {
+	.NLP_toggle = 1,
+};
+
 static const struct dahdi_echocan me = {
 	.echocan_free = echo_can_free,
 	.echocan_array_update = echo_can_array_update,
 	.echocan_traintap = echo_can_traintap,
+	.echocan_NLP_toggle = echocan_NLP_toggle,
 };
 
 struct ec_pvt {
@@ -148,6 +154,7 @@
 	}
 
 	pvt->dahdi.owner = &me;
+	pvt->dahdi.features = sec_features;
 
 	pvt->taps = ecp->tap_length;
 	pvt->tap_mask = ecp->tap_length - 1;
@@ -162,6 +169,7 @@
 	/* Non-linear processor - a fancy way to say "zap small signals, to avoid
 	   accumulating noise". */
 	pvt->use_nlp = TRUE;
+	pvt->dahdi.status.NLP_enabled = 1;
 
 	*ec = &pvt->dahdi;
 	return 0;
@@ -313,6 +321,14 @@
 		return 0;
 }
 
+static void echocan_NLP_toggle(struct dahdi_echocan_state *ec, unsigned int enable)
+{
+	struct ec_pvt *pvt = dahdi_to_pvt(ec);
+
+	pvt->use_nlp = enable ? 1 : 0;
+	pvt->dahdi.status.NLP_enabled = enable;
+}
+
 static int __init mod_init(void)
 {
 	if (dahdi_register_echocan(&my_factory)) {

Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c?view=diff&rev=6357&r1=6356&r2=6357
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c Mon Apr 13 17:18:46 2009
@@ -48,6 +48,12 @@
 	.echocan_create = echo_can_create,
 };
 
+static const struct dahdi_echocan_features hpec_features = {
+	.NLP_automatic = 1,
+	.CED_tx_detect = 1,
+	.CED_rx_detect = 1,
+};
+
 static const struct dahdi_echocan me = {
 	.echocan_free = echo_can_free,
 	.echocan_array_update = echo_can_array_update,
@@ -124,6 +130,7 @@
 	}
 
 	pvt->dahdi.owner = &me;
+	pvt->dahdi.features = hpec_features;
 
 	if (down_interruptible(&alloc_lock))
 		return -ENOTTY;
@@ -137,6 +144,7 @@
 		*ec = NULL;
 		return -ENOTTY;
 	} else {
+		pvt->dahdi.status.NLP_enabled = 1;
 		*ec = &pvt->dahdi;
 		return 0;
 	}

Modified: linux/team/kpfleming/echocan_work/include/dahdi/dahdi_config.h
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/include/dahdi/dahdi_config.h?view=diff&rev=6357&r1=6356&r2=6357
==============================================================================
--- linux/team/kpfleming/echocan_work/include/dahdi/dahdi_config.h (original)
+++ linux/team/kpfleming/echocan_work/include/dahdi/dahdi_config.h Mon Apr 13 17:18:46 2009
@@ -67,13 +67,6 @@
  * 
  */
 /* #define CONFIG_DAHDI_MMX */
-
-/*
- * Define to turn off the echo canceler disable tone detector,
- * which will cause DAHDI to ignore the 2100 Hz echo cancel disable
- * tone.
- */
-/* #define NO_ECHOCAN_DISABLE */
 
 /* We now use the linux kernel config to detect which options to use */
 /* You can still override them below */

Modified: linux/team/kpfleming/echocan_work/include/dahdi/kernel.h
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/include/dahdi/kernel.h?view=diff&rev=6357&r1=6356&r2=6357
==============================================================================
--- linux/team/kpfleming/echocan_work/include/dahdi/kernel.h (original)
+++ linux/team/kpfleming/echocan_work/include/dahdi/kernel.h Mon Apr 13 17:18:46 2009
@@ -150,16 +150,41 @@
 
 struct dahdi_echocan_state;
 
+struct dahdi_echocan_features {
+	__u32 CED_tx_detect:1;
+	__u32 CED_rx_detect:1;
+	__u32 CNG_tx_detect:1;
+	__u32 CNG_rx_detect:1;
+	__u32 NLP_toggle:1;
+	__u32 NLP_automatic:1;
+};
+
 struct dahdi_echocan {
 	void (*echocan_free)(struct dahdi_echocan_state *ec);
 	void (*echocan_array_update)(struct dahdi_echocan_state *ec, short *isig, short *iref);
 	int (*echocan_traintap)(struct dahdi_echocan_state *ec, int pos, short val);
+	void (*echocan_NLP_toggle)(struct dahdi_echocan_state *ec, unsigned int enable);
 };
 
 struct dahdi_echocan_state {
 	const struct dahdi_echocan *owner;
 	echo_can_disable_detector_state_t txecdis;
 	echo_can_disable_detector_state_t rxecdis;
+	struct dahdi_echocan_features features;
+	struct {
+		__u32 NLP_enabled:1;
+	} status;
+	union {
+		__u32 all;
+		struct {
+			__u32 CED_tx_detected:1;
+			__u32 CED_rx_detected:1;
+			__u32 CNG_tx_detected:1;
+			__u32 CNG_rx_detected:1;
+			__u32 NLP_disabled:1;
+			__u32 NLP_enabled:1;
+		};
+	} events;
 };
 
 /* Echo cancellation factories (modules) */




More information about the svn-commits mailing list