From 13179eb2fc4b2384550a1681513986584634bfd6 Mon Sep 17 00:00:00 2001 From: kpfleming Date: Thu, 1 Feb 2007 00:55:41 +0000 Subject: add support for Digium's High Performance Echo Canceller rework the top-level Makefile so kernel 2.6 modules are built by a dedicated Makefile git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2076 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- hpec/hpec.h | 47 ++++++++++++++++++++ hpec/hpec_user.h | 40 +++++++++++++++++ hpec/hpec_zaptel.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 hpec/hpec.h create mode 100644 hpec/hpec_user.h create mode 100644 hpec/hpec_zaptel.h (limited to 'hpec') diff --git a/hpec/hpec.h b/hpec/hpec.h new file mode 100644 index 0000000..7e90f12 --- /dev/null +++ b/hpec/hpec.h @@ -0,0 +1,47 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ + +#if !defined(_HPEC_H) +#define _HPEC_H + +struct echo_can_state; + +void __attribute__((regparm(0))) hpec_init(int __attribute__((regparm(0))) __attribute__((format (printf, 1, 2))) (*logger)(const char *format, ...), + unsigned int debug, + unsigned int chunk_size, + void * (*memalloc)(size_t len), + void (*memfree)(void *ptr)); + +void __attribute__((regparm(0))) hpec_shutdown(void); + +int __attribute__((regparm(0))) hpec_license_challenge(struct hpec_challenge *challenge); + +int __attribute__((regparm(0))) hpec_license_check(struct hpec_license *license); + +struct echo_can_state __attribute__((regparm(0))) *hpec_channel_alloc(unsigned int len); + +void __attribute__((regparm(0))) hpec_channel_free(struct echo_can_state *channel); + +void __attribute__((regparm(0))) hpec_channel_update(struct echo_can_state *channel, short *iref, short *isig); + +#endif /* !defined(_HPEC_H) */ + diff --git a/hpec/hpec_user.h b/hpec/hpec_user.h new file mode 100644 index 0000000..bf006eb --- /dev/null +++ b/hpec/hpec_user.h @@ -0,0 +1,40 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ + +#if !defined(_HPEC_USER_H) +#define _HPEC_USER_H + +struct hpec_challenge { + __u8 challenge[16]; +}; + +struct hpec_license { + __u32 numchannels; + __u8 userinfo[256]; + __u8 response[16]; +}; + +#define ZT_EC_LICENSE_CHALLENGE _IOR(ZT_CODE, 60, struct hpec_challenge) +#define ZT_EC_LICENSE_RESPONSE _IOW(ZT_CODE, 61, struct hpec_license) + +#endif /* !defined(_HPEC_USER_H) */ + diff --git a/hpec/hpec_zaptel.h b/hpec/hpec_zaptel.h new file mode 100644 index 0000000..1de9a85 --- /dev/null +++ b/hpec/hpec_zaptel.h @@ -0,0 +1,128 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ + +#if !defined(_HPEC_ZAPTEL_H) +#define _HPEC_ZAPTEL_H + +#define ZT_EC_ARRAY_UPDATE + +#include "hpec_user.h" +#include "hpec.h" + +static int __attribute__((regparm(0))) __attribute__((format (printf, 1, 2))) logger(const char *format, ...) +{ + int res; + va_list args; + + va_start(args, format); + res = vprintk(format, args); + va_end(args); + + return res; +} + +static void *memalloc(size_t len) +{ + return kmalloc(len, GFP_KERNEL); +} + +static void memfree(void *ptr) +{ + kfree(ptr); +} + +static void echo_can_init(void) +{ + printk("Zaptel Echo Canceller: Digium High-Performance Echo Canceller\n"); + hpec_init(logger, debug, ZT_CHUNKSIZE, memalloc, memfree); +} + +static void echo_can_shutdown(void) +{ + hpec_shutdown(); +} + +static inline void echo_can_free(struct echo_can_state *ec) +{ + hpec_channel_free(ec); +} + +static inline void echo_can_array_update(struct echo_can_state *ec, short *iref, short *isig) +{ + hpec_channel_update(ec, iref, isig); +} + +DECLARE_MUTEX(alloc_lock); + +static inline struct echo_can_state *echo_can_create(int len, int adaption_mode) +{ + struct echo_can_state *result = NULL; + + if (down_interruptible(&alloc_lock)) + return NULL; + + result = hpec_channel_alloc(len); + + up(&alloc_lock); + + return result; +} + +static inline int echo_can_traintap(struct echo_can_state *ec, int pos, short val) +{ + return 0; +} + +DECLARE_MUTEX(license_lock); + +static int hpec_license_ioctl(unsigned int cmd, unsigned long data) +{ + struct hpec_challenge challenge; + struct hpec_license license; + int result = 0; + + switch (cmd) { + case ZT_EC_LICENSE_CHALLENGE: + if (down_interruptible(&license_lock)) + return -EINTR; + memset(&challenge, 0, sizeof(challenge)); + if (hpec_license_challenge(&challenge)) + result = -ENODEV; + if (!result && copy_to_user((unsigned char *) data, &challenge, sizeof(challenge))) + result = -EFAULT; + up(&license_lock); + return result; + case ZT_EC_LICENSE_RESPONSE: + if (down_interruptible(&license_lock)) + return -EINTR; + if (copy_from_user(&license, (unsigned char *) data, sizeof(license))) + result = -EFAULT; + if (!result && hpec_license_check(&license)) + result = -EACCES; + up(&license_lock); + return result; + default: + return -ENOSYS; + } +} + +#endif /* !defined(_HPEC_ZAPTEL_H) */ -- cgit v1.2.3