From a4ee69b5300fddb961c6f0c521d204d849e52a0c Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Tue, 5 Jan 2010 20:12:48 +0200 Subject: Introduce the build system The Makefile supports either building modules locally or generating a patch vs. dahdi-linux SVN. * drivers/dahdi/{Kbuild,Kconfig} - will be merged with existing ones * dahdi_echocan_oslec.c: Copied as-is from dahdi. Provides a better sanity check that the 'echo' module was built OK. --- drivers/dahdi/Kbuild | 6 ++ drivers/dahdi/Kconfig | 14 ++++ drivers/dahdi/dahdi_echocan_oslec.c | 143 ++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 drivers/dahdi/Kbuild create mode 100644 drivers/dahdi/Kconfig create mode 100644 drivers/dahdi/dahdi_echocan_oslec.c (limited to 'drivers') diff --git a/drivers/dahdi/Kbuild b/drivers/dahdi/Kbuild new file mode 100644 index 0000000..7de6212 --- /dev/null +++ b/drivers/dahdi/Kbuild @@ -0,0 +1,6 @@ +obj-$(DAHDI_BUILD_ALL)$(CONFIG_ECHO) += ../staging/echo/ +obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_ECHOCAN_OSLEC) += dahdi_echocan_oslec.o + +####### END OF DATA ######## + +CFLAGS_MODULE = -I/usr/include diff --git a/drivers/dahdi/Kconfig b/drivers/dahdi/Kconfig new file mode 100644 index 0000000..d128f1d --- /dev/null +++ b/drivers/dahdi/Kconfig @@ -0,0 +1,14 @@ + + +config ECHO + tristate "Line Echo Canceller support" + default DAHDI + --help-- + This driver provides line echo cancelling support for mISDN and + DAHDI drivers. + + To compile this driver as a module, choose M here: the + module will be called echo. + + If unsure, say Y. + diff --git a/drivers/dahdi/dahdi_echocan_oslec.c b/drivers/dahdi/dahdi_echocan_oslec.c new file mode 100644 index 0000000..a8d38b9 --- /dev/null +++ b/drivers/dahdi/dahdi_echocan_oslec.c @@ -0,0 +1,143 @@ +/* + * DAHDI Telephony Interface to the Open Source Line Echo Canceller (OSLEC) + * + * Written by Tzafrir Cohen + * Copyright (C) 2008 Xorcom, Inc. + * + * All rights reserved. + * + * Based on dahdi_echocan_hpec.c, Copyright (C) 2006-2008 Digium, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include + +/* Fix this if OSLEC is elsewhere */ +#include "../staging/echo/oslec.h" +//#include + +#include + +#define module_printk(level, fmt, args...) printk(level "%s: " fmt, THIS_MODULE->name, ## args) + +static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, + struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec); +static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec); +static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size); +static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val); + +static const struct dahdi_echocan_factory my_factory = { + .name = "OSLEC", + .owner = THIS_MODULE, + .echocan_create = echo_can_create, +}; + +static const struct dahdi_echocan_ops my_ops = { + .name = "OSLEC", + .echocan_free = echo_can_free, + .echocan_process = echo_can_process, + .echocan_traintap = echo_can_traintap, +}; + +struct ec_pvt { + struct oslec_state *oslec; + struct dahdi_echocan_state dahdi; +}; + +#define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi) + +static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec) +{ + struct ec_pvt *pvt = dahdi_to_pvt(ec); + + oslec_free(pvt->oslec); + kfree(pvt); +} + +static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size) +{ + struct ec_pvt *pvt = dahdi_to_pvt(ec); + u32 SampleNum; + + for (SampleNum = 0; SampleNum < size; SampleNum++, iref++) { + short iCleanSample; + + iCleanSample = oslec_update(pvt->oslec, *iref, *isig); + *isig++ = iCleanSample; + } +} + +static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, + struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec) +{ + struct ec_pvt *pvt; + + if (ecp->param_count > 0) { + printk(KERN_WARNING "OSLEC does not support parameters; failing request\n"); + return -EINVAL; + } + + pvt = kzalloc(sizeof(*pvt), GFP_KERNEL); + if (!pvt) + return -ENOMEM; + + pvt->dahdi.ops = &my_ops; + + pvt->oslec = oslec_create(ecp->tap_length, ECHO_CAN_USE_ADAPTION | ECHO_CAN_USE_NLP | ECHO_CAN_USE_CLIP | ECHO_CAN_USE_TX_HPF | ECHO_CAN_USE_RX_HPF); + + if (!pvt->oslec) { + kfree(pvt); + *ec = NULL; + return -ENOTTY; + } else { + *ec = &pvt->dahdi; + return 0; + } +} + +static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val) +{ + return 1; +} + +static int __init mod_init(void) +{ + if (dahdi_register_echocan_factory(&my_factory)) { + module_printk(KERN_ERR, "could not register with DAHDI core\n"); + + return -EPERM; + } + + module_printk(KERN_INFO, "Registered echo canceler '%s'\n", my_factory.name); + + return 0; +} + +static void __exit mod_exit(void) +{ + dahdi_unregister_echocan_factory(&my_factory); +} + +MODULE_DESCRIPTION("DAHDI OSLEC wrapper"); +MODULE_AUTHOR("Tzafrir Cohen "); +MODULE_LICENSE("GPL"); + +module_init(mod_init); +module_exit(mod_exit); -- cgit v1.2.3