summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir@cohens.org.il>2010-01-05 20:12:48 +0200
committerTzafrir Cohen <tzafrir@cohens.org.il>2010-01-05 20:12:48 +0200
commita4ee69b5300fddb961c6f0c521d204d849e52a0c (patch)
tree844e20af088a4c7a6799b93e1b07617848641a98
parent7f2c8c423162af1f81bfbea5a3185b457d2cdcb5 (diff)
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.
-rw-r--r--Makefile178
-rw-r--r--drivers/dahdi/Kbuild6
-rw-r--r--drivers/dahdi/Kconfig14
-rw-r--r--drivers/dahdi/dahdi_echocan_oslec.c143
4 files changed, 341 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d05f769
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,178 @@
+#
+# Based on:
+# Makefile for DAHDI Linux kernel modules
+#
+# Copyright (C) 2001-2009 Digium, Inc.
+#
+# License: <fill in stanza. Basically: GPLv2>
+#
+
+#
+# This package allow:
+# A. test-building modules vs. DAHDI
+# B. generating a single patch of all the modules vs. the DAHDI tree.
+#
+# The default target here is to build all the modules. This requires various
+# DAHDI headers installed under /usr/include/dahdi . Some drivers will also
+# need some adjustment to include those files from there rather than from
+# the working directory.
+#
+# make # just build
+# make test-install # install under testroot/
+#
+# The modules built here are likely not to be useful as-is due to the
+# missing symbols from DAHDI. However they should expose most (if not
+# all) build warnings and errors.
+#
+# Some extra useful switches:
+#
+# KVERS=<version> # build with kernel version <version>
+# KSRC=</full/path> # build with kernel tree from /full/path
+# C=1/C=2 # Check with sparse (1: just when building, 2: all)
+#
+# The patch is generated by running:
+#
+# make gen-patch
+#
+# This generates a patch vs. dahdi in the file: dahdi_linux_extra.diff
+#
+# Other targets:
+#
+# make clean
+# make stackcheck # FIXME: doesn't work?
+#
+
+PWD:=$(shell pwd)
+
+DAHDI_LINUX_BRANCH =trunk
+DAHDI_LINUX_URL = http://svn.asterisk.org/svn/dahdi/linux/$(DAHDI_LINUX_BRANCH)
+SVN_DIR_SRC = dahdi-svn-orig
+SVN_DIR_DST = dahdi-svn-new
+
+BASE_DIR = drivers/dahdi
+MODULE_DIRS = drivers/staging/echo
+
+DAHDI_LINUX_DIFF = dahdi_linux_extra.diff
+
+# Files we shouldn't copy:
+OVERRIDE_FILES = Kbuild dahdi_echocan_oslec.c
+
+# If you want to build for a kernel other than the current kernel, set KVERS
+ifndef KVERS
+KVERS:=$(shell uname -r)
+endif
+ifndef KSRC
+ ifneq (,$(wildcard /lib/modules/$(KVERS)/build))
+ KSRC:=/lib/modules/$(KVERS)/build
+ else
+ KSRC_SEARCH_PATH:=/usr/src/linux
+ KSRC:=$(shell for dir in $(KSRC_SEARCH_PATH); do if [ -d $$dir ]; then echo $$dir; break; fi; done)
+ endif
+endif
+KVERS_MAJ:=$(shell echo $(KVERS) | cut -d. -f1-2)
+KINCLUDES:=$(KSRC)/include
+
+# We use the kernel's .config file as an indication that the KSRC
+# directory is indeed a valid and configured kernel source (or partial
+# source) directory.
+#
+# We also source it, as it has the format of Makefile variables list.
+# Thus we will have many CONFIG_* variables from there.
+KCONFIG:=$(KSRC)/.config
+ifneq (,$(wildcard $(KCONFIG)))
+ HAS_KSRC:=yes
+ include $(KCONFIG)
+else
+ HAS_KSRC:=no
+endif
+
+CHECKSTACK=$(KSRC)/scripts/checkstack.pl
+
+# Set HOTPLUG_FIRMWARE=no to override automatic building with hotplug support
+# if it is enabled in the kernel.
+
+ifeq (yes,$(HAS_KSRC))
+ HOTPLUG_FIRMWARE:=$(shell if grep -q '^CONFIG_FW_LOADER=[ym]' $(KCONFIG); then echo "yes"; else echo "no"; fi)
+endif
+
+MODULE_ALIASES:=wcfxs wctdm8xxp wct2xxp
+
+INST_HEADERS:=kernel.h user.h fasthdlc.h wctdm_user.h dahdi_config.h
+
+DAHDI_BUILD_ALL:=m
+
+KMAKE=$(MAKE) -C $(KSRC) SUBDIRS=$(PWD)/drivers/dahdi
+
+ifneq (,$(wildcard $(DESTDIR)/etc/udev/rules.d))
+ DYNFS:=yes
+endif
+
+ROOT_PREFIX:=
+
+ASCIIDOC:=asciidoc
+ASCIIDOC_CMD:=$(ASCIIDOC) -n -a toc -a toclevels=4
+
+GENERATED_DOCS:=README.html dahdi-api.html
+
+ifneq ($(wildcard .version),)
+ DAHDIVERSION:=$(shell cat .version)
+else
+ifneq ($(wildcard .svn),)
+ DAHDIVERSION:=$(shell build_tools/make_version . dahdi/linux)
+endif
+endif
+
+TESTROOT:=testroot
+
+all: modules
+
+modules:
+ifeq (no,$(HAS_KSRC))
+ @echo "You do not appear to have the sources for the $(KVERS) kernel installed."
+ @exit 1
+endif
+ $(KMAKE) modules DAHDI_BUILD_ALL=$(DAHDI_BUILD_ALL)
+
+stackcheck: $(CHECKSTACK) modules
+ objdump -d drivers/dahdi/*.ko drivers/dahdi/*/*.ko | $(CHECKSTACK)
+
+install: modules
+ $(KMAKE) INSTALL_MOD_PATH=$(DESTDIR) INSTALL_MOD_DIR=dahdi modules_install
+ [ `id -u` = 0 ] && /sbin/depmod -a $(KVERS) || :
+
+
+clean:
+ifneq (no,$(HAS_KSRC))
+ $(KMAKE) clean
+endif
+ rm -rf $(SVN_DIR_SRC) $(SVN_DIR_DST) $(DAHDI_LINUX_DIFF) $(TESTROOT)
+
+
+test-install:
+ $(MAKE) install DESTDIR=$(PWD)/$(TESTROOT)
+
+gen-patch:
+ rm -rf $(SVN_DIR_SRC) $(SVN_DIR_DST)
+ svn export -q $(DAHDI_LINUX_URL) $(SVN_DIR_SRC)
+ cp -a $(SVN_DIR_SRC) $(SVN_DIR_DST)
+ for dir in $(MODULE_DIRS); do \
+ mkdir -p $(SVN_DIR_DST)/$$dir; \
+ cp $$dir/*.[ch] $$dir/Kbuild $(SVN_DIR_DST)/$$dir/ ; \
+ done
+ # Preserve base Kbuild:
+ for file in $(OVERRIDE_FILES); do \
+ cp $(SVN_DIR_SRC)/$(BASE_DIR)/$$file $(SVN_DIR_DST)/$(BASE_DIR)/; \
+ done
+ find $(SVN_DIR_DST)/$(BASE_DIR) -name \*.mod.c | xargs rm -rf dummyfile
+
+ cat drivers/dahdi/Kconfig >>$(SVN_DIR_DST)/drivers/dahdi/Kconfig
+ cat drivers/dahdi/Kconfig >>$(SVN_DIR_DST)/drivers/dahdi/Kconfig
+ sed -e '/^####### END OF DATA ########/,$$d' drivers/dahdi/Kbuild \
+ | sed -i -e R/dev/stdin $(SVN_DIR_DST)/drivers/dahdi/Kbuild
+ diff -urN $(SVN_DIR_SRC) $(SVN_DIR_DST) >$(DAHDI_LINUX_DIFF) \
+ || [ $$? -eq 1 ]
+
+
+
+.PHONY: clean all install modules stackcheck test-install gen-patch
+
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 <tzafrir.cohen@xorcom.com>
+ * 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 <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/ctype.h>
+#include <linux/moduleparam.h>
+
+/* Fix this if OSLEC is elsewhere */
+#include "../staging/echo/oslec.h"
+//#include <linux/oslec.h>
+
+#include <dahdi/kernel.h>
+
+#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 <tzafrir.cohen@xorcom.com>");
+MODULE_LICENSE("GPL");
+
+module_init(mod_init);
+module_exit(mod_exit);