| /**************************************************************************** | |
| * ixj.c | |
| * | |
| * Device Driver for Quicknet Technologies, Inc.'s Telephony cards | |
| * including the Internet PhoneJACK, Internet PhoneJACK Lite, | |
| * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and | |
| * SmartCABLE | |
| * | |
| * (c) Copyright 1999-2001 Quicknet Technologies, Inc. | |
| * | |
| * 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. | |
| * | |
| * Author: Ed Okerson, <eokerson@quicknet.net> | |
| * | |
| * Contributors: Greg Herlein, <gherlein@quicknet.net> | |
| * David W. Erhart, <derhart@quicknet.net> | |
| * John Sellers, <jsellers@quicknet.net> | |
| * Mike Preston, <mpreston@quicknet.net> | |
| * | |
| * Fixes: David Huggins-Daines, <dhd@cepstral.com> | |
| * Fabio Ferrari, <fabio.ferrari@digitro.com.br> | |
| * Artis Kugevics, <artis@mt.lv> | |
| * Daniele Bellucci, <bellucda@tiscali.it> | |
| * | |
| * More information about the hardware related to this driver can be found | |
| * at our website: http://www.quicknet.net | |
| * | |
| * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR | |
| * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT | |
| * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET | |
| * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, | |
| * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | |
| * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
| * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION | |
| * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
| * | |
| ***************************************************************************/ | |
| /* | |
| * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci | |
| * Audit some copy_*_user and minor cleanup. | |
| * | |
| * Revision 4.7 2001/08/13 06:19:33 craigs | |
| * Added additional changes from Alan Cox and John Anderson for | |
| * 2.2 to 2.4 cleanup and bounds checking | |
| * | |
| * Revision 4.6 2001/08/13 01:05:05 craigs | |
| * Really fixed PHONE_QUERY_CODEC problem this time | |
| * | |
| * Revision 4.5 2001/08/13 00:11:03 craigs | |
| * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson | |
| * | |
| * Revision 4.4 2001/08/07 07:58:12 craigs | |
| * Changed back to three digit version numbers | |
| * Added tagbuild target to allow automatic and easy tagging of versions | |
| * | |
| * Revision 4.3 2001/08/07 07:24:47 craigs | |
| * Added ixj-ver.h to allow easy configuration management of driver | |
| * Added display of version number in /prox/ixj | |
| * | |
| * Revision 4.2 2001/08/06 07:07:19 craigs | |
| * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original | |
| * behaviour of returning int rather than short * | |
| * | |
| * Revision 4.1 2001/08/05 00:17:37 craigs | |
| * More changes for correct PCMCIA installation | |
| * Start of changes for backward Linux compatibility | |
| * | |
| * Revision 4.0 2001/08/04 12:33:12 craigs | |
| * New version using GNU autoconf | |
| * | |
| * Revision 3.105 2001/07/20 23:14:32 eokerson | |
| * More work on CallerID generation when using ring cadences. | |
| * | |
| * Revision 3.104 2001/07/06 01:33:55 eokerson | |
| * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile. | |
| * | |
| * Revision 3.103 2001/07/05 19:20:16 eokerson | |
| * Updated HOWTO | |
| * Changed mic gain to 30dB on Internet LineJACK mic/speaker port. | |
| * | |
| * Revision 3.102 2001/07/03 23:51:21 eokerson | |
| * Un-mute mic on Internet LineJACK when in speakerphone mode. | |
| * | |
| * Revision 3.101 2001/07/02 19:26:56 eokerson | |
| * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data | |
| * | |
| * Revision 3.100 2001/07/02 19:18:27 eokerson | |
| * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes. | |
| * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering. | |
| * Fixed speaker mode on Internet LineJACK. | |
| * | |
| * Revision 3.99 2001/05/09 14:11:16 eokerson | |
| * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>. | |
| * | |
| * Revision 3.98 2001/05/08 19:55:33 eokerson | |
| * Fixed POTS hookstate detection while it is connected to PSTN port. | |
| * | |
| * Revision 3.97 2001/05/08 00:01:04 eokerson | |
| * Fixed kernel oops when sending caller ID data. | |
| * | |
| * Revision 3.96 2001/05/04 23:09:30 eokerson | |
| * Now uses one kernel timer for each card, instead of one for the entire driver. | |
| * | |
| * Revision 3.95 2001/04/25 22:06:47 eokerson | |
| * Fixed squawking at beginning of some G.723.1 calls. | |
| * | |
| * Revision 3.94 2001/04/03 23:42:00 eokerson | |
| * Added linear volume ioctls | |
| * Added raw filter load ioctl | |
| * | |
| * Revision 3.93 2001/02/27 01:00:06 eokerson | |
| * Fixed blocking in CallerID. | |
| * Reduced size of ixj structure for smaller driver footprint. | |
| * | |
| * Revision 3.92 2001/02/20 22:02:59 eokerson | |
| * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels. | |
| * Improved PSTN ring detection. | |
| * Fixed wink generation on POTS ports. | |
| * | |
| * Revision 3.91 2001/02/13 00:55:44 eokerson | |
| * Turn AEC back on after changing frame sizes. | |
| * | |
| * Revision 3.90 2001/02/12 16:42:00 eokerson | |
| * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW. | |
| * | |
| * Revision 3.89 2001/02/12 15:41:16 eokerson | |
| * Fix from Artis Kugevics - Tone gains were not being set correctly. | |
| * | |
| * Revision 3.88 2001/02/05 23:25:42 eokerson | |
| * Fixed lockup bugs with deregister. | |
| * | |
| * Revision 3.87 2001/01/29 21:00:39 eokerson | |
| * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write. | |
| * Updated copyright date. | |
| * | |
| * Revision 3.86 2001/01/23 23:53:46 eokerson | |
| * Fixes to G.729 compatibility. | |
| * | |
| * Revision 3.85 2001/01/23 21:30:36 eokerson | |
| * Added verbage about cards supported. | |
| * Removed commands that put the card in low power mode at some times that it should not be in low power mode. | |
| * | |
| * Revision 3.84 2001/01/22 23:32:10 eokerson | |
| * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups. | |
| * | |
| * Revision 3.83 2001/01/19 14:51:41 eokerson | |
| * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails. | |
| * | |
| * Revision 3.82 2001/01/19 00:34:49 eokerson | |
| * Added verbosity to write overlap errors. | |
| * | |
| * Revision 3.81 2001/01/18 23:56:54 eokerson | |
| * Fixed PSTN line test functions. | |
| * | |
| * Revision 3.80 2001/01/18 22:29:27 eokerson | |
| * Updated AEC/AGC values for different cards. | |
| * | |
| * Revision 3.79 2001/01/17 02:58:54 eokerson | |
| * Fixed AEC reset after Caller ID. | |
| * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames. | |
| * | |
| * Revision 3.78 2001/01/16 19:43:09 eokerson | |
| * Added support for Linux 2.4.x kernels. | |
| * | |
| * Revision 3.77 2001/01/09 04:00:52 eokerson | |
| * Linetest will now test the line, even if it has previously succeeded. | |
| * | |
| * Revision 3.76 2001/01/08 19:27:00 eokerson | |
| * Fixed problem with standard cable on Internet PhoneCARD. | |
| * | |
| * Revision 3.75 2000/12/22 16:52:14 eokerson | |
| * Modified to allow hookstate detection on the POTS port when the PSTN port is selected. | |
| * | |
| * Revision 3.74 2000/12/08 22:41:50 eokerson | |
| * Added capability for G729B. | |
| * | |
| * Revision 3.73 2000/12/07 23:35:16 eokerson | |
| * Added capability to have different ring pattern before CallerID data. | |
| * Added hookstate checks in CallerID routines to stop FSK. | |
| * | |
| * Revision 3.72 2000/12/06 19:31:31 eokerson | |
| * Modified signal behavior to only send one signal per event. | |
| * | |
| * Revision 3.71 2000/12/06 03:23:08 eokerson | |
| * Fixed CallerID on Call Waiting. | |
| * | |
| * Revision 3.70 2000/12/04 21:29:37 eokerson | |
| * Added checking to Smart Cable gain functions. | |
| * | |
| * Revision 3.69 2000/12/04 21:05:20 eokerson | |
| * Changed ixjdebug levels. | |
| * Added ioctls to change gains in Internet Phone CARD Smart Cable. | |
| * | |
| * Revision 3.68 2000/12/04 00:17:21 craigs | |
| * Changed mixer voice gain to +6dB rather than 0dB | |
| * | |
| * Revision 3.67 2000/11/30 21:25:51 eokerson | |
| * Fixed write signal errors. | |
| * | |
| * Revision 3.66 2000/11/29 22:42:44 eokerson | |
| * Fixed PSTN ring detect problems. | |
| * | |
| * Revision 3.65 2000/11/29 07:31:55 craigs | |
| * Added new 425Hz filter co-efficients | |
| * Added card-specific DTMF prescaler initialisation | |
| * | |
| * Revision 3.64 2000/11/28 14:03:32 craigs | |
| * Changed certain mixer initialisations to be 0dB rather than 12dB | |
| * Added additional information to /proc/ixj | |
| * | |
| * Revision 3.63 2000/11/28 11:38:41 craigs | |
| * Added display of AEC modes in AUTO and AGC mode | |
| * | |
| * Revision 3.62 2000/11/28 04:05:44 eokerson | |
| * Improved PSTN ring detection routine. | |
| * | |
| * Revision 3.61 2000/11/27 21:53:12 eokerson | |
| * Fixed flash detection. | |
| * | |
| * Revision 3.60 2000/11/27 15:57:29 eokerson | |
| * More work on G.729 load routines. | |
| * | |
| * Revision 3.59 2000/11/25 21:55:12 eokerson | |
| * Fixed errors in G.729 load routine. | |
| * | |
| * Revision 3.58 2000/11/25 04:08:29 eokerson | |
| * Added board locks around G.729 and TS85 load routines. | |
| * | |
| * Revision 3.57 2000/11/24 05:35:17 craigs | |
| * Added ability to retrieve mixer values on LineJACK | |
| * Added complete initialisation of all mixer values at startup | |
| * Fixed spelling mistake | |
| * | |
| * Revision 3.56 2000/11/23 02:52:11 robertj | |
| * Added cvs change log keyword. | |
| * Fixed bug in capabilities list when using G.729 module. | |
| * | |
| */ | |
| #include "ixj-ver.h" | |
| #define PERFMON_STATS | |
| #define IXJDEBUG 0 | |
| #define MAXRINGS 5 | |
| #include <linux/module.h> | |
| #include <linux/init.h> | |
| #include <linux/sched.h> | |
| #include <linux/kernel.h> /* printk() */ | |
| #include <linux/fs.h> /* everything... */ | |
| #include <linux/errno.h> /* error codes */ | |
| #include <linux/slab.h> | |
| #include <linux/mutex.h> | |
| #include <linux/mm.h> | |
| #include <linux/ioport.h> | |
| #include <linux/interrupt.h> | |
| #include <linux/proc_fs.h> | |
| #include <linux/poll.h> | |
| #include <linux/timer.h> | |
| #include <linux/delay.h> | |
| #include <linux/pci.h> | |
| #include <asm/io.h> | |
| #include <asm/uaccess.h> | |
| #include <linux/isapnp.h> | |
| #include "ixj.h" | |
| #define TYPE(inode) (iminor(inode) >> 4) | |
| #define NUM(inode) (iminor(inode) & 0xf) | |
| static DEFINE_MUTEX(ixj_mutex); | |
| static int ixjdebug; | |
| static int hertz = HZ; | |
| static int samplerate = 100; | |
| module_param(ixjdebug, int, 0); | |
| static DEFINE_PCI_DEVICE_TABLE(ixj_pci_tbl) = { | |
| { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ, | |
| PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | |
| { } | |
| }; | |
| MODULE_DEVICE_TABLE(pci, ixj_pci_tbl); | |
| /************************************************************************ | |
| * | |
| * ixjdebug meanings are now bit mapped instead of level based | |
| * Values can be or'ed together to turn on multiple messages | |
| * | |
| * bit 0 (0x0001) = any failure | |
| * bit 1 (0x0002) = general messages | |
| * bit 2 (0x0004) = POTS ringing related | |
| * bit 3 (0x0008) = PSTN events | |
| * bit 4 (0x0010) = PSTN Cadence state details | |
| * bit 5 (0x0020) = Tone detection triggers | |
| * bit 6 (0x0040) = Tone detection cadence details | |
| * bit 7 (0x0080) = ioctl tracking | |
| * bit 8 (0x0100) = signal tracking | |
| * bit 9 (0x0200) = CallerID generation details | |
| * | |
| ************************************************************************/ | |
| #ifdef IXJ_DYN_ALLOC | |
| static IXJ *ixj[IXJMAX]; | |
| #define get_ixj(b) ixj[(b)] | |
| /* | |
| * Allocate a free IXJ device | |
| */ | |
| static IXJ *ixj_alloc() | |
| { | |
| for(cnt=0; cnt<IXJMAX; cnt++) | |
| { | |
| if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase) | |
| { | |
| j = kmalloc(sizeof(IXJ), GFP_KERNEL); | |
| if (j == NULL) | |
| return NULL; | |
| ixj[cnt] = j; | |
| return j; | |
| } | |
| } | |
| return NULL; | |
| } | |
| static void ixj_fsk_free(IXJ *j) | |
| { | |
| kfree(j->fskdata); | |
| j->fskdata = NULL; | |
| } | |
| static void ixj_fsk_alloc(IXJ *j) | |
| { | |
| if(!j->fskdata) { | |
| j->fskdata = kmalloc(8000, GFP_KERNEL); | |
| if (!j->fskdata) { | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ phone%d - allocate failed\n", j->board); | |
| } | |
| return; | |
| } else { | |
| j->fsksize = 8000; | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ phone%d - allocate succeeded\n", j->board); | |
| } | |
| } | |
| } | |
| } | |
| #else | |
| static IXJ ixj[IXJMAX]; | |
| #define get_ixj(b) (&ixj[(b)]) | |
| /* | |
| * Allocate a free IXJ device | |
| */ | |
| static IXJ *ixj_alloc(void) | |
| { | |
| int cnt; | |
| for(cnt=0; cnt<IXJMAX; cnt++) { | |
| if(!ixj[cnt].DSPbase) | |
| return &ixj[cnt]; | |
| } | |
| return NULL; | |
| } | |
| static inline void ixj_fsk_free(IXJ *j) {;} | |
| static inline void ixj_fsk_alloc(IXJ *j) | |
| { | |
| j->fsksize = 8000; | |
| } | |
| #endif | |
| #ifdef PERFMON_STATS | |
| #define ixj_perfmon(x) ((x)++) | |
| #else | |
| #define ixj_perfmon(x) do { } while(0) | |
| #endif | |
| static int ixj_convert_loaded; | |
| static int ixj_WriteDSPCommand(unsigned short, IXJ *j); | |
| /************************************************************************ | |
| * | |
| * These are function definitions to allow external modules to register | |
| * enhanced functionality call backs. | |
| * | |
| ************************************************************************/ | |
| static int Stub(IXJ * J, unsigned long arg) | |
| { | |
| return 0; | |
| } | |
| static IXJ_REGFUNC ixj_PreRead = &Stub; | |
| static IXJ_REGFUNC ixj_PostRead = &Stub; | |
| static IXJ_REGFUNC ixj_PreWrite = &Stub; | |
| static IXJ_REGFUNC ixj_PostWrite = &Stub; | |
| static void ixj_read_frame(IXJ *j); | |
| static void ixj_write_frame(IXJ *j); | |
| static void ixj_init_timer(IXJ *j); | |
| static void ixj_add_timer(IXJ * j); | |
| static void ixj_timeout(unsigned long ptr); | |
| static int read_filters(IXJ *j); | |
| static int LineMonitor(IXJ *j); | |
| static int ixj_fasync(int fd, struct file *, int mode); | |
| static int ixj_set_port(IXJ *j, int arg); | |
| static int ixj_set_pots(IXJ *j, int arg); | |
| static int ixj_hookstate(IXJ *j); | |
| static int ixj_record_start(IXJ *j); | |
| static void ixj_record_stop(IXJ *j); | |
| static void set_rec_volume(IXJ *j, int volume); | |
| static int get_rec_volume(IXJ *j); | |
| static int set_rec_codec(IXJ *j, int rate); | |
| static void ixj_vad(IXJ *j, int arg); | |
| static int ixj_play_start(IXJ *j); | |
| static void ixj_play_stop(IXJ *j); | |
| static int ixj_set_tone_on(unsigned short arg, IXJ *j); | |
| static int ixj_set_tone_off(unsigned short, IXJ *j); | |
| static int ixj_play_tone(IXJ *j, char tone); | |
| static void ixj_aec_start(IXJ *j, int level); | |
| static int idle(IXJ *j); | |
| static void ixj_ring_on(IXJ *j); | |
| static void ixj_ring_off(IXJ *j); | |
| static void aec_stop(IXJ *j); | |
| static void ixj_ringback(IXJ *j); | |
| static void ixj_busytone(IXJ *j); | |
| static void ixj_dialtone(IXJ *j); | |
| static void ixj_cpt_stop(IXJ *j); | |
| static char daa_int_read(IXJ *j); | |
| static char daa_CR_read(IXJ *j, int cr); | |
| static int daa_set_mode(IXJ *j, int mode); | |
| static int ixj_linetest(IXJ *j); | |
| static int ixj_daa_write(IXJ *j); | |
| static int ixj_daa_cid_read(IXJ *j); | |
| static void DAA_Coeff_US(IXJ *j); | |
| static void DAA_Coeff_UK(IXJ *j); | |
| static void DAA_Coeff_France(IXJ *j); | |
| static void DAA_Coeff_Germany(IXJ *j); | |
| static void DAA_Coeff_Australia(IXJ *j); | |
| static void DAA_Coeff_Japan(IXJ *j); | |
| static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf); | |
| static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr); | |
| static int ixj_init_tone(IXJ *j, IXJ_TONE * ti); | |
| static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp); | |
| static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp); | |
| /* Serial Control Interface funtions */ | |
| static int SCI_Control(IXJ *j, int control); | |
| static int SCI_Prepare(IXJ *j); | |
| static int SCI_WaitHighSCI(IXJ *j); | |
| static int SCI_WaitLowSCI(IXJ *j); | |
| static DWORD PCIEE_GetSerialNumber(WORD wAddress); | |
| static int ixj_PCcontrol_wait(IXJ *j); | |
| static void ixj_pre_cid(IXJ *j); | |
| static void ixj_write_cid(IXJ *j); | |
| static void ixj_write_cid_bit(IXJ *j, int bit); | |
| static int set_base_frame(IXJ *j, int size); | |
| static int set_play_codec(IXJ *j, int rate); | |
| static void set_rec_depth(IXJ *j, int depth); | |
| static int ixj_mixer(long val, IXJ *j); | |
| /************************************************************************ | |
| CT8020/CT8021 Host Programmers Model | |
| Host address Function Access | |
| DSPbase + | |
| 0-1 Aux Software Status Register (reserved) Read Only | |
| 2-3 Software Status Register Read Only | |
| 4-5 Aux Software Control Register (reserved) Read Write | |
| 6-7 Software Control Register Read Write | |
| 8-9 Hardware Status Register Read Only | |
| A-B Hardware Control Register Read Write | |
| C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only | |
| E-F Host Receive (Read) Data Buffer Access Port (buffer input) Read Only | |
| ************************************************************************/ | |
| static inline void ixj_read_HSR(IXJ *j) | |
| { | |
| j->hsr.bytes.low = inb_p(j->DSPbase + 8); | |
| j->hsr.bytes.high = inb_p(j->DSPbase + 9); | |
| } | |
| static inline int IsControlReady(IXJ *j) | |
| { | |
| ixj_read_HSR(j); | |
| return j->hsr.bits.controlrdy ? 1 : 0; | |
| } | |
| static inline int IsPCControlReady(IXJ *j) | |
| { | |
| j->pccr1.byte = inb_p(j->XILINXbase + 3); | |
| return j->pccr1.bits.crr ? 1 : 0; | |
| } | |
| static inline int IsStatusReady(IXJ *j) | |
| { | |
| ixj_read_HSR(j); | |
| return j->hsr.bits.statusrdy ? 1 : 0; | |
| } | |
| static inline int IsRxReady(IXJ *j) | |
| { | |
| ixj_read_HSR(j); | |
| ixj_perfmon(j->rxreadycheck); | |
| return j->hsr.bits.rxrdy ? 1 : 0; | |
| } | |
| static inline int IsTxReady(IXJ *j) | |
| { | |
| ixj_read_HSR(j); | |
| ixj_perfmon(j->txreadycheck); | |
| return j->hsr.bits.txrdy ? 1 : 0; | |
| } | |
| static inline void set_play_volume(IXJ *j, int volume) | |
| { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume); | |
| ixj_WriteDSPCommand(0xCF02, j); | |
| ixj_WriteDSPCommand(volume, j); | |
| } | |
| static int set_play_volume_linear(IXJ *j, int volume) | |
| { | |
| int newvolume, dspplaymax; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume); | |
| if(volume > 100 || volume < 0) { | |
| return -1; | |
| } | |
| /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| dspplaymax = 0x380; | |
| break; | |
| case QTI_LINEJACK: | |
| if(j->port == PORT_PSTN) { | |
| dspplaymax = 0x48; | |
| } else { | |
| dspplaymax = 0x100; | |
| } | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| dspplaymax = 0x380; | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| dspplaymax = 0x6C; | |
| break; | |
| case QTI_PHONECARD: | |
| dspplaymax = 0x50; | |
| break; | |
| default: | |
| return -1; | |
| } | |
| newvolume = (dspplaymax * volume) / 100; | |
| set_play_volume(j, newvolume); | |
| return 0; | |
| } | |
| static inline void set_play_depth(IXJ *j, int depth) | |
| { | |
| if (depth > 60) | |
| depth = 60; | |
| if (depth < 0) | |
| depth = 0; | |
| ixj_WriteDSPCommand(0x5280 + depth, j); | |
| } | |
| static inline int get_play_volume(IXJ *j) | |
| { | |
| ixj_WriteDSPCommand(0xCF00, j); | |
| return j->ssr.high << 8 | j->ssr.low; | |
| } | |
| static int get_play_volume_linear(IXJ *j) | |
| { | |
| int volume, newvolume, dspplaymax; | |
| /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| dspplaymax = 0x380; | |
| break; | |
| case QTI_LINEJACK: | |
| if(j->port == PORT_PSTN) { | |
| dspplaymax = 0x48; | |
| } else { | |
| dspplaymax = 0x100; | |
| } | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| dspplaymax = 0x380; | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| dspplaymax = 0x6C; | |
| break; | |
| case QTI_PHONECARD: | |
| dspplaymax = 100; | |
| break; | |
| default: | |
| return -1; | |
| } | |
| volume = get_play_volume(j); | |
| newvolume = (volume * 100) / dspplaymax; | |
| if(newvolume > 100) | |
| newvolume = 100; | |
| return newvolume; | |
| } | |
| static inline BYTE SLIC_GetState(IXJ *j) | |
| { | |
| if (j->cardtype == QTI_PHONECARD) { | |
| j->pccr1.byte = 0; | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 1; | |
| outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; | |
| ixj_PCcontrol_wait(j); | |
| if (j->pslic.bits.powerdown) | |
| return PLD_SLIC_STATE_OC; | |
| else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1) | |
| return PLD_SLIC_STATE_ACTIVE; | |
| else | |
| return PLD_SLIC_STATE_RINGING; | |
| } else { | |
| j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); | |
| } | |
| return j->pld_slicr.bits.state; | |
| } | |
| static bool SLIC_SetState(BYTE byState, IXJ *j) | |
| { | |
| bool fRetVal = false; | |
| if (j->cardtype == QTI_PHONECARD) { | |
| if (j->flags.pcmciasct) { | |
| switch (byState) { | |
| case PLD_SLIC_STATE_TIPOPEN: | |
| case PLD_SLIC_STATE_OC: | |
| j->pslic.bits.powerdown = 1; | |
| j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_RINGING: | |
| if (j->readers || j->writers) { | |
| j->pslic.bits.powerdown = 0; | |
| j->pslic.bits.ring0 = 1; | |
| j->pslic.bits.ring1 = 0; | |
| fRetVal = true; | |
| } | |
| break; | |
| case PLD_SLIC_STATE_OHT: /* On-hook transmit */ | |
| case PLD_SLIC_STATE_STANDBY: | |
| case PLD_SLIC_STATE_ACTIVE: | |
| if (j->readers || j->writers) { | |
| j->pslic.bits.powerdown = 0; | |
| } else { | |
| j->pslic.bits.powerdown = 1; | |
| } | |
| j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_APR: /* Active polarity reversal */ | |
| case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ | |
| default: | |
| fRetVal = false; | |
| break; | |
| } | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 0; | |
| outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| } | |
| } else { | |
| /* Set the C1, C2, C3 & B2EN signals. */ | |
| switch (byState) { | |
| case PLD_SLIC_STATE_OC: | |
| j->pld_slicw.bits.c1 = 0; | |
| j->pld_slicw.bits.c2 = 0; | |
| j->pld_slicw.bits.c3 = 0; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_RINGING: | |
| j->pld_slicw.bits.c1 = 1; | |
| j->pld_slicw.bits.c2 = 0; | |
| j->pld_slicw.bits.c3 = 0; | |
| j->pld_slicw.bits.b2en = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_ACTIVE: | |
| j->pld_slicw.bits.c1 = 0; | |
| j->pld_slicw.bits.c2 = 1; | |
| j->pld_slicw.bits.c3 = 0; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_OHT: /* On-hook transmit */ | |
| j->pld_slicw.bits.c1 = 1; | |
| j->pld_slicw.bits.c2 = 1; | |
| j->pld_slicw.bits.c3 = 0; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_TIPOPEN: | |
| j->pld_slicw.bits.c1 = 0; | |
| j->pld_slicw.bits.c2 = 0; | |
| j->pld_slicw.bits.c3 = 1; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_STANDBY: | |
| j->pld_slicw.bits.c1 = 1; | |
| j->pld_slicw.bits.c2 = 0; | |
| j->pld_slicw.bits.c3 = 1; | |
| j->pld_slicw.bits.b2en = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_APR: /* Active polarity reversal */ | |
| j->pld_slicw.bits.c1 = 0; | |
| j->pld_slicw.bits.c2 = 1; | |
| j->pld_slicw.bits.c3 = 1; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ | |
| j->pld_slicw.bits.c1 = 1; | |
| j->pld_slicw.bits.c2 = 1; | |
| j->pld_slicw.bits.c3 = 1; | |
| j->pld_slicw.bits.b2en = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| fRetVal = true; | |
| break; | |
| default: | |
| fRetVal = false; | |
| break; | |
| } | |
| } | |
| return fRetVal; | |
| } | |
| static int ixj_wink(IXJ *j) | |
| { | |
| BYTE slicnow; | |
| slicnow = SLIC_GetState(j); | |
| j->pots_winkstart = jiffies; | |
| SLIC_SetState(PLD_SLIC_STATE_OC, j); | |
| msleep(jiffies_to_msecs(j->winktime)); | |
| SLIC_SetState(slicnow, j); | |
| return 0; | |
| } | |
| static void ixj_init_timer(IXJ *j) | |
| { | |
| init_timer(&j->timer); | |
| j->timer.function = ixj_timeout; | |
| j->timer.data = (unsigned long)j; | |
| } | |
| static void ixj_add_timer(IXJ *j) | |
| { | |
| j->timer.expires = jiffies + (hertz / samplerate); | |
| add_timer(&j->timer); | |
| } | |
| static void ixj_tone_timeout(IXJ *j) | |
| { | |
| IXJ_TONE ti; | |
| j->tone_state++; | |
| if (j->tone_state == 3) { | |
| j->tone_state = 0; | |
| if (j->cadence_t) { | |
| j->tone_cadence_state++; | |
| if (j->tone_cadence_state >= j->cadence_t->elements_used) { | |
| switch (j->cadence_t->termination) { | |
| case PLAY_ONCE: | |
| ixj_cpt_stop(j); | |
| break; | |
| case REPEAT_LAST_ELEMENT: | |
| j->tone_cadence_state--; | |
| ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); | |
| break; | |
| case REPEAT_ALL: | |
| j->tone_cadence_state = 0; | |
| if (j->cadence_t->ce[j->tone_cadence_state].freq0) { | |
| ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | |
| ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | |
| ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | |
| ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | |
| ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | |
| ixj_init_tone(j, &ti); | |
| } | |
| ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j); | |
| ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j); | |
| ixj_play_tone(j, j->cadence_t->ce[0].index); | |
| break; | |
| } | |
| } else { | |
| if (j->cadence_t->ce[j->tone_cadence_state].gain0) { | |
| ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | |
| ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | |
| ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | |
| ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | |
| ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | |
| ixj_init_tone(j, &ti); | |
| } | |
| ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j); | |
| ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j); | |
| ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); | |
| } | |
| } | |
| } | |
| } | |
| static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir) | |
| { | |
| if(j->ixj_signals[event]) { | |
| if(ixjdebug & 0x0100) | |
| printk("Sending signal for event %d\n", event); | |
| /* Send apps notice of change */ | |
| /* see config.h for macro definition */ | |
| kill_fasync(&(j->async_queue), j->ixj_signals[event], dir); | |
| } | |
| } | |
| static void ixj_pstn_state(IXJ *j) | |
| { | |
| int var; | |
| union XOPXR0 XR0, daaint; | |
| var = 10; | |
| XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg; | |
| daaint.reg = 0; | |
| XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if (j->pld_scrr.bits.daaflag) { | |
| daa_int_read(j); | |
| if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) { | |
| if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { | |
| daaint.bitreg.RING = 1; | |
| if(ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | |
| } | |
| } else { | |
| daa_set_mode(j, SOP_PU_RESET); | |
| } | |
| } | |
| if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) { | |
| daaint.bitreg.Caller_ID = 1; | |
| j->pstn_cid_intr = 1; | |
| j->pstn_cid_received = jiffies; | |
| if(ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | |
| } | |
| } | |
| if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) { | |
| daaint.bitreg.Cadence = 1; | |
| if(ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | |
| } | |
| } | |
| if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) { | |
| daaint.bitreg.VDD_OK = 1; | |
| daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK; | |
| } | |
| } | |
| daa_CR_read(j, 1); | |
| if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { | |
| daaint.bitreg.RMR = 1; | |
| daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; | |
| if(ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr); | |
| } | |
| j->pstn_prev_rmr = j->pstn_last_rmr; | |
| j->pstn_last_rmr = jiffies; | |
| } | |
| switch(j->daa_mode) { | |
| case SOP_PU_SLEEP: | |
| if (daaint.bitreg.RING) { | |
| if (!j->flags.pstn_ringing) { | |
| if (j->daa_mode != SOP_PU_RINGING) { | |
| j->pstn_ring_int = jiffies; | |
| daa_set_mode(j, SOP_PU_RINGING); | |
| } | |
| } | |
| } | |
| break; | |
| case SOP_PU_RINGING: | |
| if (daaint.bitreg.RMR) { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); | |
| } | |
| if (daaint.bitreg.SI_1) { /* Rising edge of RMR */ | |
| j->flags.pstn_rmr = 1; | |
| j->pstn_ring_start = jiffies; | |
| j->pstn_ring_stop = 0; | |
| j->ex.bits.pstn_ring = 0; | |
| if (j->cadence_f[4].state == 0) { | |
| j->cadence_f[4].state = 1; | |
| j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000); | |
| j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000); | |
| j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000); | |
| } else if (j->cadence_f[4].state == 2) { | |
| if((time_after(jiffies, j->cadence_f[4].off1min) && | |
| time_before(jiffies, j->cadence_f[4].off1max))) { | |
| if (j->cadence_f[4].on2) { | |
| j->cadence_f[4].state = 3; | |
| j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000)); | |
| j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[4].state = 7; | |
| } | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].off1); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else if (j->cadence_f[4].state == 4) { | |
| if((time_after(jiffies, j->cadence_f[4].off2min) && | |
| time_before(jiffies, j->cadence_f[4].off2max))) { | |
| if (j->cadence_f[4].on3) { | |
| j->cadence_f[4].state = 5; | |
| j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000)); | |
| j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[4].state = 7; | |
| } | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].off2); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else if (j->cadence_f[4].state == 6) { | |
| if((time_after(jiffies, j->cadence_f[4].off3min) && | |
| time_before(jiffies, j->cadence_f[4].off3max))) { | |
| j->cadence_f[4].state = 7; | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].off3); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else { | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else { /* Falling edge of RMR */ | |
| j->pstn_ring_start = 0; | |
| j->pstn_ring_stop = jiffies; | |
| if (j->cadence_f[4].state == 1) { | |
| if(!j->cadence_f[4].on1) { | |
| j->cadence_f[4].state = 7; | |
| } else if((time_after(jiffies, j->cadence_f[4].on1min) && | |
| time_before(jiffies, j->cadence_f[4].on1max))) { | |
| if (j->cadence_f[4].off1) { | |
| j->cadence_f[4].state = 2; | |
| j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000)); | |
| j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[4].state = 7; | |
| } | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].on1); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else if (j->cadence_f[4].state == 3) { | |
| if((time_after(jiffies, j->cadence_f[4].on2min) && | |
| time_before(jiffies, j->cadence_f[4].on2max))) { | |
| if (j->cadence_f[4].off2) { | |
| j->cadence_f[4].state = 4; | |
| j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000)); | |
| j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[4].state = 7; | |
| } | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].on2); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else if (j->cadence_f[4].state == 5) { | |
| if((time_after(jiffies, j->cadence_f[4].on3min) && | |
| time_before(jiffies, j->cadence_f[4].on3max))) { | |
| if (j->cadence_f[4].off3) { | |
| j->cadence_f[4].state = 6; | |
| j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000)); | |
| j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[4].state = 7; | |
| } | |
| } else { | |
| j->cadence_f[4].state = 0; | |
| } | |
| } else { | |
| if (ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | |
| j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | |
| j->cadence_f[4].on3); | |
| } | |
| j->cadence_f[4].state = 0; | |
| } | |
| } | |
| if (ixjdebug & 0x0010) { | |
| printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); | |
| } | |
| if (ixjdebug & 0x0010) { | |
| switch(j->cadence_f[4].state) { | |
| case 1: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max); | |
| break; | |
| case 2: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max); | |
| break; | |
| case 3: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max); | |
| break; | |
| case 4: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max); | |
| break; | |
| case 5: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max); | |
| break; | |
| case 6: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | |
| j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max); | |
| break; | |
| } | |
| } | |
| } | |
| if (j->cadence_f[4].state == 7) { | |
| j->cadence_f[4].state = 0; | |
| j->pstn_ring_stop = jiffies; | |
| j->ex.bits.pstn_ring = 1; | |
| ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN); | |
| if(ixjdebug & 0x0008) { | |
| printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies); | |
| } | |
| } | |
| if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) || | |
| (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) { | |
| if(ixjdebug & 0x0008) { | |
| printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies); | |
| printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int); | |
| printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop); | |
| } | |
| j->pstn_ring_stop = j->pstn_ring_int = 0; | |
| daa_set_mode(j, SOP_PU_SLEEP); | |
| } | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) { | |
| ixj_daa_cid_read(j); | |
| j->ex.bits.caller_id = 1; | |
| ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN); | |
| j->pstn_cid_intr = 0; | |
| } | |
| if (daaint.bitreg.Cadence) { | |
| if(ixjdebug & 0x0008) { | |
| printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board); | |
| } | |
| daa_set_mode(j, SOP_PU_SLEEP); | |
| j->ex.bits.pstn_ring = 0; | |
| } | |
| break; | |
| case SOP_PU_CONVERSATION: | |
| if (daaint.bitreg.VDD_OK) { | |
| if(!daaint.bitreg.SI_0) { | |
| if (!j->pstn_winkstart) { | |
| if(ixjdebug & 0x0008) { | |
| printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies); | |
| } | |
| j->pstn_winkstart = jiffies; | |
| } | |
| } else { | |
| if (j->pstn_winkstart) { | |
| if(ixjdebug & 0x0008) { | |
| printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies); | |
| } | |
| j->pstn_winkstart = 0; | |
| } | |
| } | |
| } | |
| if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) { | |
| if(ixjdebug & 0x0008) { | |
| printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies); | |
| } | |
| daa_set_mode(j, SOP_PU_SLEEP); | |
| j->pstn_winkstart = 0; | |
| j->ex.bits.pstn_wink = 1; | |
| ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN); | |
| } | |
| break; | |
| } | |
| } | |
| static void ixj_timeout(unsigned long ptr) | |
| { | |
| int board; | |
| unsigned long jifon; | |
| IXJ *j = (IXJ *)ptr; | |
| board = j->board; | |
| if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) { | |
| ixj_perfmon(j->timerchecks); | |
| j->hookstate = ixj_hookstate(j); | |
| if (j->tone_state) { | |
| if (!(j->hookstate)) { | |
| ixj_cpt_stop(j); | |
| if (j->m_hook) { | |
| j->m_hook = 0; | |
| j->ex.bits.hookstate = 1; | |
| ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | |
| } | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| if (j->tone_state == 1) | |
| jifon = ((hertz * j->tone_on_time) * 25 / 100000); | |
| else | |
| jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000); | |
| if (time_before(jiffies, j->tone_start_jif + jifon)) { | |
| if (j->tone_state == 1) { | |
| ixj_play_tone(j, j->tone_index); | |
| if (j->dsp.low == 0x20) { | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| } else { | |
| ixj_play_tone(j, 0); | |
| if (j->dsp.low == 0x20) { | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| } | |
| } else { | |
| ixj_tone_timeout(j); | |
| if (j->flags.dialtone) { | |
| ixj_dialtone(j); | |
| } | |
| if (j->flags.busytone) { | |
| ixj_busytone(j); | |
| if (j->dsp.low == 0x20) { | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| } | |
| if (j->flags.ringback) { | |
| ixj_ringback(j); | |
| if (j->dsp.low == 0x20) { | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| } | |
| if (!j->tone_state) { | |
| ixj_cpt_stop(j); | |
| } | |
| } | |
| } | |
| if (!(j->tone_state && j->dsp.low == 0x20)) { | |
| if (IsRxReady(j)) { | |
| ixj_read_frame(j); | |
| } | |
| if (IsTxReady(j)) { | |
| ixj_write_frame(j); | |
| } | |
| } | |
| if (j->flags.cringing) { | |
| if (j->hookstate & 1) { | |
| j->flags.cringing = 0; | |
| ixj_ring_off(j); | |
| } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) { | |
| switch(j->cadence_f[5].state) { | |
| case 0: | |
| j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000)); | |
| if (time_before(jiffies, j->cadence_f[5].on1dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_on(j); | |
| } | |
| j->cadence_f[5].state = 1; | |
| break; | |
| case 1: | |
| if (time_after(jiffies, j->cadence_f[5].on1dot)) { | |
| j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000)); | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_off(j); | |
| j->cadence_f[5].state = 2; | |
| } | |
| break; | |
| case 2: | |
| if (time_after(jiffies, j->cadence_f[5].off1dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_on(j); | |
| if (j->cadence_f[5].on2) { | |
| j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000)); | |
| j->cadence_f[5].state = 3; | |
| } else { | |
| j->cadence_f[5].state = 7; | |
| } | |
| } | |
| break; | |
| case 3: | |
| if (time_after(jiffies, j->cadence_f[5].on2dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_off(j); | |
| if (j->cadence_f[5].off2) { | |
| j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000)); | |
| j->cadence_f[5].state = 4; | |
| } else { | |
| j->cadence_f[5].state = 7; | |
| } | |
| } | |
| break; | |
| case 4: | |
| if (time_after(jiffies, j->cadence_f[5].off2dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_on(j); | |
| if (j->cadence_f[5].on3) { | |
| j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000)); | |
| j->cadence_f[5].state = 5; | |
| } else { | |
| j->cadence_f[5].state = 7; | |
| } | |
| } | |
| break; | |
| case 5: | |
| if (time_after(jiffies, j->cadence_f[5].on3dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| ixj_ring_off(j); | |
| if (j->cadence_f[5].off3) { | |
| j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000)); | |
| j->cadence_f[5].state = 6; | |
| } else { | |
| j->cadence_f[5].state = 7; | |
| } | |
| } | |
| break; | |
| case 6: | |
| if (time_after(jiffies, j->cadence_f[5].off3dot)) { | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| j->cadence_f[5].state = 7; | |
| } | |
| break; | |
| case 7: | |
| if(ixjdebug & 0x0004) { | |
| printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | |
| } | |
| j->flags.cidring = 1; | |
| j->cadence_f[5].state = 0; | |
| break; | |
| } | |
| if (j->flags.cidring && !j->flags.cidsent) { | |
| j->flags.cidsent = 1; | |
| if(j->fskdcnt) { | |
| SLIC_SetState(PLD_SLIC_STATE_OHT, j); | |
| ixj_pre_cid(j); | |
| } | |
| j->flags.cidring = 0; | |
| } | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } else { | |
| if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) { | |
| if (j->flags.cidring && !j->flags.cidsent) { | |
| j->flags.cidsent = 1; | |
| if(j->fskdcnt) { | |
| SLIC_SetState(PLD_SLIC_STATE_OHT, j); | |
| ixj_pre_cid(j); | |
| } | |
| j->flags.cidring = 0; | |
| } | |
| j->ring_cadence_t--; | |
| if (j->ring_cadence_t == -1) | |
| j->ring_cadence_t = 15; | |
| j->ring_cadence_jif = jiffies; | |
| if (j->ring_cadence & 1 << j->ring_cadence_t) { | |
| if(j->flags.cidsent && j->cadence_f[5].en_filter) | |
| j->flags.firstring = 1; | |
| else | |
| ixj_ring_on(j); | |
| } else { | |
| ixj_ring_off(j); | |
| if(!j->flags.cidsent) | |
| j->flags.cidring = 1; | |
| } | |
| } | |
| clear_bit(board, &j->busyflags); | |
| ixj_add_timer(j); | |
| return; | |
| } | |
| } | |
| if (!j->flags.ringing) { | |
| if (j->hookstate) { /* & 1) { */ | |
| if (j->dsp.low != 0x20 && | |
| SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) { | |
| SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); | |
| } | |
| LineMonitor(j); | |
| read_filters(j); | |
| ixj_WriteDSPCommand(0x511B, j); | |
| j->proc_load = j->ssr.high << 8 | j->ssr.low; | |
| if (!j->m_hook && (j->hookstate & 1)) { | |
| j->m_hook = j->ex.bits.hookstate = 1; | |
| ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | |
| } | |
| } else { | |
| if (j->ex.bits.dtmf_ready) { | |
| j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0; | |
| } | |
| if (j->m_hook) { | |
| j->m_hook = 0; | |
| j->ex.bits.hookstate = 1; | |
| ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | |
| } | |
| } | |
| } | |
| if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) { | |
| ixj_pstn_state(j); | |
| } | |
| if (j->ex.bytes) { | |
| wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ | |
| } | |
| clear_bit(board, &j->busyflags); | |
| } | |
| ixj_add_timer(j); | |
| } | |
| static int ixj_status_wait(IXJ *j) | |
| { | |
| unsigned long jif; | |
| jif = jiffies + ((60 * hertz) / 100); | |
| while (!IsStatusReady(j)) { | |
| ixj_perfmon(j->statuswait); | |
| if (time_after(jiffies, jif)) { | |
| ixj_perfmon(j->statuswaitfail); | |
| return -1; | |
| } | |
| } | |
| return 0; | |
| } | |
| static int ixj_PCcontrol_wait(IXJ *j) | |
| { | |
| unsigned long jif; | |
| jif = jiffies + ((60 * hertz) / 100); | |
| while (!IsPCControlReady(j)) { | |
| ixj_perfmon(j->pcontrolwait); | |
| if (time_after(jiffies, jif)) { | |
| ixj_perfmon(j->pcontrolwaitfail); | |
| return -1; | |
| } | |
| } | |
| return 0; | |
| } | |
| static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j) | |
| { | |
| BYTES bytes; | |
| unsigned long jif; | |
| atomic_inc(&j->DSPWrite); | |
| if(atomic_read(&j->DSPWrite) > 1) { | |
| printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd); | |
| return -1; | |
| } | |
| bytes.high = (cmd & 0xFF00) >> 8; | |
| bytes.low = cmd & 0x00FF; | |
| jif = jiffies + ((60 * hertz) / 100); | |
| while (!IsControlReady(j)) { | |
| ixj_perfmon(j->iscontrolready); | |
| if (time_after(jiffies, jif)) { | |
| ixj_perfmon(j->iscontrolreadyfail); | |
| atomic_dec(&j->DSPWrite); | |
| if(atomic_read(&j->DSPWrite) > 0) { | |
| printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd); | |
| while(atomic_read(&j->DSPWrite) > 0) { | |
| atomic_dec(&j->DSPWrite); | |
| } | |
| } | |
| return -1; | |
| } | |
| } | |
| outb(bytes.low, j->DSPbase + 6); | |
| outb(bytes.high, j->DSPbase + 7); | |
| if (ixj_status_wait(j)) { | |
| j->ssr.low = 0xFF; | |
| j->ssr.high = 0xFF; | |
| atomic_dec(&j->DSPWrite); | |
| if(atomic_read(&j->DSPWrite) > 0) { | |
| printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd); | |
| while(atomic_read(&j->DSPWrite) > 0) { | |
| atomic_dec(&j->DSPWrite); | |
| } | |
| } | |
| return -1; | |
| } | |
| /* Read Software Status Register */ | |
| j->ssr.low = inb_p(j->DSPbase + 2); | |
| j->ssr.high = inb_p(j->DSPbase + 3); | |
| atomic_dec(&j->DSPWrite); | |
| if(atomic_read(&j->DSPWrite) > 0) { | |
| printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd); | |
| while(atomic_read(&j->DSPWrite) > 0) { | |
| atomic_dec(&j->DSPWrite); | |
| } | |
| } | |
| return 0; | |
| } | |
| /*************************************************************************** | |
| * | |
| * General Purpose IO Register read routine | |
| * | |
| ***************************************************************************/ | |
| static inline int ixj_gpio_read(IXJ *j) | |
| { | |
| if (ixj_WriteDSPCommand(0x5143, j)) | |
| return -1; | |
| j->gpio.bytes.low = j->ssr.low; | |
| j->gpio.bytes.high = j->ssr.high; | |
| return 0; | |
| } | |
| static inline void LED_SetState(int state, IXJ *j) | |
| { | |
| if (j->cardtype == QTI_LINEJACK) { | |
| j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0; | |
| j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0; | |
| j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0; | |
| j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0; | |
| outb(j->pld_scrw.byte, j->XILINXbase); | |
| } | |
| } | |
| /********************************************************************* | |
| * GPIO Pins are configured as follows on the Quicknet Internet | |
| * PhoneJACK Telephony Cards | |
| * | |
| * POTS Select GPIO_6=0 GPIO_7=0 | |
| * Mic/Speaker Select GPIO_6=0 GPIO_7=1 | |
| * Handset Select GPIO_6=1 GPIO_7=0 | |
| * | |
| * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0 | |
| * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0 | |
| * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0 | |
| * | |
| * Hook Switch changes reported on GPIO_3 | |
| *********************************************************************/ | |
| static int ixj_set_port(IXJ *j, int arg) | |
| { | |
| if (j->cardtype == QTI_PHONEJACK_LITE) { | |
| if (arg != PORT_POTS) | |
| return 10; | |
| else | |
| return 0; | |
| } | |
| switch (arg) { | |
| case PORT_POTS: | |
| j->port = PORT_POTS; | |
| switch (j->cardtype) { | |
| case QTI_PHONECARD: | |
| if (j->flags.pcmciasct == 1) | |
| SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); | |
| else | |
| return 11; | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| j->pld_slicw.pcib.mic = 0; | |
| j->pld_slicw.pcib.spk = 0; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| break; | |
| case QTI_LINEJACK: | |
| ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ | |
| if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to | |
| Software Control Register */ | |
| return 2; | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_clock.byte = 0; | |
| outb(j->pld_clock.byte, j->XILINXbase + 0x04); | |
| j->pld_slicw.bits.rly1 = 1; | |
| j->pld_slicw.bits.spken = 0; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */ | |
| ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */ | |
| ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */ | |
| ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */ | |
| ixj_mixer(0x0E80, j); /*Mic mute */ | |
| ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */ | |
| ixj_mixer(0x0080, j); /* Mute Master Left volume */ | |
| ixj_mixer(0x0180, j); /* Mute Master Right volume */ | |
| SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | |
| /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | |
| break; | |
| case QTI_PHONEJACK: | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bits.gpio6 = 0; | |
| j->gpio.bits.gpio7 = 0; | |
| ixj_WriteDSPCommand(j->gpio.word, j); | |
| break; | |
| } | |
| break; | |
| case PORT_PSTN: | |
| if (j->cardtype == QTI_LINEJACK) { | |
| ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */ | |
| j->pld_slicw.bits.rly3 = 0; | |
| j->pld_slicw.bits.rly1 = 1; | |
| j->pld_slicw.bits.spken = 0; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->port = PORT_PSTN; | |
| } else { | |
| return 4; | |
| } | |
| break; | |
| case PORT_SPEAKER: | |
| j->port = PORT_SPEAKER; | |
| switch (j->cardtype) { | |
| case QTI_PHONECARD: | |
| if (j->flags.pcmciasct) { | |
| SLIC_SetState(PLD_SLIC_STATE_OC, j); | |
| } | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| j->pld_slicw.pcib.mic = 1; | |
| j->pld_slicw.pcib.spk = 1; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| break; | |
| case QTI_LINEJACK: | |
| ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ | |
| if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to | |
| Software Control Register */ | |
| return 2; | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_clock.byte = 0; | |
| outb(j->pld_clock.byte, j->XILINXbase + 0x04); | |
| j->pld_slicw.bits.rly1 = 1; | |
| j->pld_slicw.bits.spken = 1; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */ | |
| ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */ | |
| ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */ | |
| ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */ | |
| ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */ | |
| ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */ | |
| ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */ | |
| ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */ | |
| break; | |
| case QTI_PHONEJACK: | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bits.gpio6 = 0; | |
| j->gpio.bits.gpio7 = 1; | |
| ixj_WriteDSPCommand(j->gpio.word, j); | |
| break; | |
| } | |
| break; | |
| case PORT_HANDSET: | |
| if (j->cardtype != QTI_PHONEJACK) { | |
| return 5; | |
| } else { | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bits.gpio6 = 1; | |
| j->gpio.bits.gpio7 = 0; | |
| ixj_WriteDSPCommand(j->gpio.word, j); | |
| j->port = PORT_HANDSET; | |
| } | |
| break; | |
| default: | |
| return 6; | |
| break; | |
| } | |
| return 0; | |
| } | |
| static int ixj_set_pots(IXJ *j, int arg) | |
| { | |
| if (j->cardtype == QTI_LINEJACK) { | |
| if (arg) { | |
| if (j->port == PORT_PSTN) { | |
| j->pld_slicw.bits.rly1 = 0; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->flags.pots_pstn = 1; | |
| return 1; | |
| } else { | |
| j->flags.pots_pstn = 0; | |
| return 0; | |
| } | |
| } else { | |
| j->pld_slicw.bits.rly1 = 1; | |
| outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->flags.pots_pstn = 0; | |
| return 1; | |
| } | |
| } else { | |
| return 0; | |
| } | |
| } | |
| static void ixj_ring_on(IXJ *j) | |
| { | |
| if (j->dsp.low == 0x20) /* Internet PhoneJACK */ | |
| { | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board); | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bytes.low = 0x00; | |
| j->gpio.bits.gpio1 = 1; | |
| j->gpio.bits.gpio2 = 1; | |
| j->gpio.bits.gpio5 = 0; | |
| ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */ | |
| } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */ | |
| { | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board); | |
| SLIC_SetState(PLD_SLIC_STATE_RINGING, j); | |
| } | |
| } | |
| static int ixj_siadc(IXJ *j, int val) | |
| { | |
| if(j->cardtype == QTI_PHONECARD){ | |
| if(j->flags.pcmciascp){ | |
| if(val == -1) | |
| return j->siadc.bits.rxg; | |
| if(val < 0 || val > 0x1F) | |
| return -1; | |
| j->siadc.bits.hom = 0; /* Handset Out Mute */ | |
| j->siadc.bits.lom = 0; /* Line Out Mute */ | |
| j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */ | |
| j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->siadc.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| return j->siadc.bits.rxg; | |
| } | |
| } | |
| return -1; | |
| } | |
| static int ixj_sidac(IXJ *j, int val) | |
| { | |
| if(j->cardtype == QTI_PHONECARD){ | |
| if(j->flags.pcmciascp){ | |
| if(val == -1) | |
| return j->sidac.bits.txg; | |
| if(val < 0 || val > 0x1F) | |
| return -1; | |
| j->sidac.bits.srm = 1; /* Speaker Right Mute */ | |
| j->sidac.bits.slm = 1; /* Speaker Left Mute */ | |
| j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */ | |
| j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->sidac.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| return j->sidac.bits.txg; | |
| } | |
| } | |
| return -1; | |
| } | |
| static int ixj_pcmcia_cable_check(IXJ *j) | |
| { | |
| j->pccr1.byte = inb_p(j->XILINXbase + 0x03); | |
| if (!j->flags.pcmciastate) { | |
| j->pccr2.byte = inb_p(j->XILINXbase + 0x02); | |
| if (j->pccr1.bits.drf || j->pccr2.bits.rstc) { | |
| j->flags.pcmciastate = 4; | |
| return 0; | |
| } | |
| if (j->pccr1.bits.ed) { | |
| j->pccr1.bits.ed = 0; | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 1; | |
| outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; | |
| j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0; | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 0; | |
| outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| return j->pslic.bits.led2 ? 1 : 0; | |
| } else if (j->flags.pcmciasct) { | |
| return j->r_hook; | |
| } else { | |
| return 1; | |
| } | |
| } else if (j->flags.pcmciastate == 4) { | |
| if (!j->pccr1.bits.drf) { | |
| j->flags.pcmciastate = 3; | |
| } | |
| return 0; | |
| } else if (j->flags.pcmciastate == 3) { | |
| j->pccr2.bits.pwr = 0; | |
| j->pccr2.bits.rstc = 1; | |
| outb(j->pccr2.byte, j->XILINXbase + 0x02); | |
| j->checkwait = jiffies + (hertz * 2); | |
| j->flags.incheck = 1; | |
| j->flags.pcmciastate = 2; | |
| return 0; | |
| } else if (j->flags.pcmciastate == 2) { | |
| if (j->flags.incheck) { | |
| if (time_before(jiffies, j->checkwait)) { | |
| return 0; | |
| } else { | |
| j->flags.incheck = 0; | |
| } | |
| } | |
| j->pccr2.bits.pwr = 0; | |
| j->pccr2.bits.rstc = 0; | |
| outb_p(j->pccr2.byte, j->XILINXbase + 0x02); | |
| j->flags.pcmciastate = 1; | |
| return 0; | |
| } else if (j->flags.pcmciastate == 1) { | |
| j->flags.pcmciastate = 0; | |
| if (!j->pccr1.bits.drf) { | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 1; | |
| outb_p(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| j->flags.pcmciascp = 1; /* Set Cable Present Flag */ | |
| j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */ | |
| if (j->flags.pcmciasct == 3) { | |
| j->flags.pcmciastate = 4; | |
| return 0; | |
| } else if (j->flags.pcmciasct == 0) { | |
| j->pccr2.bits.pwr = 1; | |
| j->pccr2.bits.rstc = 0; | |
| outb_p(j->pccr2.byte, j->XILINXbase + 0x02); | |
| j->port = PORT_SPEAKER; | |
| } else { | |
| j->port = PORT_POTS; | |
| } | |
| j->sic1.bits.cpd = 0; /* Chip Power Down */ | |
| j->sic1.bits.mpd = 0; /* MIC Bias Power Down */ | |
| j->sic1.bits.hpd = 0; /* Handset Bias Power Down */ | |
| j->sic1.bits.lpd = 0; /* Line Bias Power Down */ | |
| j->sic1.bits.spd = 1; /* Speaker Drive Power Down */ | |
| j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->sic1.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */ | |
| j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */ | |
| j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */ | |
| j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */ | |
| j->sic2.bits.hpd = 0; /* HPF disable */ | |
| j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->sic2.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */ | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */ | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| j->sirxg.bits.lig = 1; /* Line In Gain */ | |
| j->sirxg.bits.lim = 1; /* Line In Mute */ | |
| j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */ | |
| j->sirxg.bits.mcm = 0; /* MIC In Mute */ | |
| j->sirxg.bits.him = 0; /* Handset In Mute */ | |
| j->sirxg.bits.iir = 1; /* IIR */ | |
| j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->sirxg.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| ixj_siadc(j, 0x17); | |
| ixj_sidac(j, 0x1D); | |
| j->siaatt.bits.sot = 0; | |
| j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */ | |
| j->psccr.bits.rw = 0; /* Read / Write flag */ | |
| j->psccr.bits.dev = 0; | |
| outb(j->siaatt.byte, j->XILINXbase + 0x00); | |
| outb(j->psccr.byte, j->XILINXbase + 0x01); | |
| ixj_PCcontrol_wait(j); | |
| if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) { | |
| j->psccr.byte = j->pslic.byte = 0; | |
| j->pslic.bits.powerdown = 1; | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 0; | |
| outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| } | |
| } | |
| return 0; | |
| } else { | |
| j->flags.pcmciascp = 0; | |
| return 0; | |
| } | |
| return 0; | |
| } | |
| static int ixj_hookstate(IXJ *j) | |
| { | |
| int fOffHook = 0; | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| ixj_gpio_read(j); | |
| fOffHook = j->gpio.bits.gpio3read ? 1 : 0; | |
| break; | |
| case QTI_LINEJACK: | |
| case QTI_PHONEJACK_LITE: | |
| case QTI_PHONEJACK_PCI: | |
| SLIC_GetState(j); | |
| if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) { | |
| fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0; | |
| if(fOffHook != j->p_hook) { | |
| if(!j->checkwait) { | |
| j->checkwait = jiffies; | |
| } | |
| if(time_before(jiffies, j->checkwait + 2)) { | |
| fOffHook ^= 1; | |
| } else { | |
| j->checkwait = 0; | |
| } | |
| j->p_hook = fOffHook; | |
| printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies); | |
| } | |
| } else { | |
| if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE || | |
| j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) { | |
| if (j->flags.ringing || j->flags.cringing) { | |
| if (!in_interrupt()) { | |
| msleep(20); | |
| } | |
| SLIC_GetState(j); | |
| if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) { | |
| ixj_ring_on(j); | |
| } | |
| } | |
| if (j->cardtype == QTI_PHONEJACK_PCI) { | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| fOffHook = j->pld_scrr.pcib.det ? 1 : 0; | |
| } else | |
| fOffHook = j->pld_slicr.bits.det ? 1 : 0; | |
| } | |
| } | |
| break; | |
| case QTI_PHONECARD: | |
| fOffHook = ixj_pcmcia_cable_check(j); | |
| break; | |
| } | |
| if (j->r_hook != fOffHook) { | |
| j->r_hook = fOffHook; | |
| if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) { | |
| j->ex.bits.hookstate = 1; | |
| ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | |
| } else if (!fOffHook) { | |
| j->flash_end = jiffies + ((60 * hertz) / 100); | |
| } | |
| } | |
| if (fOffHook) { | |
| if(time_before(jiffies, j->flash_end)) { | |
| j->ex.bits.flash = 1; | |
| j->flash_end = 0; | |
| ixj_kill_fasync(j, SIG_FLASH, POLL_IN); | |
| } | |
| } else { | |
| if(time_before(jiffies, j->flash_end)) { | |
| fOffHook = 1; | |
| } | |
| } | |
| if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION) | |
| fOffHook |= 2; | |
| if (j->port == PORT_SPEAKER) { | |
| if(j->cardtype == QTI_PHONECARD) { | |
| if(j->flags.pcmciascp && j->flags.pcmciasct) { | |
| fOffHook |= 2; | |
| } | |
| } else { | |
| fOffHook |= 2; | |
| } | |
| } | |
| if (j->port == PORT_HANDSET) | |
| fOffHook |= 2; | |
| return fOffHook; | |
| } | |
| static void ixj_ring_off(IXJ *j) | |
| { | |
| if (j->dsp.low == 0x20) /* Internet PhoneJACK */ | |
| { | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Ring Off\n"); | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bytes.low = 0x00; | |
| j->gpio.bits.gpio1 = 0; | |
| j->gpio.bits.gpio2 = 1; | |
| j->gpio.bits.gpio5 = 0; | |
| ixj_WriteDSPCommand(j->gpio.word, j); | |
| } else /* Internet LineJACK */ | |
| { | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Ring Off\n"); | |
| if(!j->flags.cidplay) | |
| SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | |
| SLIC_GetState(j); | |
| } | |
| } | |
| static void ixj_ring_start(IXJ *j) | |
| { | |
| j->flags.cringing = 1; | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board); | |
| if (ixj_hookstate(j) & 1) { | |
| if (j->port == PORT_POTS) | |
| ixj_ring_off(j); | |
| j->flags.cringing = 0; | |
| if (ixjdebug & 0x0004) | |
| printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board); | |
| } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) { | |
| j->ring_cadence_jif = jiffies; | |
| j->flags.cidsent = j->flags.cidring = 0; | |
| j->cadence_f[5].state = 0; | |
| if(j->cadence_f[5].on1) | |
| ixj_ring_on(j); | |
| } else { | |
| j->ring_cadence_jif = jiffies; | |
| j->ring_cadence_t = 15; | |
| if (j->ring_cadence & 1 << j->ring_cadence_t) { | |
| ixj_ring_on(j); | |
| } else { | |
| ixj_ring_off(j); | |
| } | |
| j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0; | |
| } | |
| } | |
| static int ixj_ring(IXJ *j) | |
| { | |
| char cntr; | |
| unsigned long jif; | |
| j->flags.ringing = 1; | |
| if (ixj_hookstate(j) & 1) { | |
| ixj_ring_off(j); | |
| j->flags.ringing = 0; | |
| return 1; | |
| } | |
| for (cntr = 0; cntr < j->maxrings; cntr++) { | |
| jif = jiffies + (1 * hertz); | |
| ixj_ring_on(j); | |
| while (time_before(jiffies, jif)) { | |
| if (ixj_hookstate(j) & 1) { | |
| ixj_ring_off(j); | |
| j->flags.ringing = 0; | |
| return 1; | |
| } | |
| schedule_timeout_interruptible(1); | |
| if (signal_pending(current)) | |
| break; | |
| } | |
| jif = jiffies + (3 * hertz); | |
| ixj_ring_off(j); | |
| while (time_before(jiffies, jif)) { | |
| if (ixj_hookstate(j) & 1) { | |
| msleep(10); | |
| if (ixj_hookstate(j) & 1) { | |
| j->flags.ringing = 0; | |
| return 1; | |
| } | |
| } | |
| schedule_timeout_interruptible(1); | |
| if (signal_pending(current)) | |
| break; | |
| } | |
| } | |
| ixj_ring_off(j); | |
| j->flags.ringing = 0; | |
| return 0; | |
| } | |
| static int ixj_open(struct phone_device *p, struct file *file_p) | |
| { | |
| IXJ *j = get_ixj(p->board); | |
| file_p->private_data = j; | |
| if (!j->DSPbase) | |
| return -ENODEV; | |
| if (file_p->f_mode & FMODE_READ) { | |
| if(!j->readers) { | |
| j->readers++; | |
| } else { | |
| return -EBUSY; | |
| } | |
| } | |
| if (file_p->f_mode & FMODE_WRITE) { | |
| if(!j->writers) { | |
| j->writers++; | |
| } else { | |
| if (file_p->f_mode & FMODE_READ){ | |
| j->readers--; | |
| } | |
| return -EBUSY; | |
| } | |
| } | |
| if (j->cardtype == QTI_PHONECARD) { | |
| j->pslic.bits.powerdown = 0; | |
| j->psccr.bits.dev = 3; | |
| j->psccr.bits.rw = 0; | |
| outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | |
| ixj_PCcontrol_wait(j); | |
| } | |
| j->flags.cidplay = 0; | |
| j->flags.cidcw_ack = 0; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Opening board %d\n", p->board); | |
| j->framesread = j->frameswritten = 0; | |
| return 0; | |
| } | |
| static int ixj_release(struct inode *inode, struct file *file_p) | |
| { | |
| IXJ_TONE ti; | |
| int cnt; | |
| IXJ *j = file_p->private_data; | |
| int board = j->p.board; | |
| /* | |
| * Set up locks to ensure that only one process is talking to the DSP at a time. | |
| * This is necessary to keep the DSP from locking up. | |
| */ | |
| while(test_and_set_bit(board, (void *)&j->busyflags) != 0) | |
| schedule_timeout_interruptible(1); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Closing board %d\n", NUM(inode)); | |
| if (j->cardtype == QTI_PHONECARD) | |
| ixj_set_port(j, PORT_SPEAKER); | |
| else | |
| ixj_set_port(j, PORT_POTS); | |
| aec_stop(j); | |
| ixj_play_stop(j); | |
| ixj_record_stop(j); | |
| set_play_volume(j, 0x100); | |
| set_rec_volume(j, 0x100); | |
| ixj_ring_off(j); | |
| /* Restore the tone table to default settings. */ | |
| ti.tone_index = 10; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz941; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz1209; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 11; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz941; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz1336; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 12; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz941; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz1477; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 13; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz800; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 14; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1000; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 15; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1250; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 16; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz950; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 17; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1100; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 18; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1400; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 19; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1500; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 20; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1600; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 21; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1800; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 22; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz2100; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 23; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz1300; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 24; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz2450; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 25; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz350; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz440; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 26; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz440; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz480; | |
| ixj_init_tone(j, &ti); | |
| ti.tone_index = 27; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz480; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz620; | |
| ixj_init_tone(j, &ti); | |
| set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */ | |
| set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */ | |
| j->ex.bits.dtmf_ready = 0; | |
| j->dtmf_state = 0; | |
| j->dtmf_wp = j->dtmf_rp = 0; | |
| j->rec_mode = j->play_mode = -1; | |
| j->flags.ringing = 0; | |
| j->maxrings = MAXRINGS; | |
| j->ring_cadence = USA_RING_CADENCE; | |
| if(j->cadence_f[5].enable) { | |
| j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0; | |
| } | |
| j->drybuffer = 0; | |
| j->winktime = 320; | |
| j->flags.dtmf_oob = 0; | |
| for (cnt = 0; cnt < 4; cnt++) | |
| j->cadence_f[cnt].enable = 0; | |
| idle(j); | |
| if(j->cardtype == QTI_PHONECARD) { | |
| SLIC_SetState(PLD_SLIC_STATE_OC, j); | |
| } | |
| if (file_p->f_mode & FMODE_READ) | |
| j->readers--; | |
| if (file_p->f_mode & FMODE_WRITE) | |
| j->writers--; | |
| if (j->read_buffer && !j->readers) { | |
| kfree(j->read_buffer); | |
| j->read_buffer = NULL; | |
| j->read_buffer_size = 0; | |
| } | |
| if (j->write_buffer && !j->writers) { | |
| kfree(j->write_buffer); | |
| j->write_buffer = NULL; | |
| j->write_buffer_size = 0; | |
| } | |
| j->rec_codec = j->play_codec = 0; | |
| j->rec_frame_size = j->play_frame_size = 0; | |
| j->flags.cidsent = j->flags.cidring = 0; | |
| if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) { | |
| ixj_set_port(j, PORT_PSTN); | |
| daa_set_mode(j, SOP_PU_SLEEP); | |
| ixj_set_pots(j, 1); | |
| } | |
| ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */ | |
| /* Set up the default signals for events */ | |
| for (cnt = 0; cnt < 35; cnt++) | |
| j->ixj_signals[cnt] = SIGIO; | |
| /* Set the excetion signal enable flags */ | |
| j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = | |
| j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = | |
| j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; | |
| file_p->private_data = NULL; | |
| clear_bit(board, &j->busyflags); | |
| return 0; | |
| } | |
| static int read_filters(IXJ *j) | |
| { | |
| unsigned short fc, cnt, trg; | |
| int var; | |
| trg = 0; | |
| if (ixj_WriteDSPCommand(0x5144, j)) { | |
| if(ixjdebug & 0x0001) { | |
| printk(KERN_INFO "Read Frame Counter failed!\n"); | |
| } | |
| return -1; | |
| } | |
| fc = j->ssr.high << 8 | j->ssr.low; | |
| if (fc == j->frame_count) | |
| return 1; | |
| j->frame_count = fc; | |
| if (j->dtmf_proc) | |
| return 1; | |
| var = 10; | |
| for (cnt = 0; cnt < 4; cnt++) { | |
| if (ixj_WriteDSPCommand(0x5154 + cnt, j)) { | |
| if(ixjdebug & 0x0001) { | |
| printk(KERN_INFO "Select Filter %d failed!\n", cnt); | |
| } | |
| return -1; | |
| } | |
| if (ixj_WriteDSPCommand(0x515C, j)) { | |
| if(ixjdebug & 0x0001) { | |
| printk(KERN_INFO "Read Filter History %d failed!\n", cnt); | |
| } | |
| return -1; | |
| } | |
| j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low; | |
| if (j->cadence_f[cnt].enable) { | |
| if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) { | |
| if (j->cadence_f[cnt].state == 0) { | |
| j->cadence_f[cnt].state = 1; | |
| j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000)); | |
| } else if (j->cadence_f[cnt].state == 2 && | |
| (time_after(jiffies, j->cadence_f[cnt].off1min) && | |
| time_before(jiffies, j->cadence_f[cnt].off1max))) { | |
| if (j->cadence_f[cnt].on2) { | |
| j->cadence_f[cnt].state = 3; | |
| j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| } else if (j->cadence_f[cnt].state == 4 && | |
| (time_after(jiffies, j->cadence_f[cnt].off2min) && | |
| time_before(jiffies, j->cadence_f[cnt].off2max))) { | |
| if (j->cadence_f[cnt].on3) { | |
| j->cadence_f[cnt].state = 5; | |
| j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| } else { | |
| j->cadence_f[cnt].state = 0; | |
| } | |
| } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) { | |
| if (j->cadence_f[cnt].state == 1) { | |
| if(!j->cadence_f[cnt].on1) { | |
| j->cadence_f[cnt].state = 7; | |
| } else if((time_after(jiffies, j->cadence_f[cnt].on1min) && | |
| time_before(jiffies, j->cadence_f[cnt].on1max))) { | |
| if(j->cadence_f[cnt].off1) { | |
| j->cadence_f[cnt].state = 2; | |
| j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| } else { | |
| j->cadence_f[cnt].state = 0; | |
| } | |
| } else if (j->cadence_f[cnt].state == 3) { | |
| if((time_after(jiffies, j->cadence_f[cnt].on2min) && | |
| time_before(jiffies, j->cadence_f[cnt].on2max))) { | |
| if(j->cadence_f[cnt].off2) { | |
| j->cadence_f[cnt].state = 4; | |
| j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| } else { | |
| j->cadence_f[cnt].state = 0; | |
| } | |
| } else if (j->cadence_f[cnt].state == 5) { | |
| if ((time_after(jiffies, j->cadence_f[cnt].on3min) && | |
| time_before(jiffies, j->cadence_f[cnt].on3max))) { | |
| if(j->cadence_f[cnt].off3) { | |
| j->cadence_f[cnt].state = 6; | |
| j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000)); | |
| j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000)); | |
| j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000)); | |
| } else { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| } else { | |
| j->cadence_f[cnt].state = 0; | |
| } | |
| } else { | |
| j->cadence_f[cnt].state = 0; | |
| } | |
| } else { | |
| switch(j->cadence_f[cnt].state) { | |
| case 1: | |
| if(time_after(jiffies, j->cadence_f[cnt].on1dot) && | |
| !j->cadence_f[cnt].off1 && | |
| !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 && | |
| !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| break; | |
| case 3: | |
| if(time_after(jiffies, j->cadence_f[cnt].on2dot) && | |
| !j->cadence_f[cnt].off2 && | |
| !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| break; | |
| case 5: | |
| if(time_after(jiffies, j->cadence_f[cnt].on3dot) && | |
| !j->cadence_f[cnt].off3) { | |
| j->cadence_f[cnt].state = 7; | |
| } | |
| break; | |
| } | |
| } | |
| if (ixjdebug & 0x0040) { | |
| printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies); | |
| switch(j->cadence_f[cnt].state) { | |
| case 0: | |
| printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board); | |
| break; | |
| case 1: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board, | |
| j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max); | |
| break; | |
| case 2: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min, | |
| j->cadence_f[cnt].off1max); | |
| break; | |
| case 3: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min, | |
| j->cadence_f[cnt].on2max); | |
| break; | |
| case 4: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min, | |
| j->cadence_f[cnt].off2max); | |
| break; | |
| case 5: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min, | |
| j->cadence_f[cnt].on3max); | |
| break; | |
| case 6: | |
| printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min, | |
| j->cadence_f[cnt].off3max); | |
| break; | |
| } | |
| } | |
| } | |
| if (j->cadence_f[cnt].state == 7) { | |
| j->cadence_f[cnt].state = 0; | |
| if (j->cadence_f[cnt].enable == 1) | |
| j->cadence_f[cnt].enable = 0; | |
| switch (cnt) { | |
| case 0: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies); | |
| } | |
| j->ex.bits.fc0 = 1; | |
| ixj_kill_fasync(j, SIG_FC0, POLL_IN); | |
| break; | |
| case 1: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies); | |
| } | |
| j->ex.bits.fc1 = 1; | |
| ixj_kill_fasync(j, SIG_FC1, POLL_IN); | |
| break; | |
| case 2: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies); | |
| } | |
| j->ex.bits.fc2 = 1; | |
| ixj_kill_fasync(j, SIG_FC2, POLL_IN); | |
| break; | |
| case 3: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies); | |
| } | |
| j->ex.bits.fc3 = 1; | |
| ixj_kill_fasync(j, SIG_FC3, POLL_IN); | |
| break; | |
| } | |
| } | |
| if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) || | |
| (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) { | |
| if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) { | |
| trg = 1; | |
| } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) { | |
| trg = 0; | |
| } | |
| switch (cnt) { | |
| case 0: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies); | |
| } | |
| j->ex.bits.f0 = 1; | |
| ixj_kill_fasync(j, SIG_F0, POLL_IN); | |
| break; | |
| case 1: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies); | |
| } | |
| j->ex.bits.f1 = 1; | |
| ixj_kill_fasync(j, SIG_F1, POLL_IN); | |
| break; | |
| case 2: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies); | |
| } | |
| j->ex.bits.f2 = 1; | |
| ixj_kill_fasync(j, SIG_F2, POLL_IN); | |
| break; | |
| case 3: | |
| if(ixjdebug & 0x0020) { | |
| printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies); | |
| } | |
| j->ex.bits.f3 = 1; | |
| ixj_kill_fasync(j, SIG_F3, POLL_IN); | |
| break; | |
| } | |
| } | |
| } | |
| return 0; | |
| } | |
| static int LineMonitor(IXJ *j) | |
| { | |
| if (j->dtmf_proc) { | |
| return -1; | |
| } | |
| j->dtmf_proc = 1; | |
| if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */ | |
| return -1; | |
| j->dtmf.bytes.high = j->ssr.high; | |
| j->dtmf.bytes.low = j->ssr.low; | |
| if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) { | |
| j->dtmf_state = 1; | |
| j->dtmf_current = j->dtmf.bits.digit; | |
| } | |
| if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */ | |
| { | |
| if(!j->cidcw_wait) { | |
| j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current; | |
| j->dtmf_wp++; | |
| if (j->dtmf_wp == 79) | |
| j->dtmf_wp = 0; | |
| j->ex.bits.dtmf_ready = 1; | |
| if(j->ex_sig.bits.dtmf_ready) { | |
| ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN); | |
| } | |
| } | |
| else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) { | |
| if(ixjdebug & 0x0020) { | |
| printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies); | |
| } | |
| j->flags.cidcw_ack = 1; | |
| } | |
| j->dtmf_state = 0; | |
| } | |
| j->dtmf_proc = 0; | |
| return 0; | |
| } | |
| /************************************************************************ | |
| * | |
| * Functions to allow alaw <-> ulaw conversions. | |
| * | |
| ************************************************************************/ | |
| static void ulaw2alaw(unsigned char *buff, unsigned long len) | |
| { | |
| static unsigned char table_ulaw2alaw[] = | |
| { | |
| 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, | |
| 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, | |
| 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, | |
| 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, | |
| 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, | |
| 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, | |
| 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, | |
| 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, | |
| 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, | |
| 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, | |
| 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, | |
| 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, | |
| 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, | |
| 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, | |
| 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, | |
| 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, | |
| 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, | |
| 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, | |
| 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, | |
| 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, | |
| 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, | |
| 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, | |
| 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, | |
| 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, | |
| 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, | |
| 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, | |
| 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, | |
| 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, | |
| 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, | |
| 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, | |
| 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, | |
| 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5 | |
| }; | |
| while (len--) | |
| { | |
| *buff = table_ulaw2alaw[*(unsigned char *)buff]; | |
| buff++; | |
| } | |
| } | |
| static void alaw2ulaw(unsigned char *buff, unsigned long len) | |
| { | |
| static unsigned char table_alaw2ulaw[] = | |
| { | |
| 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, | |
| 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, | |
| 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, | |
| 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, | |
| 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, | |
| 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, | |
| 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, | |
| 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, | |
| 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, | |
| 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, | |
| 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, | |
| 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, | |
| 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, | |
| 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, | |
| 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, | |
| 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, | |
| 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, | |
| 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, | |
| 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, | |
| 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, | |
| 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, | |
| 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, | |
| 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, | |
| 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, | |
| 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, | |
| 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, | |
| 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, | |
| 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, | |
| 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, | |
| 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, | |
| 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, | |
| 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1 | |
| }; | |
| while (len--) | |
| { | |
| *buff = table_alaw2ulaw[*(unsigned char *)buff]; | |
| buff++; | |
| } | |
| } | |
| static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos) | |
| { | |
| unsigned long i = *ppos; | |
| IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); | |
| DECLARE_WAITQUEUE(wait, current); | |
| if (j->flags.inread) | |
| return -EALREADY; | |
| j->flags.inread = 1; | |
| add_wait_queue(&j->read_q, &wait); | |
| set_current_state(TASK_INTERRUPTIBLE); | |
| mb(); | |
| while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) { | |
| ++j->read_wait; | |
| if (file_p->f_flags & O_NONBLOCK) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->read_q, &wait); | |
| j->flags.inread = 0; | |
| return -EAGAIN; | |
| } | |
| if (!ixj_hookstate(j)) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->read_q, &wait); | |
| j->flags.inread = 0; | |
| return 0; | |
| } | |
| interruptible_sleep_on(&j->read_q); | |
| if (signal_pending(current)) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->read_q, &wait); | |
| j->flags.inread = 0; | |
| return -EINTR; | |
| } | |
| } | |
| remove_wait_queue(&j->read_q, &wait); | |
| set_current_state(TASK_RUNNING); | |
| /* Don't ever copy more than the user asks */ | |
| if(j->rec_codec == ALAW) | |
| ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size)); | |
| i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size)); | |
| j->read_buffer_ready = 0; | |
| if (i) { | |
| j->flags.inread = 0; | |
| return -EFAULT; | |
| } else { | |
| j->flags.inread = 0; | |
| return min(length, j->read_buffer_size); | |
| } | |
| } | |
| static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length, | |
| loff_t * ppos) | |
| { | |
| int pre_retval; | |
| ssize_t read_retval = 0; | |
| IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); | |
| pre_retval = ixj_PreRead(j, 0L); | |
| switch (pre_retval) { | |
| case NORMAL: | |
| read_retval = ixj_read(file_p, buf, length, ppos); | |
| ixj_PostRead(j, 0L); | |
| break; | |
| case NOPOST: | |
| read_retval = ixj_read(file_p, buf, length, ppos); | |
| break; | |
| case POSTONLY: | |
| ixj_PostRead(j, 0L); | |
| break; | |
| default: | |
| read_retval = pre_retval; | |
| } | |
| return read_retval; | |
| } | |
| static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos) | |
| { | |
| unsigned long i = *ppos; | |
| IXJ *j = file_p->private_data; | |
| DECLARE_WAITQUEUE(wait, current); | |
| if (j->flags.inwrite) | |
| return -EALREADY; | |
| j->flags.inwrite = 1; | |
| add_wait_queue(&j->write_q, &wait); | |
| set_current_state(TASK_INTERRUPTIBLE); | |
| mb(); | |
| while (!j->write_buffers_empty) { | |
| ++j->write_wait; | |
| if (file_p->f_flags & O_NONBLOCK) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->write_q, &wait); | |
| j->flags.inwrite = 0; | |
| return -EAGAIN; | |
| } | |
| if (!ixj_hookstate(j)) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->write_q, &wait); | |
| j->flags.inwrite = 0; | |
| return 0; | |
| } | |
| interruptible_sleep_on(&j->write_q); | |
| if (signal_pending(current)) { | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->write_q, &wait); | |
| j->flags.inwrite = 0; | |
| return -EINTR; | |
| } | |
| } | |
| set_current_state(TASK_RUNNING); | |
| remove_wait_queue(&j->write_q, &wait); | |
| if (j->write_buffer_wp + count >= j->write_buffer_end) | |
| j->write_buffer_wp = j->write_buffer; | |
| i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size)); | |
| if (i) { | |
| j->flags.inwrite = 0; | |
| return -EFAULT; | |
| } | |
| if(j->play_codec == ALAW) | |
| alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size)); | |
| j->flags.inwrite = 0; | |
| return min(count, j->write_buffer_size); | |
| } | |
| static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos) | |
| { | |
| int pre_retval; | |
| ssize_t write_retval = 0; | |
| IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); | |
| pre_retval = ixj_PreWrite(j, 0L); | |
| switch (pre_retval) { | |
| case NORMAL: | |
| write_retval = ixj_write(file_p, buf, count, ppos); | |
| if (write_retval > 0) { | |
| ixj_PostWrite(j, 0L); | |
| j->write_buffer_wp += write_retval; | |
| j->write_buffers_empty--; | |
| } | |
| break; | |
| case NOPOST: | |
| write_retval = ixj_write(file_p, buf, count, ppos); | |
| if (write_retval > 0) { | |
| j->write_buffer_wp += write_retval; | |
| j->write_buffers_empty--; | |
| } | |
| break; | |
| case POSTONLY: | |
| ixj_PostWrite(j, 0L); | |
| break; | |
| default: | |
| write_retval = pre_retval; | |
| } | |
| return write_retval; | |
| } | |
| static void ixj_read_frame(IXJ *j) | |
| { | |
| int cnt, dly; | |
| if (j->read_buffer) { | |
| for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { | |
| if (!(cnt % 16) && !IsRxReady(j)) { | |
| dly = 0; | |
| while (!IsRxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| /* Throw away word 0 of the 8021 compressed format to get standard G.729. */ | |
| if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { | |
| inb_p(j->DSPbase + 0x0E); | |
| inb_p(j->DSPbase + 0x0F); | |
| } | |
| *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E); | |
| *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F); | |
| } | |
| ++j->framesread; | |
| if (j->intercom != -1) { | |
| if (IsTxReady(get_ixj(j->intercom))) { | |
| for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { | |
| if (!(cnt % 16) && !IsTxReady(j)) { | |
| dly = 0; | |
| while (!IsTxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C); | |
| outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D); | |
| } | |
| get_ixj(j->intercom)->frameswritten++; | |
| } | |
| } else { | |
| j->read_buffer_ready = 1; | |
| wake_up_interruptible(&j->read_q); /* Wake any blocked readers */ | |
| wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ | |
| if(j->ixj_signals[SIG_READ_READY]) | |
| ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT); | |
| } | |
| } | |
| } | |
| static short fsk[][6][20] = | |
| { | |
| { | |
| { | |
| 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196, | |
| -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722 | |
| }, | |
| { | |
| -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481, | |
| -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876 | |
| }, | |
| { | |
| -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715, | |
| -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846 | |
| }, | |
| { | |
| 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196, | |
| 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722 | |
| }, | |
| { | |
| 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481, | |
| 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876 | |
| }, | |
| { | |
| 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715, | |
| 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846 | |
| } | |
| }, | |
| { | |
| { | |
| 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126, | |
| 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126 | |
| }, | |
| { | |
| -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051, | |
| 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051 | |
| }, | |
| { | |
| -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925, | |
| 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925 | |
| }, | |
| { | |
| 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126, | |
| 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126 | |
| }, | |
| { | |
| 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051, | |
| -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051 | |
| }, | |
| { | |
| 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925, | |
| -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925 | |
| } | |
| } | |
| }; | |
| static void ixj_write_cid_bit(IXJ *j, int bit) | |
| { | |
| while (j->fskcnt < 20) { | |
| if(j->fskdcnt < (j->fsksize - 1)) | |
| j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt]; | |
| j->fskcnt += 3; | |
| } | |
| j->fskcnt %= 20; | |
| if (!bit) | |
| j->fskz++; | |
| if (j->fskz >= 6) | |
| j->fskz = 0; | |
| } | |
| static void ixj_write_cid_byte(IXJ *j, char byte) | |
| { | |
| IXJ_CBYTE cb; | |
| cb.cbyte = byte; | |
| ixj_write_cid_bit(j, 0); | |
| ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0); | |
| ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0); | |
| ixj_write_cid_bit(j, 1); | |
| } | |
| static void ixj_write_cid_seize(IXJ *j) | |
| { | |
| int cnt; | |
| for (cnt = 0; cnt < 150; cnt++) { | |
| ixj_write_cid_bit(j, 0); | |
| ixj_write_cid_bit(j, 1); | |
| } | |
| for (cnt = 0; cnt < 180; cnt++) { | |
| ixj_write_cid_bit(j, 1); | |
| } | |
| } | |
| static void ixj_write_cidcw_seize(IXJ *j) | |
| { | |
| int cnt; | |
| for (cnt = 0; cnt < 80; cnt++) { | |
| ixj_write_cid_bit(j, 1); | |
| } | |
| } | |
| static int ixj_write_cid_string(IXJ *j, char *s, int checksum) | |
| { | |
| int cnt; | |
| for (cnt = 0; cnt < strlen(s); cnt++) { | |
| ixj_write_cid_byte(j, s[cnt]); | |
| checksum = (checksum + s[cnt]); | |
| } | |
| return checksum; | |
| } | |
| static void ixj_pad_fsk(IXJ *j, int pad) | |
| { | |
| int cnt; | |
| for (cnt = 0; cnt < pad; cnt++) { | |
| if(j->fskdcnt < (j->fsksize - 1)) | |
| j->fskdata[j->fskdcnt++] = 0x0000; | |
| } | |
| for (cnt = 0; cnt < 720; cnt++) { | |
| if(j->fskdcnt < (j->fsksize - 1)) | |
| j->fskdata[j->fskdcnt++] = 0x0000; | |
| } | |
| } | |
| static void ixj_pre_cid(IXJ *j) | |
| { | |
| j->cid_play_codec = j->play_codec; | |
| j->cid_play_frame_size = j->play_frame_size; | |
| j->cid_play_volume = get_play_volume(j); | |
| j->cid_play_flag = j->flags.playing; | |
| j->cid_rec_codec = j->rec_codec; | |
| j->cid_rec_volume = get_rec_volume(j); | |
| j->cid_rec_flag = j->flags.recording; | |
| j->cid_play_aec_level = j->aec_level; | |
| switch(j->baseframe.low) { | |
| case 0xA0: | |
| j->cid_base_frame_size = 20; | |
| break; | |
| case 0x50: | |
| j->cid_base_frame_size = 10; | |
| break; | |
| case 0xF0: | |
| j->cid_base_frame_size = 30; | |
| break; | |
| } | |
| ixj_play_stop(j); | |
| ixj_cpt_stop(j); | |
| j->flags.cidplay = 1; | |
| set_base_frame(j, 30); | |
| set_play_codec(j, LINEAR16); | |
| set_play_volume(j, 0x1B); | |
| ixj_play_start(j); | |
| } | |
| static void ixj_post_cid(IXJ *j) | |
| { | |
| ixj_play_stop(j); | |
| if(j->cidsize > 5000) { | |
| SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | |
| } | |
| j->flags.cidplay = 0; | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies); | |
| } | |
| ixj_fsk_free(j); | |
| j->fskdcnt = 0; | |
| set_base_frame(j, j->cid_base_frame_size); | |
| set_play_codec(j, j->cid_play_codec); | |
| ixj_aec_start(j, j->cid_play_aec_level); | |
| set_play_volume(j, j->cid_play_volume); | |
| set_rec_codec(j, j->cid_rec_codec); | |
| set_rec_volume(j, j->cid_rec_volume); | |
| if(j->cid_rec_flag) | |
| ixj_record_start(j); | |
| if(j->cid_play_flag) | |
| ixj_play_start(j); | |
| if(j->cid_play_flag) { | |
| wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ | |
| } | |
| } | |
| static void ixj_write_cid(IXJ *j) | |
| { | |
| char sdmf1[50]; | |
| char sdmf2[50]; | |
| char sdmf3[80]; | |
| char mdmflen, len1, len2, len3; | |
| int pad; | |
| int checksum = 0; | |
| if (j->dsp.low == 0x20 || j->flags.cidplay) | |
| return; | |
| j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | |
| j->cidsize = j->cidcnt = 0; | |
| ixj_fsk_alloc(j); | |
| strlcpy(sdmf1, j->cid_send.month, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.day, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.hour, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.min, sizeof(sdmf1)); | |
| strlcpy(sdmf2, j->cid_send.number, sizeof(sdmf2)); | |
| strlcpy(sdmf3, j->cid_send.name, sizeof(sdmf3)); | |
| len1 = strlen(sdmf1); | |
| len2 = strlen(sdmf2); | |
| len3 = strlen(sdmf3); | |
| mdmflen = len1 + len2 + len3 + 6; | |
| while(1){ | |
| ixj_write_cid_seize(j); | |
| ixj_write_cid_byte(j, 0x80); | |
| checksum = 0x80; | |
| ixj_write_cid_byte(j, mdmflen); | |
| checksum = checksum + mdmflen; | |
| ixj_write_cid_byte(j, 0x01); | |
| checksum = checksum + 0x01; | |
| ixj_write_cid_byte(j, len1); | |
| checksum = checksum + len1; | |
| checksum = ixj_write_cid_string(j, sdmf1, checksum); | |
| if(ixj_hookstate(j) & 1) | |
| break; | |
| ixj_write_cid_byte(j, 0x02); | |
| checksum = checksum + 0x02; | |
| ixj_write_cid_byte(j, len2); | |
| checksum = checksum + len2; | |
| checksum = ixj_write_cid_string(j, sdmf2, checksum); | |
| if(ixj_hookstate(j) & 1) | |
| break; | |
| ixj_write_cid_byte(j, 0x07); | |
| checksum = checksum + 0x07; | |
| ixj_write_cid_byte(j, len3); | |
| checksum = checksum + len3; | |
| checksum = ixj_write_cid_string(j, sdmf3, checksum); | |
| if(ixj_hookstate(j) & 1) | |
| break; | |
| checksum %= 256; | |
| checksum ^= 0xFF; | |
| checksum += 1; | |
| ixj_write_cid_byte(j, (char) checksum); | |
| pad = j->fskdcnt % 240; | |
| if (pad) { | |
| pad = 240 - pad; | |
| } | |
| ixj_pad_fsk(j, pad); | |
| break; | |
| } | |
| ixj_write_frame(j); | |
| } | |
| static void ixj_write_cidcw(IXJ *j) | |
| { | |
| IXJ_TONE ti; | |
| char sdmf1[50]; | |
| char sdmf2[50]; | |
| char sdmf3[80]; | |
| char mdmflen, len1, len2, len3; | |
| int pad; | |
| int checksum = 0; | |
| if (j->dsp.low == 0x20 || j->flags.cidplay) | |
| return; | |
| j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | |
| j->cidsize = j->cidcnt = 0; | |
| ixj_fsk_alloc(j); | |
| j->flags.cidcw_ack = 0; | |
| ti.tone_index = 23; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz440; | |
| ti.gain1 = 0; | |
| ti.freq1 = 0; | |
| ixj_init_tone(j, &ti); | |
| ixj_set_tone_on(1500, j); | |
| ixj_set_tone_off(32, j); | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies); | |
| } | |
| ixj_play_tone(j, 23); | |
| clear_bit(j->board, &j->busyflags); | |
| while(j->tone_state) | |
| schedule_timeout_interruptible(1); | |
| while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | |
| schedule_timeout_interruptible(1); | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies); | |
| } | |
| ti.tone_index = 24; | |
| ti.gain0 = 1; | |
| ti.freq0 = hz2130; | |
| ti.gain1 = 0; | |
| ti.freq1 = hz2750; | |
| ixj_init_tone(j, &ti); | |
| ixj_set_tone_off(10, j); | |
| ixj_set_tone_on(600, j); | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies); | |
| } | |
| ixj_play_tone(j, 24); | |
| clear_bit(j->board, &j->busyflags); | |
| while(j->tone_state) | |
| schedule_timeout_interruptible(1); | |
| while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | |
| schedule_timeout_interruptible(1); | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies); | |
| } | |
| j->cidcw_wait = jiffies + ((50 * hertz) / 100); | |
| clear_bit(j->board, &j->busyflags); | |
| while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) | |
| schedule_timeout_interruptible(1); | |
| while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | |
| schedule_timeout_interruptible(1); | |
| j->cidcw_wait = 0; | |
| if(!j->flags.cidcw_ack) { | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies); | |
| } | |
| ixj_post_cid(j); | |
| if(j->cid_play_flag) { | |
| wake_up_interruptible(&j->write_q); /* Wake any blocked readers */ | |
| } | |
| return; | |
| } else { | |
| ixj_pre_cid(j); | |
| } | |
| j->flags.cidcw_ack = 0; | |
| strlcpy(sdmf1, j->cid_send.month, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.day, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.hour, sizeof(sdmf1)); | |
| strlcat(sdmf1, j->cid_send.min, sizeof(sdmf1)); | |
| strlcpy(sdmf2, j->cid_send.number, sizeof(sdmf2)); | |
| strlcpy(sdmf3, j->cid_send.name, sizeof(sdmf3)); | |
| len1 = strlen(sdmf1); | |
| len2 = strlen(sdmf2); | |
| len3 = strlen(sdmf3); | |
| mdmflen = len1 + len2 + len3 + 6; | |
| ixj_write_cidcw_seize(j); | |
| ixj_write_cid_byte(j, 0x80); | |
| checksum = 0x80; | |
| ixj_write_cid_byte(j, mdmflen); | |
| checksum = checksum + mdmflen; | |
| ixj_write_cid_byte(j, 0x01); | |
| checksum = checksum + 0x01; | |
| ixj_write_cid_byte(j, len1); | |
| checksum = checksum + len1; | |
| checksum = ixj_write_cid_string(j, sdmf1, checksum); | |
| ixj_write_cid_byte(j, 0x02); | |
| checksum = checksum + 0x02; | |
| ixj_write_cid_byte(j, len2); | |
| checksum = checksum + len2; | |
| checksum = ixj_write_cid_string(j, sdmf2, checksum); | |
| ixj_write_cid_byte(j, 0x07); | |
| checksum = checksum + 0x07; | |
| ixj_write_cid_byte(j, len3); | |
| checksum = checksum + len3; | |
| checksum = ixj_write_cid_string(j, sdmf3, checksum); | |
| checksum %= 256; | |
| checksum ^= 0xFF; | |
| checksum += 1; | |
| ixj_write_cid_byte(j, (char) checksum); | |
| pad = j->fskdcnt % 240; | |
| if (pad) { | |
| pad = 240 - pad; | |
| } | |
| ixj_pad_fsk(j, pad); | |
| if(ixjdebug & 0x0200) { | |
| printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies); | |
| } | |
| } | |
| static void ixj_write_vmwi(IXJ *j, int msg) | |
| { | |
| char mdmflen; | |
| int pad; | |
| int checksum = 0; | |
| if (j->dsp.low == 0x20 || j->flags.cidplay) | |
| return; | |
| j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | |
| j->cidsize = j->cidcnt = 0; | |
| ixj_fsk_alloc(j); | |
| mdmflen = 3; | |
| if (j->port == PORT_POTS) | |
| SLIC_SetState(PLD_SLIC_STATE_OHT, j); | |
| ixj_write_cid_seize(j); | |
| ixj_write_cid_byte(j, 0x82); | |
| checksum = 0x82; | |
| ixj_write_cid_byte(j, mdmflen); | |
| checksum = checksum + mdmflen; | |
| ixj_write_cid_byte(j, 0x0B); | |
| checksum = checksum + 0x0B; | |
| ixj_write_cid_byte(j, 1); | |
| checksum = checksum + 1; | |
| if(msg) { | |
| ixj_write_cid_byte(j, 0xFF); | |
| checksum = checksum + 0xFF; | |
| } | |
| else { | |
| ixj_write_cid_byte(j, 0x00); | |
| checksum = checksum + 0x00; | |
| } | |
| checksum %= 256; | |
| checksum ^= 0xFF; | |
| checksum += 1; | |
| ixj_write_cid_byte(j, (char) checksum); | |
| pad = j->fskdcnt % 240; | |
| if (pad) { | |
| pad = 240 - pad; | |
| } | |
| ixj_pad_fsk(j, pad); | |
| } | |
| static void ixj_write_frame(IXJ *j) | |
| { | |
| int cnt, frame_count, dly; | |
| IXJ_WORD dat; | |
| frame_count = 0; | |
| if(j->flags.cidplay) { | |
| for(cnt = 0; cnt < 480; cnt++) { | |
| if (!(cnt % 16) && !IsTxReady(j)) { | |
| dly = 0; | |
| while (!IsTxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| dat.word = j->fskdata[j->cidcnt++]; | |
| outb_p(dat.bytes.low, j->DSPbase + 0x0C); | |
| outb_p(dat.bytes.high, j->DSPbase + 0x0D); | |
| cnt++; | |
| } | |
| if(j->cidcnt >= j->fskdcnt) { | |
| ixj_post_cid(j); | |
| } | |
| /* This may seem rude, but if we just played one frame of FSK data for CallerID | |
| and there is real audio data in the buffer, we need to throw it away because | |
| we just used it's time slot */ | |
| if (j->write_buffer_rp > j->write_buffer_wp) { | |
| j->write_buffer_rp += j->cid_play_frame_size * 2; | |
| if (j->write_buffer_rp >= j->write_buffer_end) { | |
| j->write_buffer_rp = j->write_buffer; | |
| } | |
| j->write_buffers_empty++; | |
| wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ | |
| wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ | |
| } | |
| } else if (j->write_buffer && j->write_buffers_empty < 1) { | |
| if (j->write_buffer_wp > j->write_buffer_rp) { | |
| frame_count = | |
| (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2); | |
| } | |
| if (j->write_buffer_rp > j->write_buffer_wp) { | |
| frame_count = | |
| (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) + | |
| (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2); | |
| } | |
| if (frame_count >= 1) { | |
| if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) { | |
| BYTES blankword; | |
| switch (j->play_mode) { | |
| case PLAYBACK_MODE_ULAW: | |
| case PLAYBACK_MODE_ALAW: | |
| blankword.low = blankword.high = 0xFF; | |
| break; | |
| case PLAYBACK_MODE_8LINEAR: | |
| case PLAYBACK_MODE_16LINEAR: | |
| default: | |
| blankword.low = blankword.high = 0x00; | |
| break; | |
| case PLAYBACK_MODE_8LINEAR_WSS: | |
| blankword.low = blankword.high = 0x80; | |
| break; | |
| } | |
| for (cnt = 0; cnt < 16; cnt++) { | |
| if (!(cnt % 16) && !IsTxReady(j)) { | |
| dly = 0; | |
| while (!IsTxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| outb_p((blankword.low), j->DSPbase + 0x0C); | |
| outb_p((blankword.high), j->DSPbase + 0x0D); | |
| } | |
| j->flags.play_first_frame = 0; | |
| } else if (j->play_codec == G723_63 && j->flags.play_first_frame) { | |
| for (cnt = 0; cnt < 24; cnt++) { | |
| BYTES blankword; | |
| if(cnt == 12) { | |
| blankword.low = 0x02; | |
| blankword.high = 0x00; | |
| } | |
| else { | |
| blankword.low = blankword.high = 0x00; | |
| } | |
| if (!(cnt % 16) && !IsTxReady(j)) { | |
| dly = 0; | |
| while (!IsTxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| outb_p((blankword.low), j->DSPbase + 0x0C); | |
| outb_p((blankword.high), j->DSPbase + 0x0D); | |
| } | |
| j->flags.play_first_frame = 0; | |
| } | |
| for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) { | |
| if (!(cnt % 16) && !IsTxReady(j)) { | |
| dly = 0; | |
| while (!IsTxReady(j)) { | |
| if (dly++ > 5) { | |
| dly = 0; | |
| break; | |
| } | |
| udelay(10); | |
| } | |
| } | |
| /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */ | |
| if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { | |
| if (j->write_buffer_rp[cnt] == 0 && | |
| j->write_buffer_rp[cnt + 1] == 0 && | |
| j->write_buffer_rp[cnt + 2] == 0 && | |
| j->write_buffer_rp[cnt + 3] == 0 && | |
| j->write_buffer_rp[cnt + 4] == 0 && | |
| j->write_buffer_rp[cnt + 5] == 0 && | |
| j->write_buffer_rp[cnt + 6] == 0 && | |
| j->write_buffer_rp[cnt + 7] == 0 && | |
| j->write_buffer_rp[cnt + 8] == 0 && | |
| j->write_buffer_rp[cnt + 9] == 0) { | |
| /* someone is trying to write silence lets make this a type 0 frame. */ | |
| outb_p(0x00, j->DSPbase + 0x0C); | |
| outb_p(0x00, j->DSPbase + 0x0D); | |
| } else { | |
| /* so all other frames are type 1. */ | |
| outb_p(0x01, j->DSPbase + 0x0C); | |
| outb_p(0x00, j->DSPbase + 0x0D); | |
| } | |
| } | |
| outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C); | |
| outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D); | |
| *(j->write_buffer_rp + cnt) = 0; | |
| *(j->write_buffer_rp + cnt + 1) = 0; | |
| } | |
| j->write_buffer_rp += j->play_frame_size * 2; | |
| if (j->write_buffer_rp >= j->write_buffer_end) { | |
| j->write_buffer_rp = j->write_buffer; | |
| } | |
| j->write_buffers_empty++; | |
| wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ | |
| wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ | |
| ++j->frameswritten; | |
| } | |
| } else { | |
| j->drybuffer++; | |
| } | |
| if(j->ixj_signals[SIG_WRITE_READY]) { | |
| ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT); | |
| } | |
| } | |
| static int idle(IXJ *j) | |
| { | |
| if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */ | |
| return 0; | |
| if (j->ssr.high || j->ssr.low) { | |
| return 0; | |
| } else { | |
| j->play_mode = -1; | |
| j->flags.playing = 0; | |
| j->rec_mode = -1; | |
| j->flags.recording = 0; | |
| return 1; | |
| } | |
| } | |
| static int set_base_frame(IXJ *j, int size) | |
| { | |
| unsigned short cmd; | |
| int cnt; | |
| idle(j); | |
| j->cid_play_aec_level = j->aec_level; | |
| aec_stop(j); | |
| for (cnt = 0; cnt < 10; cnt++) { | |
| if (idle(j)) | |
| break; | |
| } | |
| if (j->ssr.high || j->ssr.low) | |
| return -1; | |
| if (j->dsp.low != 0x20) { | |
| switch (size) { | |
| case 30: | |
| cmd = 0x07F0; | |
| /* Set Base Frame Size to 240 pg9-10 8021 */ | |
| break; | |
| case 20: | |
| cmd = 0x07A0; | |
| /* Set Base Frame Size to 160 pg9-10 8021 */ | |
| break; | |
| case 10: | |
| cmd = 0x0750; | |
| /* Set Base Frame Size to 80 pg9-10 8021 */ | |
| break; | |
| default: | |
| return -1; | |
| } | |
| } else { | |
| if (size == 30) | |
| return size; | |
| else | |
| return -1; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) { | |
| j->baseframe.high = j->baseframe.low = 0xFF; | |
| return -1; | |
| } else { | |
| j->baseframe.high = j->ssr.high; | |
| j->baseframe.low = j->ssr.low; | |
| /* If the status returned is 0x0000 (pg9-9 8021) the call failed */ | |
| if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) { | |
| return -1; | |
| } | |
| } | |
| ixj_aec_start(j, j->cid_play_aec_level); | |
| return size; | |
| } | |
| static int set_rec_codec(IXJ *j, int rate) | |
| { | |
| int retval = 0; | |
| j->rec_codec = rate; | |
| switch (rate) { | |
| case G723_63: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->rec_frame_size = 12; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G723_53: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->rec_frame_size = 10; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS85: | |
| if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | |
| j->rec_frame_size = 16; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS48: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->rec_frame_size = 9; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS41: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->rec_frame_size = 8; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G728: | |
| if (j->dsp.low != 0x20) { | |
| j->rec_frame_size = 48; | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G729: | |
| if (j->dsp.low != 0x20) { | |
| if (!j->flags.g729_loaded) { | |
| retval = 1; | |
| break; | |
| } | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 10; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 5; | |
| break; | |
| default: | |
| j->rec_frame_size = 15; | |
| break; | |
| } | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G729B: | |
| if (j->dsp.low != 0x20) { | |
| if (!j->flags.g729_loaded) { | |
| retval = 1; | |
| break; | |
| } | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 12; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 6; | |
| break; | |
| default: | |
| j->rec_frame_size = 18; | |
| break; | |
| } | |
| j->rec_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case ULAW: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 40; | |
| break; | |
| default: | |
| j->rec_frame_size = 120; | |
| break; | |
| } | |
| j->rec_mode = 4; | |
| break; | |
| case ALAW: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 40; | |
| break; | |
| default: | |
| j->rec_frame_size = 120; | |
| break; | |
| } | |
| j->rec_mode = 4; | |
| break; | |
| case LINEAR16: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 160; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 80; | |
| break; | |
| default: | |
| j->rec_frame_size = 240; | |
| break; | |
| } | |
| j->rec_mode = 5; | |
| break; | |
| case LINEAR8: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 40; | |
| break; | |
| default: | |
| j->rec_frame_size = 120; | |
| break; | |
| } | |
| j->rec_mode = 6; | |
| break; | |
| case WSS: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->rec_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->rec_frame_size = 40; | |
| break; | |
| default: | |
| j->rec_frame_size = 120; | |
| break; | |
| } | |
| j->rec_mode = 7; | |
| break; | |
| default: | |
| kfree(j->read_buffer); | |
| j->rec_frame_size = 0; | |
| j->rec_mode = -1; | |
| j->read_buffer = NULL; | |
| j->read_buffer_size = 0; | |
| retval = 1; | |
| break; | |
| } | |
| return retval; | |
| } | |
| static int ixj_record_start(IXJ *j) | |
| { | |
| unsigned short cmd = 0x0000; | |
| if (j->read_buffer) { | |
| ixj_record_stop(j); | |
| } | |
| j->flags.recording = 1; | |
| ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ | |
| if(ixjdebug & 0x0002) | |
| printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); | |
| if (!j->rec_mode) { | |
| switch (j->rec_codec) { | |
| case G723_63: | |
| cmd = 0x5131; | |
| break; | |
| case G723_53: | |
| cmd = 0x5132; | |
| break; | |
| case TS85: | |
| cmd = 0x5130; /* TrueSpeech 8.5 */ | |
| break; | |
| case TS48: | |
| cmd = 0x5133; /* TrueSpeech 4.8 */ | |
| break; | |
| case TS41: | |
| cmd = 0x5134; /* TrueSpeech 4.1 */ | |
| break; | |
| case G728: | |
| cmd = 0x5135; | |
| break; | |
| case G729: | |
| case G729B: | |
| cmd = 0x5136; | |
| break; | |
| default: | |
| return 1; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| } | |
| if (!j->read_buffer) { | |
| if (!j->read_buffer) | |
| j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC); | |
| if (!j->read_buffer) { | |
| printk("Read buffer allocation for ixj board %d failed!\n", j->board); | |
| return -ENOMEM; | |
| } | |
| } | |
| j->read_buffer_size = j->rec_frame_size * 2; | |
| if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */ | |
| return -1; | |
| switch (j->rec_mode) { | |
| case 0: | |
| cmd = 0x1C03; /* Record C1 */ | |
| break; | |
| case 4: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x1E03; /* Record C1 */ | |
| } else { | |
| cmd = 0x1E01; /* Record C1 */ | |
| } | |
| break; | |
| case 5: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x1E83; /* Record C1 */ | |
| } else { | |
| cmd = 0x1E81; /* Record C1 */ | |
| } | |
| break; | |
| case 6: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x1F03; /* Record C1 */ | |
| } else { | |
| cmd = 0x1F01; /* Record C1 */ | |
| } | |
| break; | |
| case 7: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x1F83; /* Record C1 */ | |
| } else { | |
| cmd = 0x1F81; /* Record C1 */ | |
| } | |
| break; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| if (j->flags.playing) { | |
| ixj_aec_start(j, j->aec_level); | |
| } | |
| return 0; | |
| } | |
| static void ixj_record_stop(IXJ *j) | |
| { | |
| if (ixjdebug & 0x0002) | |
| printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); | |
| kfree(j->read_buffer); | |
| j->read_buffer = NULL; | |
| j->read_buffer_size = 0; | |
| if (j->rec_mode > -1) { | |
| ixj_WriteDSPCommand(0x5120, j); | |
| j->rec_mode = -1; | |
| } | |
| j->flags.recording = 0; | |
| } | |
| static void ixj_vad(IXJ *j, int arg) | |
| { | |
| if (arg) | |
| ixj_WriteDSPCommand(0x513F, j); | |
| else | |
| ixj_WriteDSPCommand(0x513E, j); | |
| } | |
| static void set_rec_depth(IXJ *j, int depth) | |
| { | |
| if (depth > 60) | |
| depth = 60; | |
| if (depth < 0) | |
| depth = 0; | |
| ixj_WriteDSPCommand(0x5180 + depth, j); | |
| } | |
| static void set_dtmf_prescale(IXJ *j, int volume) | |
| { | |
| ixj_WriteDSPCommand(0xCF07, j); | |
| ixj_WriteDSPCommand(volume, j); | |
| } | |
| static int get_dtmf_prescale(IXJ *j) | |
| { | |
| ixj_WriteDSPCommand(0xCF05, j); | |
| return j->ssr.high << 8 | j->ssr.low; | |
| } | |
| static void set_rec_volume(IXJ *j, int volume) | |
| { | |
| if(j->aec_level == AEC_AGC) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume); | |
| ixj_WriteDSPCommand(0xCF96, j); | |
| ixj_WriteDSPCommand(volume, j); | |
| } else { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume); | |
| ixj_WriteDSPCommand(0xCF03, j); | |
| ixj_WriteDSPCommand(volume, j); | |
| } | |
| } | |
| static int set_rec_volume_linear(IXJ *j, int volume) | |
| { | |
| int newvolume, dsprecmax; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume); | |
| if(volume > 100 || volume < 0) { | |
| return -1; | |
| } | |
| /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| dsprecmax = 0x440; | |
| break; | |
| case QTI_LINEJACK: | |
| dsprecmax = 0x180; | |
| ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */ | |
| ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */ | |
| ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */ | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| dsprecmax = 0x4C0; | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| dsprecmax = 0x100; | |
| break; | |
| case QTI_PHONECARD: | |
| dsprecmax = 0x400; | |
| break; | |
| default: | |
| return -1; | |
| } | |
| newvolume = (dsprecmax * volume) / 100; | |
| set_rec_volume(j, newvolume); | |
| return 0; | |
| } | |
| static int get_rec_volume(IXJ *j) | |
| { | |
| if(j->aec_level == AEC_AGC) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Getting AGC Threshold\n"); | |
| ixj_WriteDSPCommand(0xCF86, j); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low); | |
| return j->ssr.high << 8 | j->ssr.low; | |
| } else { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Getting Record Volume\n"); | |
| ixj_WriteDSPCommand(0xCF01, j); | |
| return j->ssr.high << 8 | j->ssr.low; | |
| } | |
| } | |
| static int get_rec_volume_linear(IXJ *j) | |
| { | |
| int volume, newvolume, dsprecmax; | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| dsprecmax = 0x440; | |
| break; | |
| case QTI_LINEJACK: | |
| dsprecmax = 0x180; | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| dsprecmax = 0x4C0; | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| dsprecmax = 0x100; | |
| break; | |
| case QTI_PHONECARD: | |
| dsprecmax = 0x400; | |
| break; | |
| default: | |
| return -1; | |
| } | |
| volume = get_rec_volume(j); | |
| newvolume = (volume * 100) / dsprecmax; | |
| if(newvolume > 100) | |
| newvolume = 100; | |
| return newvolume; | |
| } | |
| static int get_rec_level(IXJ *j) | |
| { | |
| int retval; | |
| ixj_WriteDSPCommand(0xCF88, j); | |
| retval = j->ssr.high << 8 | j->ssr.low; | |
| retval = (retval * 256) / 240; | |
| return retval; | |
| } | |
| static void ixj_aec_start(IXJ *j, int level) | |
| { | |
| j->aec_level = level; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level); | |
| if (!level) { | |
| aec_stop(j); | |
| } else { | |
| if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { | |
| ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */ | |
| ixj_WriteDSPCommand(0x0300, j); | |
| } | |
| ixj_WriteDSPCommand(0xB001, j); /* AEC On */ | |
| ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */ | |
| switch (level) { | |
| case AEC_LOW: | |
| ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */ | |
| ixj_WriteDSPCommand(0xE011, j); | |
| ixj_WriteDSPCommand(0xFFFF, j); | |
| ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ | |
| ixj_WriteDSPCommand(0x0000, j); /* to off */ | |
| break; | |
| case AEC_MED: | |
| ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */ | |
| ixj_WriteDSPCommand(0xE011, j); | |
| ixj_WriteDSPCommand(0x0080, j); | |
| ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ | |
| ixj_WriteDSPCommand(0x0000, j); /* to off */ | |
| break; | |
| case AEC_HIGH: | |
| ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */ | |
| ixj_WriteDSPCommand(0xE011, j); | |
| ixj_WriteDSPCommand(0x0080, j); | |
| ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ | |
| ixj_WriteDSPCommand(0x0000, j); /* to off */ | |
| break; | |
| case AEC_AGC: | |
| /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */ | |
| ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */ | |
| ixj_WriteDSPCommand(0xE011, j); | |
| ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */ | |
| ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */ | |
| if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) | |
| ixj_WriteDSPCommand(0x0224, j); | |
| else | |
| ixj_WriteDSPCommand(0x1224, j); | |
| ixj_WriteDSPCommand(0xE014, j); | |
| ixj_WriteDSPCommand(0x0003, j); /* Lock threshold at 3dB */ | |
| ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */ | |
| /* Now we can set the AGC initial parameters and turn it on */ | |
| ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minimum gain */ | |
| ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */ | |
| ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */ | |
| ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */ | |
| ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */ | |
| ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */ | |
| ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */ | |
| ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */ | |
| ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */ | |
| ixj_WriteDSPCommand(0x0005, j); /* to 8ms */ | |
| ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */ | |
| ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */ | |
| ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */ | |
| ixj_WriteDSPCommand(0x1200, j); /* to 25% */ | |
| ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ | |
| ixj_WriteDSPCommand(0x0001, j); /* to on */ | |
| break; | |
| case AEC_AUTO: | |
| ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */ | |
| ixj_WriteDSPCommand(0xE011, j); | |
| ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */ | |
| ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */ | |
| if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) | |
| ixj_WriteDSPCommand(0x0224, j); | |
| else | |
| ixj_WriteDSPCommand(0x1224, j); | |
| ixj_WriteDSPCommand(0xE014, j); | |
| ixj_WriteDSPCommand(0x0003, j); /* Lock threshold at 3dB */ | |
| ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */ | |
| break; | |
| } | |
| } | |
| } | |
| static void aec_stop(IXJ *j) | |
| { | |
| j->aec_level = AEC_OFF; | |
| if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { | |
| ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */ | |
| ixj_WriteDSPCommand(0x0700, j); | |
| } | |
| if (j->play_mode != -1 && j->rec_mode != -1) | |
| { | |
| ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */ | |
| } | |
| } | |
| static int set_play_codec(IXJ *j, int rate) | |
| { | |
| int retval = 0; | |
| j->play_codec = rate; | |
| switch (rate) { | |
| case G723_63: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->play_frame_size = 12; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G723_53: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->play_frame_size = 10; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS85: | |
| if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | |
| j->play_frame_size = 16; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS48: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->play_frame_size = 9; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case TS41: | |
| if (j->ver.low != 0x12 || ixj_convert_loaded) { | |
| j->play_frame_size = 8; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G728: | |
| if (j->dsp.low != 0x20) { | |
| j->play_frame_size = 48; | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G729: | |
| if (j->dsp.low != 0x20) { | |
| if (!j->flags.g729_loaded) { | |
| retval = 1; | |
| break; | |
| } | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 10; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 5; | |
| break; | |
| default: | |
| j->play_frame_size = 15; | |
| break; | |
| } | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case G729B: | |
| if (j->dsp.low != 0x20) { | |
| if (!j->flags.g729_loaded) { | |
| retval = 1; | |
| break; | |
| } | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 12; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 6; | |
| break; | |
| default: | |
| j->play_frame_size = 18; | |
| break; | |
| } | |
| j->play_mode = 0; | |
| } else { | |
| retval = 1; | |
| } | |
| break; | |
| case ULAW: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 40; | |
| break; | |
| default: | |
| j->play_frame_size = 120; | |
| break; | |
| } | |
| j->play_mode = 2; | |
| break; | |
| case ALAW: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 40; | |
| break; | |
| default: | |
| j->play_frame_size = 120; | |
| break; | |
| } | |
| j->play_mode = 2; | |
| break; | |
| case LINEAR16: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 160; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 80; | |
| break; | |
| default: | |
| j->play_frame_size = 240; | |
| break; | |
| } | |
| j->play_mode = 6; | |
| break; | |
| case LINEAR8: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 40; | |
| break; | |
| default: | |
| j->play_frame_size = 120; | |
| break; | |
| } | |
| j->play_mode = 4; | |
| break; | |
| case WSS: | |
| switch (j->baseframe.low) { | |
| case 0xA0: | |
| j->play_frame_size = 80; | |
| break; | |
| case 0x50: | |
| j->play_frame_size = 40; | |
| break; | |
| default: | |
| j->play_frame_size = 120; | |
| break; | |
| } | |
| j->play_mode = 5; | |
| break; | |
| default: | |
| kfree(j->write_buffer); | |
| j->play_frame_size = 0; | |
| j->play_mode = -1; | |
| j->write_buffer = NULL; | |
| j->write_buffer_size = 0; | |
| retval = 1; | |
| break; | |
| } | |
| return retval; | |
| } | |
| static int ixj_play_start(IXJ *j) | |
| { | |
| unsigned short cmd = 0x0000; | |
| if (j->write_buffer) { | |
| ixj_play_stop(j); | |
| } | |
| if(ixjdebug & 0x0002) | |
| printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); | |
| j->flags.playing = 1; | |
| ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ | |
| j->flags.play_first_frame = 1; | |
| j->drybuffer = 0; | |
| if (!j->play_mode) { | |
| switch (j->play_codec) { | |
| case G723_63: | |
| cmd = 0x5231; | |
| break; | |
| case G723_53: | |
| cmd = 0x5232; | |
| break; | |
| case TS85: | |
| cmd = 0x5230; /* TrueSpeech 8.5 */ | |
| break; | |
| case TS48: | |
| cmd = 0x5233; /* TrueSpeech 4.8 */ | |
| break; | |
| case TS41: | |
| cmd = 0x5234; /* TrueSpeech 4.1 */ | |
| break; | |
| case G728: | |
| cmd = 0x5235; | |
| break; | |
| case G729: | |
| case G729B: | |
| cmd = 0x5236; | |
| break; | |
| default: | |
| return 1; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| } | |
| j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC); | |
| if (!j->write_buffer) { | |
| printk("Write buffer allocation for ixj board %d failed!\n", j->board); | |
| return -ENOMEM; | |
| } | |
| /* j->write_buffers_empty = 2; */ | |
| j->write_buffers_empty = 1; | |
| j->write_buffer_size = j->play_frame_size * 2; | |
| j->write_buffer_end = j->write_buffer + j->play_frame_size * 2; | |
| j->write_buffer_rp = j->write_buffer_wp = j->write_buffer; | |
| if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */ | |
| return -1; | |
| switch (j->play_mode) { | |
| case 0: | |
| cmd = 0x2C03; | |
| break; | |
| case 2: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x2C23; | |
| } else { | |
| cmd = 0x2C21; | |
| } | |
| break; | |
| case 4: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x2C43; | |
| } else { | |
| cmd = 0x2C41; | |
| } | |
| break; | |
| case 5: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x2C53; | |
| } else { | |
| cmd = 0x2C51; | |
| } | |
| break; | |
| case 6: | |
| if (j->ver.low == 0x12) { | |
| cmd = 0x2C63; | |
| } else { | |
| cmd = 0x2C61; | |
| } | |
| break; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */ | |
| return -1; | |
| if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */ | |
| return -1; | |
| if (j->flags.recording) { | |
| ixj_aec_start(j, j->aec_level); | |
| } | |
| return 0; | |
| } | |
| static void ixj_play_stop(IXJ *j) | |
| { | |
| if (ixjdebug & 0x0002) | |
| printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); | |
| kfree(j->write_buffer); | |
| j->write_buffer = NULL; | |
| j->write_buffer_size = 0; | |
| if (j->play_mode > -1) { | |
| ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */ | |
| j->play_mode = -1; | |
| } | |
| j->flags.playing = 0; | |
| } | |
| static inline int get_play_level(IXJ *j) | |
| { | |
| int retval; | |
| ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */ | |
| return j->ssr.high << 8 | j->ssr.low; | |
| retval = j->ssr.high << 8 | j->ssr.low; | |
| retval = (retval * 256) / 240; | |
| return retval; | |
| } | |
| static unsigned int ixj_poll(struct file *file_p, poll_table * wait) | |
| { | |
| unsigned int mask = 0; | |
| IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); | |
| poll_wait(file_p, &(j->poll_q), wait); | |
| if (j->read_buffer_ready > 0) | |
| mask |= POLLIN | POLLRDNORM; /* readable */ | |
| if (j->write_buffers_empty > 0) | |
| mask |= POLLOUT | POLLWRNORM; /* writable */ | |
| if (j->ex.bytes) | |
| mask |= POLLPRI; | |
| return mask; | |
| } | |
| static int ixj_play_tone(IXJ *j, char tone) | |
| { | |
| if (!j->tone_state) { | |
| if(ixjdebug & 0x0002) { | |
| printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies); | |
| } | |
| if (j->dsp.low == 0x20) { | |
| idle(j); | |
| } | |
| j->tone_start_jif = jiffies; | |
| j->tone_state = 1; | |
| } | |
| j->tone_index = tone; | |
| if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j)) | |
| return -1; | |
| return 0; | |
| } | |
| static int ixj_set_tone_on(unsigned short arg, IXJ *j) | |
| { | |
| j->tone_on_time = arg; | |
| if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */ | |
| return -1; | |
| if (ixj_WriteDSPCommand(arg, j)) | |
| return -1; | |
| return 0; | |
| } | |
| static int SCI_WaitHighSCI(IXJ *j) | |
| { | |
| int cnt; | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if (!j->pld_scrr.bits.sci) { | |
| for (cnt = 0; cnt < 10; cnt++) { | |
| udelay(32); | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if ((j->pld_scrr.bits.sci)) | |
| return 1; | |
| } | |
| if (ixjdebug & 0x0001) | |
| printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte); | |
| return 0; | |
| } else | |
| return 1; | |
| } | |
| static int SCI_WaitLowSCI(IXJ *j) | |
| { | |
| int cnt; | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if (j->pld_scrr.bits.sci) { | |
| for (cnt = 0; cnt < 10; cnt++) { | |
| udelay(32); | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if (!(j->pld_scrr.bits.sci)) | |
| return 1; | |
| } | |
| if (ixjdebug & 0x0001) | |
| printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte); | |
| return 0; | |
| } else | |
| return 1; | |
| } | |
| static int SCI_Control(IXJ *j, int control) | |
| { | |
| switch (control) { | |
| case SCI_End: | |
| j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */ | |
| j->pld_scrw.bits.c1 = 0; /* to no selection */ | |
| break; | |
| case SCI_Enable_DAA: | |
| j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */ | |
| j->pld_scrw.bits.c1 = 0; /* to write to DAA */ | |
| break; | |
| case SCI_Enable_Mixer: | |
| j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */ | |
| j->pld_scrw.bits.c1 = 1; /* to write to mixer */ | |
| break; | |
| case SCI_Enable_EEPROM: | |
| j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */ | |
| j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */ | |
| break; | |
| default: | |
| return 0; | |
| break; | |
| } | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| switch (control) { | |
| case SCI_End: | |
| return 1; | |
| break; | |
| case SCI_Enable_DAA: | |
| case SCI_Enable_Mixer: | |
| case SCI_Enable_EEPROM: | |
| if (!SCI_WaitHighSCI(j)) | |
| return 0; | |
| break; | |
| default: | |
| return 0; | |
| break; | |
| } | |
| return 1; | |
| } | |
| static int SCI_Prepare(IXJ *j) | |
| { | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| return 1; | |
| } | |
| static int ixj_get_mixer(long val, IXJ *j) | |
| { | |
| int reg = (val & 0x1F00) >> 8; | |
| return j->mix.vol[reg]; | |
| } | |
| static int ixj_mixer(long val, IXJ *j) | |
| { | |
| BYTES bytes; | |
| bytes.high = (val & 0x1F00) >> 8; | |
| bytes.low = val & 0x00FF; | |
| /* save mixer value so we can get back later on */ | |
| j->mix.vol[bytes.high] = bytes.low; | |
| outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */ | |
| outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */ | |
| SCI_Control(j, SCI_Enable_Mixer); | |
| SCI_Control(j, SCI_End); | |
| return 0; | |
| } | |
| static int daa_load(BYTES * p_bytes, IXJ *j) | |
| { | |
| outb_p(p_bytes->high, j->XILINXbase + 0x03); | |
| outb_p(p_bytes->low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| else | |
| return 1; | |
| } | |
| static int ixj_daa_cr4(IXJ *j, char reg) | |
| { | |
| BYTES bytes; | |
| switch (j->daa_mode) { | |
| case SOP_PU_SLEEP: | |
| bytes.high = 0x14; | |
| break; | |
| case SOP_PU_RINGING: | |
| bytes.high = 0x54; | |
| break; | |
| case SOP_PU_CONVERSATION: | |
| bytes.high = 0x94; | |
| break; | |
| case SOP_PU_PULSEDIALING: | |
| bytes.high = 0xD4; | |
| break; | |
| } | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg; | |
| switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) { | |
| case 0: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0; | |
| break; | |
| case 1: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2; | |
| break; | |
| case 2: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1; | |
| break; | |
| case 3: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3; | |
| break; | |
| } | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| return 1; | |
| } | |
| static char daa_int_read(IXJ *j) | |
| { | |
| BYTES bytes; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x38; | |
| bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (bytes.low != ALISDAA_ID_BYTE) { | |
| if (ixjdebug & 0x0001) | |
| printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | |
| return 0; | |
| } | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high; | |
| return 1; | |
| } | |
| static char daa_CR_read(IXJ *j, int cr) | |
| { | |
| IXJ_WORD wdata; | |
| BYTES bytes; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| switch (j->daa_mode) { | |
| case SOP_PU_SLEEP: | |
| bytes.high = 0x30 + cr; | |
| break; | |
| case SOP_PU_RINGING: | |
| bytes.high = 0x70 + cr; | |
| break; | |
| case SOP_PU_CONVERSATION: | |
| bytes.high = 0xB0 + cr; | |
| break; | |
| case SOP_PU_PULSEDIALING: | |
| default: | |
| bytes.high = 0xF0 + cr; | |
| break; | |
| } | |
| bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (bytes.low != ALISDAA_ID_BYTE) { | |
| if (ixjdebug & 0x0001) | |
| printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | |
| return 0; | |
| } | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| wdata.word = inw_p(j->XILINXbase + 0x02); | |
| switch(cr){ | |
| case 5: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high; | |
| break; | |
| case 4: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high; | |
| break; | |
| case 3: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high; | |
| break; | |
| case 2: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high; | |
| break; | |
| case 1: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high; | |
| break; | |
| case 0: | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high; | |
| break; | |
| default: | |
| return 0; | |
| } | |
| return 1; | |
| } | |
| static int ixj_daa_cid_reset(IXJ *j) | |
| { | |
| int i; | |
| BYTES bytes; | |
| if (ixjdebug & 0x0002) | |
| printk("DAA Clearing CID ram\n"); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x58; | |
| bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_WaitHighSCI(j)) | |
| return 0; | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) { | |
| bytes.high = bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| if (i < ALISDAA_CALLERID_SIZE - 1) | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_WaitHighSCI(j)) | |
| return 0; | |
| } | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (ixjdebug & 0x0002) | |
| printk("DAA CID ram cleared\n"); | |
| return 1; | |
| } | |
| static int ixj_daa_cid_read(IXJ *j) | |
| { | |
| int i; | |
| BYTES bytes; | |
| char CID[ALISDAA_CALLERID_SIZE]; | |
| bool mContinue; | |
| char *pIn, *pOut; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x78; | |
| bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_WaitHighSCI(j)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (bytes.low != ALISDAA_ID_BYTE) { | |
| if (ixjdebug & 0x0001) | |
| printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | |
| return 0; | |
| } | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) { | |
| bytes.high = bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_WaitHighSCI(j)) | |
| return 0; | |
| CID[i + 0] = inb_p(j->XILINXbase + 0x03); | |
| CID[i + 1] = inb_p(j->XILINXbase + 0x02); | |
| } | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| pIn = CID; | |
| pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; | |
| mContinue = true; | |
| while (mContinue) { | |
| if ((pIn[1] & 0x03) == 0x01) { | |
| pOut[0] = pIn[0]; | |
| } | |
| if ((pIn[2] & 0x0c) == 0x04) { | |
| pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2); | |
| } | |
| if ((pIn[3] & 0x30) == 0x10) { | |
| pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4); | |
| } | |
| if ((pIn[4] & 0xc0) == 0x40) { | |
| pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6); | |
| } else { | |
| mContinue = false; | |
| } | |
| pIn += 5, pOut += 4; | |
| } | |
| memset(&j->cid, 0, sizeof(PHONE_CID)); | |
| pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; | |
| pOut += 4; | |
| strncpy(j->cid.month, pOut, 2); | |
| pOut += 2; | |
| strncpy(j->cid.day, pOut, 2); | |
| pOut += 2; | |
| strncpy(j->cid.hour, pOut, 2); | |
| pOut += 2; | |
| strncpy(j->cid.min, pOut, 2); | |
| pOut += 3; | |
| j->cid.numlen = *pOut; | |
| pOut += 1; | |
| strncpy(j->cid.number, pOut, j->cid.numlen); | |
| pOut += j->cid.numlen + 1; | |
| j->cid.namelen = *pOut; | |
| pOut += 1; | |
| strncpy(j->cid.name, pOut, j->cid.namelen); | |
| ixj_daa_cid_reset(j); | |
| return 1; | |
| } | |
| static char daa_get_version(IXJ *j) | |
| { | |
| BYTES bytes; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x35; | |
| bytes.low = 0x00; | |
| outb_p(bytes.high, j->XILINXbase + 0x03); | |
| outb_p(bytes.low, j->XILINXbase + 0x02); | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (bytes.low != ALISDAA_ID_BYTE) { | |
| if (ixjdebug & 0x0001) | |
| printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | |
| return 0; | |
| } | |
| if (!SCI_Control(j, SCI_Enable_DAA)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| bytes.high = inb_p(j->XILINXbase + 0x03); | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (ixjdebug & 0x0002) | |
| printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low); | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high; | |
| return bytes.high; | |
| } | |
| static int daa_set_mode(IXJ *j, int mode) | |
| { | |
| /* NOTE: | |
| The DAA *MUST* be in the conversation mode if the | |
| PSTN line is to be seized (PSTN line off-hook). | |
| Taking the PSTN line off-hook while the DAA is in | |
| a mode other than conversation mode will cause a | |
| hardware failure of the ALIS-A part. | |
| NOTE: | |
| The DAA can only go to SLEEP, RINGING or PULSEDIALING modes | |
| if the PSTN line is on-hook. Failure to have the PSTN line | |
| in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE | |
| ALIS-A part. | |
| */ | |
| BYTES bytes; | |
| j->flags.pstn_rmr = 0; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| switch (mode) { | |
| case SOP_PU_RESET: | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly2 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| bytes.high = 0x10; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| j->daa_mode = SOP_PU_SLEEP; | |
| break; | |
| case SOP_PU_SLEEP: | |
| if(j->daa_mode == SOP_PU_SLEEP) | |
| { | |
| break; | |
| } | |
| if (ixjdebug & 0x0008) | |
| printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies); | |
| /* if(j->daa_mode == SOP_PU_CONVERSATION) */ | |
| { | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly2 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| bytes.high = 0x10; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| } | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly2 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| bytes.high = 0x10; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| j->daa_mode = SOP_PU_SLEEP; | |
| j->flags.pstn_ringing = 0; | |
| j->ex.bits.pstn_ring = 0; | |
| j->pstn_sleeptil = jiffies + (hertz / 4); | |
| wake_up_interruptible(&j->read_q); /* Wake any blocked readers */ | |
| wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ | |
| wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ | |
| break; | |
| case SOP_PU_RINGING: | |
| if (ixjdebug & 0x0008) | |
| printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies); | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly2 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| bytes.high = 0x50; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| j->daa_mode = SOP_PU_RINGING; | |
| break; | |
| case SOP_PU_CONVERSATION: | |
| if (ixjdebug & 0x0008) | |
| printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies); | |
| bytes.high = 0x90; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| j->pld_slicw.bits.rly2 = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->daa_mode = SOP_PU_CONVERSATION; | |
| j->flags.pstn_ringing = 0; | |
| j->ex.bits.pstn_ring = 0; | |
| j->pstn_sleeptil = jiffies; | |
| j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0; | |
| break; | |
| case SOP_PU_PULSEDIALING: | |
| if (ixjdebug & 0x0008) | |
| printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies); | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly2 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| bytes.high = 0xD0; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| daa_load(&bytes, j); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| j->daa_mode = SOP_PU_PULSEDIALING; | |
| break; | |
| default: | |
| break; | |
| } | |
| return 1; | |
| } | |
| static int ixj_daa_write(IXJ *j) | |
| { | |
| BYTES bytes; | |
| j->flags.pstncheck = 1; | |
| daa_set_mode(j, SOP_PU_SLEEP); | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| bytes.high = 0x14; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg; | |
| bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x1F; | |
| bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg; | |
| bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg; | |
| bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg; | |
| bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Prepare(j)) | |
| return 0; | |
| bytes.high = 0x00; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x01; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x02; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x03; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x04; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x05; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x06; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x07; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x08; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x09; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0A; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0B; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0C; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0D; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0E; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| if (!SCI_WaitLowSCI(j)) | |
| return 0; | |
| bytes.high = 0x0F; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2]; | |
| bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1]; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0]; | |
| bytes.low = 0x00; | |
| if (!daa_load(&bytes, j)) | |
| return 0; | |
| udelay(32); | |
| j->pld_scrr.byte = inb_p(j->XILINXbase); | |
| if (!SCI_Control(j, SCI_End)) | |
| return 0; | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| if (ixjdebug & 0x0002) | |
| printk("DAA Coefficients Loaded\n"); | |
| j->flags.pstncheck = 0; | |
| return 1; | |
| } | |
| static int ixj_set_tone_off(unsigned short arg, IXJ *j) | |
| { | |
| j->tone_off_time = arg; | |
| if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */ | |
| return -1; | |
| if (ixj_WriteDSPCommand(arg, j)) | |
| return -1; | |
| return 0; | |
| } | |
| static int ixj_get_tone_on(IXJ *j) | |
| { | |
| if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */ | |
| return -1; | |
| return 0; | |
| } | |
| static int ixj_get_tone_off(IXJ *j) | |
| { | |
| if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */ | |
| return -1; | |
| return 0; | |
| } | |
| static void ixj_busytone(IXJ *j) | |
| { | |
| j->flags.ringback = 0; | |
| j->flags.dialtone = 0; | |
| j->flags.busytone = 1; | |
| ixj_set_tone_on(0x07D0, j); | |
| ixj_set_tone_off(0x07D0, j); | |
| ixj_play_tone(j, 27); | |
| } | |
| static void ixj_dialtone(IXJ *j) | |
| { | |
| j->flags.ringback = 0; | |
| j->flags.dialtone = 1; | |
| j->flags.busytone = 0; | |
| if (j->dsp.low == 0x20) { | |
| return; | |
| } else { | |
| ixj_set_tone_on(0xFFFF, j); | |
| ixj_set_tone_off(0x0000, j); | |
| ixj_play_tone(j, 25); | |
| } | |
| } | |
| static void ixj_cpt_stop(IXJ *j) | |
| { | |
| if(j->tone_state || j->tone_cadence_state) | |
| { | |
| j->flags.dialtone = 0; | |
| j->flags.busytone = 0; | |
| j->flags.ringback = 0; | |
| ixj_set_tone_on(0x0001, j); | |
| ixj_set_tone_off(0x0000, j); | |
| ixj_play_tone(j, 0); | |
| j->tone_state = j->tone_cadence_state = 0; | |
| if (j->cadence_t) { | |
| kfree(j->cadence_t->ce); | |
| kfree(j->cadence_t); | |
| j->cadence_t = NULL; | |
| } | |
| } | |
| if (j->play_mode == -1 && j->rec_mode == -1) | |
| idle(j); | |
| if (j->play_mode != -1 && j->dsp.low == 0x20) | |
| ixj_play_start(j); | |
| if (j->rec_mode != -1 && j->dsp.low == 0x20) | |
| ixj_record_start(j); | |
| } | |
| static void ixj_ringback(IXJ *j) | |
| { | |
| j->flags.busytone = 0; | |
| j->flags.dialtone = 0; | |
| j->flags.ringback = 1; | |
| ixj_set_tone_on(0x0FA0, j); | |
| ixj_set_tone_off(0x2EE0, j); | |
| ixj_play_tone(j, 26); | |
| } | |
| static void ixj_testram(IXJ *j) | |
| { | |
| ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */ | |
| } | |
| static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp) | |
| { | |
| ixj_cadence *lcp; | |
| IXJ_CADENCE_ELEMENT __user *cep; | |
| IXJ_CADENCE_ELEMENT *lcep; | |
| IXJ_TONE ti; | |
| int err; | |
| lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL); | |
| if (lcp == NULL) | |
| return -ENOMEM; | |
| err = -EFAULT; | |
| if (copy_from_user(&lcp->elements_used, | |
| &cp->elements_used, sizeof(int))) | |
| goto out; | |
| if (copy_from_user(&lcp->termination, | |
| &cp->termination, sizeof(IXJ_CADENCE_TERM))) | |
| goto out; | |
| if (get_user(cep, &cp->ce)) | |
| goto out; | |
| err = -EINVAL; | |
| if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT)) | |
| goto out; | |
| err = -ENOMEM; | |
| lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL); | |
| if (!lcep) | |
| goto out; | |
| err = -EFAULT; | |
| if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used)) | |
| goto out1; | |
| if (j->cadence_t) { | |
| kfree(j->cadence_t->ce); | |
| kfree(j->cadence_t); | |
| } | |
| lcp->ce = (void *) lcep; | |
| j->cadence_t = lcp; | |
| j->tone_cadence_state = 0; | |
| ixj_set_tone_on(lcp->ce[0].tone_on_time, j); | |
| ixj_set_tone_off(lcp->ce[0].tone_off_time, j); | |
| if (j->cadence_t->ce[j->tone_cadence_state].freq0) { | |
| ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | |
| ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | |
| ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | |
| ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | |
| ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | |
| ixj_init_tone(j, &ti); | |
| } | |
| ixj_play_tone(j, lcp->ce[0].index); | |
| return 1; | |
| out1: | |
| kfree(lcep); | |
| out: | |
| kfree(lcp); | |
| return err; | |
| } | |
| static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp) | |
| { | |
| IXJ_FILTER_CADENCE *lcp; | |
| lcp = memdup_user(cp, sizeof(IXJ_FILTER_CADENCE)); | |
| if (IS_ERR(lcp)) { | |
| if(ixjdebug & 0x0001) { | |
| printk(KERN_INFO "Could not allocate memory for cadence or could not copy cadence to kernel\n"); | |
| } | |
| return PTR_ERR(lcp); | |
| } | |
| if (lcp->filter > 5) { | |
| if(ixjdebug & 0x0001) { | |
| printk(KERN_INFO "Cadence out of range\n"); | |
| } | |
| kfree(lcp); | |
| return -1; | |
| } | |
| j->cadence_f[lcp->filter].state = 0; | |
| j->cadence_f[lcp->filter].enable = lcp->enable; | |
| j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter; | |
| j->cadence_f[lcp->filter].on1 = lcp->on1; | |
| j->cadence_f[lcp->filter].on1min = 0; | |
| j->cadence_f[lcp->filter].on1max = 0; | |
| j->cadence_f[lcp->filter].off1 = lcp->off1; | |
| j->cadence_f[lcp->filter].off1min = 0; | |
| j->cadence_f[lcp->filter].off1max = 0; | |
| j->cadence_f[lcp->filter].on2 = lcp->on2; | |
| j->cadence_f[lcp->filter].on2min = 0; | |
| j->cadence_f[lcp->filter].on2max = 0; | |
| j->cadence_f[lcp->filter].off2 = lcp->off2; | |
| j->cadence_f[lcp->filter].off2min = 0; | |
| j->cadence_f[lcp->filter].off2max = 0; | |
| j->cadence_f[lcp->filter].on3 = lcp->on3; | |
| j->cadence_f[lcp->filter].on3min = 0; | |
| j->cadence_f[lcp->filter].on3max = 0; | |
| j->cadence_f[lcp->filter].off3 = lcp->off3; | |
| j->cadence_f[lcp->filter].off3min = 0; | |
| j->cadence_f[lcp->filter].off3max = 0; | |
| if(ixjdebug & 0x0002) { | |
| printk(KERN_INFO "Cadence %d loaded\n", lcp->filter); | |
| } | |
| kfree(lcp); | |
| return 0; | |
| } | |
| static void add_caps(IXJ *j) | |
| { | |
| j->caps = 0; | |
| j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET; | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)"); | |
| j->caplist[j->caps].captype = vendor; | |
| j->caplist[j->caps].handle = j->caps++; | |
| j->caplist[j->caps].captype = device; | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK"); | |
| break; | |
| case QTI_LINEJACK: | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK"); | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite"); | |
| break; | |
| case QTI_PHONEJACK_PCI: | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI"); | |
| break; | |
| case QTI_PHONECARD: | |
| strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD"); | |
| break; | |
| } | |
| j->caplist[j->caps].cap = j->cardtype; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "POTS"); | |
| j->caplist[j->caps].captype = port; | |
| j->caplist[j->caps].cap = pots; | |
| j->caplist[j->caps].handle = j->caps++; | |
| /* add devices that can do speaker/mic */ | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| case QTI_LINEJACK: | |
| case QTI_PHONEJACK_PCI: | |
| case QTI_PHONECARD: | |
| strcpy(j->caplist[j->caps].desc, "SPEAKER"); | |
| j->caplist[j->caps].captype = port; | |
| j->caplist[j->caps].cap = speaker; | |
| j->caplist[j->caps].handle = j->caps++; | |
| default: | |
| break; | |
| } | |
| /* add devices that can do handset */ | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| strcpy(j->caplist[j->caps].desc, "HANDSET"); | |
| j->caplist[j->caps].captype = port; | |
| j->caplist[j->caps].cap = handset; | |
| j->caplist[j->caps].handle = j->caps++; | |
| break; | |
| default: | |
| break; | |
| } | |
| /* add devices that can do PSTN */ | |
| switch (j->cardtype) { | |
| case QTI_LINEJACK: | |
| strcpy(j->caplist[j->caps].desc, "PSTN"); | |
| j->caplist[j->caps].captype = port; | |
| j->caplist[j->caps].cap = pstn; | |
| j->caplist[j->caps].handle = j->caps++; | |
| break; | |
| default: | |
| break; | |
| } | |
| /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */ | |
| strcpy(j->caplist[j->caps].desc, "ULAW"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = ULAW; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = LINEAR16; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = LINEAR8; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "Windows Sound System"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = WSS; | |
| j->caplist[j->caps].handle = j->caps++; | |
| /* software ALAW codec, made from ULAW */ | |
| strcpy(j->caplist[j->caps].desc, "ALAW"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = ALAW; | |
| j->caplist[j->caps].handle = j->caps++; | |
| /* version 12 of the 8020 does the following codecs in a broken way */ | |
| if (j->dsp.low != 0x20 || j->ver.low != 0x12) { | |
| strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = G723_63; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = G723_53; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = TS48; | |
| j->caplist[j->caps].handle = j->caps++; | |
| strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = TS41; | |
| j->caplist[j->caps].handle = j->caps++; | |
| } | |
| /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */ | |
| if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | |
| strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = TS85; | |
| j->caplist[j->caps].handle = j->caps++; | |
| } | |
| /* 8021 chips can do G728 */ | |
| if (j->dsp.low == 0x21) { | |
| strcpy(j->caplist[j->caps].desc, "G.728 16kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = G728; | |
| j->caplist[j->caps].handle = j->caps++; | |
| } | |
| /* 8021/8022 chips can do G729 if loaded */ | |
| if (j->dsp.low != 0x20 && j->flags.g729_loaded) { | |
| strcpy(j->caplist[j->caps].desc, "G.729A 8kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = G729; | |
| j->caplist[j->caps].handle = j->caps++; | |
| } | |
| if (j->dsp.low != 0x20 && j->flags.g729_loaded) { | |
| strcpy(j->caplist[j->caps].desc, "G.729B 8kbps"); | |
| j->caplist[j->caps].captype = codec; | |
| j->caplist[j->caps].cap = G729B; | |
| j->caplist[j->caps].handle = j->caps++; | |
| } | |
| } | |
| static int capabilities_check(IXJ *j, struct phone_capability *pcreq) | |
| { | |
| int cnt; | |
| int retval = 0; | |
| for (cnt = 0; cnt < j->caps; cnt++) { | |
| if (pcreq->captype == j->caplist[cnt].captype | |
| && pcreq->cap == j->caplist[cnt].cap) { | |
| retval = 1; | |
| break; | |
| } | |
| } | |
| return retval; | |
| } | |
| static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg) | |
| { | |
| IXJ_TONE ti; | |
| IXJ_FILTER jf; | |
| IXJ_FILTER_RAW jfr; | |
| void __user *argp = (void __user *)arg; | |
| struct inode *inode = file_p->f_path.dentry->d_inode; | |
| unsigned int minor = iminor(inode); | |
| unsigned int raise, mant; | |
| int board = NUM(inode); | |
| IXJ *j = get_ixj(NUM(inode)); | |
| int retval = 0; | |
| /* | |
| * Set up locks to ensure that only one process is talking to the DSP at a time. | |
| * This is necessary to keep the DSP from locking up. | |
| */ | |
| while(test_and_set_bit(board, (void *)&j->busyflags) != 0) | |
| schedule_timeout_interruptible(1); | |
| if (ixjdebug & 0x0040) | |
| printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); | |
| if (minor >= IXJMAX) { | |
| clear_bit(board, &j->busyflags); | |
| return -ENODEV; | |
| } | |
| /* | |
| * Check ioctls only root can use. | |
| */ | |
| if (!capable(CAP_SYS_ADMIN)) { | |
| switch (cmd) { | |
| case IXJCTL_TESTRAM: | |
| case IXJCTL_HZ: | |
| retval = -EPERM; | |
| } | |
| } | |
| switch (cmd) { | |
| case IXJCTL_TESTRAM: | |
| ixj_testram(j); | |
| retval = (j->ssr.high << 8) + j->ssr.low; | |
| break; | |
| case IXJCTL_CARDTYPE: | |
| retval = j->cardtype; | |
| break; | |
| case IXJCTL_SERIAL: | |
| retval = j->serial; | |
| break; | |
| case IXJCTL_VERSION: | |
| { | |
| char arg_str[100]; | |
| snprintf(arg_str, sizeof(arg_str), | |
| "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, | |
| IXJ_VER_MINOR, IXJ_BLD_VER); | |
| if (copy_to_user(argp, arg_str, strlen(arg_str))) | |
| retval = -EFAULT; | |
| } | |
| break; | |
| case PHONE_RING_CADENCE: | |
| j->ring_cadence = arg; | |
| break; | |
| case IXJCTL_CIDCW: | |
| if(arg) { | |
| if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { | |
| retval = -EFAULT; | |
| break; | |
| } | |
| } else { | |
| memset(&j->cid_send, 0, sizeof(PHONE_CID)); | |
| } | |
| ixj_write_cidcw(j); | |
| break; | |
| /* Binary compatbility */ | |
| case OLD_PHONE_RING_START: | |
| arg = 0; | |
| /* Fall through */ | |
| case PHONE_RING_START: | |
| if(arg) { | |
| if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { | |
| retval = -EFAULT; | |
| break; | |
| } | |
| ixj_write_cid(j); | |
| } else { | |
| memset(&j->cid_send, 0, sizeof(PHONE_CID)); | |
| } | |
| ixj_ring_start(j); | |
| break; | |
| case PHONE_RING_STOP: | |
| j->flags.cringing = 0; | |
| if(j->cadence_f[5].enable) { | |
| j->cadence_f[5].state = 0; | |
| } | |
| ixj_ring_off(j); | |
| break; | |
| case PHONE_RING: | |
| retval = ixj_ring(j); | |
| break; | |
| case PHONE_EXCEPTION: | |
| retval = j->ex.bytes; | |
| if(j->ex.bits.flash) { | |
| j->flash_end = 0; | |
| j->ex.bits.flash = 0; | |
| } | |
| j->ex.bits.pstn_ring = 0; | |
| j->ex.bits.caller_id = 0; | |
| j->ex.bits.pstn_wink = 0; | |
| j->ex.bits.f0 = 0; | |
| j->ex.bits.f1 = 0; | |
| j->ex.bits.f2 = 0; | |
| j->ex.bits.f3 = 0; | |
| j->ex.bits.fc0 = 0; | |
| j->ex.bits.fc1 = 0; | |
| j->ex.bits.fc2 = 0; | |
| j->ex.bits.fc3 = 0; | |
| j->ex.bits.reserved = 0; | |
| break; | |
| case PHONE_HOOKSTATE: | |
| j->ex.bits.hookstate = 0; | |
| retval = j->hookstate; //j->r_hook; | |
| break; | |
| case IXJCTL_SET_LED: | |
| LED_SetState(arg, j); | |
| break; | |
| case PHONE_FRAME: | |
| retval = set_base_frame(j, arg); | |
| break; | |
| case PHONE_REC_CODEC: | |
| retval = set_rec_codec(j, arg); | |
| break; | |
| case PHONE_VAD: | |
| ixj_vad(j, arg); | |
| break; | |
| case PHONE_REC_START: | |
| ixj_record_start(j); | |
| break; | |
| case PHONE_REC_STOP: | |
| ixj_record_stop(j); | |
| break; | |
| case PHONE_REC_DEPTH: | |
| set_rec_depth(j, arg); | |
| break; | |
| case PHONE_REC_VOLUME: | |
| if(arg == -1) { | |
| retval = get_rec_volume(j); | |
| } | |
| else { | |
| set_rec_volume(j, arg); | |
| retval = arg; | |
| } | |
| break; | |
| case PHONE_REC_VOLUME_LINEAR: | |
| if(arg == -1) { | |
| retval = get_rec_volume_linear(j); | |
| } | |
| else { | |
| set_rec_volume_linear(j, arg); | |
| retval = arg; | |
| } | |
| break; | |
| case IXJCTL_DTMF_PRESCALE: | |
| if(arg == -1) { | |
| retval = get_dtmf_prescale(j); | |
| } | |
| else { | |
| set_dtmf_prescale(j, arg); | |
| retval = arg; | |
| } | |
| break; | |
| case PHONE_REC_LEVEL: | |
| retval = get_rec_level(j); | |
| break; | |
| case IXJCTL_SC_RXG: | |
| retval = ixj_siadc(j, arg); | |
| break; | |
| case IXJCTL_SC_TXG: | |
| retval = ixj_sidac(j, arg); | |
| break; | |
| case IXJCTL_AEC_START: | |
| ixj_aec_start(j, arg); | |
| break; | |
| case IXJCTL_AEC_STOP: | |
| aec_stop(j); | |
| break; | |
| case IXJCTL_AEC_GET_LEVEL: | |
| retval = j->aec_level; | |
| break; | |
| case PHONE_PLAY_CODEC: | |
| retval = set_play_codec(j, arg); | |
| break; | |
| case PHONE_PLAY_START: | |
| retval = ixj_play_start(j); | |
| break; | |
| case PHONE_PLAY_STOP: | |
| ixj_play_stop(j); | |
| break; | |
| case PHONE_PLAY_DEPTH: | |
| set_play_depth(j, arg); | |
| break; | |
| case PHONE_PLAY_VOLUME: | |
| if(arg == -1) { | |
| retval = get_play_volume(j); | |
| } | |
| else { | |
| set_play_volume(j, arg); | |
| retval = arg; | |
| } | |
| break; | |
| case PHONE_PLAY_VOLUME_LINEAR: | |
| if(arg == -1) { | |
| retval = get_play_volume_linear(j); | |
| } | |
| else { | |
| set_play_volume_linear(j, arg); | |
| retval = arg; | |
| } | |
| break; | |
| case PHONE_PLAY_LEVEL: | |
| retval = get_play_level(j); | |
| break; | |
| case IXJCTL_DSP_TYPE: | |
| retval = (j->dsp.high << 8) + j->dsp.low; | |
| break; | |
| case IXJCTL_DSP_VERSION: | |
| retval = (j->ver.high << 8) + j->ver.low; | |
| break; | |
| case IXJCTL_HZ: | |
| hertz = arg; | |
| break; | |
| case IXJCTL_RATE: | |
| if (arg > hertz) | |
| retval = -1; | |
| else | |
| samplerate = arg; | |
| break; | |
| case IXJCTL_DRYBUFFER_READ: | |
| put_user(j->drybuffer, (unsigned long __user *) argp); | |
| break; | |
| case IXJCTL_DRYBUFFER_CLEAR: | |
| j->drybuffer = 0; | |
| break; | |
| case IXJCTL_FRAMES_READ: | |
| put_user(j->framesread, (unsigned long __user *) argp); | |
| break; | |
| case IXJCTL_FRAMES_WRITTEN: | |
| put_user(j->frameswritten, (unsigned long __user *) argp); | |
| break; | |
| case IXJCTL_READ_WAIT: | |
| put_user(j->read_wait, (unsigned long __user *) argp); | |
| break; | |
| case IXJCTL_WRITE_WAIT: | |
| put_user(j->write_wait, (unsigned long __user *) argp); | |
| break; | |
| case PHONE_MAXRINGS: | |
| j->maxrings = arg; | |
| break; | |
| case PHONE_SET_TONE_ON_TIME: | |
| ixj_set_tone_on(arg, j); | |
| break; | |
| case PHONE_SET_TONE_OFF_TIME: | |
| ixj_set_tone_off(arg, j); | |
| break; | |
| case PHONE_GET_TONE_ON_TIME: | |
| if (ixj_get_tone_on(j)) { | |
| retval = -1; | |
| } else { | |
| retval = (j->ssr.high << 8) + j->ssr.low; | |
| } | |
| break; | |
| case PHONE_GET_TONE_OFF_TIME: | |
| if (ixj_get_tone_off(j)) { | |
| retval = -1; | |
| } else { | |
| retval = (j->ssr.high << 8) + j->ssr.low; | |
| } | |
| break; | |
| case PHONE_PLAY_TONE: | |
| if (!j->tone_state) | |
| retval = ixj_play_tone(j, arg); | |
| else | |
| retval = -1; | |
| break; | |
| case PHONE_GET_TONE_STATE: | |
| retval = j->tone_state; | |
| break; | |
| case PHONE_DTMF_READY: | |
| retval = j->ex.bits.dtmf_ready; | |
| break; | |
| case PHONE_GET_DTMF: | |
| if (ixj_hookstate(j)) { | |
| if (j->dtmf_rp != j->dtmf_wp) { | |
| retval = j->dtmfbuffer[j->dtmf_rp]; | |
| j->dtmf_rp++; | |
| if (j->dtmf_rp == 79) | |
| j->dtmf_rp = 0; | |
| if (j->dtmf_rp == j->dtmf_wp) { | |
| j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; | |
| } | |
| } | |
| } | |
| break; | |
| case PHONE_GET_DTMF_ASCII: | |
| if (ixj_hookstate(j)) { | |
| if (j->dtmf_rp != j->dtmf_wp) { | |
| switch (j->dtmfbuffer[j->dtmf_rp]) { | |
| case 10: | |
| retval = 42; /* '*'; */ | |
| break; | |
| case 11: | |
| retval = 48; /*'0'; */ | |
| break; | |
| case 12: | |
| retval = 35; /*'#'; */ | |
| break; | |
| case 28: | |
| retval = 65; /*'A'; */ | |
| break; | |
| case 29: | |
| retval = 66; /*'B'; */ | |
| break; | |
| case 30: | |
| retval = 67; /*'C'; */ | |
| break; | |
| case 31: | |
| retval = 68; /*'D'; */ | |
| break; | |
| default: | |
| retval = 48 + j->dtmfbuffer[j->dtmf_rp]; | |
| break; | |
| } | |
| j->dtmf_rp++; | |
| if (j->dtmf_rp == 79) | |
| j->dtmf_rp = 0; | |
| if(j->dtmf_rp == j->dtmf_wp) | |
| { | |
| j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; | |
| } | |
| } | |
| } | |
| break; | |
| case PHONE_DTMF_OOB: | |
| j->flags.dtmf_oob = arg; | |
| break; | |
| case PHONE_DIALTONE: | |
| ixj_dialtone(j); | |
| break; | |
| case PHONE_BUSY: | |
| ixj_busytone(j); | |
| break; | |
| case PHONE_RINGBACK: | |
| ixj_ringback(j); | |
| break; | |
| case PHONE_WINK: | |
| if(j->cardtype == QTI_PHONEJACK) | |
| retval = -1; | |
| else | |
| retval = ixj_wink(j); | |
| break; | |
| case PHONE_CPT_STOP: | |
| ixj_cpt_stop(j); | |
| break; | |
| case PHONE_QUERY_CODEC: | |
| { | |
| struct phone_codec_data pd; | |
| int val; | |
| int proto_size[] = { | |
| -1, | |
| 12, 10, 16, 9, 8, 48, 5, | |
| 40, 40, 80, 40, 40, 6 | |
| }; | |
| if(copy_from_user(&pd, argp, sizeof(pd))) { | |
| retval = -EFAULT; | |
| break; | |
| } | |
| if(pd.type<1 || pd.type>13) { | |
| retval = -EPROTONOSUPPORT; | |
| break; | |
| } | |
| if(pd.type<G729) | |
| val=proto_size[pd.type]; | |
| else switch(j->baseframe.low) | |
| { | |
| case 0xA0:val=2*proto_size[pd.type];break; | |
| case 0x50:val=proto_size[pd.type];break; | |
| default:val=proto_size[pd.type]*3;break; | |
| } | |
| pd.buf_min=pd.buf_max=pd.buf_opt=val; | |
| if(copy_to_user(argp, &pd, sizeof(pd))) | |
| retval = -EFAULT; | |
| break; | |
| } | |
| case IXJCTL_DSP_IDLE: | |
| idle(j); | |
| break; | |
| case IXJCTL_MIXER: | |
| if ((arg & 0xff) == 0xff) | |
| retval = ixj_get_mixer(arg, j); | |
| else | |
| ixj_mixer(arg, j); | |
| break; | |
| case IXJCTL_DAA_COEFF_SET: | |
| switch (arg) { | |
| case DAA_US: | |
| DAA_Coeff_US(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| case DAA_UK: | |
| DAA_Coeff_UK(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| case DAA_FRANCE: | |
| DAA_Coeff_France(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| case DAA_GERMANY: | |
| DAA_Coeff_Germany(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| case DAA_AUSTRALIA: | |
| DAA_Coeff_Australia(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| case DAA_JAPAN: | |
| DAA_Coeff_Japan(j); | |
| retval = ixj_daa_write(j); | |
| break; | |
| default: | |
| retval = 1; | |
| break; | |
| } | |
| break; | |
| case IXJCTL_DAA_AGAIN: | |
| ixj_daa_cr4(j, arg | 0x02); | |
| break; | |
| case IXJCTL_PSTN_LINETEST: | |
| retval = ixj_linetest(j); | |
| break; | |
| case IXJCTL_VMWI: | |
| ixj_write_vmwi(j, arg); | |
| break; | |
| case IXJCTL_CID: | |
| if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID))) | |
| retval = -EFAULT; | |
| j->ex.bits.caller_id = 0; | |
| break; | |
| case IXJCTL_WINK_DURATION: | |
| j->winktime = arg; | |
| break; | |
| case IXJCTL_PORT: | |
| if (arg) | |
| retval = ixj_set_port(j, arg); | |
| else | |
| retval = j->port; | |
| break; | |
| case IXJCTL_POTS_PSTN: | |
| retval = ixj_set_pots(j, arg); | |
| break; | |
| case PHONE_CAPABILITIES: | |
| add_caps(j); | |
| retval = j->caps; | |
| break; | |
| case PHONE_CAPABILITIES_LIST: | |
| add_caps(j); | |
| if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps)) | |
| retval = -EFAULT; | |
| break; | |
| case PHONE_CAPABILITIES_CHECK: | |
| { | |
| struct phone_capability cap; | |
| if (copy_from_user(&cap, argp, sizeof(cap))) | |
| retval = -EFAULT; | |
| else { | |
| add_caps(j); | |
| retval = capabilities_check(j, &cap); | |
| } | |
| } | |
| break; | |
| case PHONE_PSTN_SET_STATE: | |
| daa_set_mode(j, arg); | |
| break; | |
| case PHONE_PSTN_GET_STATE: | |
| retval = j->daa_mode; | |
| j->ex.bits.pstn_ring = 0; | |
| break; | |
| case IXJCTL_SET_FILTER: | |
| if (copy_from_user(&jf, argp, sizeof(jf))) | |
| retval = -EFAULT; | |
| else | |
| retval = ixj_init_filter(j, &jf); | |
| break; | |
| case IXJCTL_SET_FILTER_RAW: | |
| if (copy_from_user(&jfr, argp, sizeof(jfr))) | |
| retval = -EFAULT; | |
| else | |
| retval = ixj_init_filter_raw(j, &jfr); | |
| break; | |
| case IXJCTL_GET_FILTER_HIST: | |
| if(arg<0||arg>3) | |
| retval = -EINVAL; | |
| else | |
| retval = j->filter_hist[arg]; | |
| break; | |
| case IXJCTL_INIT_TONE: | |
| if (copy_from_user(&ti, argp, sizeof(ti))) | |
| retval = -EFAULT; | |
| else | |
| retval = ixj_init_tone(j, &ti); | |
| break; | |
| case IXJCTL_TONE_CADENCE: | |
| retval = ixj_build_cadence(j, argp); | |
| break; | |
| case IXJCTL_FILTER_CADENCE: | |
| retval = ixj_build_filter_cadence(j, argp); | |
| break; | |
| case IXJCTL_SIGCTL: | |
| if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) { | |
| retval = -EFAULT; | |
| break; | |
| } | |
| j->ixj_signals[j->sigdef.event] = j->sigdef.signal; | |
| if(j->sigdef.event < 33) { | |
| raise = 1; | |
| for(mant = 0; mant < j->sigdef.event; mant++){ | |
| raise *= 2; | |
| } | |
| if(j->sigdef.signal) | |
| j->ex_sig.bytes |= raise; | |
| else | |
| j->ex_sig.bytes &= (raise^0xffff); | |
| } | |
| break; | |
| case IXJCTL_INTERCOM_STOP: | |
| if(arg < 0 || arg >= IXJMAX) | |
| return -EINVAL; | |
| j->intercom = -1; | |
| ixj_record_stop(j); | |
| ixj_play_stop(j); | |
| idle(j); | |
| get_ixj(arg)->intercom = -1; | |
| ixj_record_stop(get_ixj(arg)); | |
| ixj_play_stop(get_ixj(arg)); | |
| idle(get_ixj(arg)); | |
| break; | |
| case IXJCTL_INTERCOM_START: | |
| if(arg < 0 || arg >= IXJMAX) | |
| return -EINVAL; | |
| j->intercom = arg; | |
| ixj_record_start(j); | |
| ixj_play_start(j); | |
| get_ixj(arg)->intercom = board; | |
| ixj_play_start(get_ixj(arg)); | |
| ixj_record_start(get_ixj(arg)); | |
| break; | |
| } | |
| if (ixjdebug & 0x0040) | |
| printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); | |
| clear_bit(board, &j->busyflags); | |
| return retval; | |
| } | |
| static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg) | |
| { | |
| long ret; | |
| mutex_lock(&ixj_mutex); | |
| ret = do_ixj_ioctl(file_p, cmd, arg); | |
| mutex_unlock(&ixj_mutex); | |
| return ret; | |
| } | |
| static int ixj_fasync(int fd, struct file *file_p, int mode) | |
| { | |
| IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); | |
| return fasync_helper(fd, file_p, mode, &j->async_queue); | |
| } | |
| static const struct file_operations ixj_fops = | |
| { | |
| .owner = THIS_MODULE, | |
| .read = ixj_enhanced_read, | |
| .write = ixj_enhanced_write, | |
| .poll = ixj_poll, | |
| .unlocked_ioctl = ixj_ioctl, | |
| .release = ixj_release, | |
| .fasync = ixj_fasync, | |
| .llseek = default_llseek, | |
| }; | |
| static int ixj_linetest(IXJ *j) | |
| { | |
| j->flags.pstncheck = 1; /* Testing */ | |
| j->flags.pstn_present = 0; /* Assume the line is not there */ | |
| daa_int_read(j); /*Clear DAA Interrupt flags */ | |
| /* */ | |
| /* Hold all relays in the normally de-energized position. */ | |
| /* */ | |
| j->pld_slicw.bits.rly1 = 0; | |
| j->pld_slicw.bits.rly2 = 0; | |
| j->pld_slicw.bits.rly3 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); | |
| if (j->pld_slicr.bits.potspstn) { | |
| j->flags.pots_pstn = 1; | |
| j->flags.pots_correct = 0; | |
| LED_SetState(0x4, j); | |
| } else { | |
| j->flags.pots_pstn = 0; | |
| j->pld_slicw.bits.rly1 = 0; | |
| j->pld_slicw.bits.rly2 = 0; | |
| j->pld_slicw.bits.rly3 = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| daa_set_mode(j, SOP_PU_CONVERSATION); | |
| msleep(1000); | |
| daa_int_read(j); | |
| daa_set_mode(j, SOP_PU_RESET); | |
| if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { | |
| j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */ | |
| LED_SetState(0x4, j); | |
| j->pld_slicw.bits.rly3 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| } else { | |
| j->flags.pots_correct = 1; | |
| LED_SetState(0x8, j); | |
| j->pld_slicw.bits.rly1 = 1; | |
| j->pld_slicw.bits.rly2 = 0; | |
| j->pld_slicw.bits.rly3 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| } | |
| } | |
| j->pld_slicw.bits.rly3 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| daa_set_mode(j, SOP_PU_CONVERSATION); | |
| msleep(1000); | |
| daa_int_read(j); | |
| daa_set_mode(j, SOP_PU_RESET); | |
| if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { | |
| j->pstn_sleeptil = jiffies + (hertz / 4); | |
| j->flags.pstn_present = 1; | |
| } else { | |
| j->flags.pstn_present = 0; | |
| } | |
| if (j->flags.pstn_present) { | |
| if (j->flags.pots_correct) { | |
| LED_SetState(0xA, j); | |
| } else { | |
| LED_SetState(0x6, j); | |
| } | |
| } else { | |
| if (j->flags.pots_correct) { | |
| LED_SetState(0x9, j); | |
| } else { | |
| LED_SetState(0x5, j); | |
| } | |
| } | |
| j->flags.pstncheck = 0; /* Testing */ | |
| return j->flags.pstn_present; | |
| } | |
| static int ixj_selfprobe(IXJ *j) | |
| { | |
| unsigned short cmd; | |
| int cnt; | |
| BYTES bytes; | |
| init_waitqueue_head(&j->poll_q); | |
| init_waitqueue_head(&j->read_q); | |
| init_waitqueue_head(&j->write_q); | |
| while(atomic_read(&j->DSPWrite) > 0) | |
| atomic_dec(&j->DSPWrite); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Write IDLE to Software Control Register\n"); | |
| ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ | |
| if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */ | |
| return -1; | |
| /* The read values of the SSR should be 0x00 for the IDLE command */ | |
| if (j->ssr.low || j->ssr.high) | |
| return -1; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Get Device ID Code\n"); | |
| if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */ | |
| return -1; | |
| j->dsp.low = j->ssr.low; | |
| j->dsp.high = j->ssr.high; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Get Device Version Code\n"); | |
| if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */ | |
| return -1; | |
| j->ver.low = j->ssr.low; | |
| j->ver.high = j->ssr.high; | |
| if (!j->cardtype) { | |
| if (j->dsp.low == 0x21) { | |
| bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02); | |
| outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02); | |
| /* Test for Internet LineJACK or Internet PhoneJACK Lite */ | |
| bytes.low = inb_p(j->XILINXbase + 0x02); | |
| if (bytes.low == bytes.high) /* Register is read only on */ | |
| /* Internet PhoneJack Lite */ | |
| { | |
| j->cardtype = QTI_PHONEJACK_LITE; | |
| if (!request_region(j->XILINXbase, 4, "ixj control")) { | |
| printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | |
| return -1; | |
| } | |
| j->pld_slicw.pcib.e1 = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase); | |
| } else { | |
| j->cardtype = QTI_LINEJACK; | |
| if (!request_region(j->XILINXbase, 8, "ixj control")) { | |
| printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | |
| return -1; | |
| } | |
| } | |
| } else if (j->dsp.low == 0x22) { | |
| j->cardtype = QTI_PHONEJACK_PCI; | |
| request_region(j->XILINXbase, 4, "ixj control"); | |
| j->pld_slicw.pcib.e1 = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase); | |
| } else | |
| j->cardtype = QTI_PHONEJACK; | |
| } else { | |
| switch (j->cardtype) { | |
| case QTI_PHONEJACK: | |
| if (!j->dsp.low != 0x20) { | |
| j->dsp.high = 0x80; | |
| j->dsp.low = 0x20; | |
| ixj_WriteDSPCommand(0x3800, j); | |
| j->ver.low = j->ssr.low; | |
| j->ver.high = j->ssr.high; | |
| } | |
| break; | |
| case QTI_LINEJACK: | |
| if (!request_region(j->XILINXbase, 8, "ixj control")) { | |
| printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | |
| return -1; | |
| } | |
| break; | |
| case QTI_PHONEJACK_LITE: | |
| case QTI_PHONEJACK_PCI: | |
| if (!request_region(j->XILINXbase, 4, "ixj control")) { | |
| printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | |
| return -1; | |
| } | |
| j->pld_slicw.pcib.e1 = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase); | |
| break; | |
| case QTI_PHONECARD: | |
| break; | |
| } | |
| } | |
| if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Write CODEC config to Software Control Register\n"); | |
| if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */ | |
| return -1; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Write CODEC timing to Software Control Register\n"); | |
| if (j->cardtype == QTI_PHONEJACK) { | |
| cmd = 0x9FF2; | |
| } else { | |
| cmd = 0x9FF5; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */ | |
| return -1; | |
| } else { | |
| if (set_base_frame(j, 30) != 30) | |
| return -1; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Write CODEC config to Software Control Register\n"); | |
| if (j->cardtype == QTI_PHONECARD) { | |
| if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ | |
| return -1; | |
| } | |
| if (j->cardtype == QTI_LINEJACK) { | |
| if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ | |
| return -1; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n"); | |
| j->pld_clock.byte = 0; | |
| outb_p(j->pld_clock.byte, j->XILINXbase + 0x04); | |
| } | |
| } | |
| if (j->dsp.low == 0x20) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Configure GPIO pins\n"); | |
| j->gpio.bytes.high = 0x09; | |
| /* bytes.low = 0xEF; 0xF7 */ | |
| j->gpio.bits.gpio1 = 1; | |
| j->gpio.bits.gpio2 = 1; | |
| j->gpio.bits.gpio3 = 0; | |
| j->gpio.bits.gpio4 = 1; | |
| j->gpio.bits.gpio5 = 1; | |
| j->gpio.bits.gpio6 = 1; | |
| j->gpio.bits.gpio7 = 1; | |
| ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */ | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Enable SLIC\n"); | |
| j->gpio.bytes.high = 0x0B; | |
| j->gpio.bytes.low = 0x00; | |
| j->gpio.bits.gpio1 = 0; | |
| j->gpio.bits.gpio2 = 1; | |
| j->gpio.bits.gpio5 = 0; | |
| ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */ | |
| j->port = PORT_POTS; | |
| } else { | |
| if (j->cardtype == QTI_LINEJACK) { | |
| LED_SetState(0x1, j); | |
| msleep(100); | |
| LED_SetState(0x2, j); | |
| msleep(100); | |
| LED_SetState(0x4, j); | |
| msleep(100); | |
| LED_SetState(0x8, j); | |
| msleep(100); | |
| LED_SetState(0x0, j); | |
| daa_get_version(j); | |
| if (ixjdebug & 0x0002) | |
| printk("Loading DAA Coefficients\n"); | |
| DAA_Coeff_US(j); | |
| if (!ixj_daa_write(j)) { | |
| printk("DAA write failed on board %d\n", j->board); | |
| return -1; | |
| } | |
| if(!ixj_daa_cid_reset(j)) { | |
| printk("DAA CID reset failed on board %d\n", j->board); | |
| return -1; | |
| } | |
| j->flags.pots_correct = 0; | |
| j->flags.pstn_present = 0; | |
| ixj_linetest(j); | |
| if (j->flags.pots_correct) { | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly1 = 1; | |
| j->pld_slicw.bits.spken = 1; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | |
| /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | |
| j->port = PORT_POTS; | |
| } | |
| ixj_set_port(j, PORT_PSTN); | |
| ixj_set_pots(j, 1); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Enable Mixer\n"); | |
| ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */ | |
| ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */ | |
| ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */ | |
| ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */ | |
| ixj_mixer(0x0480, j); /*FM Left mute */ | |
| ixj_mixer(0x0580, j); /*FM Right mute */ | |
| ixj_mixer(0x0680, j); /*CD Left mute */ | |
| ixj_mixer(0x0780, j); /*CD Right mute */ | |
| ixj_mixer(0x0880, j); /*Line Left mute */ | |
| ixj_mixer(0x0980, j); /*Line Right mute */ | |
| ixj_mixer(0x0A80, j); /*Aux left mute */ | |
| ixj_mixer(0x0B80, j); /*Aux right mute */ | |
| ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */ | |
| ixj_mixer(0x0D80, j); /*Mono2 mute */ | |
| ixj_mixer(0x0E80, j); /*Mic mute */ | |
| ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */ | |
| ixj_mixer(0x1000, j); /*Voice Left and Right out only */ | |
| ixj_mixer(0x110C, j); | |
| ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */ | |
| ixj_mixer(0x1401, j); | |
| ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */ | |
| ixj_mixer(0x1501, j); | |
| ixj_mixer(0x1700, j); /*Clock select */ | |
| ixj_mixer(0x1800, j); /*ADC input from mixer */ | |
| ixj_mixer(0x1901, j); /*Mic gain 30db */ | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Setting Default US Ring Cadence Detection\n"); | |
| j->cadence_f[4].state = 0; | |
| j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */ | |
| j->cadence_f[4].off1 = 0; | |
| j->cadence_f[4].on2 = 0; | |
| j->cadence_f[4].off2 = 0; | |
| j->cadence_f[4].on3 = 0; | |
| j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */ | |
| j->pstn_last_rmr = jiffies; | |
| } else { | |
| if (j->cardtype == QTI_PHONECARD) { | |
| ixj_WriteDSPCommand(0xCF07, j); | |
| ixj_WriteDSPCommand(0x00B0, j); | |
| ixj_set_port(j, PORT_SPEAKER); | |
| } else { | |
| ixj_set_port(j, PORT_POTS); | |
| SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | |
| /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | |
| } | |
| } | |
| } | |
| j->intercom = -1; | |
| j->framesread = j->frameswritten = 0; | |
| j->read_wait = j->write_wait = 0; | |
| j->rxreadycheck = j->txreadycheck = 0; | |
| /* initialise the DTMF prescale to a sensible value */ | |
| if (j->cardtype == QTI_LINEJACK) { | |
| set_dtmf_prescale(j, 0x10); | |
| } else { | |
| set_dtmf_prescale(j, 0x40); | |
| } | |
| set_play_volume(j, 0x100); | |
| set_rec_volume(j, 0x100); | |
| if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */ | |
| return -1; | |
| /* The read values of the SSR should be 0x00 for the IDLE command */ | |
| if (j->ssr.low || j->ssr.high) | |
| return -1; | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Enable Line Monitor\n"); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n"); | |
| if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */ | |
| return -1; | |
| if (ixjdebug & 0x002) | |
| printk(KERN_INFO "Enable DTMF Detectors\n"); | |
| if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */ | |
| return -1; | |
| if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */ | |
| return -1; | |
| set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */ | |
| set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */ | |
| j->ex.bits.dtmf_ready = 0; | |
| j->dtmf_state = 0; | |
| j->dtmf_wp = j->dtmf_rp = 0; | |
| j->rec_mode = j->play_mode = -1; | |
| j->flags.ringing = 0; | |
| j->maxrings = MAXRINGS; | |
| j->ring_cadence = USA_RING_CADENCE; | |
| j->drybuffer = 0; | |
| j->winktime = 320; | |
| j->flags.dtmf_oob = 0; | |
| for (cnt = 0; cnt < 4; cnt++) | |
| j->cadence_f[cnt].enable = 0; | |
| /* must be a device on the specified address */ | |
| ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */ | |
| /* Set up the default signals for events */ | |
| for (cnt = 0; cnt < 35; cnt++) | |
| j->ixj_signals[cnt] = SIGIO; | |
| /* Set the excetion signal enable flags */ | |
| j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = | |
| j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = | |
| j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; | |
| #ifdef IXJ_DYN_ALLOC | |
| j->fskdata = NULL; | |
| #endif | |
| j->fskdcnt = 0; | |
| j->cidcw_wait = 0; | |
| /* Register with the Telephony for Linux subsystem */ | |
| j->p.f_op = &ixj_fops; | |
| j->p.open = ixj_open; | |
| j->p.board = j->board; | |
| phone_register_device(&j->p, PHONE_UNIT_ANY); | |
| ixj_init_timer(j); | |
| ixj_add_timer(j); | |
| return 0; | |
| } | |
| /* | |
| * Exported service for pcmcia card handling | |
| */ | |
| IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx) | |
| { | |
| IXJ *j = ixj_alloc(); | |
| j->board = 0; | |
| j->DSPbase = dsp; | |
| j->XILINXbase = xilinx; | |
| j->cardtype = QTI_PHONECARD; | |
| ixj_selfprobe(j); | |
| return j; | |
| } | |
| EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */ | |
| static int ixj_get_status_proc(char *buf) | |
| { | |
| int len; | |
| int cnt; | |
| IXJ *j; | |
| len = 0; | |
| len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER); | |
| len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ)); | |
| len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS)); | |
| len += sprintf(buf + len, "\nUsing old telephony API"); | |
| len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug); | |
| for (cnt = 0; cnt < IXJMAX; cnt++) { | |
| j = get_ixj(cnt); | |
| if(j==NULL) | |
| continue; | |
| if (j->DSPbase) { | |
| len += sprintf(buf + len, "\nCard Num %d", cnt); | |
| len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase); | |
| if (j->cardtype != QTI_PHONEJACK) | |
| len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase); | |
| len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low); | |
| len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low); | |
| len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial); | |
| switch (j->cardtype) { | |
| case (QTI_PHONEJACK): | |
| len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK"); | |
| break; | |
| case (QTI_LINEJACK): | |
| len += sprintf(buf + len, "\nCard Type = Internet LineJACK"); | |
| if (j->flags.g729_loaded) | |
| len += sprintf(buf + len, " w/G.729 A/B"); | |
| len += sprintf(buf + len, " Country = %d", j->daa_country); | |
| break; | |
| case (QTI_PHONEJACK_LITE): | |
| len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite"); | |
| if (j->flags.g729_loaded) | |
| len += sprintf(buf + len, " w/G.729 A/B"); | |
| break; | |
| case (QTI_PHONEJACK_PCI): | |
| len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI"); | |
| if (j->flags.g729_loaded) | |
| len += sprintf(buf + len, " w/G.729 A/B"); | |
| break; | |
| case (QTI_PHONECARD): | |
| len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD"); | |
| if (j->flags.g729_loaded) | |
| len += sprintf(buf + len, " w/G.729 A/B"); | |
| len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : ""); | |
| if (!j->pccr1.bits.drf) | |
| len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct); | |
| len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate); | |
| break; | |
| default: | |
| len += sprintf(buf + len, "\nCard Type = %d", j->cardtype); | |
| break; | |
| } | |
| len += sprintf(buf + len, "\nReaders %d", j->readers); | |
| len += sprintf(buf + len, "\nWriters %d", j->writers); | |
| add_caps(j); | |
| len += sprintf(buf + len, "\nCapabilities %d", j->caps); | |
| if (j->dsp.low != 0x20) | |
| len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load); | |
| if (j->flags.cidsent) | |
| len += sprintf(buf + len, "\nCaller ID data sent"); | |
| else | |
| len += sprintf(buf + len, "\nCaller ID data not sent"); | |
| len += sprintf(buf + len, "\nPlay CODEC "); | |
| switch (j->play_codec) { | |
| case G723_63: | |
| len += sprintf(buf + len, "G.723.1 6.3"); | |
| break; | |
| case G723_53: | |
| len += sprintf(buf + len, "G.723.1 5.3"); | |
| break; | |
| case TS85: | |
| len += sprintf(buf + len, "TrueSpeech 8.5"); | |
| break; | |
| case TS48: | |
| len += sprintf(buf + len, "TrueSpeech 4.8"); | |
| break; | |
| case TS41: | |
| len += sprintf(buf + len, "TrueSpeech 4.1"); | |
| break; | |
| case G728: | |
| len += sprintf(buf + len, "G.728"); | |
| break; | |
| case G729: | |
| len += sprintf(buf + len, "G.729"); | |
| break; | |
| case G729B: | |
| len += sprintf(buf + len, "G.729B"); | |
| break; | |
| case ULAW: | |
| len += sprintf(buf + len, "uLaw"); | |
| break; | |
| case ALAW: | |
| len += sprintf(buf + len, "aLaw"); | |
| break; | |
| case LINEAR16: | |
| len += sprintf(buf + len, "16 bit Linear"); | |
| break; | |
| case LINEAR8: | |
| len += sprintf(buf + len, "8 bit Linear"); | |
| break; | |
| case WSS: | |
| len += sprintf(buf + len, "Windows Sound System"); | |
| break; | |
| default: | |
| len += sprintf(buf + len, "NO CODEC CHOSEN"); | |
| break; | |
| } | |
| len += sprintf(buf + len, "\nRecord CODEC "); | |
| switch (j->rec_codec) { | |
| case G723_63: | |
| len += sprintf(buf + len, "G.723.1 6.3"); | |
| break; | |
| case G723_53: | |
| len += sprintf(buf + len, "G.723.1 5.3"); | |
| break; | |
| case TS85: | |
| len += sprintf(buf + len, "TrueSpeech 8.5"); | |
| break; | |
| case TS48: | |
| len += sprintf(buf + len, "TrueSpeech 4.8"); | |
| break; | |
| case TS41: | |
| len += sprintf(buf + len, "TrueSpeech 4.1"); | |
| break; | |
| case G728: | |
| len += sprintf(buf + len, "G.728"); | |
| break; | |
| case G729: | |
| len += sprintf(buf + len, "G.729"); | |
| break; | |
| case G729B: | |
| len += sprintf(buf + len, "G.729B"); | |
| break; | |
| case ULAW: | |
| len += sprintf(buf + len, "uLaw"); | |
| break; | |
| case ALAW: | |
| len += sprintf(buf + len, "aLaw"); | |
| break; | |
| case LINEAR16: | |
| len += sprintf(buf + len, "16 bit Linear"); | |
| break; | |
| case LINEAR8: | |
| len += sprintf(buf + len, "8 bit Linear"); | |
| break; | |
| case WSS: | |
| len += sprintf(buf + len, "Windows Sound System"); | |
| break; | |
| default: | |
| len += sprintf(buf + len, "NO CODEC CHOSEN"); | |
| break; | |
| } | |
| len += sprintf(buf + len, "\nAEC "); | |
| switch (j->aec_level) { | |
| case AEC_OFF: | |
| len += sprintf(buf + len, "Off"); | |
| break; | |
| case AEC_LOW: | |
| len += sprintf(buf + len, "Low"); | |
| break; | |
| case AEC_MED: | |
| len += sprintf(buf + len, "Med"); | |
| break; | |
| case AEC_HIGH: | |
| len += sprintf(buf + len, "High"); | |
| break; | |
| case AEC_AUTO: | |
| len += sprintf(buf + len, "Auto"); | |
| break; | |
| case AEC_AGC: | |
| len += sprintf(buf + len, "AEC/AGC"); | |
| break; | |
| default: | |
| len += sprintf(buf + len, "unknown(%i)", j->aec_level); | |
| break; | |
| } | |
| len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j)); | |
| len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j)); | |
| len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j)); | |
| len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */ | |
| if (j->cardtype == QTI_LINEJACK) { | |
| len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct); | |
| len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present); | |
| len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck); | |
| len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn); | |
| switch (j->daa_mode) { | |
| case SOP_PU_SLEEP: | |
| len += sprintf(buf + len, "\nDAA PSTN On Hook"); | |
| break; | |
| case SOP_PU_RINGING: | |
| len += sprintf(buf + len, "\nDAA PSTN Ringing"); | |
| len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state); | |
| break; | |
| case SOP_PU_CONVERSATION: | |
| len += sprintf(buf + len, "\nDAA PSTN Off Hook"); | |
| break; | |
| case SOP_PU_PULSEDIALING: | |
| len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing"); | |
| break; | |
| } | |
| len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR); | |
| len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK); | |
| len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg); | |
| len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg); | |
| len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg); | |
| len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg); | |
| len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg); | |
| len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg); | |
| len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg); | |
| len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies); | |
| } | |
| switch (j->port) { | |
| case PORT_POTS: | |
| len += sprintf(buf + len, "\nPort POTS"); | |
| break; | |
| case PORT_PSTN: | |
| len += sprintf(buf + len, "\nPort PSTN"); | |
| break; | |
| case PORT_SPEAKER: | |
| len += sprintf(buf + len, "\nPort SPEAKER/MIC"); | |
| break; | |
| case PORT_HANDSET: | |
| len += sprintf(buf + len, "\nPort HANDSET"); | |
| break; | |
| } | |
| if (j->dsp.low == 0x21 || j->dsp.low == 0x22) { | |
| len += sprintf(buf + len, "\nSLIC state "); | |
| switch (SLIC_GetState(j)) { | |
| case PLD_SLIC_STATE_OC: | |
| len += sprintf(buf + len, "OC"); | |
| break; | |
| case PLD_SLIC_STATE_RINGING: | |
| len += sprintf(buf + len, "RINGING"); | |
| break; | |
| case PLD_SLIC_STATE_ACTIVE: | |
| len += sprintf(buf + len, "ACTIVE"); | |
| break; | |
| case PLD_SLIC_STATE_OHT: /* On-hook transmit */ | |
| len += sprintf(buf + len, "OHT"); | |
| break; | |
| case PLD_SLIC_STATE_TIPOPEN: | |
| len += sprintf(buf + len, "TIPOPEN"); | |
| break; | |
| case PLD_SLIC_STATE_STANDBY: | |
| len += sprintf(buf + len, "STANDBY"); | |
| break; | |
| case PLD_SLIC_STATE_APR: /* Active polarity reversal */ | |
| len += sprintf(buf + len, "APR"); | |
| break; | |
| case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ | |
| len += sprintf(buf + len, "OHTPR"); | |
| break; | |
| default: | |
| len += sprintf(buf + len, "%d", SLIC_GetState(j)); | |
| break; | |
| } | |
| } | |
| len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low); | |
| len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size); | |
| #ifdef PERFMON_STATS | |
| len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks); | |
| len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck); | |
| len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck); | |
| len += sprintf(buf + len, "\nFrames Read %ld", j->framesread); | |
| len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten); | |
| len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer); | |
| len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait); | |
| len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait); | |
| len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait); | |
| len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail); | |
| len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait); | |
| len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail); | |
| len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready); | |
| len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail); | |
| #endif | |
| len += sprintf(buf + len, "\n"); | |
| } | |
| } | |
| return len; | |
| } | |
| static int ixj_read_proc(char *page, char **start, off_t off, | |
| int count, int *eof, void *data) | |
| { | |
| int len = ixj_get_status_proc(page); | |
| if (len <= off+count) *eof = 1; | |
| *start = page + off; | |
| len -= off; | |
| if (len>count) len = count; | |
| if (len<0) len = 0; | |
| return len; | |
| } | |
| static void cleanup(void) | |
| { | |
| int cnt; | |
| IXJ *j; | |
| for (cnt = 0; cnt < IXJMAX; cnt++) { | |
| j = get_ixj(cnt); | |
| if(j != NULL && j->DSPbase) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt); | |
| del_timer(&j->timer); | |
| if (j->cardtype == QTI_LINEJACK) { | |
| j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ | |
| outb_p(j->pld_scrw.byte, j->XILINXbase); | |
| j->pld_slicw.bits.rly1 = 0; | |
| j->pld_slicw.bits.rly2 = 0; | |
| j->pld_slicw.bits.rly3 = 0; | |
| outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | |
| LED_SetState(0x0, j); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); | |
| release_region(j->XILINXbase, 8); | |
| } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); | |
| release_region(j->XILINXbase, 4); | |
| } | |
| kfree(j->read_buffer); | |
| kfree(j->write_buffer); | |
| if (j->dev) | |
| pnp_device_detach(j->dev); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt); | |
| phone_unregister_device(&j->p); | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt); | |
| release_region(j->DSPbase, 16); | |
| #ifdef IXJ_DYN_ALLOC | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt); | |
| kfree(j); | |
| ixj[cnt] = NULL; | |
| #endif | |
| } | |
| } | |
| if (ixjdebug & 0x0002) | |
| printk(KERN_INFO "IXJ: Removing /proc/ixj\n"); | |
| remove_proc_entry ("ixj", NULL); | |
| } | |
| /* Typedefs */ | |
| typedef struct { | |
| BYTE length; | |
| DWORD bits; | |
| } DATABLOCK; | |
| static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData) | |
| { | |
| lastLCC = lastLCC & 0xfb; | |
| lastLCC = lastLCC | (byData ? 4 : 0); | |
| outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */ | |
| mdelay(1); | |
| lastLCC = lastLCC | 0x01; | |
| outb(lastLCC, wEEPROMAddress); /*SK rising edge */ | |
| byData = byData << 1; | |
| lastLCC = lastLCC & 0xfe; | |
| mdelay(1); | |
| outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */ | |
| } | |
| static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC) | |
| { | |
| mdelay(1); | |
| lastLCC = lastLCC | 0x01; | |
| outb(lastLCC, wEEPROMAddress); /*SK rising edge */ | |
| lastLCC = lastLCC & 0xfe; | |
| mdelay(1); | |
| outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */ | |
| return ((inb(wEEPROMAddress) >> 3) & 1); | |
| } | |
| static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult) | |
| { | |
| BYTE lastLCC; | |
| WORD wEEPROMAddress = wAddress + 3; | |
| DWORD i; | |
| BYTE byResult; | |
| *pwResult = 0; | |
| lastLCC = inb(wEEPROMAddress); | |
| lastLCC = lastLCC | 0x02; | |
| lastLCC = lastLCC & 0xfe; | |
| outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */ | |
| mdelay(1); /* delay */ | |
| PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); | |
| PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); | |
| PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0); | |
| for (i = 0; i < 8; i++) { | |
| PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0); | |
| wLoc <<= 1; | |
| } | |
| for (i = 0; i < 16; i++) { | |
| byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC); | |
| *pwResult = (*pwResult << 1) | byResult; | |
| } | |
| mdelay(1); /* another delay */ | |
| lastLCC = lastLCC & 0xfd; | |
| outb(lastLCC, wEEPROMAddress); /* negate CS */ | |
| return 0; | |
| } | |
| static DWORD PCIEE_GetSerialNumber(WORD wAddress) | |
| { | |
| WORD wLo, wHi; | |
| if (PCIEE_ReadWord(wAddress, 62, &wLo)) | |
| return 0; | |
| if (PCIEE_ReadWord(wAddress, 63, &wHi)) | |
| return 0; | |
| return (((DWORD) wHi << 16) | wLo); | |
| } | |
| static int dspio[IXJMAX + 1] = | |
| { | |
| 0, | |
| }; | |
| static int xio[IXJMAX + 1] = | |
| { | |
| 0, | |
| }; | |
| module_param_array(dspio, int, NULL, 0); | |
| module_param_array(xio, int, NULL, 0); | |
| MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net"); | |
| MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>"); | |
| MODULE_LICENSE("GPL"); | |
| static void __exit ixj_exit(void) | |
| { | |
| cleanup(); | |
| } | |
| static IXJ *new_ixj(unsigned long port) | |
| { | |
| IXJ *res; | |
| if (!request_region(port, 16, "ixj DSP")) { | |
| printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port); | |
| return NULL; | |
| } | |
| res = ixj_alloc(); | |
| if (!res) { | |
| release_region(port, 16); | |
| printk(KERN_INFO "ixj: out of memory\n"); | |
| return NULL; | |
| } | |
| res->DSPbase = port; | |
| return res; | |
| } | |
| static int __init ixj_probe_isapnp(int *cnt) | |
| { | |
| int probe = 0; | |
| int func = 0x110; | |
| struct pnp_dev *dev = NULL, *old_dev = NULL; | |
| while (1) { | |
| do { | |
| IXJ *j; | |
| int result; | |
| old_dev = dev; | |
| dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'), | |
| ISAPNP_FUNCTION(func), old_dev); | |
| if (!dev || !dev->card) | |
| break; | |
| result = pnp_device_attach(dev); | |
| if (result < 0) { | |
| printk("pnp attach failed %d \n", result); | |
| break; | |
| } | |
| if (pnp_activate_dev(dev) < 0) { | |
| printk("pnp activate failed (out of resources?)\n"); | |
| pnp_device_detach(dev); | |
| return -ENOMEM; | |
| } | |
| if (!pnp_port_valid(dev, 0)) { | |
| pnp_device_detach(dev); | |
| return -ENODEV; | |
| } | |
| j = new_ixj(pnp_port_start(dev, 0)); | |
| if (!j) | |
| break; | |
| if (func != 0x110) | |
| j->XILINXbase = pnp_port_start(dev, 1); /* get real port */ | |
| switch (func) { | |
| case (0x110): | |
| j->cardtype = QTI_PHONEJACK; | |
| break; | |
| case (0x310): | |
| j->cardtype = QTI_LINEJACK; | |
| break; | |
| case (0x410): | |
| j->cardtype = QTI_PHONEJACK_LITE; | |
| break; | |
| } | |
| j->board = *cnt; | |
| probe = ixj_selfprobe(j); | |
| if(!probe) { | |
| j->serial = dev->card->serial; | |
| j->dev = dev; | |
| switch (func) { | |
| case 0x110: | |
| printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase); | |
| break; | |
| case 0x310: | |
| printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase); | |
| break; | |
| case 0x410: | |
| printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase); | |
| break; | |
| } | |
| } | |
| ++*cnt; | |
| } while (dev); | |
| if (func == 0x410) | |
| break; | |
| if (func == 0x310) | |
| func = 0x410; | |
| if (func == 0x110) | |
| func = 0x310; | |
| dev = NULL; | |
| } | |
| return probe; | |
| } | |
| static int __init ixj_probe_isa(int *cnt) | |
| { | |
| int i, probe; | |
| /* Use passed parameters for older kernels without PnP */ | |
| for (i = 0; i < IXJMAX; i++) { | |
| if (dspio[i]) { | |
| IXJ *j = new_ixj(dspio[i]); | |
| if (!j) | |
| break; | |
| j->XILINXbase = xio[i]; | |
| j->cardtype = 0; | |
| j->board = *cnt; | |
| probe = ixj_selfprobe(j); | |
| j->dev = NULL; | |
| ++*cnt; | |
| } | |
| } | |
| return 0; | |
| } | |
| static int __init ixj_probe_pci(int *cnt) | |
| { | |
| struct pci_dev *pci = NULL; | |
| int i, probe = 0; | |
| IXJ *j = NULL; | |
| for (i = 0; i < IXJMAX - *cnt; i++) { | |
| pci = pci_get_device(PCI_VENDOR_ID_QUICKNET, | |
| PCI_DEVICE_ID_QUICKNET_XJ, pci); | |
| if (!pci) | |
| break; | |
| if (pci_enable_device(pci)) | |
| break; | |
| j = new_ixj(pci_resource_start(pci, 0)); | |
| if (!j) | |
| break; | |
| j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2); | |
| j->XILINXbase = j->DSPbase + 0x10; | |
| j->cardtype = QTI_PHONEJACK_PCI; | |
| j->board = *cnt; | |
| probe = ixj_selfprobe(j); | |
| if (!probe) | |
| printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase); | |
| ++*cnt; | |
| } | |
| pci_dev_put(pci); | |
| return probe; | |
| } | |
| static int __init ixj_init(void) | |
| { | |
| int cnt = 0; | |
| int probe = 0; | |
| cnt = 0; | |
| /* These might be no-ops, see above. */ | |
| if ((probe = ixj_probe_isapnp(&cnt)) < 0) { | |
| return probe; | |
| } | |
| if ((probe = ixj_probe_isa(&cnt)) < 0) { | |
| return probe; | |
| } | |
| if ((probe = ixj_probe_pci(&cnt)) < 0) { | |
| return probe; | |
| } | |
| printk(KERN_INFO "ixj driver initialized.\n"); | |
| create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL); | |
| return probe; | |
| } | |
| module_init(ixj_init); | |
| module_exit(ixj_exit); | |
| static void DAA_Coeff_US(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_US; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): 16,55,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): 52,D3,11,42 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | |
| /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC; | |
| /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6; | |
| /* ; (10K, 0.68uF) */ | |
| /* */ | |
| /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):B2,45,0F,8E */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | |
| /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */ | |
| /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */ | |
| /* */ | |
| /* Levelmetering Ringing (0D):B2,45,0F,8E */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */ | |
| /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */ | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* */ | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C; | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */ | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):40 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ | |
| /* */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static void DAA_Coeff_UK(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_UK; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): 1B,A5,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): E2,27,10,D6 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | |
| /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4; | |
| /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32; | |
| /* ; idle */ | |
| /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FF */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):00 ; */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):36 ; */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):46 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static void DAA_Coeff_France(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_FRANCE; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): 16,B5,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): 52,C7,10,D6 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | |
| /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C; | |
| /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45; | |
| /* ; idle */ | |
| /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FF */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):00 ; */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):36 ; */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):46 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static void DAA_Coeff_Germany(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_GERMANY; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): 72,D5,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): 72,42,13,4B */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B; | |
| /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27; | |
| /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2; | |
| /* ; (10K, 0.68uF) */ | |
| /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):B2,45,0F,8E */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32; | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static void DAA_Coeff_Australia(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_AUSTRALIA; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): CB,45,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): 1B,67,10,D6 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | |
| /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC; | |
| /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46; | |
| /* ; idle */ | |
| /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FF */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):00 ; */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):2B ; */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B; | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):40 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static void DAA_Coeff_Japan(IXJ *j) | |
| { | |
| int i; | |
| j->daa_country = DAA_JAPAN; | |
| /*----------------------------------------------- */ | |
| /* CAO */ | |
| for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | |
| j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | |
| } | |
| /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | |
| /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | |
| /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | |
| /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; | |
| j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | |
| /* Bytes for AX-filter (0A): 51,C5,DD,CA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | |
| /* Bytes for AR-filter (09): 25,A7,10,D6 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | |
| j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | |
| /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | |
| /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28; | |
| /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA; | |
| /* ; idle */ | |
| /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | |
| /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | |
| /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | |
| j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | |
| /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | |
| /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | |
| j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | |
| /* ;CR Registers */ | |
| /* Config. Reg. 0 (filters) (cr0):FF */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | |
| /* Config. Reg. 1 (dialing) (cr1):05 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | |
| /* Config. Reg. 2 (caller ID) (cr2):04 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | |
| /* Config. Reg. 3 (testloops) (cr3):00 ; */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | |
| /* Config. Reg. 4 (analog gain) (cr4):02 */ | |
| j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | |
| /* Config. Reg. 5 (Version) (cr5):02 */ | |
| /* Config. Reg. 6 (Reserved) (cr6):00 */ | |
| /* Config. Reg. 7 (Reserved) (cr7):00 */ | |
| /* ;xr Registers */ | |
| /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ | |
| j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ | |
| /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ | |
| /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | |
| /* Ext. Reg. 3 (DC Char) (xr3):22 ; */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22; | |
| /* Ext. Reg. 4 (Cadence) (xr4):00 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | |
| /* Ext. Reg. 5 (Ring timer) (xr5):22 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | |
| /* Ext. Reg. 6 (Power State) (xr6):00 */ | |
| j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | |
| /* Ext. Reg. 7 (Vdd) (xr7):40 */ | |
| j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ | |
| /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ | |
| /* 12,33,5A,C3 ; 770 Hz */ | |
| /* 13,3C,5B,32 ; 852 Hz */ | |
| /* 1D,1B,5C,CC ; 941 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | |
| /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ | |
| /* EC,1D,52,22 ; 1336 Hz */ | |
| /* AA,AC,51,D2 ; 1477 Hz */ | |
| /* 9B,3B,51,25 ; 1633 Hz */ | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | |
| j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | |
| } | |
| static s16 tone_table[][19] = | |
| { | |
| { /* f20_50[] 11 */ | |
| 32538, /* A1 = 1.985962 */ | |
| -32325, /* A2 = -0.986511 */ | |
| -343, /* B2 = -0.010493 */ | |
| 0, /* B1 = 0 */ | |
| 343, /* B0 = 0.010493 */ | |
| 32619, /* A1 = 1.990906 */ | |
| -32520, /* A2 = -0.992462 */ | |
| 19179, /* B2 = 0.585327 */ | |
| -19178, /* B1 = -1.170593 */ | |
| 19179, /* B0 = 0.585327 */ | |
| 32723, /* A1 = 1.997314 */ | |
| -32686, /* A2 = -0.997528 */ | |
| 9973, /* B2 = 0.304352 */ | |
| -9955, /* B1 = -0.607605 */ | |
| 9973, /* B0 = 0.304352 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f133_200[] 12 */ | |
| 32072, /* A1 = 1.95752 */ | |
| -31896, /* A2 = -0.973419 */ | |
| -435, /* B2 = -0.013294 */ | |
| 0, /* B1 = 0 */ | |
| 435, /* B0 = 0.013294 */ | |
| 32188, /* A1 = 1.9646 */ | |
| -32400, /* A2 = -0.98877 */ | |
| 15139, /* B2 = 0.462036 */ | |
| -14882, /* B1 = -0.908356 */ | |
| 15139, /* B0 = 0.462036 */ | |
| 32473, /* A1 = 1.981995 */ | |
| -32524, /* A2 = -0.992584 */ | |
| 23200, /* B2 = 0.708008 */ | |
| -23113, /* B1 = -1.410706 */ | |
| 23200, /* B0 = 0.708008 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f300 13 */ | |
| 31769, /* A1 = -1.939026 */ | |
| -32584, /* A2 = 0.994385 */ | |
| -475, /* B2 = -0.014522 */ | |
| 0, /* B1 = 0.000000 */ | |
| 475, /* B0 = 0.014522 */ | |
| 31789, /* A1 = -1.940247 */ | |
| -32679, /* A2 = 0.997284 */ | |
| 17280, /* B2 = 0.527344 */ | |
| -16865, /* B1 = -1.029358 */ | |
| 17280, /* B0 = 0.527344 */ | |
| 31841, /* A1 = -1.943481 */ | |
| -32681, /* A2 = 0.997345 */ | |
| 543, /* B2 = 0.016579 */ | |
| -525, /* B1 = -0.032097 */ | |
| 543, /* B0 = 0.016579 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f300_420[] 14 */ | |
| 30750, /* A1 = 1.876892 */ | |
| -31212, /* A2 = -0.952515 */ | |
| -804, /* B2 = -0.024541 */ | |
| 0, /* B1 = 0 */ | |
| 804, /* B0 = 0.024541 */ | |
| 30686, /* A1 = 1.872925 */ | |
| -32145, /* A2 = -0.980988 */ | |
| 14747, /* B2 = 0.450043 */ | |
| -13703, /* B1 = -0.836395 */ | |
| 14747, /* B0 = 0.450043 */ | |
| 31651, /* A1 = 1.931824 */ | |
| -32321, /* A2 = -0.986389 */ | |
| 24425, /* B2 = 0.745422 */ | |
| -23914, /* B1 = -1.459595 */ | |
| 24427, /* B0 = 0.745483 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f330 15 */ | |
| 31613, /* A1 = -1.929565 */ | |
| -32646, /* A2 = 0.996277 */ | |
| -185, /* B2 = -0.005657 */ | |
| 0, /* B1 = 0.000000 */ | |
| 185, /* B0 = 0.005657 */ | |
| 31620, /* A1 = -1.929932 */ | |
| -32713, /* A2 = 0.998352 */ | |
| 19253, /* B2 = 0.587585 */ | |
| -18566, /* B1 = -1.133179 */ | |
| 19253, /* B0 = 0.587585 */ | |
| 31674, /* A1 = -1.933228 */ | |
| -32715, /* A2 = 0.998413 */ | |
| 2575, /* B2 = 0.078590 */ | |
| -2495, /* B1 = -0.152283 */ | |
| 2575, /* B0 = 0.078590 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f300_425[] 16 */ | |
| 30741, /* A1 = 1.876282 */ | |
| -31475, /* A2 = -0.960541 */ | |
| -703, /* B2 = -0.021484 */ | |
| 0, /* B1 = 0 */ | |
| 703, /* B0 = 0.021484 */ | |
| 30688, /* A1 = 1.873047 */ | |
| -32248, /* A2 = -0.984161 */ | |
| 14542, /* B2 = 0.443787 */ | |
| -13523, /* B1 = -0.825439 */ | |
| 14542, /* B0 = 0.443817 */ | |
| 31494, /* A1 = 1.922302 */ | |
| -32366, /* A2 = -0.987762 */ | |
| 21577, /* B2 = 0.658508 */ | |
| -21013, /* B1 = -1.282532 */ | |
| 21577, /* B0 = 0.658508 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f330_440[] 17 */ | |
| 30627, /* A1 = 1.869324 */ | |
| -31338, /* A2 = -0.95636 */ | |
| -843, /* B2 = -0.025749 */ | |
| 0, /* B1 = 0 */ | |
| 843, /* B0 = 0.025749 */ | |
| 30550, /* A1 = 1.864685 */ | |
| -32221, /* A2 = -0.983337 */ | |
| 13594, /* B2 = 0.414886 */ | |
| -12589, /* B1 = -0.768402 */ | |
| 13594, /* B0 = 0.414886 */ | |
| 31488, /* A1 = 1.921936 */ | |
| -32358, /* A2 = -0.987518 */ | |
| 24684, /* B2 = 0.753296 */ | |
| -24029, /* B1 = -1.466614 */ | |
| 24684, /* B0 = 0.753296 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f340 18 */ | |
| 31546, /* A1 = -1.925476 */ | |
| -32646, /* A2 = 0.996277 */ | |
| -445, /* B2 = -0.013588 */ | |
| 0, /* B1 = 0.000000 */ | |
| 445, /* B0 = 0.013588 */ | |
| 31551, /* A1 = -1.925781 */ | |
| -32713, /* A2 = 0.998352 */ | |
| 23884, /* B2 = 0.728882 */ | |
| -22979, /* B1 = -1.402527 */ | |
| 23884, /* B0 = 0.728882 */ | |
| 31606, /* A1 = -1.929138 */ | |
| -32715, /* A2 = 0.998413 */ | |
| 863, /* B2 = 0.026367 */ | |
| -835, /* B1 = -0.050985 */ | |
| 863, /* B0 = 0.026367 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f350_400[] 19 */ | |
| 31006, /* A1 = 1.892517 */ | |
| -32029, /* A2 = -0.977448 */ | |
| -461, /* B2 = -0.014096 */ | |
| 0, /* B1 = 0 */ | |
| 461, /* B0 = 0.014096 */ | |
| 30999, /* A1 = 1.892029 */ | |
| -32487, /* A2 = -0.991455 */ | |
| 11325, /* B2 = 0.345612 */ | |
| -10682, /* B1 = -0.651978 */ | |
| 11325, /* B0 = 0.345612 */ | |
| 31441, /* A1 = 1.919067 */ | |
| -32526, /* A2 = -0.992615 */ | |
| 24324, /* B2 = 0.74231 */ | |
| -23535, /* B1 = -1.436523 */ | |
| 24324, /* B0 = 0.74231 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f350_440[] */ | |
| 30634, /* A1 = 1.869751 */ | |
| -31533, /* A2 = -0.962341 */ | |
| -680, /* B2 = -0.020782 */ | |
| 0, /* B1 = 0 */ | |
| 680, /* B0 = 0.020782 */ | |
| 30571, /* A1 = 1.865906 */ | |
| -32277, /* A2 = -0.985016 */ | |
| 12894, /* B2 = 0.393524 */ | |
| -11945, /* B1 = -0.729065 */ | |
| 12894, /* B0 = 0.393524 */ | |
| 31367, /* A1 = 1.91449 */ | |
| -32379, /* A2 = -0.988129 */ | |
| 23820, /* B2 = 0.726929 */ | |
| -23104, /* B1 = -1.410217 */ | |
| 23820, /* B0 = 0.726929 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f350_450[] */ | |
| 30552, /* A1 = 1.864807 */ | |
| -31434, /* A2 = -0.95929 */ | |
| -690, /* B2 = -0.021066 */ | |
| 0, /* B1 = 0 */ | |
| 690, /* B0 = 0.021066 */ | |
| 30472, /* A1 = 1.859924 */ | |
| -32248, /* A2 = -0.984161 */ | |
| 13385, /* B2 = 0.408478 */ | |
| -12357, /* B1 = -0.754242 */ | |
| 13385, /* B0 = 0.408478 */ | |
| 31358, /* A1 = 1.914001 */ | |
| -32366, /* A2 = -0.987732 */ | |
| 26488, /* B2 = 0.80835 */ | |
| -25692, /* B1 = -1.568176 */ | |
| 26490, /* B0 = 0.808411 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f360 */ | |
| 31397, /* A1 = -1.916321 */ | |
| -32623, /* A2 = 0.995605 */ | |
| -117, /* B2 = -0.003598 */ | |
| 0, /* B1 = 0.000000 */ | |
| 117, /* B0 = 0.003598 */ | |
| 31403, /* A1 = -1.916687 */ | |
| -32700, /* A2 = 0.997925 */ | |
| 3388, /* B2 = 0.103401 */ | |
| -3240, /* B1 = -0.197784 */ | |
| 3388, /* B0 = 0.103401 */ | |
| 31463, /* A1 = -1.920410 */ | |
| -32702, /* A2 = 0.997986 */ | |
| 13346, /* B2 = 0.407288 */ | |
| -12863, /* B1 = -0.785126 */ | |
| 13346, /* B0 = 0.407288 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f380_420[] */ | |
| 30831, /* A1 = 1.881775 */ | |
| -32064, /* A2 = -0.978546 */ | |
| -367, /* B2 = -0.01122 */ | |
| 0, /* B1 = 0 */ | |
| 367, /* B0 = 0.01122 */ | |
| 30813, /* A1 = 1.880737 */ | |
| -32456, /* A2 = -0.990509 */ | |
| 11068, /* B2 = 0.337769 */ | |
| -10338, /* B1 = -0.631042 */ | |
| 11068, /* B0 = 0.337769 */ | |
| 31214, /* A1 = 1.905212 */ | |
| -32491, /* A2 = -0.991577 */ | |
| 16374, /* B2 = 0.499695 */ | |
| -15781, /* B1 = -0.963196 */ | |
| 16374, /* B0 = 0.499695 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f392 */ | |
| 31152, /* A1 = -1.901428 */ | |
| -32613, /* A2 = 0.995300 */ | |
| -314, /* B2 = -0.009605 */ | |
| 0, /* B1 = 0.000000 */ | |
| 314, /* B0 = 0.009605 */ | |
| 31156, /* A1 = -1.901672 */ | |
| -32694, /* A2 = 0.997742 */ | |
| 28847, /* B2 = 0.880371 */ | |
| -2734, /* B1 = -0.166901 */ | |
| 28847, /* B0 = 0.880371 */ | |
| 31225, /* A1 = -1.905823 */ | |
| -32696, /* A2 = 0.997803 */ | |
| 462, /* B2 = 0.014108 */ | |
| -442, /* B1 = -0.027019 */ | |
| 462, /* B0 = 0.014108 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f400_425[] */ | |
| 30836, /* A1 = 1.882141 */ | |
| -32296, /* A2 = -0.985596 */ | |
| -324, /* B2 = -0.009903 */ | |
| 0, /* B1 = 0 */ | |
| 324, /* B0 = 0.009903 */ | |
| 30825, /* A1 = 1.881409 */ | |
| -32570, /* A2 = -0.993958 */ | |
| 16847, /* B2 = 0.51416 */ | |
| -15792, /* B1 = -0.963898 */ | |
| 16847, /* B0 = 0.51416 */ | |
| 31106, /* A1 = 1.89856 */ | |
| -32584, /* A2 = -0.994415 */ | |
| 9579, /* B2 = 0.292328 */ | |
| -9164, /* B1 = -0.559357 */ | |
| 9579, /* B0 = 0.292328 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f400_440[] */ | |
| 30702, /* A1 = 1.873962 */ | |
| -32134, /* A2 = -0.980682 */ | |
| -517, /* B2 = -0.015793 */ | |
| 0, /* B1 = 0 */ | |
| 517, /* B0 = 0.015793 */ | |
| 30676, /* A1 = 1.872375 */ | |
| -32520, /* A2 = -0.992462 */ | |
| 8144, /* B2 = 0.24855 */ | |
| -7596, /* B1 = -0.463684 */ | |
| 8144, /* B0 = 0.24855 */ | |
| 31084, /* A1 = 1.897217 */ | |
| -32547, /* A2 = -0.993256 */ | |
| 22713, /* B2 = 0.693176 */ | |
| -21734, /* B1 = -1.326599 */ | |
| 22713, /* B0 = 0.693176 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f400_450[] */ | |
| 30613, /* A1 = 1.86853 */ | |
| -32031, /* A2 = -0.977509 */ | |
| -618, /* B2 = -0.018866 */ | |
| 0, /* B1 = 0 */ | |
| 618, /* B0 = 0.018866 */ | |
| 30577, /* A1 = 1.866272 */ | |
| -32491, /* A2 = -0.991577 */ | |
| 9612, /* B2 = 0.293335 */ | |
| -8935, /* B1 = -0.54541 */ | |
| 9612, /* B0 = 0.293335 */ | |
| 31071, /* A1 = 1.896484 */ | |
| -32524, /* A2 = -0.992584 */ | |
| 21596, /* B2 = 0.659058 */ | |
| -20667, /* B1 = -1.261414 */ | |
| 21596, /* B0 = 0.659058 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f420 */ | |
| 30914, /* A1 = -1.886841 */ | |
| -32584, /* A2 = 0.994385 */ | |
| -426, /* B2 = -0.013020 */ | |
| 0, /* B1 = 0.000000 */ | |
| 426, /* B0 = 0.013020 */ | |
| 30914, /* A1 = -1.886841 */ | |
| -32679, /* A2 = 0.997314 */ | |
| 17520, /* B2 = 0.534668 */ | |
| -16471, /* B1 = -1.005310 */ | |
| 17520, /* B0 = 0.534668 */ | |
| 31004, /* A1 = -1.892334 */ | |
| -32683, /* A2 = 0.997406 */ | |
| 819, /* B2 = 0.025023 */ | |
| -780, /* B1 = -0.047619 */ | |
| 819, /* B0 = 0.025023 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| #if 0 | |
| { /* f425 */ | |
| 30881, /* A1 = -1.884827 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -496, /* B2 = -0.015144 */ | |
| 0, /* B1 = 0.000000 */ | |
| 496, /* B0 = 0.015144 */ | |
| 30880, /* A1 = -1.884766 */ | |
| -32692, /* A2 = 0.997711 */ | |
| 24767, /* B2 = 0.755859 */ | |
| -23290, /* B1 = -1.421509 */ | |
| 24767, /* B0 = 0.755859 */ | |
| 30967, /* A1 = -1.890076 */ | |
| -32694, /* A2 = 0.997772 */ | |
| 728, /* B2 = 0.022232 */ | |
| -691, /* B1 = -0.042194 */ | |
| 728, /* B0 = 0.022232 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| #else | |
| { | |
| 30850, | |
| -32534, | |
| -504, | |
| 0, | |
| 504, | |
| 30831, | |
| -32669, | |
| 24303, | |
| -22080, | |
| 24303, | |
| 30994, | |
| -32673, | |
| 1905, | |
| -1811, | |
| 1905, | |
| 5, | |
| 129, | |
| 17, | |
| 0xff5 | |
| }, | |
| #endif | |
| { /* f425_450[] */ | |
| 30646, /* A1 = 1.870544 */ | |
| -32327, /* A2 = -0.986572 */ | |
| -287, /* B2 = -0.008769 */ | |
| 0, /* B1 = 0 */ | |
| 287, /* B0 = 0.008769 */ | |
| 30627, /* A1 = 1.869324 */ | |
| -32607, /* A2 = -0.995087 */ | |
| 13269, /* B2 = 0.404968 */ | |
| -12376, /* B1 = -0.755432 */ | |
| 13269, /* B0 = 0.404968 */ | |
| 30924, /* A1 = 1.887512 */ | |
| -32619, /* A2 = -0.995453 */ | |
| 19950, /* B2 = 0.608826 */ | |
| -18940, /* B1 = -1.156006 */ | |
| 19950, /* B0 = 0.608826 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f425_475[] */ | |
| 30396, /* A1 = 1.855225 */ | |
| -32014, /* A2 = -0.97699 */ | |
| -395, /* B2 = -0.012055 */ | |
| 0, /* B1 = 0 */ | |
| 395, /* B0 = 0.012055 */ | |
| 30343, /* A1 = 1.85199 */ | |
| -32482, /* A2 = -0.991302 */ | |
| 17823, /* B2 = 0.543945 */ | |
| -16431, /* B1 = -1.002869 */ | |
| 17823, /* B0 = 0.543945 */ | |
| 30872, /* A1 = 1.884338 */ | |
| -32516, /* A2 = -0.99231 */ | |
| 18124, /* B2 = 0.553101 */ | |
| -17246, /* B1 = -1.052673 */ | |
| 18124, /* B0 = 0.553101 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f435 */ | |
| 30796, /* A1 = -1.879639 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -254, /* B2 = -0.007762 */ | |
| 0, /* B1 = 0.000000 */ | |
| 254, /* B0 = 0.007762 */ | |
| 30793, /* A1 = -1.879456 */ | |
| -32692, /* A2 = 0.997711 */ | |
| 18934, /* B2 = 0.577820 */ | |
| -17751, /* B1 = -1.083496 */ | |
| 18934, /* B0 = 0.577820 */ | |
| 30882, /* A1 = -1.884888 */ | |
| -32694, /* A2 = 0.997772 */ | |
| 1858, /* B2 = 0.056713 */ | |
| -1758, /* B1 = -0.107357 */ | |
| 1858, /* B0 = 0.056713 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f440_450[] */ | |
| 30641, /* A1 = 1.870239 */ | |
| -32458, /* A2 = -0.99057 */ | |
| -155, /* B2 = -0.004735 */ | |
| 0, /* B1 = 0 */ | |
| 155, /* B0 = 0.004735 */ | |
| 30631, /* A1 = 1.869568 */ | |
| -32630, /* A2 = -0.995789 */ | |
| 11453, /* B2 = 0.349548 */ | |
| -10666, /* B1 = -0.651001 */ | |
| 11453, /* B0 = 0.349548 */ | |
| 30810, /* A1 = 1.880554 */ | |
| -32634, /* A2 = -0.995941 */ | |
| 12237, /* B2 = 0.373474 */ | |
| -11588, /* B1 = -0.707336 */ | |
| 12237, /* B0 = 0.373474 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f440_480[] */ | |
| 30367, /* A1 = 1.853455 */ | |
| -32147, /* A2 = -0.981079 */ | |
| -495, /* B2 = -0.015113 */ | |
| 0, /* B1 = 0 */ | |
| 495, /* B0 = 0.015113 */ | |
| 30322, /* A1 = 1.850769 */ | |
| -32543, /* A2 = -0.993134 */ | |
| 10031, /* B2 = 0.306152 */ | |
| -9252, /* B1 = -0.564728 */ | |
| 10031, /* B0 = 0.306152 */ | |
| 30770, /* A1 = 1.878052 */ | |
| -32563, /* A2 = -0.993774 */ | |
| 22674, /* B2 = 0.691956 */ | |
| -21465, /* B1 = -1.31012 */ | |
| 22674, /* B0 = 0.691956 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f445 */ | |
| 30709, /* A1 = -1.874329 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -83, /* B2 = -0.002545 */ | |
| 0, /* B1 = 0.000000 */ | |
| 83, /* B0 = 0.002545 */ | |
| 30704, /* A1 = -1.874084 */ | |
| -32692, /* A2 = 0.997711 */ | |
| 10641, /* B2 = 0.324738 */ | |
| -9947, /* B1 = -0.607147 */ | |
| 10641, /* B0 = 0.324738 */ | |
| 30796, /* A1 = -1.879639 */ | |
| -32694, /* A2 = 0.997772 */ | |
| 10079, /* B2 = 0.307587 */ | |
| 9513, /* B1 = 0.580688 */ | |
| 10079, /* B0 = 0.307587 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f450 */ | |
| 30664, /* A1 = -1.871643 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -164, /* B2 = -0.005029 */ | |
| 0, /* B1 = 0.000000 */ | |
| 164, /* B0 = 0.005029 */ | |
| 30661, /* A1 = -1.871399 */ | |
| -32692, /* A2 = 0.997711 */ | |
| 15294, /* B2 = 0.466736 */ | |
| -14275, /* B1 = -0.871307 */ | |
| 15294, /* B0 = 0.466736 */ | |
| 30751, /* A1 = -1.876953 */ | |
| -32694, /* A2 = 0.997772 */ | |
| 3548, /* B2 = 0.108284 */ | |
| -3344, /* B1 = -0.204155 */ | |
| 3548, /* B0 = 0.108284 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f452 */ | |
| 30653, /* A1 = -1.870911 */ | |
| -32615, /* A2 = 0.995361 */ | |
| -209, /* B2 = -0.006382 */ | |
| 0, /* B1 = 0.000000 */ | |
| 209, /* B0 = 0.006382 */ | |
| 30647, /* A1 = -1.870605 */ | |
| -32702, /* A2 = 0.997986 */ | |
| 18971, /* B2 = 0.578979 */ | |
| -17716, /* B1 = -1.081299 */ | |
| 18971, /* B0 = 0.578979 */ | |
| 30738, /* A1 = -1.876099 */ | |
| -32702, /* A2 = 0.998016 */ | |
| 2967, /* B2 = 0.090561 */ | |
| -2793, /* B1 = -0.170502 */ | |
| 2967, /* B0 = 0.090561 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f475 */ | |
| 30437, /* A1 = -1.857727 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -264, /* B2 = -0.008062 */ | |
| 0, /* B1 = 0.000000 */ | |
| 264, /* B0 = 0.008062 */ | |
| 30430, /* A1 = -1.857300 */ | |
| -32692, /* A2 = 0.997711 */ | |
| 21681, /* B2 = 0.661682 */ | |
| -20082, /* B1 = -1.225708 */ | |
| 21681, /* B0 = 0.661682 */ | |
| 30526, /* A1 = -1.863220 */ | |
| -32694, /* A2 = 0.997742 */ | |
| 1559, /* B2 = 0.047600 */ | |
| -1459, /* B1 = -0.089096 */ | |
| 1559, /* B0 = 0.047600 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f480_620[] */ | |
| 28975, /* A1 = 1.768494 */ | |
| -30955, /* A2 = -0.944672 */ | |
| -1026, /* B2 = -0.03133 */ | |
| 0, /* B1 = 0 */ | |
| 1026, /* B0 = 0.03133 */ | |
| 28613, /* A1 = 1.746399 */ | |
| -32089, /* A2 = -0.979309 */ | |
| 14214, /* B2 = 0.433807 */ | |
| -12202, /* B1 = -0.744812 */ | |
| 14214, /* B0 = 0.433807 */ | |
| 30243, /* A1 = 1.845947 */ | |
| -32238, /* A2 = -0.983856 */ | |
| 24825, /* B2 = 0.757629 */ | |
| -23402, /* B1 = -1.428345 */ | |
| 24825, /* B0 = 0.757629 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f494 */ | |
| 30257, /* A1 = -1.846741 */ | |
| -32605, /* A2 = 0.995056 */ | |
| -249, /* B2 = -0.007625 */ | |
| 0, /* B1 = 0.000000 */ | |
| 249, /* B0 = 0.007625 */ | |
| 30247, /* A1 = -1.846191 */ | |
| -32694, /* A2 = 0.997772 */ | |
| 18088, /* B2 = 0.552002 */ | |
| -16652, /* B1 = -1.016418 */ | |
| 18088, /* B0 = 0.552002 */ | |
| 30348, /* A1 = -1.852295 */ | |
| -32696, /* A2 = 0.997803 */ | |
| 2099, /* B2 = 0.064064 */ | |
| -1953, /* B1 = -0.119202 */ | |
| 2099, /* B0 = 0.064064 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f500 */ | |
| 30202, /* A1 = -1.843431 */ | |
| -32624, /* A2 = 0.995622 */ | |
| -413, /* B2 = -0.012622 */ | |
| 0, /* B1 = 0.000000 */ | |
| 413, /* B0 = 0.012622 */ | |
| 30191, /* A1 = -1.842721 */ | |
| -32714, /* A2 = 0.998364 */ | |
| 25954, /* B2 = 0.792057 */ | |
| -23890, /* B1 = -1.458131 */ | |
| 25954, /* B0 = 0.792057 */ | |
| 30296, /* A1 = -1.849172 */ | |
| -32715, /* A2 = 0.998397 */ | |
| 2007, /* B2 = 0.061264 */ | |
| -1860, /* B1 = -0.113568 */ | |
| 2007, /* B0 = 0.061264 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f520 */ | |
| 30001, /* A1 = -1.831116 */ | |
| -32613, /* A2 = 0.995270 */ | |
| -155, /* B2 = -0.004750 */ | |
| 0, /* B1 = 0.000000 */ | |
| 155, /* B0 = 0.004750 */ | |
| 29985, /* A1 = -1.830200 */ | |
| -32710, /* A2 = 0.998260 */ | |
| 6584, /* B2 = 0.200928 */ | |
| -6018, /* B1 = -0.367355 */ | |
| 6584, /* B0 = 0.200928 */ | |
| 30105, /* A1 = -1.837524 */ | |
| -32712, /* A2 = 0.998291 */ | |
| 23812, /* B2 = 0.726685 */ | |
| -21936, /* B1 = -1.338928 */ | |
| 23812, /* B0 = 0.726685 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f523 */ | |
| 29964, /* A1 = -1.828918 */ | |
| -32601, /* A2 = 0.994904 */ | |
| -101, /* B2 = -0.003110 */ | |
| 0, /* B1 = 0.000000 */ | |
| 101, /* B0 = 0.003110 */ | |
| 29949, /* A1 = -1.827942 */ | |
| -32700, /* A2 = 0.997925 */ | |
| 11041, /* B2 = 0.336975 */ | |
| -10075, /* B1 = -0.614960 */ | |
| 11041, /* B0 = 0.336975 */ | |
| 30070, /* A1 = -1.835388 */ | |
| -32702, /* A2 = 0.997986 */ | |
| 16762, /* B2 = 0.511536 */ | |
| -15437, /* B1 = -0.942230 */ | |
| 16762, /* B0 = 0.511536 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f525 */ | |
| 29936, /* A1 = -1.827209 */ | |
| -32584, /* A2 = 0.994415 */ | |
| -91, /* B2 = -0.002806 */ | |
| 0, /* B1 = 0.000000 */ | |
| 91, /* B0 = 0.002806 */ | |
| 29921, /* A1 = -1.826233 */ | |
| -32688, /* A2 = 0.997559 */ | |
| 11449, /* B2 = 0.349396 */ | |
| -10426, /* B1 = -0.636383 */ | |
| 11449, /* B0 = 0.349396 */ | |
| 30045, /* A1 = -1.833862 */ | |
| -32688, /* A2 = 0.997589 */ | |
| 13055, /* B2 = 0.398407 */ | |
| -12028, /* B1 = -0.734161 */ | |
| 13055, /* B0 = 0.398407 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f540_660[] */ | |
| 28499, /* A1 = 1.739441 */ | |
| -31129, /* A2 = -0.949982 */ | |
| -849, /* B2 = -0.025922 */ | |
| 0, /* B1 = 0 */ | |
| 849, /* B0 = 0.025922 */ | |
| 28128, /* A1 = 1.716797 */ | |
| -32130, /* A2 = -0.98056 */ | |
| 14556, /* B2 = 0.444214 */ | |
| -12251, /* B1 = -0.747772 */ | |
| 14556, /* B0 = 0.444244 */ | |
| 29667, /* A1 = 1.81073 */ | |
| -32244, /* A2 = -0.984039 */ | |
| 23038, /* B2 = 0.703064 */ | |
| -21358, /* B1 = -1.303589 */ | |
| 23040, /* B0 = 0.703125 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f587 */ | |
| 29271, /* A1 = -1.786560 */ | |
| -32599, /* A2 = 0.994873 */ | |
| -490, /* B2 = -0.014957 */ | |
| 0, /* B1 = 0.000000 */ | |
| 490, /* B0 = 0.014957 */ | |
| 29246, /* A1 = -1.785095 */ | |
| -32700, /* A2 = 0.997925 */ | |
| 28961, /* B2 = 0.883850 */ | |
| -25796, /* B1 = -1.574463 */ | |
| 28961, /* B0 = 0.883850 */ | |
| 29383, /* A1 = -1.793396 */ | |
| -32700, /* A2 = 0.997955 */ | |
| 1299, /* B2 = 0.039650 */ | |
| -1169, /* B1 = -0.071396 */ | |
| 1299, /* B0 = 0.039650 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f590 */ | |
| 29230, /* A1 = -1.784058 */ | |
| -32584, /* A2 = 0.994415 */ | |
| -418, /* B2 = -0.012757 */ | |
| 0, /* B1 = 0.000000 */ | |
| 418, /* B0 = 0.012757 */ | |
| 29206, /* A1 = -1.782593 */ | |
| -32688, /* A2 = 0.997559 */ | |
| 36556, /* B2 = 1.115601 */ | |
| -32478, /* B1 = -1.982300 */ | |
| 36556, /* B0 = 1.115601 */ | |
| 29345, /* A1 = -1.791077 */ | |
| -32688, /* A2 = 0.997589 */ | |
| 897, /* B2 = 0.027397 */ | |
| -808, /* B1 = -0.049334 */ | |
| 897, /* B0 = 0.027397 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f600 */ | |
| 29116, /* A1 = -1.777100 */ | |
| -32603, /* A2 = 0.994965 */ | |
| -165, /* B2 = -0.005039 */ | |
| 0, /* B1 = 0.000000 */ | |
| 165, /* B0 = 0.005039 */ | |
| 29089, /* A1 = -1.775452 */ | |
| -32708, /* A2 = 0.998199 */ | |
| 6963, /* B2 = 0.212494 */ | |
| -6172, /* B1 = -0.376770 */ | |
| 6963, /* B0 = 0.212494 */ | |
| 29237, /* A1 = -1.784485 */ | |
| -32710, /* A2 = 0.998230 */ | |
| 24197, /* B2 = 0.738464 */ | |
| -21657, /* B1 = -1.321899 */ | |
| 24197, /* B0 = 0.738464 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f660 */ | |
| 28376, /* A1 = -1.731934 */ | |
| -32567, /* A2 = 0.993896 */ | |
| -363, /* B2 = -0.011102 */ | |
| 0, /* B1 = 0.000000 */ | |
| 363, /* B0 = 0.011102 */ | |
| 28337, /* A1 = -1.729614 */ | |
| -32683, /* A2 = 0.997434 */ | |
| 21766, /* B2 = 0.664246 */ | |
| -18761, /* B1 = -1.145081 */ | |
| 21766, /* B0 = 0.664246 */ | |
| 28513, /* A1 = -1.740356 */ | |
| -32686, /* A2 = 0.997498 */ | |
| 2509, /* B2 = 0.076584 */ | |
| -2196, /* B1 = -0.134041 */ | |
| 2509, /* B0 = 0.076584 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f700 */ | |
| 27844, /* A1 = -1.699463 */ | |
| -32563, /* A2 = 0.993744 */ | |
| -366, /* B2 = -0.011187 */ | |
| 0, /* B1 = 0.000000 */ | |
| 366, /* B0 = 0.011187 */ | |
| 27797, /* A1 = -1.696655 */ | |
| -32686, /* A2 = 0.997498 */ | |
| 22748, /* B2 = 0.694214 */ | |
| -19235, /* B1 = -1.174072 */ | |
| 22748, /* B0 = 0.694214 */ | |
| 27995, /* A1 = -1.708740 */ | |
| -32688, /* A2 = 0.997559 */ | |
| 2964, /* B2 = 0.090477 */ | |
| -2546, /* B1 = -0.155449 */ | |
| 2964, /* B0 = 0.090477 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f740 */ | |
| 27297, /* A1 = -1.666077 */ | |
| -32551, /* A2 = 0.993408 */ | |
| -345, /* B2 = -0.010540 */ | |
| 0, /* B1 = 0.000000 */ | |
| 345, /* B0 = 0.010540 */ | |
| 27240, /* A1 = -1.662598 */ | |
| -32683, /* A2 = 0.997406 */ | |
| 22560, /* B2 = 0.688477 */ | |
| -18688, /* B1 = -1.140625 */ | |
| 22560, /* B0 = 0.688477 */ | |
| 27461, /* A1 = -1.676147 */ | |
| -32684, /* A2 = 0.997467 */ | |
| 3541, /* B2 = 0.108086 */ | |
| -2985, /* B1 = -0.182220 */ | |
| 3541, /* B0 = 0.108086 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f750 */ | |
| 27155, /* A1 = -1.657410 */ | |
| -32551, /* A2 = 0.993408 */ | |
| -462, /* B2 = -0.014117 */ | |
| 0, /* B1 = 0.000000 */ | |
| 462, /* B0 = 0.014117 */ | |
| 27097, /* A1 = -1.653870 */ | |
| -32683, /* A2 = 0.997406 */ | |
| 32495, /* B2 = 0.991699 */ | |
| -26776, /* B1 = -1.634338 */ | |
| 32495, /* B0 = 0.991699 */ | |
| 27321, /* A1 = -1.667542 */ | |
| -32684, /* A2 = 0.997467 */ | |
| 1835, /* B2 = 0.056007 */ | |
| -1539, /* B1 = -0.093948 */ | |
| 1835, /* B0 = 0.056007 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f750_1450[] */ | |
| 19298, /* A1 = 1.177917 */ | |
| -24471, /* A2 = -0.746796 */ | |
| -4152, /* B2 = -0.126709 */ | |
| 0, /* B1 = 0 */ | |
| 4152, /* B0 = 0.126709 */ | |
| 12902, /* A1 = 0.787476 */ | |
| -29091, /* A2 = -0.887817 */ | |
| 12491, /* B2 = 0.38121 */ | |
| -1794, /* B1 = -0.109528 */ | |
| 12494, /* B0 = 0.381317 */ | |
| 26291, /* A1 = 1.604736 */ | |
| -30470, /* A2 = -0.929901 */ | |
| 28859, /* B2 = 0.880737 */ | |
| -26084, /* B1 = -1.592102 */ | |
| 28861, /* B0 = 0.880798 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f770 */ | |
| 26867, /* A1 = -1.639832 */ | |
| -32551, /* A2 = 0.993408 */ | |
| -123, /* B2 = -0.003755 */ | |
| 0, /* B1 = 0.000000 */ | |
| 123, /* B0 = 0.003755 */ | |
| 26805, /* A1 = -1.636108 */ | |
| -32683, /* A2 = 0.997406 */ | |
| 17297, /* B2 = 0.527863 */ | |
| -14096, /* B1 = -0.860382 */ | |
| 17297, /* B0 = 0.527863 */ | |
| 27034, /* A1 = -1.650085 */ | |
| -32684, /* A2 = 0.997467 */ | |
| 12958, /* B2 = 0.395477 */ | |
| -10756, /* B1 = -0.656525 */ | |
| 12958, /* B0 = 0.395477 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f800 */ | |
| 26413, /* A1 = -1.612122 */ | |
| -32547, /* A2 = 0.993286 */ | |
| -223, /* B2 = -0.006825 */ | |
| 0, /* B1 = 0.000000 */ | |
| 223, /* B0 = 0.006825 */ | |
| 26342, /* A1 = -1.607849 */ | |
| -32686, /* A2 = 0.997498 */ | |
| 6391, /* B2 = 0.195053 */ | |
| -5120, /* B1 = -0.312531 */ | |
| 6391, /* B0 = 0.195053 */ | |
| 26593, /* A1 = -1.623108 */ | |
| -32688, /* A2 = 0.997559 */ | |
| 23681, /* B2 = 0.722717 */ | |
| -19328, /* B1 = -1.179688 */ | |
| 23681, /* B0 = 0.722717 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f816 */ | |
| 26168, /* A1 = -1.597209 */ | |
| -32528, /* A2 = 0.992706 */ | |
| -235, /* B2 = -0.007182 */ | |
| 0, /* B1 = 0.000000 */ | |
| 235, /* B0 = 0.007182 */ | |
| 26092, /* A1 = -1.592590 */ | |
| -32675, /* A2 = 0.997192 */ | |
| 20823, /* B2 = 0.635498 */ | |
| -16510, /* B1 = -1.007751 */ | |
| 20823, /* B0 = 0.635498 */ | |
| 26363, /* A1 = -1.609070 */ | |
| -32677, /* A2 = 0.997253 */ | |
| 6739, /* B2 = 0.205688 */ | |
| -5459, /* B1 = -0.333206 */ | |
| 6739, /* B0 = 0.205688 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f850 */ | |
| 25641, /* A1 = -1.565063 */ | |
| -32536, /* A2 = 0.992950 */ | |
| -121, /* B2 = -0.003707 */ | |
| 0, /* B1 = 0.000000 */ | |
| 121, /* B0 = 0.003707 */ | |
| 25560, /* A1 = -1.560059 */ | |
| -32684, /* A2 = 0.997437 */ | |
| 18341, /* B2 = 0.559753 */ | |
| -14252, /* B1 = -0.869904 */ | |
| 18341, /* B0 = 0.559753 */ | |
| 25837, /* A1 = -1.577026 */ | |
| -32684, /* A2 = 0.997467 */ | |
| 16679, /* B2 = 0.509003 */ | |
| -13232, /* B1 = -0.807648 */ | |
| 16679, /* B0 = 0.509003 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f857_1645[] */ | |
| 16415, /* A1 = 1.001953 */ | |
| -23669, /* A2 = -0.722321 */ | |
| -4549, /* B2 = -0.138847 */ | |
| 0, /* B1 = 0 */ | |
| 4549, /* B0 = 0.138847 */ | |
| 8456, /* A1 = 0.516174 */ | |
| -28996, /* A2 = -0.884918 */ | |
| 13753, /* B2 = 0.419724 */ | |
| -12, /* B1 = -0.000763 */ | |
| 13757, /* B0 = 0.419846 */ | |
| 24632, /* A1 = 1.503418 */ | |
| -30271, /* A2 = -0.923828 */ | |
| 29070, /* B2 = 0.887146 */ | |
| -25265, /* B1 = -1.542114 */ | |
| 29073, /* B0 = 0.887268 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f900 */ | |
| 24806, /* A1 = -1.514099 */ | |
| -32501, /* A2 = 0.991852 */ | |
| -326, /* B2 = -0.009969 */ | |
| 0, /* B1 = 0.000000 */ | |
| 326, /* B0 = 0.009969 */ | |
| 24709, /* A1 = -1.508118 */ | |
| -32659, /* A2 = 0.996674 */ | |
| 20277, /* B2 = 0.618835 */ | |
| -15182, /* B1 = -0.926636 */ | |
| 20277, /* B0 = 0.618835 */ | |
| 25022, /* A1 = -1.527222 */ | |
| -32661, /* A2 = 0.996735 */ | |
| 4320, /* B2 = 0.131836 */ | |
| -3331, /* B1 = -0.203339 */ | |
| 4320, /* B0 = 0.131836 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f900_1300[] */ | |
| 19776, /* A1 = 1.207092 */ | |
| -27437, /* A2 = -0.837341 */ | |
| -2666, /* B2 = -0.081371 */ | |
| 0, /* B1 = 0 */ | |
| 2666, /* B0 = 0.081371 */ | |
| 16302, /* A1 = 0.995026 */ | |
| -30354, /* A2 = -0.926361 */ | |
| 10389, /* B2 = 0.317062 */ | |
| -3327, /* B1 = -0.203064 */ | |
| 10389, /* B0 = 0.317062 */ | |
| 24299, /* A1 = 1.483154 */ | |
| -30930, /* A2 = -0.943909 */ | |
| 25016, /* B2 = 0.763428 */ | |
| -21171, /* B1 = -1.292236 */ | |
| 25016, /* B0 = 0.763428 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f935_1215[] */ | |
| 20554, /* A1 = 1.254517 */ | |
| -28764, /* A2 = -0.877838 */ | |
| -2048, /* B2 = -0.062515 */ | |
| 0, /* B1 = 0 */ | |
| 2048, /* B0 = 0.062515 */ | |
| 18209, /* A1 = 1.11145 */ | |
| -30951, /* A2 = -0.94458 */ | |
| 9390, /* B2 = 0.286575 */ | |
| -3955, /* B1 = -0.241455 */ | |
| 9390, /* B0 = 0.286575 */ | |
| 23902, /* A1 = 1.458923 */ | |
| -31286, /* A2 = -0.954803 */ | |
| 23252, /* B2 = 0.709595 */ | |
| -19132, /* B1 = -1.167725 */ | |
| 23252, /* B0 = 0.709595 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f941_1477[] */ | |
| 17543, /* A1 = 1.07074 */ | |
| -26220, /* A2 = -0.800201 */ | |
| -3298, /* B2 = -0.100647 */ | |
| 0, /* B1 = 0 */ | |
| 3298, /* B0 = 0.100647 */ | |
| 12423, /* A1 = 0.75827 */ | |
| -30036, /* A2 = -0.916626 */ | |
| 12651, /* B2 = 0.386078 */ | |
| -2444, /* B1 = -0.14917 */ | |
| 12653, /* B0 = 0.386154 */ | |
| 23518, /* A1 = 1.435425 */ | |
| -30745, /* A2 = -0.938293 */ | |
| 27282, /* B2 = 0.832581 */ | |
| -22529, /* B1 = -1.375122 */ | |
| 27286, /* B0 = 0.832703 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f942 */ | |
| 24104, /* A1 = -1.471252 */ | |
| -32507, /* A2 = 0.992065 */ | |
| -351, /* B2 = -0.010722 */ | |
| 0, /* B1 = 0.000000 */ | |
| 351, /* B0 = 0.010722 */ | |
| 23996, /* A1 = -1.464600 */ | |
| -32671, /* A2 = 0.997040 */ | |
| 22848, /* B2 = 0.697266 */ | |
| -16639, /* B1 = -1.015564 */ | |
| 22848, /* B0 = 0.697266 */ | |
| 24332, /* A1 = -1.485168 */ | |
| -32673, /* A2 = 0.997101 */ | |
| 4906, /* B2 = 0.149727 */ | |
| -3672, /* B1 = -0.224174 */ | |
| 4906, /* B0 = 0.149727 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f950 */ | |
| 23967, /* A1 = -1.462830 */ | |
| -32507, /* A2 = 0.992065 */ | |
| -518, /* B2 = -0.015821 */ | |
| 0, /* B1 = 0.000000 */ | |
| 518, /* B0 = 0.015821 */ | |
| 23856, /* A1 = -1.456055 */ | |
| -32671, /* A2 = 0.997040 */ | |
| 26287, /* B2 = 0.802246 */ | |
| -19031, /* B1 = -1.161560 */ | |
| 26287, /* B0 = 0.802246 */ | |
| 24195, /* A1 = -1.476746 */ | |
| -32673, /* A2 = 0.997101 */ | |
| 2890, /* B2 = 0.088196 */ | |
| -2151, /* B1 = -0.131317 */ | |
| 2890, /* B0 = 0.088196 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f950_1400[] */ | |
| 18294, /* A1 = 1.116638 */ | |
| -26962, /* A2 = -0.822845 */ | |
| -2914, /* B2 = -0.088936 */ | |
| 0, /* B1 = 0 */ | |
| 2914, /* B0 = 0.088936 */ | |
| 14119, /* A1 = 0.861786 */ | |
| -30227, /* A2 = -0.922455 */ | |
| 11466, /* B2 = 0.349945 */ | |
| -2833, /* B1 = -0.172943 */ | |
| 11466, /* B0 = 0.349945 */ | |
| 23431, /* A1 = 1.430115 */ | |
| -30828, /* A2 = -0.940796 */ | |
| 25331, /* B2 = 0.773071 */ | |
| -20911, /* B1 = -1.276367 */ | |
| 25331, /* B0 = 0.773071 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f975 */ | |
| 23521, /* A1 = -1.435608 */ | |
| -32489, /* A2 = 0.991516 */ | |
| -193, /* B2 = -0.005915 */ | |
| 0, /* B1 = 0.000000 */ | |
| 193, /* B0 = 0.005915 */ | |
| 23404, /* A1 = -1.428467 */ | |
| -32655, /* A2 = 0.996582 */ | |
| 17740, /* B2 = 0.541412 */ | |
| -12567, /* B1 = -0.767029 */ | |
| 17740, /* B0 = 0.541412 */ | |
| 23753, /* A1 = -1.449829 */ | |
| -32657, /* A2 = 0.996613 */ | |
| 9090, /* B2 = 0.277405 */ | |
| -6662, /* B1 = -0.406647 */ | |
| 9090, /* B0 = 0.277405 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1000 */ | |
| 23071, /* A1 = -1.408203 */ | |
| -32489, /* A2 = 0.991516 */ | |
| -293, /* B2 = -0.008965 */ | |
| 0, /* B1 = 0.000000 */ | |
| 293, /* B0 = 0.008965 */ | |
| 22951, /* A1 = -1.400818 */ | |
| -32655, /* A2 = 0.996582 */ | |
| 5689, /* B2 = 0.173645 */ | |
| -3951, /* B1 = -0.241150 */ | |
| 5689, /* B0 = 0.173645 */ | |
| 23307, /* A1 = -1.422607 */ | |
| -32657, /* A2 = 0.996613 */ | |
| 18692, /* B2 = 0.570435 */ | |
| -13447, /* B1 = -0.820770 */ | |
| 18692, /* B0 = 0.570435 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1020 */ | |
| 22701, /* A1 = -1.385620 */ | |
| -32474, /* A2 = 0.991058 */ | |
| -292, /* B2 = -0.008933 */ | |
| 0, /*163840 , B1 = 10.000000 */ | |
| 292, /* B0 = 0.008933 */ | |
| 22564, /* A1 = -1.377258 */ | |
| -32655, /* A2 = 0.996552 */ | |
| 20756, /* B2 = 0.633423 */ | |
| -14176, /* B1 = -0.865295 */ | |
| 20756, /* B0 = 0.633423 */ | |
| 22960, /* A1 = -1.401428 */ | |
| -32657, /* A2 = 0.996613 */ | |
| 6520, /* B2 = 0.198990 */ | |
| -4619, /* B1 = -0.281937 */ | |
| 6520, /* B0 = 0.198990 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1050 */ | |
| 22142, /* A1 = -1.351501 */ | |
| -32474, /* A2 = 0.991058 */ | |
| -147, /* B2 = -0.004493 */ | |
| 0, /* B1 = 0.000000 */ | |
| 147, /* B0 = 0.004493 */ | |
| 22000, /* A1 = -1.342834 */ | |
| -32655, /* A2 = 0.996552 */ | |
| 15379, /* B2 = 0.469360 */ | |
| -10237, /* B1 = -0.624847 */ | |
| 15379, /* B0 = 0.469360 */ | |
| 22406, /* A1 = -1.367554 */ | |
| -32657, /* A2 = 0.996613 */ | |
| 17491, /* B2 = 0.533783 */ | |
| -12096, /* B1 = -0.738312 */ | |
| 17491, /* B0 = 0.533783 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1100_1750[] */ | |
| 12973, /* A1 = 0.79184 */ | |
| -24916, /* A2 = -0.760376 */ | |
| 6655, /* B2 = 0.203102 */ | |
| 367, /* B1 = 0.0224 */ | |
| 6657, /* B0 = 0.203171 */ | |
| 5915, /* A1 = 0.361053 */ | |
| -29560, /* A2 = -0.90213 */ | |
| -7777, /* B2 = -0.23735 */ | |
| 0, /* B1 = 0 */ | |
| 7777, /* B0 = 0.23735 */ | |
| 20510, /* A1 = 1.251892 */ | |
| -30260, /* A2 = -0.923462 */ | |
| 26662, /* B2 = 0.81366 */ | |
| -20573, /* B1 = -1.255737 */ | |
| 26668, /* B0 = 0.813843 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1140 */ | |
| 20392, /* A1 = -1.244629 */ | |
| -32460, /* A2 = 0.990601 */ | |
| -270, /* B2 = -0.008240 */ | |
| 0, /* B1 = 0.000000 */ | |
| 270, /* B0 = 0.008240 */ | |
| 20218, /* A1 = -1.234009 */ | |
| -32655, /* A2 = 0.996582 */ | |
| 21337, /* B2 = 0.651154 */ | |
| -13044, /* B1 = -0.796143 */ | |
| 21337, /* B0 = 0.651154 */ | |
| 20684, /* A1 = -1.262512 */ | |
| -32657, /* A2 = 0.996643 */ | |
| 8572, /* B2 = 0.261612 */ | |
| -5476, /* B1 = -0.334244 */ | |
| 8572, /* B0 = 0.261612 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1200 */ | |
| 19159, /* A1 = -1.169373 */ | |
| -32456, /* A2 = 0.990509 */ | |
| -335, /* B2 = -0.010252 */ | |
| 0, /* B1 = 0.000000 */ | |
| 335, /* B0 = 0.010252 */ | |
| 18966, /* A1 = -1.157593 */ | |
| -32661, /* A2 = 0.996735 */ | |
| 6802, /* B2 = 0.207588 */ | |
| -3900, /* B1 = -0.238098 */ | |
| 6802, /* B0 = 0.207588 */ | |
| 19467, /* A1 = -1.188232 */ | |
| -32661, /* A2 = 0.996765 */ | |
| 25035, /* B2 = 0.764008 */ | |
| -15049, /* B1 = -0.918579 */ | |
| 25035, /* B0 = 0.764008 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1209 */ | |
| 18976, /* A1 = -1.158264 */ | |
| -32439, /* A2 = 0.989990 */ | |
| -183, /* B2 = -0.005588 */ | |
| 0, /* B1 = 0.000000 */ | |
| 183, /* B0 = 0.005588 */ | |
| 18774, /* A1 = -1.145874 */ | |
| -32650, /* A2 = 0.996429 */ | |
| 15468, /* B2 = 0.472076 */ | |
| -8768, /* B1 = -0.535217 */ | |
| 15468, /* B0 = 0.472076 */ | |
| 19300, /* A1 = -1.177979 */ | |
| -32652, /* A2 = 0.996490 */ | |
| 19840, /* B2 = 0.605499 */ | |
| -11842, /* B1 = -0.722809 */ | |
| 19840, /* B0 = 0.605499 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1330 */ | |
| 16357, /* A1 = -0.998413 */ | |
| -32368, /* A2 = 0.987793 */ | |
| -217, /* B2 = -0.006652 */ | |
| 0, /* B1 = 0.000000 */ | |
| 217, /* B0 = 0.006652 */ | |
| 16107, /* A1 = -0.983126 */ | |
| -32601, /* A2 = 0.994904 */ | |
| 11602, /* B2 = 0.354065 */ | |
| -5555, /* B1 = -0.339111 */ | |
| 11602, /* B0 = 0.354065 */ | |
| 16722, /* A1 = -1.020630 */ | |
| -32603, /* A2 = 0.994965 */ | |
| 15574, /* B2 = 0.475311 */ | |
| -8176, /* B1 = -0.499069 */ | |
| 15574, /* B0 = 0.475311 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1336 */ | |
| 16234, /* A1 = -0.990875 */ | |
| 32404, /* A2 = -0.988922 */ | |
| -193, /* B2 = -0.005908 */ | |
| 0, /* B1 = 0.000000 */ | |
| 193, /* B0 = 0.005908 */ | |
| 15986, /* A1 = -0.975769 */ | |
| -32632, /* A2 = 0.995880 */ | |
| 18051, /* B2 = 0.550903 */ | |
| -8658, /* B1 = -0.528473 */ | |
| 18051, /* B0 = 0.550903 */ | |
| 16591, /* A1 = -1.012695 */ | |
| -32634, /* A2 = 0.995941 */ | |
| 15736, /* B2 = 0.480240 */ | |
| -8125, /* B1 = -0.495926 */ | |
| 15736, /* B0 = 0.480240 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1366 */ | |
| 15564, /* A1 = -0.949982 */ | |
| -32404, /* A2 = 0.988922 */ | |
| -269, /* B2 = -0.008216 */ | |
| 0, /* B1 = 0.000000 */ | |
| 269, /* B0 = 0.008216 */ | |
| 15310, /* A1 = -0.934479 */ | |
| -32632, /* A2 = 0.995880 */ | |
| 10815, /* B2 = 0.330063 */ | |
| -4962, /* B1 = -0.302887 */ | |
| 10815, /* B0 = 0.330063 */ | |
| 15924, /* A1 = -0.971924 */ | |
| -32634, /* A2 = 0.995941 */ | |
| 18880, /* B2 = 0.576172 */ | |
| -9364, /* B1 = -0.571594 */ | |
| 18880, /* B0 = 0.576172 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1380 */ | |
| 15247, /* A1 = -0.930603 */ | |
| -32397, /* A2 = 0.988708 */ | |
| -244, /* B2 = -0.007451 */ | |
| 0, /* B1 = 0.000000 */ | |
| 244, /* B0 = 0.007451 */ | |
| 14989, /* A1 = -0.914886 */ | |
| -32627, /* A2 = 0.995697 */ | |
| 18961, /* B2 = 0.578644 */ | |
| -8498, /* B1 = -0.518707 */ | |
| 18961, /* B0 = 0.578644 */ | |
| 15608, /* A1 = -0.952667 */ | |
| -32628, /* A2 = 0.995758 */ | |
| 11145, /* B2 = 0.340134 */ | |
| -5430, /* B1 = -0.331467 */ | |
| 11145, /* B0 = 0.340134 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1400 */ | |
| 14780, /* A1 = -0.902130 */ | |
| -32393, /* A2 = 0.988586 */ | |
| -396, /* B2 = -0.012086 */ | |
| 0, /* B1 = 0.000000 */ | |
| 396, /* B0 = 0.012086 */ | |
| 14510, /* A1 = -0.885651 */ | |
| -32630, /* A2 = 0.995819 */ | |
| 6326, /* B2 = 0.193069 */ | |
| -2747, /* B1 = -0.167671 */ | |
| 6326, /* B0 = 0.193069 */ | |
| 15154, /* A1 = -0.924957 */ | |
| -32632, /* A2 = 0.995850 */ | |
| 23235, /* B2 = 0.709076 */ | |
| -10983, /* B1 = -0.670380 */ | |
| 23235, /* B0 = 0.709076 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1477 */ | |
| 13005, /* A1 = -0.793793 */ | |
| -32368, /* A2 = 0.987823 */ | |
| -500, /* B2 = -0.015265 */ | |
| 0, /* B1 = 0.000000 */ | |
| 500, /* B0 = 0.015265 */ | |
| 12708, /* A1 = -0.775665 */ | |
| -32615, /* A2 = 0.995331 */ | |
| 11420, /* B2 = 0.348526 */ | |
| -4306, /* B1 = -0.262833 */ | |
| 11420, /* B0 = 0.348526 */ | |
| 13397, /* A1 = -0.817688 */ | |
| -32615, /* A2 = 0.995361 */ | |
| 9454, /* B2 = 0.288528 */ | |
| -3981, /* B1 = -0.243027 */ | |
| 9454, /* B0 = 0.288528 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1600 */ | |
| 10046, /* A1 = -0.613190 */ | |
| -32331, /* A2 = 0.986694 */ | |
| -455, /* B2 = -0.013915 */ | |
| 0, /* B1 = 0.000000 */ | |
| 455, /* B0 = 0.013915 */ | |
| 9694, /* A1 = -0.591705 */ | |
| -32601, /* A2 = 0.994934 */ | |
| 6023, /* B2 = 0.183815 */ | |
| -1708, /* B1 = -0.104279 */ | |
| 6023, /* B0 = 0.183815 */ | |
| 10478, /* A1 = -0.639587 */ | |
| -32603, /* A2 = 0.994965 */ | |
| 22031, /* B2 = 0.672333 */ | |
| -7342, /* B1 = -0.448151 */ | |
| 22031, /* B0 = 0.672333 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1633_1638[] */ | |
| 9181, /* A1 = 0.560394 */ | |
| -32256, /* A2 = -0.984375 */ | |
| -556, /* B2 = -0.016975 */ | |
| 0, /* B1 = 0 */ | |
| 556, /* B0 = 0.016975 */ | |
| 8757, /* A1 = 0.534515 */ | |
| -32574, /* A2 = -0.99408 */ | |
| 8443, /* B2 = 0.25769 */ | |
| -2135, /* B1 = -0.130341 */ | |
| 8443, /* B0 = 0.25769 */ | |
| 9691, /* A1 = 0.591522 */ | |
| -32574, /* A2 = -0.99411 */ | |
| 15446, /* B2 = 0.471375 */ | |
| -4809, /* B1 = -0.293579 */ | |
| 15446, /* B0 = 0.471375 */ | |
| 7, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1800 */ | |
| 5076, /* A1 = -0.309875 */ | |
| -32304, /* A2 = 0.985840 */ | |
| -508, /* B2 = -0.015503 */ | |
| 0, /* B1 = 0.000000 */ | |
| 508, /* B0 = 0.015503 */ | |
| 4646, /* A1 = -0.283600 */ | |
| -32605, /* A2 = 0.995026 */ | |
| 6742, /* B2 = 0.205780 */ | |
| -878, /* B1 = -0.053635 */ | |
| 6742, /* B0 = 0.205780 */ | |
| 5552, /* A1 = -0.338928 */ | |
| -32605, /* A2 = 0.995056 */ | |
| 23667, /* B2 = 0.722260 */ | |
| -4297, /* B1 = -0.262329 */ | |
| 23667, /* B0 = 0.722260 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| { /* f1860 */ | |
| 3569, /* A1 = -0.217865 */ | |
| -32292, /* A2 = 0.985504 */ | |
| -239, /* B2 = -0.007322 */ | |
| 0, /* B1 = 0.000000 */ | |
| 239, /* B0 = 0.007322 */ | |
| 3117, /* A1 = -0.190277 */ | |
| -32603, /* A2 = 0.994965 */ | |
| 18658, /* B2 = 0.569427 */ | |
| -1557, /* B1 = -0.095032 */ | |
| 18658, /* B0 = 0.569427 */ | |
| 4054, /* A1 = -0.247437 */ | |
| -32603, /* A2 = 0.994965 */ | |
| 18886, /* B2 = 0.576385 */ | |
| -2566, /* B1 = -0.156647 */ | |
| 18886, /* B0 = 0.576385 */ | |
| 5, /* Internal filter scaling */ | |
| 159, /* Minimum in-band energy threshold */ | |
| 21, /* 21/32 in-band to broad-band ratio */ | |
| 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | |
| }, | |
| }; | |
| static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf) | |
| { | |
| unsigned short cmd; | |
| int cnt, max; | |
| if (jf->filter > 3) { | |
| return -1; | |
| } | |
| if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */ | |
| return -1; | |
| if (!jf->enable) { | |
| if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */ | |
| return -1; | |
| else | |
| return 0; | |
| } else { | |
| if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */ | |
| return -1; | |
| /* Select the filter (f0 - f3) to use. */ | |
| if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) | |
| return -1; | |
| } | |
| if (jf->freq < 12 && jf->freq > 3) { | |
| /* Select the frequency for the selected filter. */ | |
| if (ixj_WriteDSPCommand(0x5170 + jf->freq, j)) | |
| return -1; | |
| } else if (jf->freq > 11) { | |
| /* We need to load a programmable filter set for undefined */ | |
| /* frequencies. So we will point the filter to a programmable set. */ | |
| /* Since there are only 4 filters and 4 programmable sets, we will */ | |
| /* just point the filter to the same number set and program it for the */ | |
| /* frequency we want. */ | |
| if (ixj_WriteDSPCommand(0x5170 + jf->filter, j)) | |
| return -1; | |
| if (j->ver.low != 0x12) { | |
| cmd = 0x515B; | |
| max = 19; | |
| } else { | |
| cmd = 0x515E; | |
| max = 15; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| for (cnt = 0; cnt < max; cnt++) { | |
| if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j)) | |
| return -1; | |
| } | |
| } | |
| j->filter_en[jf->filter] = jf->enable; | |
| return 0; | |
| } | |
| static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr) | |
| { | |
| unsigned short cmd; | |
| int cnt, max; | |
| if (jfr->filter > 3) { | |
| return -1; | |
| } | |
| if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */ | |
| return -1; | |
| if (!jfr->enable) { | |
| if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */ | |
| return -1; | |
| else | |
| return 0; | |
| } else { | |
| if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */ | |
| return -1; | |
| /* Select the filter (f0 - f3) to use. */ | |
| if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) | |
| return -1; | |
| } | |
| /* We need to load a programmable filter set for undefined */ | |
| /* frequencies. So we will point the filter to a programmable set. */ | |
| /* Since there are only 4 filters and 4 programmable sets, we will */ | |
| /* just point the filter to the same number set and program it for the */ | |
| /* frequency we want. */ | |
| if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j)) | |
| return -1; | |
| if (j->ver.low != 0x12) { | |
| cmd = 0x515B; | |
| max = 19; | |
| } else { | |
| cmd = 0x515E; | |
| max = 15; | |
| } | |
| if (ixj_WriteDSPCommand(cmd, j)) | |
| return -1; | |
| for (cnt = 0; cnt < max; cnt++) { | |
| if (ixj_WriteDSPCommand(jfr->coeff[cnt], j)) | |
| return -1; | |
| } | |
| j->filter_en[jfr->filter] = jfr->enable; | |
| return 0; | |
| } | |
| static int ixj_init_tone(IXJ *j, IXJ_TONE * ti) | |
| { | |
| int freq0, freq1; | |
| unsigned short data; | |
| if (ti->freq0) { | |
| freq0 = ti->freq0; | |
| } else { | |
| freq0 = 0x7FFF; | |
| } | |
| if (ti->freq1) { | |
| freq1 = ti->freq1; | |
| } else { | |
| freq1 = 0x7FFF; | |
| } | |
| if(ti->tone_index > 12 && ti->tone_index < 28) | |
| { | |
| if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j)) | |
| return -1; | |
| if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j)) | |
| return -1; | |
| data = freq0; | |
| if (ixj_WriteDSPCommand(data, j)) | |
| return -1; | |
| data = freq1; | |
| if (ixj_WriteDSPCommand(data, j)) | |
| return -1; | |
| } | |
| return freq0; | |
| } | |