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. --- Makefile | 178 ++++++++++++++++++++++++++++++++++++ drivers/dahdi/Kbuild | 6 ++ drivers/dahdi/Kconfig | 14 +++ drivers/dahdi/dahdi_echocan_oslec.c | 143 +++++++++++++++++++++++++++++ 4 files changed, 341 insertions(+) create mode 100644 Makefile create mode 100644 drivers/dahdi/Kbuild create mode 100644 drivers/dahdi/Kconfig create mode 100644 drivers/dahdi/dahdi_echocan_oslec.c 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: +# + +# +# 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= # build with kernel version +# KSRC= # 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 + * 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