SOURCES: zaptel-alt-oslec.patch (NEW) - new OSLEC

arekm arekm at pld-linux.org
Fri Sep 21 23:17:48 CEST 2007


Author: arekm                        Date: Fri Sep 21 21:17:48 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- new OSLEC

---- Files affected:
SOURCES:
   zaptel-alt-oslec.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/zaptel-alt-oslec.patch
diff -u /dev/null SOURCES/zaptel-alt-oslec.patch:1.1
--- /dev/null	Fri Sep 21 23:17:48 2007
+++ SOURCES/zaptel-alt-oslec.patch	Fri Sep 21 23:17:43 2007
@@ -0,0 +1,315 @@
+Common subdirectories: zaptel-1.4.3-orig/build_tools and zaptel-1.4.3/build_tools
+Common subdirectories: zaptel-1.4.3-orig/datamods and zaptel-1.4.3/datamods
+Common subdirectories: zaptel-1.4.3-orig/doc and zaptel-1.4.3/doc
+Common subdirectories: zaptel-1.4.3-orig/firmware and zaptel-1.4.3/firmware
+Common subdirectories: zaptel-1.4.3-orig/hpec and zaptel-1.4.3/hpec
+Common subdirectories: zaptel-1.4.3-orig/menuselect and zaptel-1.4.3/menuselect
+Common subdirectories: zaptel-1.4.3-orig/oct612x and zaptel-1.4.3/oct612x
+diff -uN zaptel-1.4.3-orig/oslec.h zaptel-1.4.3/oslec.h
+--- zaptel-1.4.3-orig/oslec.h	1969-12-31 19:00:00.000000000 -0500
++++ zaptel-1.4.3/oslec.h	2007-07-10 16:06:05.335249296 -0400
+@@ -0,0 +1,28 @@
++/*
++  oslec.h
++  David Rowe
++  7 Feb 2007
++
++  Interface for OSLEC module.
++*/
++
++#ifndef __OSLEC__
++
++struct echo_can_state {
++  void *ec;
++};
++
++struct echo_can_state *oslec_echo_can_create(int len, int adaption_mode);
++void oslec_echo_can_free(struct echo_can_state *ec);
++short oslec_echo_can_update(struct echo_can_state *ec, short iref, short isig);
++int oslec_echo_can_traintap(struct echo_can_state *ec, int pos, short val);
++static inline void echo_can_init(void) {}
++static inline void echo_can_shutdown(void) {}
++short oslec_hpf_tx(struct echo_can_state *ec, short txlin);
++static inline void echo_can_identify(char *buf, size_t len)
++{
++	strncpy(buf, "OSLEC", len);
++}
++
++#endif
++
+Common subdirectories: zaptel-1.4.3-orig/wct4xxp and zaptel-1.4.3/wct4xxp
+Common subdirectories: zaptel-1.4.3-orig/wctc4xxp and zaptel-1.4.3/wctc4xxp
+Common subdirectories: zaptel-1.4.3-orig/xpp and zaptel-1.4.3/xpp
+diff -uN zaptel-1.4.3-orig/zaptel-base.c zaptel-1.4.3/zaptel-base.c
+--- zaptel-1.4.3-orig/zaptel-base.c	2007-05-18 11:50:19.000000000 -0400
++++ zaptel-1.4.3/zaptel-base.c	2007-07-10 16:18:35.533866934 -0400
+@@ -426,6 +426,14 @@
+ #include "mg2ec.h"
+ #elif defined(ECHO_CAN_JP1)
+ #include "jpah.h"
++/* Start Open Source Line Echo Canceller (OSLEC) -----------------*/
++#elif defined(ECHO_CAN_OSLEC)
++#include "oslec.h"
++#define echo_can_create oslec_echo_can_create
++#define echo_can_free oslec_echo_can_free
++#define echo_can_update oslec_echo_can_update
++#define echo_can_traintap oslec_echo_can_traintap
++/* End Open Source Line Echo Canceller (OSLEC) -------------------*/
+ #else
+ #include "mec3.h"
+ #endif
+@@ -5747,6 +5755,71 @@
+ 	spin_unlock_irqrestore(&chan->lock, flags);
+ }
+ 
++/* Zaptap code -----------------------------------------------------------*/
++
++#define SAMPLE_BUF_SZ  1000 
++#define SAMPLE_IDLE    0
++#define SAMPLE_PING    1
++#define SAMPLE_PONG    2
++
++DECLARE_WAIT_QUEUE_HEAD(sample_wait);
++static int sample_state = 0;
++static int samples = 0;
++static short *psample;
++static short ping[3*SAMPLE_BUF_SZ];
++static short pong[3*SAMPLE_BUF_SZ];
++static int sample_ch = 1;
++static int sample_impulse = 0;
++static int tmp1,tmp2;
++
++static inline void sample_echo_before(int channo, short rxlin, short txlin) {
++
++  // Sample echo canceller signals
++  // Notes:
++  //   1. Samples are multiplexed in buffer:
++  //        tx sample
++  //        rx sample
++  //        ec sample
++  //   2. We needs to sample rx here before echo can as it is
++  //      overwritten.
++
++  tmp1++;
++  tmp2 = channo;
++  if ((sample_state != SAMPLE_IDLE) && (channo == sample_ch)) {
++      *psample++ = txlin;
++      *psample++ = rxlin;
++  }
++}
++
++static inline void sample_echo_after(int channo, short rxlin) {
++
++  if ((sample_state != SAMPLE_IDLE) && (channo == sample_ch)) {
++
++    *psample++ = rxlin;
++
++    // sample collection ping-pong buffer logic
++
++    samples++;
++    if (samples >= SAMPLE_BUF_SZ) {
++      // time to swap buffers
++      samples = 0;
++
++      if (sample_state == SAMPLE_PING) {
++       sample_state = SAMPLE_PONG;
++       psample = pong;
++      }
++      else {
++       sample_state = SAMPLE_PING;
++       psample = ping;
++      }
++      wake_up_interruptible(&sample_wait);
++    }
++  }
++}
++
++/* end Zaptap code -----------------------------------------------------*/
++
++
+ static inline void __zt_ec_chunk(struct zt_chan *ss, unsigned char *rxchunk, const unsigned char *txchunk)
+ {
+ 	short rxlin, txlin;
+@@ -5797,7 +5870,9 @@
+ #if !defined(ZT_EC_ARRAY_UPDATE)
+ 			for (x=0;x<ZT_CHUNKSIZE;x++) {
+ 				rxlin = ZT_XLAW(rxchunk[x], ss);
++				sample_echo_before(ss->channo, rxlin, ZT_XLAW(txchunk[x], ss)); /* Zaptap code */
+ 				rxlin = echo_can_update(ss->ec, ZT_XLAW(txchunk[x], ss), rxlin);
++                                sample_echo_after(ss->channo, rxlin);                           /* Zaptap code */
+ 				rxchunk[x] = ZT_LIN2X((int) rxlin, ss);
+ 			}
+ #else /* defined(ZT_EC_ARRAY_UPDATE) */
+@@ -6675,6 +6750,8 @@
+ static void __zt_transmit_chunk(struct zt_chan *chan, unsigned char *buf)
+ {
+ 	unsigned char silly[ZT_CHUNKSIZE];
++        int x;
++
+ 	/* Called with chan->lock locked */
+ 	if (!buf)
+ 		buf = silly;
+@@ -6689,8 +6766,122 @@
+ 		kernel_fpu_end();
+ #endif
+ 	}
++       /* Start Zaptap code -----------------------------------------*/
++
++       if (sample_impulse && (samples == 0)) {
++
++               // option impulse insertion, tx stream becomes one
++               // impulse followed by SAMPLE_BUF_SZ-1 0's
++
++               buf[0] = ZT_LIN2MU(10000);
++               for (x=1;x<ZT_CHUNKSIZE;x++) {
++                   buf[x] = ZT_LIN2MU(0);
++               }
++       }
++
++       /* End Zaptap code -----------------------------------------*/
++
++}
++
++/* Zaptap code -----------------------------------------------------*/
++
++static int sample_open (struct inode *inode, struct file *file) {
++       printk("sample_open:\n");
++       tmp1 = tmp2 = -1;
++
++       psample = ping;
++       samples = 0;
++       sample_state = SAMPLE_PING;
++
++       return 0;
+ }
+ 
++static int sample_release (struct inode *inode, struct file *file) {
++       printk("sample_release: tmp1 = %d tmp2 = %d\n", tmp1, tmp2);
++
++       sample_state = SAMPLE_IDLE;
++       sample_impulse = 0;
++       samples = 0;
++
++       return 0;
++}
++
++static ssize_t sample_read(struct file *file, char *buf,
++               size_t count, loff_t *ppos) {
++       int    err, len;
++       short *pread;
++
++       /* wait for next buffer to be prepared by ISR, we read
++           alternate buffer just after transition.
++         */
++       interruptible_sleep_on(&sample_wait);
++
++       if (sample_state == SAMPLE_PING) {
++         pread = pong;
++       }
++       else {
++         pread = ping;
++       }
++
++       len = 3*sizeof(short)*SAMPLE_BUF_SZ;
++       err = copy_to_user(buf, pread, len);
++
++       if (err != 0)
++               return -EFAULT;
++
++       return len;
++}
++
++/* ioctls for sample */
++
++#define SAMPLE_SET_CHANNEL 0
++#define SAMPLE_TX_IMPULSE  1
++
++static int sample_ioctl(struct inode *inode, struct file *file,
++               unsigned int cmd, unsigned long arg) {
++       int retval = 0;
++
++       switch ( cmd ) {
++               case SAMPLE_SET_CHANNEL:
++                 if (copy_from_user(&sample_ch, (int *)arg, sizeof(int)))
++                   return -EFAULT;
++                 printk("sample_ioctl: sample_ch = %d\n", sample_ch);
++                 break;
++               case SAMPLE_TX_IMPULSE:
++                 sample_impulse = 1;
++                 printk("sample_ioctl: under impulse power\n");
++                 break;
++               default:
++                 retval = -EINVAL;
++        }
++
++       return retval;
++}
++
++// define which file operations are supported
++struct file_operations sample_fops = {
++       .owner  =       THIS_MODULE,
++       .llseek =       NULL,
++       .read   =       sample_read,
++       .write  =       NULL,
++       .readdir=       NULL,
++       .poll   =       NULL,
++       .ioctl  =       sample_ioctl,
++       .mmap   =       NULL,
++       .open   =       sample_open,
++       .flush  =       NULL,
++       .release=       sample_release,
++       .fsync  =       NULL,
++       .fasync =       NULL,
++       .lock   =       NULL,
++};
++
++#define SAMPLE_NAME  "sample"
++#define SAMPLE_MAJOR 33
++
++/* end Zaptap code -----------------------------------------------------*/
++
++
+ static inline void __zt_real_transmit(struct zt_chan *chan)
+ {
+ 	/* Called with chan->lock held */
+@@ -7166,12 +7357,27 @@
+ #ifdef CONFIG_ZAPTEL_WATCHDOG
+ 	watchdog_init();
+ #endif	
++
++       /* start Zaptap code ----------------------------------------*/
++
++       sample_state = SAMPLE_IDLE;
++       sample_impulse = 0;
++	if ((res = register_chrdev (SAMPLE_MAJOR, SAMPLE_NAME, &sample_fops))) {
++	  printk(KERN_ERR "Zaptap unable to register 'sample' char driver on %d\n", SAMPLE_MAJOR);
++	  return res;
++	}
++	printk("Zaptap registered 'sample' char driver on major %d\n", SAMPLE_MAJOR);
++
++       /* end Zaptap code ------------------------------------------*/
++
+ 	return res;
+ }
+ 
+ static void __exit zt_cleanup(void) {
+ 	int x;
+ 
++	 unregister_chrdev (SAMPLE_MAJOR, SAMPLE_NAME); /* Zaptap code */
++
+ #ifdef CONFIG_PROC_FS
+ 	remove_proc_entry("zaptel", NULL);
+ #endif
+diff -uN zaptel-1.4.3-orig/zconfig.h zaptel-1.4.3/zconfig.h
+--- zaptel-1.4.3-orig/zconfig.h	2007-04-24 14:32:49.000000000 -0400
++++ zaptel-1.4.3/zconfig.h	2007-07-10 16:19:08.333392729 -0400
+@@ -63,7 +63,8 @@
+ /* #define ECHO_CAN_MARK3 */
+ /* #define ECHO_CAN_KB1 */
+ /* This is the new latest and greatest */
+-#define ECHO_CAN_MG2
++/* #define ECHO_CAN_MG2 */
++#define ECHO_CAN_OSLEC
+ 
+ /*
+  * This is only technically an "echo canceller"...
================================================================


More information about the pld-cvs-commit mailing list