1 /****************************************************************************
4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
5 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
9 * (c) Copyright 1999-2001 Quicknet Technologies, Inc.
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
16 * Author: Ed Okerson, <eokerson@quicknet.net>
18 * Contributors: Greg Herlein, <gherlein@quicknet.net>
19 * David W. Erhart, <derhart@quicknet.net>
20 * John Sellers, <jsellers@quicknet.net>
21 * Mike Preston, <mpreston@quicknet.net>
23 * Fixes: David Huggins-Daines, <dhd@cepstral.com>
24 * Fabio Ferrari, <fabio.ferrari@digitro.com.br>
25 * Artis Kugevics, <artis@mt.lv>
26 * Daniele Bellucci, <bellucda@tiscali.it>
28 * More information about the hardware related to this driver can be found
29 * at our website: http://www.quicknet.net
31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
38 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
42 ***************************************************************************/
45 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
46 * Audit some copy_*_user and minor cleanup.
48 * Revision 4.7 2001/08/13 06:19:33 craigs
49 * Added additional changes from Alan Cox and John Anderson for
50 * 2.2 to 2.4 cleanup and bounds checking
52 * Revision 4.6 2001/08/13 01:05:05 craigs
53 * Really fixed PHONE_QUERY_CODEC problem this time
55 * Revision 4.5 2001/08/13 00:11:03 craigs
56 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
58 * Revision 4.4 2001/08/07 07:58:12 craigs
59 * Changed back to three digit version numbers
60 * Added tagbuild target to allow automatic and easy tagging of versions
62 * Revision 4.3 2001/08/07 07:24:47 craigs
63 * Added ixj-ver.h to allow easy configuration management of driver
64 * Added display of version number in /prox/ixj
66 * Revision 4.2 2001/08/06 07:07:19 craigs
67 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
68 * behaviour of returning int rather than short *
70 * Revision 4.1 2001/08/05 00:17:37 craigs
71 * More changes for correct PCMCIA installation
72 * Start of changes for backward Linux compatibility
74 * Revision 4.0 2001/08/04 12:33:12 craigs
75 * New version using GNU autoconf
77 * Revision 3.105 2001/07/20 23:14:32 eokerson
78 * More work on CallerID generation when using ring cadences.
80 * Revision 3.104 2001/07/06 01:33:55 eokerson
81 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
83 * Revision 3.103 2001/07/05 19:20:16 eokerson
85 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
87 * Revision 3.102 2001/07/03 23:51:21 eokerson
88 * Un-mute mic on Internet LineJACK when in speakerphone mode.
90 * Revision 3.101 2001/07/02 19:26:56 eokerson
91 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
93 * Revision 3.100 2001/07/02 19:18:27 eokerson
94 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
95 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
96 * Fixed speaker mode on Internet LineJACK.
98 * Revision 3.99 2001/05/09 14:11:16 eokerson
99 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
101 * Revision 3.98 2001/05/08 19:55:33 eokerson
102 * Fixed POTS hookstate detection while it is connected to PSTN port.
104 * Revision 3.97 2001/05/08 00:01:04 eokerson
105 * Fixed kernel oops when sending caller ID data.
107 * Revision 3.96 2001/05/04 23:09:30 eokerson
108 * Now uses one kernel timer for each card, instead of one for the entire driver.
110 * Revision 3.95 2001/04/25 22:06:47 eokerson
111 * Fixed squawking at beginning of some G.723.1 calls.
113 * Revision 3.94 2001/04/03 23:42:00 eokerson
114 * Added linear volume ioctls
115 * Added raw filter load ioctl
117 * Revision 3.93 2001/02/27 01:00:06 eokerson
118 * Fixed blocking in CallerID.
119 * Reduced size of ixj structure for smaller driver footprint.
121 * Revision 3.92 2001/02/20 22:02:59 eokerson
122 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
123 * Improved PSTN ring detection.
124 * Fixed wink generation on POTS ports.
126 * Revision 3.91 2001/02/13 00:55:44 eokerson
127 * Turn AEC back on after changing frame sizes.
129 * Revision 3.90 2001/02/12 16:42:00 eokerson
130 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
132 * Revision 3.89 2001/02/12 15:41:16 eokerson
133 * Fix from Artis Kugevics - Tone gains were not being set correctly.
135 * Revision 3.88 2001/02/05 23:25:42 eokerson
136 * Fixed lockup bugs with deregister.
138 * Revision 3.87 2001/01/29 21:00:39 eokerson
139 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
140 * Updated copyright date.
142 * Revision 3.86 2001/01/23 23:53:46 eokerson
143 * Fixes to G.729 compatibility.
145 * Revision 3.85 2001/01/23 21:30:36 eokerson
146 * Added verbage about cards supported.
147 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
149 * Revision 3.84 2001/01/22 23:32:10 eokerson
150 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
152 * Revision 3.83 2001/01/19 14:51:41 eokerson
153 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
155 * Revision 3.82 2001/01/19 00:34:49 eokerson
156 * Added verbosity to write overlap errors.
158 * Revision 3.81 2001/01/18 23:56:54 eokerson
159 * Fixed PSTN line test functions.
161 * Revision 3.80 2001/01/18 22:29:27 eokerson
162 * Updated AEC/AGC values for different cards.
164 * Revision 3.79 2001/01/17 02:58:54 eokerson
165 * Fixed AEC reset after Caller ID.
166 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
168 * Revision 3.78 2001/01/16 19:43:09 eokerson
169 * Added support for Linux 2.4.x kernels.
171 * Revision 3.77 2001/01/09 04:00:52 eokerson
172 * Linetest will now test the line, even if it has previously succeded.
174 * Revision 3.76 2001/01/08 19:27:00 eokerson
175 * Fixed problem with standard cable on Internet PhoneCARD.
177 * Revision 3.75 2000/12/22 16:52:14 eokerson
178 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
180 * Revision 3.74 2000/12/08 22:41:50 eokerson
181 * Added capability for G729B.
183 * Revision 3.73 2000/12/07 23:35:16 eokerson
184 * Added capability to have different ring pattern before CallerID data.
185 * Added hookstate checks in CallerID routines to stop FSK.
187 * Revision 3.72 2000/12/06 19:31:31 eokerson
188 * Modified signal behavior to only send one signal per event.
190 * Revision 3.71 2000/12/06 03:23:08 eokerson
191 * Fixed CallerID on Call Waiting.
193 * Revision 3.70 2000/12/04 21:29:37 eokerson
194 * Added checking to Smart Cable gain functions.
196 * Revision 3.69 2000/12/04 21:05:20 eokerson
197 * Changed ixjdebug levels.
198 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
200 * Revision 3.68 2000/12/04 00:17:21 craigs
201 * Changed mixer voice gain to +6dB rather than 0dB
203 * Revision 3.67 2000/11/30 21:25:51 eokerson
204 * Fixed write signal errors.
206 * Revision 3.66 2000/11/29 22:42:44 eokerson
207 * Fixed PSTN ring detect problems.
209 * Revision 3.65 2000/11/29 07:31:55 craigs
210 * Added new 425Hz filter co-efficients
211 * Added card-specific DTMF prescaler initialisation
213 * Revision 3.64 2000/11/28 14:03:32 craigs
214 * Changed certain mixer initialisations to be 0dB rather than 12dB
215 * Added additional information to /proc/ixj
217 * Revision 3.63 2000/11/28 11:38:41 craigs
218 * Added display of AEC modes in AUTO and AGC mode
220 * Revision 3.62 2000/11/28 04:05:44 eokerson
221 * Improved PSTN ring detection routine.
223 * Revision 3.61 2000/11/27 21:53:12 eokerson
224 * Fixed flash detection.
226 * Revision 3.60 2000/11/27 15:57:29 eokerson
227 * More work on G.729 load routines.
229 * Revision 3.59 2000/11/25 21:55:12 eokerson
230 * Fixed errors in G.729 load routine.
232 * Revision 3.58 2000/11/25 04:08:29 eokerson
233 * Added board locks around G.729 and TS85 load routines.
235 * Revision 3.57 2000/11/24 05:35:17 craigs
236 * Added ability to retrieve mixer values on LineJACK
237 * Added complete initialisation of all mixer values at startup
238 * Fixed spelling mistake
240 * Revision 3.56 2000/11/23 02:52:11 robertj
241 * Added cvs change log keyword.
242 * Fixed bug in capabilities list when using G.729 module.
248 #define PERFMON_STATS
252 #include <linux/module.h>
254 #include <linux/init.h>
255 #include <linux/sched.h>
256 #include <linux/kernel.h> /* printk() */
257 #include <linux/fs.h> /* everything... */
258 #include <linux/errno.h> /* error codes */
259 #include <linux/slab.h>
260 #include <linux/mm.h>
261 #include <linux/ioport.h>
262 #include <linux/interrupt.h>
263 #include <linux/proc_fs.h>
264 #include <linux/poll.h>
265 #include <linux/timer.h>
266 #include <linux/delay.h>
267 #include <linux/pci.h>
270 #include <asm/uaccess.h>
272 #include <linux/isapnp.h>
276 #define TYPE(inode) (iminor(inode) >> 4)
277 #define NUM(inode) (iminor(inode) & 0xf)
280 static int hertz = HZ;
281 static int samplerate = 100;
283 module_param(ixjdebug, int, 0);
285 static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
286 { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
287 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
291 MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
293 /************************************************************************
295 * ixjdebug meanings are now bit mapped instead of level based
296 * Values can be or'ed together to turn on multiple messages
298 * bit 0 (0x0001) = any failure
299 * bit 1 (0x0002) = general messages
300 * bit 2 (0x0004) = POTS ringing related
301 * bit 3 (0x0008) = PSTN events
302 * bit 4 (0x0010) = PSTN Cadence state details
303 * bit 5 (0x0020) = Tone detection triggers
304 * bit 6 (0x0040) = Tone detection cadence details
305 * bit 7 (0x0080) = ioctl tracking
306 * bit 8 (0x0100) = signal tracking
307 * bit 9 (0x0200) = CallerID generation details
309 ************************************************************************/
313 static IXJ *ixj[IXJMAX];
314 #define get_ixj(b) ixj[(b)]
317 * Allocate a free IXJ device
320 static IXJ *ixj_alloc()
322 for(cnt=0; cnt<IXJMAX; cnt++)
324 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
326 j = kmalloc(sizeof(IXJ), GFP_KERNEL);
336 static void ixj_fsk_free(IXJ *j)
342 static void ixj_fsk_alloc(IXJ *j)
345 j->fskdata = kmalloc(8000, GFP_KERNEL);
347 if(ixjdebug & 0x0200) {
348 printk("IXJ phone%d - allocate failed\n", j->board);
353 if(ixjdebug & 0x0200) {
354 printk("IXJ phone%d - allocate succeded\n", j->board);
362 static IXJ ixj[IXJMAX];
363 #define get_ixj(b) (&ixj[(b)])
366 * Allocate a free IXJ device
369 static IXJ *ixj_alloc(void)
372 for(cnt=0; cnt<IXJMAX; cnt++) {
373 if(!ixj[cnt].DSPbase)
379 static inline void ixj_fsk_free(IXJ *j) {;}
381 static inline void ixj_fsk_alloc(IXJ *j)
389 #define ixj_perfmon(x) ((x)++)
391 #define ixj_perfmon(x) do { } while(0)
394 static int ixj_convert_loaded;
396 static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
398 /************************************************************************
400 * These are function definitions to allow external modules to register
401 * enhanced functionality call backs.
403 ************************************************************************/
405 static int Stub(IXJ * J, unsigned long arg)
410 static IXJ_REGFUNC ixj_PreRead = &Stub;
411 static IXJ_REGFUNC ixj_PostRead = &Stub;
412 static IXJ_REGFUNC ixj_PreWrite = &Stub;
413 static IXJ_REGFUNC ixj_PostWrite = &Stub;
415 static void ixj_read_frame(IXJ *j);
416 static void ixj_write_frame(IXJ *j);
417 static void ixj_init_timer(IXJ *j);
418 static void ixj_add_timer(IXJ * j);
419 static void ixj_timeout(unsigned long ptr);
420 static int read_filters(IXJ *j);
421 static int LineMonitor(IXJ *j);
422 static int ixj_fasync(int fd, struct file *, int mode);
423 static int ixj_set_port(IXJ *j, int arg);
424 static int ixj_set_pots(IXJ *j, int arg);
425 static int ixj_hookstate(IXJ *j);
426 static int ixj_record_start(IXJ *j);
427 static void ixj_record_stop(IXJ *j);
428 static void set_rec_volume(IXJ *j, int volume);
429 static int get_rec_volume(IXJ *j);
430 static int set_rec_codec(IXJ *j, int rate);
431 static void ixj_vad(IXJ *j, int arg);
432 static int ixj_play_start(IXJ *j);
433 static void ixj_play_stop(IXJ *j);
434 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
435 static int ixj_set_tone_off(unsigned short, IXJ *j);
436 static int ixj_play_tone(IXJ *j, char tone);
437 static void ixj_aec_start(IXJ *j, int level);
438 static int idle(IXJ *j);
439 static void ixj_ring_on(IXJ *j);
440 static void ixj_ring_off(IXJ *j);
441 static void aec_stop(IXJ *j);
442 static void ixj_ringback(IXJ *j);
443 static void ixj_busytone(IXJ *j);
444 static void ixj_dialtone(IXJ *j);
445 static void ixj_cpt_stop(IXJ *j);
446 static char daa_int_read(IXJ *j);
447 static char daa_CR_read(IXJ *j, int cr);
448 static int daa_set_mode(IXJ *j, int mode);
449 static int ixj_linetest(IXJ *j);
450 static int ixj_daa_write(IXJ *j);
451 static int ixj_daa_cid_read(IXJ *j);
452 static void DAA_Coeff_US(IXJ *j);
453 static void DAA_Coeff_UK(IXJ *j);
454 static void DAA_Coeff_France(IXJ *j);
455 static void DAA_Coeff_Germany(IXJ *j);
456 static void DAA_Coeff_Australia(IXJ *j);
457 static void DAA_Coeff_Japan(IXJ *j);
458 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
459 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
460 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
461 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
462 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
463 /* Serial Control Interface funtions */
464 static int SCI_Control(IXJ *j, int control);
465 static int SCI_Prepare(IXJ *j);
466 static int SCI_WaitHighSCI(IXJ *j);
467 static int SCI_WaitLowSCI(IXJ *j);
468 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
469 static int ixj_PCcontrol_wait(IXJ *j);
470 static void ixj_pre_cid(IXJ *j);
471 static void ixj_write_cid(IXJ *j);
472 static void ixj_write_cid_bit(IXJ *j, int bit);
473 static int set_base_frame(IXJ *j, int size);
474 static int set_play_codec(IXJ *j, int rate);
475 static void set_rec_depth(IXJ *j, int depth);
476 static int ixj_mixer(long val, IXJ *j);
478 /************************************************************************
479 CT8020/CT8021 Host Programmers Model
480 Host address Function Access
482 0-1 Aux Software Status Register (reserved) Read Only
483 2-3 Software Status Register Read Only
484 4-5 Aux Software Control Register (reserved) Read Write
485 6-7 Software Control Register Read Write
486 8-9 Hardware Status Register Read Only
487 A-B Hardware Control Register Read Write
488 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
489 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
490 ************************************************************************/
492 static inline void ixj_read_HSR(IXJ *j)
494 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
495 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
498 static inline int IsControlReady(IXJ *j)
501 return j->hsr.bits.controlrdy ? 1 : 0;
504 static inline int IsPCControlReady(IXJ *j)
506 j->pccr1.byte = inb_p(j->XILINXbase + 3);
507 return j->pccr1.bits.crr ? 1 : 0;
510 static inline int IsStatusReady(IXJ *j)
513 return j->hsr.bits.statusrdy ? 1 : 0;
516 static inline int IsRxReady(IXJ *j)
519 ixj_perfmon(j->rxreadycheck);
520 return j->hsr.bits.rxrdy ? 1 : 0;
523 static inline int IsTxReady(IXJ *j)
526 ixj_perfmon(j->txreadycheck);
527 return j->hsr.bits.txrdy ? 1 : 0;
530 static inline void set_play_volume(IXJ *j, int volume)
532 if (ixjdebug & 0x0002)
533 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
534 ixj_WriteDSPCommand(0xCF02, j);
535 ixj_WriteDSPCommand(volume, j);
538 static int set_play_volume_linear(IXJ *j, int volume)
540 int newvolume, dspplaymax;
542 if (ixjdebug & 0x0002)
543 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
544 if(volume > 100 || volume < 0) {
548 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
549 switch (j->cardtype) {
554 if(j->port == PORT_PSTN) {
560 case QTI_PHONEJACK_LITE:
563 case QTI_PHONEJACK_PCI:
572 newvolume = (dspplaymax * volume) / 100;
573 set_play_volume(j, newvolume);
577 static inline void set_play_depth(IXJ *j, int depth)
583 ixj_WriteDSPCommand(0x5280 + depth, j);
586 static inline int get_play_volume(IXJ *j)
588 ixj_WriteDSPCommand(0xCF00, j);
589 return j->ssr.high << 8 | j->ssr.low;
592 static int get_play_volume_linear(IXJ *j)
594 int volume, newvolume, dspplaymax;
596 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
597 switch (j->cardtype) {
602 if(j->port == PORT_PSTN) {
608 case QTI_PHONEJACK_LITE:
611 case QTI_PHONEJACK_PCI:
620 volume = get_play_volume(j);
621 newvolume = (volume * 100) / dspplaymax;
627 static inline BYTE SLIC_GetState(IXJ *j)
629 if (j->cardtype == QTI_PHONECARD) {
631 j->psccr.bits.dev = 3;
632 j->psccr.bits.rw = 1;
633 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
634 ixj_PCcontrol_wait(j);
635 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
636 ixj_PCcontrol_wait(j);
637 if (j->pslic.bits.powerdown)
638 return PLD_SLIC_STATE_OC;
639 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
640 return PLD_SLIC_STATE_ACTIVE;
642 return PLD_SLIC_STATE_RINGING;
644 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
646 return j->pld_slicr.bits.state;
649 static bool SLIC_SetState(BYTE byState, IXJ *j)
651 bool fRetVal = false;
653 if (j->cardtype == QTI_PHONECARD) {
654 if (j->flags.pcmciasct) {
656 case PLD_SLIC_STATE_TIPOPEN:
657 case PLD_SLIC_STATE_OC:
658 j->pslic.bits.powerdown = 1;
659 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
662 case PLD_SLIC_STATE_RINGING:
663 if (j->readers || j->writers) {
664 j->pslic.bits.powerdown = 0;
665 j->pslic.bits.ring0 = 1;
666 j->pslic.bits.ring1 = 0;
670 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
672 case PLD_SLIC_STATE_STANDBY:
673 case PLD_SLIC_STATE_ACTIVE:
674 if (j->readers || j->writers) {
675 j->pslic.bits.powerdown = 0;
677 j->pslic.bits.powerdown = 1;
679 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
682 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
684 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
690 j->psccr.bits.dev = 3;
691 j->psccr.bits.rw = 0;
692 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
693 ixj_PCcontrol_wait(j);
696 /* Set the C1, C2, C3 & B2EN signals. */
698 case PLD_SLIC_STATE_OC:
699 j->pld_slicw.bits.c1 = 0;
700 j->pld_slicw.bits.c2 = 0;
701 j->pld_slicw.bits.c3 = 0;
702 j->pld_slicw.bits.b2en = 0;
703 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
706 case PLD_SLIC_STATE_RINGING:
707 j->pld_slicw.bits.c1 = 1;
708 j->pld_slicw.bits.c2 = 0;
709 j->pld_slicw.bits.c3 = 0;
710 j->pld_slicw.bits.b2en = 1;
711 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
714 case PLD_SLIC_STATE_ACTIVE:
715 j->pld_slicw.bits.c1 = 0;
716 j->pld_slicw.bits.c2 = 1;
717 j->pld_slicw.bits.c3 = 0;
718 j->pld_slicw.bits.b2en = 0;
719 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
722 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
724 j->pld_slicw.bits.c1 = 1;
725 j->pld_slicw.bits.c2 = 1;
726 j->pld_slicw.bits.c3 = 0;
727 j->pld_slicw.bits.b2en = 0;
728 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
731 case PLD_SLIC_STATE_TIPOPEN:
732 j->pld_slicw.bits.c1 = 0;
733 j->pld_slicw.bits.c2 = 0;
734 j->pld_slicw.bits.c3 = 1;
735 j->pld_slicw.bits.b2en = 0;
736 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
739 case PLD_SLIC_STATE_STANDBY:
740 j->pld_slicw.bits.c1 = 1;
741 j->pld_slicw.bits.c2 = 0;
742 j->pld_slicw.bits.c3 = 1;
743 j->pld_slicw.bits.b2en = 1;
744 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
747 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
749 j->pld_slicw.bits.c1 = 0;
750 j->pld_slicw.bits.c2 = 1;
751 j->pld_slicw.bits.c3 = 1;
752 j->pld_slicw.bits.b2en = 0;
753 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
756 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
758 j->pld_slicw.bits.c1 = 1;
759 j->pld_slicw.bits.c2 = 1;
760 j->pld_slicw.bits.c3 = 1;
761 j->pld_slicw.bits.b2en = 0;
762 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
774 static int ixj_wink(IXJ *j)
778 slicnow = SLIC_GetState(j);
780 j->pots_winkstart = jiffies;
781 SLIC_SetState(PLD_SLIC_STATE_OC, j);
783 msleep(jiffies_to_msecs(j->winktime));
785 SLIC_SetState(slicnow, j);
789 static void ixj_init_timer(IXJ *j)
791 init_timer(&j->timer);
792 j->timer.function = ixj_timeout;
793 j->timer.data = (unsigned long)j;
796 static void ixj_add_timer(IXJ *j)
798 j->timer.expires = jiffies + (hertz / samplerate);
799 add_timer(&j->timer);
802 static void ixj_tone_timeout(IXJ *j)
807 if (j->tone_state == 3) {
810 j->tone_cadence_state++;
811 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
812 switch (j->cadence_t->termination) {
816 case REPEAT_LAST_ELEMENT:
817 j->tone_cadence_state--;
818 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
821 j->tone_cadence_state = 0;
822 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
823 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
824 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
825 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
826 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
827 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
828 ixj_init_tone(j, &ti);
830 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
831 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
832 ixj_play_tone(j, j->cadence_t->ce[0].index);
836 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
837 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
838 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
839 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
840 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
841 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
842 ixj_init_tone(j, &ti);
844 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
845 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
846 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
852 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
854 if(j->ixj_signals[event]) {
855 if(ixjdebug & 0x0100)
856 printk("Sending signal for event %d\n", event);
857 /* Send apps notice of change */
858 /* see config.h for macro definition */
859 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
863 static void ixj_pstn_state(IXJ *j)
866 union XOPXR0 XR0, daaint;
870 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
872 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
874 j->pld_scrr.byte = inb_p(j->XILINXbase);
875 if (j->pld_scrr.bits.daaflag) {
877 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
878 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
879 daaint.bitreg.RING = 1;
880 if(ixjdebug & 0x0008) {
881 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
884 daa_set_mode(j, SOP_PU_RESET);
887 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
888 daaint.bitreg.Caller_ID = 1;
889 j->pstn_cid_intr = 1;
890 j->pstn_cid_received = jiffies;
891 if(ixjdebug & 0x0008) {
892 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
895 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
896 daaint.bitreg.Cadence = 1;
897 if(ixjdebug & 0x0008) {
898 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
901 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
902 daaint.bitreg.VDD_OK = 1;
903 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
907 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)) {
908 daaint.bitreg.RMR = 1;
909 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
910 if(ixjdebug & 0x0008) {
911 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);
913 j->pstn_prev_rmr = j->pstn_last_rmr;
914 j->pstn_last_rmr = jiffies;
916 switch(j->daa_mode) {
918 if (daaint.bitreg.RING) {
919 if (!j->flags.pstn_ringing) {
920 if (j->daa_mode != SOP_PU_RINGING) {
921 j->pstn_ring_int = jiffies;
922 daa_set_mode(j, SOP_PU_RINGING);
928 if (daaint.bitreg.RMR) {
929 if (ixjdebug & 0x0008) {
930 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
932 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
933 j->flags.pstn_rmr = 1;
934 j->pstn_ring_start = jiffies;
935 j->pstn_ring_stop = 0;
936 j->ex.bits.pstn_ring = 0;
937 if (j->cadence_f[4].state == 0) {
938 j->cadence_f[4].state = 1;
939 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
940 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
941 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
942 } else if (j->cadence_f[4].state == 2) {
943 if((time_after(jiffies, j->cadence_f[4].off1min) &&
944 time_before(jiffies, j->cadence_f[4].off1max))) {
945 if (j->cadence_f[4].on2) {
946 j->cadence_f[4].state = 3;
947 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
948 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
949 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
951 j->cadence_f[4].state = 7;
954 if (ixjdebug & 0x0008) {
955 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
956 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
957 j->cadence_f[4].off1);
959 j->cadence_f[4].state = 0;
961 } else if (j->cadence_f[4].state == 4) {
962 if((time_after(jiffies, j->cadence_f[4].off2min) &&
963 time_before(jiffies, j->cadence_f[4].off2max))) {
964 if (j->cadence_f[4].on3) {
965 j->cadence_f[4].state = 5;
966 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
967 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
968 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
970 j->cadence_f[4].state = 7;
973 if (ixjdebug & 0x0008) {
974 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
975 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
976 j->cadence_f[4].off2);
978 j->cadence_f[4].state = 0;
980 } else if (j->cadence_f[4].state == 6) {
981 if((time_after(jiffies, j->cadence_f[4].off3min) &&
982 time_before(jiffies, j->cadence_f[4].off3max))) {
983 j->cadence_f[4].state = 7;
985 if (ixjdebug & 0x0008) {
986 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
987 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
988 j->cadence_f[4].off3);
990 j->cadence_f[4].state = 0;
993 j->cadence_f[4].state = 0;
995 } else { /* Falling edge of RMR */
996 j->pstn_ring_start = 0;
997 j->pstn_ring_stop = jiffies;
998 if (j->cadence_f[4].state == 1) {
999 if(!j->cadence_f[4].on1) {
1000 j->cadence_f[4].state = 7;
1001 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1002 time_before(jiffies, j->cadence_f[4].on1max))) {
1003 if (j->cadence_f[4].off1) {
1004 j->cadence_f[4].state = 2;
1005 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1006 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1007 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1009 j->cadence_f[4].state = 7;
1012 if (ixjdebug & 0x0008) {
1013 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1014 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1015 j->cadence_f[4].on1);
1017 j->cadence_f[4].state = 0;
1019 } else if (j->cadence_f[4].state == 3) {
1020 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1021 time_before(jiffies, j->cadence_f[4].on2max))) {
1022 if (j->cadence_f[4].off2) {
1023 j->cadence_f[4].state = 4;
1024 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1025 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1026 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1028 j->cadence_f[4].state = 7;
1031 if (ixjdebug & 0x0008) {
1032 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1033 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1034 j->cadence_f[4].on2);
1036 j->cadence_f[4].state = 0;
1038 } else if (j->cadence_f[4].state == 5) {
1039 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1040 time_before(jiffies, j->cadence_f[4].on3max))) {
1041 if (j->cadence_f[4].off3) {
1042 j->cadence_f[4].state = 6;
1043 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1044 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1045 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1047 j->cadence_f[4].state = 7;
1050 j->cadence_f[4].state = 0;
1053 if (ixjdebug & 0x0008) {
1054 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1055 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1056 j->cadence_f[4].on3);
1058 j->cadence_f[4].state = 0;
1061 if (ixjdebug & 0x0010) {
1062 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1064 if (ixjdebug & 0x0010) {
1065 switch(j->cadence_f[4].state) {
1067 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1068 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1071 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1072 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1075 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1076 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1079 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1080 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1083 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1084 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1087 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1088 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1093 if (j->cadence_f[4].state == 7) {
1094 j->cadence_f[4].state = 0;
1095 j->pstn_ring_stop = jiffies;
1096 j->ex.bits.pstn_ring = 1;
1097 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1098 if(ixjdebug & 0x0008) {
1099 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1102 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1103 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1104 if(ixjdebug & 0x0008) {
1105 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1106 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1107 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1109 j->pstn_ring_stop = j->pstn_ring_int = 0;
1110 daa_set_mode(j, SOP_PU_SLEEP);
1112 outb_p(j->pld_scrw.byte, j->XILINXbase);
1113 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1114 ixj_daa_cid_read(j);
1115 j->ex.bits.caller_id = 1;
1116 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1117 j->pstn_cid_intr = 0;
1119 if (daaint.bitreg.Cadence) {
1120 if(ixjdebug & 0x0008) {
1121 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1123 daa_set_mode(j, SOP_PU_SLEEP);
1124 j->ex.bits.pstn_ring = 0;
1127 case SOP_PU_CONVERSATION:
1128 if (daaint.bitreg.VDD_OK) {
1129 if(!daaint.bitreg.SI_0) {
1130 if (!j->pstn_winkstart) {
1131 if(ixjdebug & 0x0008) {
1132 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1134 j->pstn_winkstart = jiffies;
1137 if (j->pstn_winkstart) {
1138 if(ixjdebug & 0x0008) {
1139 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1141 j->pstn_winkstart = 0;
1145 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1146 if(ixjdebug & 0x0008) {
1147 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1149 daa_set_mode(j, SOP_PU_SLEEP);
1150 j->pstn_winkstart = 0;
1151 j->ex.bits.pstn_wink = 1;
1152 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1158 static void ixj_timeout(unsigned long ptr)
1161 unsigned long jifon;
1162 IXJ *j = (IXJ *)ptr;
1165 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1166 ixj_perfmon(j->timerchecks);
1167 j->hookstate = ixj_hookstate(j);
1168 if (j->tone_state) {
1169 if (!(j->hookstate)) {
1173 j->ex.bits.hookstate = 1;
1174 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1176 clear_bit(board, &j->busyflags);
1180 if (j->tone_state == 1)
1181 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1183 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1184 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1185 if (j->tone_state == 1) {
1186 ixj_play_tone(j, j->tone_index);
1187 if (j->dsp.low == 0x20) {
1188 clear_bit(board, &j->busyflags);
1193 ixj_play_tone(j, 0);
1194 if (j->dsp.low == 0x20) {
1195 clear_bit(board, &j->busyflags);
1201 ixj_tone_timeout(j);
1202 if (j->flags.dialtone) {
1205 if (j->flags.busytone) {
1207 if (j->dsp.low == 0x20) {
1208 clear_bit(board, &j->busyflags);
1213 if (j->flags.ringback) {
1215 if (j->dsp.low == 0x20) {
1216 clear_bit(board, &j->busyflags);
1221 if (!j->tone_state) {
1226 if (!(j->tone_state && j->dsp.low == 0x20)) {
1234 if (j->flags.cringing) {
1235 if (j->hookstate & 1) {
1236 j->flags.cringing = 0;
1238 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1239 switch(j->cadence_f[5].state) {
1241 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1242 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1243 if(ixjdebug & 0x0004) {
1244 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1248 j->cadence_f[5].state = 1;
1251 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1252 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1253 if(ixjdebug & 0x0004) {
1254 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1257 j->cadence_f[5].state = 2;
1261 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1262 if(ixjdebug & 0x0004) {
1263 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1266 if (j->cadence_f[5].on2) {
1267 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1268 j->cadence_f[5].state = 3;
1270 j->cadence_f[5].state = 7;
1275 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1276 if(ixjdebug & 0x0004) {
1277 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1280 if (j->cadence_f[5].off2) {
1281 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1282 j->cadence_f[5].state = 4;
1284 j->cadence_f[5].state = 7;
1289 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1290 if(ixjdebug & 0x0004) {
1291 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1294 if (j->cadence_f[5].on3) {
1295 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1296 j->cadence_f[5].state = 5;
1298 j->cadence_f[5].state = 7;
1303 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1304 if(ixjdebug & 0x0004) {
1305 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1308 if (j->cadence_f[5].off3) {
1309 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1310 j->cadence_f[5].state = 6;
1312 j->cadence_f[5].state = 7;
1317 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1318 if(ixjdebug & 0x0004) {
1319 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1321 j->cadence_f[5].state = 7;
1325 if(ixjdebug & 0x0004) {
1326 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1328 j->flags.cidring = 1;
1329 j->cadence_f[5].state = 0;
1332 if (j->flags.cidring && !j->flags.cidsent) {
1333 j->flags.cidsent = 1;
1335 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1338 j->flags.cidring = 0;
1340 clear_bit(board, &j->busyflags);
1344 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1345 if (j->flags.cidring && !j->flags.cidsent) {
1346 j->flags.cidsent = 1;
1348 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1351 j->flags.cidring = 0;
1353 j->ring_cadence_t--;
1354 if (j->ring_cadence_t == -1)
1355 j->ring_cadence_t = 15;
1356 j->ring_cadence_jif = jiffies;
1358 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1359 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1360 j->flags.firstring = 1;
1365 if(!j->flags.cidsent)
1366 j->flags.cidring = 1;
1369 clear_bit(board, &j->busyflags);
1374 if (!j->flags.ringing) {
1375 if (j->hookstate) { /* & 1) { */
1376 if (j->dsp.low != 0x20 &&
1377 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1378 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1382 ixj_WriteDSPCommand(0x511B, j);
1383 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1384 if (!j->m_hook && (j->hookstate & 1)) {
1385 j->m_hook = j->ex.bits.hookstate = 1;
1386 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1389 if (j->ex.bits.dtmf_ready) {
1390 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1394 j->ex.bits.hookstate = 1;
1395 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1399 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1403 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1405 clear_bit(board, &j->busyflags);
1410 static int ixj_status_wait(IXJ *j)
1414 jif = jiffies + ((60 * hertz) / 100);
1415 while (!IsStatusReady(j)) {
1416 ixj_perfmon(j->statuswait);
1417 if (time_after(jiffies, jif)) {
1418 ixj_perfmon(j->statuswaitfail);
1425 static int ixj_PCcontrol_wait(IXJ *j)
1429 jif = jiffies + ((60 * hertz) / 100);
1430 while (!IsPCControlReady(j)) {
1431 ixj_perfmon(j->pcontrolwait);
1432 if (time_after(jiffies, jif)) {
1433 ixj_perfmon(j->pcontrolwaitfail);
1440 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1445 atomic_inc(&j->DSPWrite);
1446 if(atomic_read(&j->DSPWrite) > 1) {
1447 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1450 bytes.high = (cmd & 0xFF00) >> 8;
1451 bytes.low = cmd & 0x00FF;
1452 jif = jiffies + ((60 * hertz) / 100);
1453 while (!IsControlReady(j)) {
1454 ixj_perfmon(j->iscontrolready);
1455 if (time_after(jiffies, jif)) {
1456 ixj_perfmon(j->iscontrolreadyfail);
1457 atomic_dec(&j->DSPWrite);
1458 if(atomic_read(&j->DSPWrite) > 0) {
1459 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1460 while(atomic_read(&j->DSPWrite) > 0) {
1461 atomic_dec(&j->DSPWrite);
1467 outb(bytes.low, j->DSPbase + 6);
1468 outb(bytes.high, j->DSPbase + 7);
1470 if (ixj_status_wait(j)) {
1473 atomic_dec(&j->DSPWrite);
1474 if(atomic_read(&j->DSPWrite) > 0) {
1475 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1476 while(atomic_read(&j->DSPWrite) > 0) {
1477 atomic_dec(&j->DSPWrite);
1482 /* Read Software Status Register */
1483 j->ssr.low = inb_p(j->DSPbase + 2);
1484 j->ssr.high = inb_p(j->DSPbase + 3);
1485 atomic_dec(&j->DSPWrite);
1486 if(atomic_read(&j->DSPWrite) > 0) {
1487 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1488 while(atomic_read(&j->DSPWrite) > 0) {
1489 atomic_dec(&j->DSPWrite);
1495 /***************************************************************************
1497 * General Purpose IO Register read routine
1499 ***************************************************************************/
1500 static inline int ixj_gpio_read(IXJ *j)
1502 if (ixj_WriteDSPCommand(0x5143, j))
1505 j->gpio.bytes.low = j->ssr.low;
1506 j->gpio.bytes.high = j->ssr.high;
1511 static inline void LED_SetState(int state, IXJ *j)
1513 if (j->cardtype == QTI_LINEJACK) {
1514 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1515 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1516 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1517 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1519 outb(j->pld_scrw.byte, j->XILINXbase);
1523 /*********************************************************************
1524 * GPIO Pins are configured as follows on the Quicknet Internet
1525 * PhoneJACK Telephony Cards
1527 * POTS Select GPIO_6=0 GPIO_7=0
1528 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1529 * Handset Select GPIO_6=1 GPIO_7=0
1531 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1532 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1533 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1535 * Hook Switch changes reported on GPIO_3
1536 *********************************************************************/
1537 static int ixj_set_port(IXJ *j, int arg)
1539 if (j->cardtype == QTI_PHONEJACK_LITE) {
1540 if (arg != PORT_POTS)
1547 j->port = PORT_POTS;
1548 switch (j->cardtype) {
1550 if (j->flags.pcmciasct == 1)
1551 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1555 case QTI_PHONEJACK_PCI:
1556 j->pld_slicw.pcib.mic = 0;
1557 j->pld_slicw.pcib.spk = 0;
1558 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1561 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1562 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1563 Software Control Register */
1565 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1567 outb(j->pld_scrw.byte, j->XILINXbase);
1568 j->pld_clock.byte = 0;
1569 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1570 j->pld_slicw.bits.rly1 = 1;
1571 j->pld_slicw.bits.spken = 0;
1572 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1573 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1574 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1575 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1576 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1577 ixj_mixer(0x0E80, j); /*Mic mute */
1578 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1579 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1580 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1581 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1582 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1585 j->gpio.bytes.high = 0x0B;
1586 j->gpio.bits.gpio6 = 0;
1587 j->gpio.bits.gpio7 = 0;
1588 ixj_WriteDSPCommand(j->gpio.word, j);
1593 if (j->cardtype == QTI_LINEJACK) {
1594 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1596 j->pld_slicw.bits.rly3 = 0;
1597 j->pld_slicw.bits.rly1 = 1;
1598 j->pld_slicw.bits.spken = 0;
1599 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1600 j->port = PORT_PSTN;
1606 j->port = PORT_SPEAKER;
1607 switch (j->cardtype) {
1609 if (j->flags.pcmciasct) {
1610 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1613 case QTI_PHONEJACK_PCI:
1614 j->pld_slicw.pcib.mic = 1;
1615 j->pld_slicw.pcib.spk = 1;
1616 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1619 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1620 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1621 Software Control Register */
1623 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1625 outb(j->pld_scrw.byte, j->XILINXbase);
1626 j->pld_clock.byte = 0;
1627 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1628 j->pld_slicw.bits.rly1 = 1;
1629 j->pld_slicw.bits.spken = 1;
1630 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1631 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1632 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1633 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1634 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1635 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1636 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1637 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1638 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1641 j->gpio.bytes.high = 0x0B;
1642 j->gpio.bits.gpio6 = 0;
1643 j->gpio.bits.gpio7 = 1;
1644 ixj_WriteDSPCommand(j->gpio.word, j);
1649 if (j->cardtype != QTI_PHONEJACK) {
1652 j->gpio.bytes.high = 0x0B;
1653 j->gpio.bits.gpio6 = 1;
1654 j->gpio.bits.gpio7 = 0;
1655 ixj_WriteDSPCommand(j->gpio.word, j);
1656 j->port = PORT_HANDSET;
1666 static int ixj_set_pots(IXJ *j, int arg)
1668 if (j->cardtype == QTI_LINEJACK) {
1670 if (j->port == PORT_PSTN) {
1671 j->pld_slicw.bits.rly1 = 0;
1672 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1673 j->flags.pots_pstn = 1;
1676 j->flags.pots_pstn = 0;
1680 j->pld_slicw.bits.rly1 = 1;
1681 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1682 j->flags.pots_pstn = 0;
1690 static void ixj_ring_on(IXJ *j)
1692 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1694 if (ixjdebug & 0x0004)
1695 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1697 j->gpio.bytes.high = 0x0B;
1698 j->gpio.bytes.low = 0x00;
1699 j->gpio.bits.gpio1 = 1;
1700 j->gpio.bits.gpio2 = 1;
1701 j->gpio.bits.gpio5 = 0;
1702 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1703 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1705 if (ixjdebug & 0x0004)
1706 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1708 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1712 static int ixj_siadc(IXJ *j, int val)
1714 if(j->cardtype == QTI_PHONECARD){
1715 if(j->flags.pcmciascp){
1717 return j->siadc.bits.rxg;
1719 if(val < 0 || val > 0x1F)
1722 j->siadc.bits.hom = 0; /* Handset Out Mute */
1723 j->siadc.bits.lom = 0; /* Line Out Mute */
1724 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1725 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1726 j->psccr.bits.rw = 0; /* Read / Write flag */
1727 j->psccr.bits.dev = 0;
1728 outb(j->siadc.byte, j->XILINXbase + 0x00);
1729 outb(j->psccr.byte, j->XILINXbase + 0x01);
1730 ixj_PCcontrol_wait(j);
1731 return j->siadc.bits.rxg;
1737 static int ixj_sidac(IXJ *j, int val)
1739 if(j->cardtype == QTI_PHONECARD){
1740 if(j->flags.pcmciascp){
1742 return j->sidac.bits.txg;
1744 if(val < 0 || val > 0x1F)
1747 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1748 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1749 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1750 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1751 j->psccr.bits.rw = 0; /* Read / Write flag */
1752 j->psccr.bits.dev = 0;
1753 outb(j->sidac.byte, j->XILINXbase + 0x00);
1754 outb(j->psccr.byte, j->XILINXbase + 0x01);
1755 ixj_PCcontrol_wait(j);
1756 return j->sidac.bits.txg;
1762 static int ixj_pcmcia_cable_check(IXJ *j)
1764 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1765 if (!j->flags.pcmciastate) {
1766 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1767 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1768 j->flags.pcmciastate = 4;
1771 if (j->pccr1.bits.ed) {
1772 j->pccr1.bits.ed = 0;
1773 j->psccr.bits.dev = 3;
1774 j->psccr.bits.rw = 1;
1775 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1776 ixj_PCcontrol_wait(j);
1777 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1778 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1779 j->psccr.bits.dev = 3;
1780 j->psccr.bits.rw = 0;
1781 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1782 ixj_PCcontrol_wait(j);
1783 return j->pslic.bits.led2 ? 1 : 0;
1784 } else if (j->flags.pcmciasct) {
1789 } else if (j->flags.pcmciastate == 4) {
1790 if (!j->pccr1.bits.drf) {
1791 j->flags.pcmciastate = 3;
1794 } else if (j->flags.pcmciastate == 3) {
1795 j->pccr2.bits.pwr = 0;
1796 j->pccr2.bits.rstc = 1;
1797 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1798 j->checkwait = jiffies + (hertz * 2);
1799 j->flags.incheck = 1;
1800 j->flags.pcmciastate = 2;
1802 } else if (j->flags.pcmciastate == 2) {
1803 if (j->flags.incheck) {
1804 if (time_before(jiffies, j->checkwait)) {
1807 j->flags.incheck = 0;
1810 j->pccr2.bits.pwr = 0;
1811 j->pccr2.bits.rstc = 0;
1812 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1813 j->flags.pcmciastate = 1;
1815 } else if (j->flags.pcmciastate == 1) {
1816 j->flags.pcmciastate = 0;
1817 if (!j->pccr1.bits.drf) {
1818 j->psccr.bits.dev = 3;
1819 j->psccr.bits.rw = 1;
1820 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1821 ixj_PCcontrol_wait(j);
1822 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1824 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1826 if (j->flags.pcmciasct == 3) {
1827 j->flags.pcmciastate = 4;
1829 } else if (j->flags.pcmciasct == 0) {
1830 j->pccr2.bits.pwr = 1;
1831 j->pccr2.bits.rstc = 0;
1832 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1833 j->port = PORT_SPEAKER;
1835 j->port = PORT_POTS;
1837 j->sic1.bits.cpd = 0; /* Chip Power Down */
1838 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1839 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1840 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1841 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1842 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1843 j->psccr.bits.rw = 0; /* Read / Write flag */
1844 j->psccr.bits.dev = 0;
1845 outb(j->sic1.byte, j->XILINXbase + 0x00);
1846 outb(j->psccr.byte, j->XILINXbase + 0x01);
1847 ixj_PCcontrol_wait(j);
1849 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1850 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1851 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1852 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1853 j->sic2.bits.hpd = 0; /* HPF disable */
1854 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1855 j->psccr.bits.rw = 0; /* Read / Write flag */
1856 j->psccr.bits.dev = 0;
1857 outb(j->sic2.byte, j->XILINXbase + 0x00);
1858 outb(j->psccr.byte, j->XILINXbase + 0x01);
1859 ixj_PCcontrol_wait(j);
1861 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1862 j->psccr.bits.rw = 0; /* Read / Write flag */
1863 j->psccr.bits.dev = 0;
1864 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1865 outb(j->psccr.byte, j->XILINXbase + 0x01);
1866 ixj_PCcontrol_wait(j);
1868 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1869 j->psccr.bits.rw = 0; /* Read / Write flag */
1870 j->psccr.bits.dev = 0;
1871 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1872 outb(j->psccr.byte, j->XILINXbase + 0x01);
1873 ixj_PCcontrol_wait(j);
1875 j->sirxg.bits.lig = 1; /* Line In Gain */
1876 j->sirxg.bits.lim = 1; /* Line In Mute */
1877 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1878 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1879 j->sirxg.bits.him = 0; /* Handset In Mute */
1880 j->sirxg.bits.iir = 1; /* IIR */
1881 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1882 j->psccr.bits.rw = 0; /* Read / Write flag */
1883 j->psccr.bits.dev = 0;
1884 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1885 outb(j->psccr.byte, j->XILINXbase + 0x01);
1886 ixj_PCcontrol_wait(j);
1891 j->siaatt.bits.sot = 0;
1892 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1893 j->psccr.bits.rw = 0; /* Read / Write flag */
1894 j->psccr.bits.dev = 0;
1895 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1896 outb(j->psccr.byte, j->XILINXbase + 0x01);
1897 ixj_PCcontrol_wait(j);
1899 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1900 j->psccr.byte = j->pslic.byte = 0;
1901 j->pslic.bits.powerdown = 1;
1902 j->psccr.bits.dev = 3;
1903 j->psccr.bits.rw = 0;
1904 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1905 ixj_PCcontrol_wait(j);
1910 j->flags.pcmciascp = 0;
1916 static int ixj_hookstate(IXJ *j)
1920 switch (j->cardtype) {
1923 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1926 case QTI_PHONEJACK_LITE:
1927 case QTI_PHONEJACK_PCI:
1929 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1930 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1931 if(fOffHook != j->p_hook) {
1933 j->checkwait = jiffies;
1935 if(time_before(jiffies, j->checkwait + 2)) {
1940 j->p_hook = fOffHook;
1941 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1944 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1945 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1946 if (j->flags.ringing || j->flags.cringing) {
1947 if (!in_interrupt()) {
1951 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1955 if (j->cardtype == QTI_PHONEJACK_PCI) {
1956 j->pld_scrr.byte = inb_p(j->XILINXbase);
1957 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1959 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1964 fOffHook = ixj_pcmcia_cable_check(j);
1967 if (j->r_hook != fOffHook) {
1968 j->r_hook = fOffHook;
1969 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1970 j->ex.bits.hookstate = 1;
1971 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1972 } else if (!fOffHook) {
1973 j->flash_end = jiffies + ((60 * hertz) / 100);
1977 if(time_before(jiffies, j->flash_end)) {
1978 j->ex.bits.flash = 1;
1980 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1983 if(time_before(jiffies, j->flash_end)) {
1988 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1991 if (j->port == PORT_SPEAKER) {
1992 if(j->cardtype == QTI_PHONECARD) {
1993 if(j->flags.pcmciascp && j->flags.pcmciasct) {
2001 if (j->port == PORT_HANDSET)
2007 static void ixj_ring_off(IXJ *j)
2009 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2011 if (ixjdebug & 0x0004)
2012 printk(KERN_INFO "IXJ Ring Off\n");
2013 j->gpio.bytes.high = 0x0B;
2014 j->gpio.bytes.low = 0x00;
2015 j->gpio.bits.gpio1 = 0;
2016 j->gpio.bits.gpio2 = 1;
2017 j->gpio.bits.gpio5 = 0;
2018 ixj_WriteDSPCommand(j->gpio.word, j);
2019 } else /* Internet LineJACK */
2021 if (ixjdebug & 0x0004)
2022 printk(KERN_INFO "IXJ Ring Off\n");
2024 if(!j->flags.cidplay)
2025 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2031 static void ixj_ring_start(IXJ *j)
2033 j->flags.cringing = 1;
2034 if (ixjdebug & 0x0004)
2035 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2036 if (ixj_hookstate(j) & 1) {
2037 if (j->port == PORT_POTS)
2039 j->flags.cringing = 0;
2040 if (ixjdebug & 0x0004)
2041 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2042 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2043 j->ring_cadence_jif = jiffies;
2044 j->flags.cidsent = j->flags.cidring = 0;
2045 j->cadence_f[5].state = 0;
2046 if(j->cadence_f[5].on1)
2049 j->ring_cadence_jif = jiffies;
2050 j->ring_cadence_t = 15;
2051 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2056 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2060 static int ixj_ring(IXJ *j)
2065 j->flags.ringing = 1;
2066 if (ixj_hookstate(j) & 1) {
2068 j->flags.ringing = 0;
2071 for (cntr = 0; cntr < j->maxrings; cntr++) {
2072 jif = jiffies + (1 * hertz);
2074 while (time_before(jiffies, jif)) {
2075 if (ixj_hookstate(j) & 1) {
2077 j->flags.ringing = 0;
2080 schedule_timeout_interruptible(1);
2081 if (signal_pending(current))
2084 jif = jiffies + (3 * hertz);
2086 while (time_before(jiffies, jif)) {
2087 if (ixj_hookstate(j) & 1) {
2089 if (ixj_hookstate(j) & 1) {
2090 j->flags.ringing = 0;
2094 schedule_timeout_interruptible(1);
2095 if (signal_pending(current))
2100 j->flags.ringing = 0;
2104 static int ixj_open(struct phone_device *p, struct file *file_p)
2106 IXJ *j = get_ixj(p->board);
2107 file_p->private_data = j;
2112 if (file_p->f_mode & FMODE_READ) {
2120 if (file_p->f_mode & FMODE_WRITE) {
2124 if (file_p->f_mode & FMODE_READ){
2131 if (j->cardtype == QTI_PHONECARD) {
2132 j->pslic.bits.powerdown = 0;
2133 j->psccr.bits.dev = 3;
2134 j->psccr.bits.rw = 0;
2135 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2136 ixj_PCcontrol_wait(j);
2139 j->flags.cidplay = 0;
2140 j->flags.cidcw_ack = 0;
2142 if (ixjdebug & 0x0002)
2143 printk(KERN_INFO "Opening board %d\n", p->board);
2145 j->framesread = j->frameswritten = 0;
2149 static int ixj_release(struct inode *inode, struct file *file_p)
2153 IXJ *j = file_p->private_data;
2154 int board = j->p.board;
2157 * Set up locks to ensure that only one process is talking to the DSP at a time.
2158 * This is necessary to keep the DSP from locking up.
2160 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2161 schedule_timeout_interruptible(1);
2162 if (ixjdebug & 0x0002)
2163 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2165 if (j->cardtype == QTI_PHONECARD)
2166 ixj_set_port(j, PORT_SPEAKER);
2168 ixj_set_port(j, PORT_POTS);
2173 set_play_volume(j, 0x100);
2174 set_rec_volume(j, 0x100);
2177 /* Restore the tone table to default settings. */
2183 ixj_init_tone(j, &ti);
2189 ixj_init_tone(j, &ti);
2195 ixj_init_tone(j, &ti);
2201 ixj_init_tone(j, &ti);
2207 ixj_init_tone(j, &ti);
2213 ixj_init_tone(j, &ti);
2219 ixj_init_tone(j, &ti);
2225 ixj_init_tone(j, &ti);
2231 ixj_init_tone(j, &ti);
2237 ixj_init_tone(j, &ti);
2243 ixj_init_tone(j, &ti);
2249 ixj_init_tone(j, &ti);
2255 ixj_init_tone(j, &ti);
2261 ixj_init_tone(j, &ti);
2267 ixj_init_tone(j, &ti);
2273 ixj_init_tone(j, &ti);
2279 ixj_init_tone(j, &ti);
2285 ixj_init_tone(j, &ti);
2287 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2289 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2291 j->ex.bits.dtmf_ready = 0;
2293 j->dtmf_wp = j->dtmf_rp = 0;
2294 j->rec_mode = j->play_mode = -1;
2295 j->flags.ringing = 0;
2296 j->maxrings = MAXRINGS;
2297 j->ring_cadence = USA_RING_CADENCE;
2298 if(j->cadence_f[5].enable) {
2299 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2303 j->flags.dtmf_oob = 0;
2304 for (cnt = 0; cnt < 4; cnt++)
2305 j->cadence_f[cnt].enable = 0;
2309 if(j->cardtype == QTI_PHONECARD) {
2310 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2313 if (file_p->f_mode & FMODE_READ)
2315 if (file_p->f_mode & FMODE_WRITE)
2318 if (j->read_buffer && !j->readers) {
2319 kfree(j->read_buffer);
2320 j->read_buffer = NULL;
2321 j->read_buffer_size = 0;
2323 if (j->write_buffer && !j->writers) {
2324 kfree(j->write_buffer);
2325 j->write_buffer = NULL;
2326 j->write_buffer_size = 0;
2328 j->rec_codec = j->play_codec = 0;
2329 j->rec_frame_size = j->play_frame_size = 0;
2330 j->flags.cidsent = j->flags.cidring = 0;
2332 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2333 ixj_set_port(j, PORT_PSTN);
2334 daa_set_mode(j, SOP_PU_SLEEP);
2337 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2339 /* Set up the default signals for events */
2340 for (cnt = 0; cnt < 35; cnt++)
2341 j->ixj_signals[cnt] = SIGIO;
2343 /* Set the excetion signal enable flags */
2344 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2345 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 =
2346 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;
2348 file_p->private_data = NULL;
2349 clear_bit(board, &j->busyflags);
2353 static int read_filters(IXJ *j)
2355 unsigned short fc, cnt, trg;
2359 if (ixj_WriteDSPCommand(0x5144, j)) {
2360 if(ixjdebug & 0x0001) {
2361 printk(KERN_INFO "Read Frame Counter failed!\n");
2365 fc = j->ssr.high << 8 | j->ssr.low;
2366 if (fc == j->frame_count)
2369 j->frame_count = fc;
2376 for (cnt = 0; cnt < 4; cnt++) {
2377 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2378 if(ixjdebug & 0x0001) {
2379 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2383 if (ixj_WriteDSPCommand(0x515C, j)) {
2384 if(ixjdebug & 0x0001) {
2385 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2389 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2391 if (j->cadence_f[cnt].enable) {
2392 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2393 if (j->cadence_f[cnt].state == 0) {
2394 j->cadence_f[cnt].state = 1;
2395 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2396 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2397 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2398 } else if (j->cadence_f[cnt].state == 2 &&
2399 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2400 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2401 if (j->cadence_f[cnt].on2) {
2402 j->cadence_f[cnt].state = 3;
2403 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2404 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2405 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2407 j->cadence_f[cnt].state = 7;
2409 } else if (j->cadence_f[cnt].state == 4 &&
2410 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2411 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2412 if (j->cadence_f[cnt].on3) {
2413 j->cadence_f[cnt].state = 5;
2414 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2415 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2416 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2418 j->cadence_f[cnt].state = 7;
2421 j->cadence_f[cnt].state = 0;
2423 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2424 if (j->cadence_f[cnt].state == 1) {
2425 if(!j->cadence_f[cnt].on1) {
2426 j->cadence_f[cnt].state = 7;
2427 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2428 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2429 if(j->cadence_f[cnt].off1) {
2430 j->cadence_f[cnt].state = 2;
2431 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2432 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2433 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2435 j->cadence_f[cnt].state = 7;
2438 j->cadence_f[cnt].state = 0;
2440 } else if (j->cadence_f[cnt].state == 3) {
2441 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2442 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2443 if(j->cadence_f[cnt].off2) {
2444 j->cadence_f[cnt].state = 4;
2445 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2446 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2447 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2449 j->cadence_f[cnt].state = 7;
2452 j->cadence_f[cnt].state = 0;
2454 } else if (j->cadence_f[cnt].state == 5) {
2455 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2456 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2457 if(j->cadence_f[cnt].off3) {
2458 j->cadence_f[cnt].state = 6;
2459 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2460 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2461 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2463 j->cadence_f[cnt].state = 7;
2466 j->cadence_f[cnt].state = 0;
2469 j->cadence_f[cnt].state = 0;
2472 switch(j->cadence_f[cnt].state) {
2474 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2475 !j->cadence_f[cnt].off1 &&
2476 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2477 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2478 j->cadence_f[cnt].state = 7;
2482 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2483 !j->cadence_f[cnt].off2 &&
2484 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2485 j->cadence_f[cnt].state = 7;
2489 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2490 !j->cadence_f[cnt].off3) {
2491 j->cadence_f[cnt].state = 7;
2497 if (ixjdebug & 0x0040) {
2498 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2499 switch(j->cadence_f[cnt].state) {
2501 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2504 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2505 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2508 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2509 j->cadence_f[cnt].off1max);
2512 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2513 j->cadence_f[cnt].on2max);
2516 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2517 j->cadence_f[cnt].off2max);
2520 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2521 j->cadence_f[cnt].on3max);
2524 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2525 j->cadence_f[cnt].off3max);
2530 if (j->cadence_f[cnt].state == 7) {
2531 j->cadence_f[cnt].state = 0;
2532 if (j->cadence_f[cnt].enable == 1)
2533 j->cadence_f[cnt].enable = 0;
2536 if(ixjdebug & 0x0020) {
2537 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2540 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2543 if(ixjdebug & 0x0020) {
2544 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2547 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2550 if(ixjdebug & 0x0020) {
2551 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2554 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2557 if(ixjdebug & 0x0020) {
2558 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2561 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2565 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2566 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2567 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2569 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2574 if(ixjdebug & 0x0020) {
2575 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2578 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2581 if(ixjdebug & 0x0020) {
2582 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2585 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2588 if(ixjdebug & 0x0020) {
2589 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2592 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2595 if(ixjdebug & 0x0020) {
2596 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2599 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2607 static int LineMonitor(IXJ *j)
2614 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2617 j->dtmf.bytes.high = j->ssr.high;
2618 j->dtmf.bytes.low = j->ssr.low;
2619 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2621 j->dtmf_current = j->dtmf.bits.digit;
2623 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2625 if(!j->cidcw_wait) {
2626 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2628 if (j->dtmf_wp == 79)
2630 j->ex.bits.dtmf_ready = 1;
2631 if(j->ex_sig.bits.dtmf_ready) {
2632 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2635 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2636 if(ixjdebug & 0x0020) {
2637 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2639 j->flags.cidcw_ack = 1;
2648 /************************************************************************
2650 * Functions to allow alaw <-> ulaw conversions.
2652 ************************************************************************/
2654 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2656 static unsigned char table_ulaw2alaw[] =
2658 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2659 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2660 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2661 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2662 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2663 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2664 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2665 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2666 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2667 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2668 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2669 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2670 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2671 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2672 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2673 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2674 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2675 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2676 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2677 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2678 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2679 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2680 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2681 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2682 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2683 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2684 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2685 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2686 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2687 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2688 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2689 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2694 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2699 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2701 static unsigned char table_alaw2ulaw[] =
2703 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2704 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2705 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2706 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2707 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2708 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2709 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2710 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2711 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2712 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2713 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2714 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2715 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2716 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2717 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2718 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2719 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2720 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2721 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2722 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2723 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2724 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2725 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2726 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2727 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2728 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2729 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2730 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2731 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2732 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2733 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2734 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2739 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2744 static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2746 unsigned long i = *ppos;
2747 IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2749 DECLARE_WAITQUEUE(wait, current);
2751 if (j->flags.inread)
2754 j->flags.inread = 1;
2756 add_wait_queue(&j->read_q, &wait);
2757 set_current_state(TASK_INTERRUPTIBLE);
2760 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2762 if (file_p->f_flags & O_NONBLOCK) {
2763 set_current_state(TASK_RUNNING);
2764 remove_wait_queue(&j->read_q, &wait);
2765 j->flags.inread = 0;
2768 if (!ixj_hookstate(j)) {
2769 set_current_state(TASK_RUNNING);
2770 remove_wait_queue(&j->read_q, &wait);
2771 j->flags.inread = 0;
2774 interruptible_sleep_on(&j->read_q);
2775 if (signal_pending(current)) {
2776 set_current_state(TASK_RUNNING);
2777 remove_wait_queue(&j->read_q, &wait);
2778 j->flags.inread = 0;
2783 remove_wait_queue(&j->read_q, &wait);
2784 set_current_state(TASK_RUNNING);
2785 /* Don't ever copy more than the user asks */
2786 if(j->rec_codec == ALAW)
2787 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2788 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2789 j->read_buffer_ready = 0;
2791 j->flags.inread = 0;
2794 j->flags.inread = 0;
2795 return min(length, j->read_buffer_size);
2799 static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2803 ssize_t read_retval = 0;
2804 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2806 pre_retval = ixj_PreRead(j, 0L);
2807 switch (pre_retval) {
2809 read_retval = ixj_read(file_p, buf, length, ppos);
2810 ixj_PostRead(j, 0L);
2813 read_retval = ixj_read(file_p, buf, length, ppos);
2816 ixj_PostRead(j, 0L);
2819 read_retval = pre_retval;
2824 static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2826 unsigned long i = *ppos;
2827 IXJ *j = file_p->private_data;
2829 DECLARE_WAITQUEUE(wait, current);
2831 if (j->flags.inwrite)
2834 j->flags.inwrite = 1;
2836 add_wait_queue(&j->write_q, &wait);
2837 set_current_state(TASK_INTERRUPTIBLE);
2841 while (!j->write_buffers_empty) {
2843 if (file_p->f_flags & O_NONBLOCK) {
2844 set_current_state(TASK_RUNNING);
2845 remove_wait_queue(&j->write_q, &wait);
2846 j->flags.inwrite = 0;
2849 if (!ixj_hookstate(j)) {
2850 set_current_state(TASK_RUNNING);
2851 remove_wait_queue(&j->write_q, &wait);
2852 j->flags.inwrite = 0;
2855 interruptible_sleep_on(&j->write_q);
2856 if (signal_pending(current)) {
2857 set_current_state(TASK_RUNNING);
2858 remove_wait_queue(&j->write_q, &wait);
2859 j->flags.inwrite = 0;
2863 set_current_state(TASK_RUNNING);
2864 remove_wait_queue(&j->write_q, &wait);
2865 if (j->write_buffer_wp + count >= j->write_buffer_end)
2866 j->write_buffer_wp = j->write_buffer;
2867 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2869 j->flags.inwrite = 0;
2872 if(j->play_codec == ALAW)
2873 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2874 j->flags.inwrite = 0;
2875 return min(count, j->write_buffer_size);
2878 static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2881 ssize_t write_retval = 0;
2883 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2885 pre_retval = ixj_PreWrite(j, 0L);
2886 switch (pre_retval) {
2888 write_retval = ixj_write(file_p, buf, count, ppos);
2889 if (write_retval > 0) {
2890 ixj_PostWrite(j, 0L);
2891 j->write_buffer_wp += write_retval;
2892 j->write_buffers_empty--;
2896 write_retval = ixj_write(file_p, buf, count, ppos);
2897 if (write_retval > 0) {
2898 j->write_buffer_wp += write_retval;
2899 j->write_buffers_empty--;
2903 ixj_PostWrite(j, 0L);
2906 write_retval = pre_retval;
2908 return write_retval;
2911 static void ixj_read_frame(IXJ *j)
2915 if (j->read_buffer) {
2916 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2917 if (!(cnt % 16) && !IsRxReady(j)) {
2919 while (!IsRxReady(j)) {
2927 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2928 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2929 inb_p(j->DSPbase + 0x0E);
2930 inb_p(j->DSPbase + 0x0F);
2932 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2933 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2936 if (j->intercom != -1) {
2937 if (IsTxReady(get_ixj(j->intercom))) {
2938 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2939 if (!(cnt % 16) && !IsTxReady(j)) {
2941 while (!IsTxReady(j)) {
2949 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2950 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2952 get_ixj(j->intercom)->frameswritten++;
2955 j->read_buffer_ready = 1;
2956 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2958 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2960 if(j->ixj_signals[SIG_READ_READY])
2961 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2966 static short fsk[][6][20] =
2970 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2971 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2974 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2975 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2978 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2979 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2982 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2983 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2986 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2987 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2990 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2991 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2996 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
2997 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3000 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3001 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3004 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3005 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3008 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3009 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3012 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3013 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3016 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3017 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3023 static void ixj_write_cid_bit(IXJ *j, int bit)
3025 while (j->fskcnt < 20) {
3026 if(j->fskdcnt < (j->fsksize - 1))
3027 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3040 static void ixj_write_cid_byte(IXJ *j, char byte)
3045 ixj_write_cid_bit(j, 0);
3046 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3047 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3048 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3049 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3050 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3051 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3052 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3053 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3054 ixj_write_cid_bit(j, 1);
3057 static void ixj_write_cid_seize(IXJ *j)
3061 for (cnt = 0; cnt < 150; cnt++) {
3062 ixj_write_cid_bit(j, 0);
3063 ixj_write_cid_bit(j, 1);
3065 for (cnt = 0; cnt < 180; cnt++) {
3066 ixj_write_cid_bit(j, 1);
3070 static void ixj_write_cidcw_seize(IXJ *j)
3074 for (cnt = 0; cnt < 80; cnt++) {
3075 ixj_write_cid_bit(j, 1);
3079 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3083 for (cnt = 0; cnt < strlen(s); cnt++) {
3084 ixj_write_cid_byte(j, s[cnt]);
3085 checksum = (checksum + s[cnt]);
3090 static void ixj_pad_fsk(IXJ *j, int pad)
3094 for (cnt = 0; cnt < pad; cnt++) {
3095 if(j->fskdcnt < (j->fsksize - 1))
3096 j->fskdata[j->fskdcnt++] = 0x0000;
3098 for (cnt = 0; cnt < 720; cnt++) {
3099 if(j->fskdcnt < (j->fsksize - 1))
3100 j->fskdata[j->fskdcnt++] = 0x0000;
3104 static void ixj_pre_cid(IXJ *j)
3106 j->cid_play_codec = j->play_codec;
3107 j->cid_play_frame_size = j->play_frame_size;
3108 j->cid_play_volume = get_play_volume(j);
3109 j->cid_play_flag = j->flags.playing;
3111 j->cid_rec_codec = j->rec_codec;
3112 j->cid_rec_volume = get_rec_volume(j);
3113 j->cid_rec_flag = j->flags.recording;
3115 j->cid_play_aec_level = j->aec_level;
3117 switch(j->baseframe.low) {
3119 j->cid_base_frame_size = 20;
3122 j->cid_base_frame_size = 10;
3125 j->cid_base_frame_size = 30;
3132 j->flags.cidplay = 1;
3134 set_base_frame(j, 30);
3135 set_play_codec(j, LINEAR16);
3136 set_play_volume(j, 0x1B);
3140 static void ixj_post_cid(IXJ *j)
3144 if(j->cidsize > 5000) {
3145 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3147 j->flags.cidplay = 0;
3148 if(ixjdebug & 0x0200) {
3149 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3155 set_base_frame(j, j->cid_base_frame_size);
3156 set_play_codec(j, j->cid_play_codec);
3157 ixj_aec_start(j, j->cid_play_aec_level);
3158 set_play_volume(j, j->cid_play_volume);
3160 set_rec_codec(j, j->cid_rec_codec);
3161 set_rec_volume(j, j->cid_rec_volume);
3164 ixj_record_start(j);
3166 if(j->cid_play_flag)
3169 if(j->cid_play_flag) {
3170 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3174 static void ixj_write_cid(IXJ *j)
3179 char mdmflen, len1, len2, len3;
3184 if (j->dsp.low == 0x20 || j->flags.cidplay)
3187 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3188 j->cidsize = j->cidcnt = 0;
3192 strcpy(sdmf1, j->cid_send.month);
3193 strcat(sdmf1, j->cid_send.day);
3194 strcat(sdmf1, j->cid_send.hour);
3195 strcat(sdmf1, j->cid_send.min);
3196 strcpy(sdmf2, j->cid_send.number);
3197 strcpy(sdmf3, j->cid_send.name);
3199 len1 = strlen(sdmf1);
3200 len2 = strlen(sdmf2);
3201 len3 = strlen(sdmf3);
3202 mdmflen = len1 + len2 + len3 + 6;
3205 ixj_write_cid_seize(j);
3207 ixj_write_cid_byte(j, 0x80);
3209 ixj_write_cid_byte(j, mdmflen);
3210 checksum = checksum + mdmflen;
3212 ixj_write_cid_byte(j, 0x01);
3213 checksum = checksum + 0x01;
3214 ixj_write_cid_byte(j, len1);
3215 checksum = checksum + len1;
3216 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3217 if(ixj_hookstate(j) & 1)
3220 ixj_write_cid_byte(j, 0x02);
3221 checksum = checksum + 0x02;
3222 ixj_write_cid_byte(j, len2);
3223 checksum = checksum + len2;
3224 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3225 if(ixj_hookstate(j) & 1)
3228 ixj_write_cid_byte(j, 0x07);
3229 checksum = checksum + 0x07;
3230 ixj_write_cid_byte(j, len3);
3231 checksum = checksum + len3;
3232 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3233 if(ixj_hookstate(j) & 1)
3240 ixj_write_cid_byte(j, (char) checksum);
3242 pad = j->fskdcnt % 240;
3246 ixj_pad_fsk(j, pad);
3253 static void ixj_write_cidcw(IXJ *j)
3260 char mdmflen, len1, len2, len3;
3265 if (j->dsp.low == 0x20 || j->flags.cidplay)
3268 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3269 j->cidsize = j->cidcnt = 0;
3273 j->flags.cidcw_ack = 0;
3280 ixj_init_tone(j, &ti);
3282 ixj_set_tone_on(1500, j);
3283 ixj_set_tone_off(32, j);
3284 if(ixjdebug & 0x0200) {
3285 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3287 ixj_play_tone(j, 23);
3289 clear_bit(j->board, &j->busyflags);
3290 while(j->tone_state)
3291 schedule_timeout_interruptible(1);
3292 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3293 schedule_timeout_interruptible(1);
3294 if(ixjdebug & 0x0200) {
3295 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3303 ixj_init_tone(j, &ti);
3305 ixj_set_tone_off(10, j);
3306 ixj_set_tone_on(600, j);
3307 if(ixjdebug & 0x0200) {
3308 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3310 ixj_play_tone(j, 24);
3312 clear_bit(j->board, &j->busyflags);
3313 while(j->tone_state)
3314 schedule_timeout_interruptible(1);
3315 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3316 schedule_timeout_interruptible(1);
3317 if(ixjdebug & 0x0200) {
3318 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3321 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3323 clear_bit(j->board, &j->busyflags);
3324 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3325 schedule_timeout_interruptible(1);
3326 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3327 schedule_timeout_interruptible(1);
3329 if(!j->flags.cidcw_ack) {
3330 if(ixjdebug & 0x0200) {
3331 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3334 if(j->cid_play_flag) {
3335 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3341 j->flags.cidcw_ack = 0;
3342 strcpy(sdmf1, j->cid_send.month);
3343 strcat(sdmf1, j->cid_send.day);
3344 strcat(sdmf1, j->cid_send.hour);
3345 strcat(sdmf1, j->cid_send.min);
3346 strcpy(sdmf2, j->cid_send.number);
3347 strcpy(sdmf3, j->cid_send.name);
3349 len1 = strlen(sdmf1);
3350 len2 = strlen(sdmf2);
3351 len3 = strlen(sdmf3);
3352 mdmflen = len1 + len2 + len3 + 6;
3354 ixj_write_cidcw_seize(j);
3356 ixj_write_cid_byte(j, 0x80);
3358 ixj_write_cid_byte(j, mdmflen);
3359 checksum = checksum + mdmflen;
3361 ixj_write_cid_byte(j, 0x01);
3362 checksum = checksum + 0x01;
3363 ixj_write_cid_byte(j, len1);
3364 checksum = checksum + len1;
3365 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3367 ixj_write_cid_byte(j, 0x02);
3368 checksum = checksum + 0x02;
3369 ixj_write_cid_byte(j, len2);
3370 checksum = checksum + len2;
3371 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3373 ixj_write_cid_byte(j, 0x07);
3374 checksum = checksum + 0x07;
3375 ixj_write_cid_byte(j, len3);
3376 checksum = checksum + len3;
3377 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3383 ixj_write_cid_byte(j, (char) checksum);
3385 pad = j->fskdcnt % 240;
3389 ixj_pad_fsk(j, pad);
3390 if(ixjdebug & 0x0200) {
3391 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3395 static void ixj_write_vmwi(IXJ *j, int msg)
3402 if (j->dsp.low == 0x20 || j->flags.cidplay)
3405 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3406 j->cidsize = j->cidcnt = 0;
3412 if (j->port == PORT_POTS)
3413 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3415 ixj_write_cid_seize(j);
3417 ixj_write_cid_byte(j, 0x82);
3419 ixj_write_cid_byte(j, mdmflen);
3420 checksum = checksum + mdmflen;
3422 ixj_write_cid_byte(j, 0x0B);
3423 checksum = checksum + 0x0B;
3424 ixj_write_cid_byte(j, 1);
3425 checksum = checksum + 1;
3428 ixj_write_cid_byte(j, 0xFF);
3429 checksum = checksum + 0xFF;
3432 ixj_write_cid_byte(j, 0x00);
3433 checksum = checksum + 0x00;
3440 ixj_write_cid_byte(j, (char) checksum);
3442 pad = j->fskdcnt % 240;
3446 ixj_pad_fsk(j, pad);
3449 static void ixj_write_frame(IXJ *j)
3451 int cnt, frame_count, dly;
3455 if(j->flags.cidplay) {
3456 for(cnt = 0; cnt < 480; cnt++) {
3457 if (!(cnt % 16) && !IsTxReady(j)) {
3459 while (!IsTxReady(j)) {
3467 dat.word = j->fskdata[j->cidcnt++];
3468 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3469 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3472 if(j->cidcnt >= j->fskdcnt) {
3475 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3476 and there is real audio data in the buffer, we need to throw it away because
3477 we just used it's time slot */
3478 if (j->write_buffer_rp > j->write_buffer_wp) {
3479 j->write_buffer_rp += j->cid_play_frame_size * 2;
3480 if (j->write_buffer_rp >= j->write_buffer_end) {
3481 j->write_buffer_rp = j->write_buffer;
3483 j->write_buffers_empty++;
3484 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3486 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3488 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3489 if (j->write_buffer_wp > j->write_buffer_rp) {
3491 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3493 if (j->write_buffer_rp > j->write_buffer_wp) {
3495 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3496 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3498 if (frame_count >= 1) {
3499 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3502 switch (j->play_mode) {
3503 case PLAYBACK_MODE_ULAW:
3504 case PLAYBACK_MODE_ALAW:
3505 blankword.low = blankword.high = 0xFF;
3507 case PLAYBACK_MODE_8LINEAR:
3508 case PLAYBACK_MODE_16LINEAR:
3510 blankword.low = blankword.high = 0x00;
3512 case PLAYBACK_MODE_8LINEAR_WSS:
3513 blankword.low = blankword.high = 0x80;
3516 for (cnt = 0; cnt < 16; cnt++) {
3517 if (!(cnt % 16) && !IsTxReady(j)) {
3519 while (!IsTxReady(j)) {
3527 outb_p((blankword.low), j->DSPbase + 0x0C);
3528 outb_p((blankword.high), j->DSPbase + 0x0D);
3530 j->flags.play_first_frame = 0;
3531 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3532 for (cnt = 0; cnt < 24; cnt++) {
3536 blankword.low = 0x02;
3537 blankword.high = 0x00;
3540 blankword.low = blankword.high = 0x00;
3542 if (!(cnt % 16) && !IsTxReady(j)) {
3544 while (!IsTxReady(j)) {
3552 outb_p((blankword.low), j->DSPbase + 0x0C);
3553 outb_p((blankword.high), j->DSPbase + 0x0D);
3555 j->flags.play_first_frame = 0;
3557 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3558 if (!(cnt % 16) && !IsTxReady(j)) {
3560 while (!IsTxReady(j)) {
3568 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3569 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3570 if (j->write_buffer_rp[cnt] == 0 &&
3571 j->write_buffer_rp[cnt + 1] == 0 &&
3572 j->write_buffer_rp[cnt + 2] == 0 &&
3573 j->write_buffer_rp[cnt + 3] == 0 &&
3574 j->write_buffer_rp[cnt + 4] == 0 &&
3575 j->write_buffer_rp[cnt + 5] == 0 &&
3576 j->write_buffer_rp[cnt + 6] == 0 &&
3577 j->write_buffer_rp[cnt + 7] == 0 &&
3578 j->write_buffer_rp[cnt + 8] == 0 &&
3579 j->write_buffer_rp[cnt + 9] == 0) {
3580 /* someone is trying to write silence lets make this a type 0 frame. */
3581 outb_p(0x00, j->DSPbase + 0x0C);
3582 outb_p(0x00, j->DSPbase + 0x0D);
3584 /* so all other frames are type 1. */
3585 outb_p(0x01, j->DSPbase + 0x0C);
3586 outb_p(0x00, j->DSPbase + 0x0D);
3589 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3590 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3591 *(j->write_buffer_rp + cnt) = 0;
3592 *(j->write_buffer_rp + cnt + 1) = 0;
3594 j->write_buffer_rp += j->play_frame_size * 2;
3595 if (j->write_buffer_rp >= j->write_buffer_end) {
3596 j->write_buffer_rp = j->write_buffer;
3598 j->write_buffers_empty++;
3599 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3601 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3608 if(j->ixj_signals[SIG_WRITE_READY]) {
3609 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3613 static int idle(IXJ *j)
3615 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3619 if (j->ssr.high || j->ssr.low) {
3623 j->flags.playing = 0;
3625 j->flags.recording = 0;
3630 static int set_base_frame(IXJ *j, int size)
3636 j->cid_play_aec_level = j->aec_level;
3638 for (cnt = 0; cnt < 10; cnt++) {
3642 if (j->ssr.high || j->ssr.low)
3644 if (j->dsp.low != 0x20) {
3648 /* Set Base Frame Size to 240 pg9-10 8021 */
3652 /* Set Base Frame Size to 160 pg9-10 8021 */
3656 /* Set Base Frame Size to 80 pg9-10 8021 */
3667 if (ixj_WriteDSPCommand(cmd, j)) {
3668 j->baseframe.high = j->baseframe.low = 0xFF;
3671 j->baseframe.high = j->ssr.high;
3672 j->baseframe.low = j->ssr.low;
3673 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3674 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3678 ixj_aec_start(j, j->cid_play_aec_level);
3682 static int set_rec_codec(IXJ *j, int rate)
3686 j->rec_codec = rate;
3690 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3691 j->rec_frame_size = 12;
3698 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3699 j->rec_frame_size = 10;
3706 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3707 j->rec_frame_size = 16;
3714 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3715 j->rec_frame_size = 9;
3722 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3723 j->rec_frame_size = 8;
3730 if (j->dsp.low != 0x20) {
3731 j->rec_frame_size = 48;
3738 if (j->dsp.low != 0x20) {
3739 if (!j->flags.g729_loaded) {
3743 switch (j->baseframe.low) {
3745 j->rec_frame_size = 10;
3748 j->rec_frame_size = 5;
3751 j->rec_frame_size = 15;
3760 if (j->dsp.low != 0x20) {
3761 if (!j->flags.g729_loaded) {
3765 switch (j->baseframe.low) {
3767 j->rec_frame_size = 12;
3770 j->rec_frame_size = 6;
3773 j->rec_frame_size = 18;
3782 switch (j->baseframe.low) {
3784 j->rec_frame_size = 80;
3787 j->rec_frame_size = 40;
3790 j->rec_frame_size = 120;
3796 switch (j->baseframe.low) {
3798 j->rec_frame_size = 80;
3801 j->rec_frame_size = 40;
3804 j->rec_frame_size = 120;
3810 switch (j->baseframe.low) {
3812 j->rec_frame_size = 160;
3815 j->rec_frame_size = 80;
3818 j->rec_frame_size = 240;
3824 switch (j->baseframe.low) {
3826 j->rec_frame_size = 80;
3829 j->rec_frame_size = 40;
3832 j->rec_frame_size = 120;
3838 switch (j->baseframe.low) {
3840 j->rec_frame_size = 80;
3843 j->rec_frame_size = 40;
3846 j->rec_frame_size = 120;
3852 kfree(j->read_buffer);
3853 j->rec_frame_size = 0;
3855 j->read_buffer = NULL;
3856 j->read_buffer_size = 0;
3863 static int ixj_record_start(IXJ *j)
3865 unsigned short cmd = 0x0000;
3867 if (j->read_buffer) {
3870 j->flags.recording = 1;
3871 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3873 if(ixjdebug & 0x0002)
3874 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3877 switch (j->rec_codec) {
3885 cmd = 0x5130; /* TrueSpeech 8.5 */
3889 cmd = 0x5133; /* TrueSpeech 4.8 */
3893 cmd = 0x5134; /* TrueSpeech 4.1 */
3906 if (ixj_WriteDSPCommand(cmd, j))
3909 if (!j->read_buffer) {
3910 if (!j->read_buffer)
3911 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3912 if (!j->read_buffer) {
3913 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3917 j->read_buffer_size = j->rec_frame_size * 2;
3919 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3923 switch (j->rec_mode) {
3925 cmd = 0x1C03; /* Record C1 */
3929 if (j->ver.low == 0x12) {
3930 cmd = 0x1E03; /* Record C1 */
3933 cmd = 0x1E01; /* Record C1 */
3938 if (j->ver.low == 0x12) {
3939 cmd = 0x1E83; /* Record C1 */
3942 cmd = 0x1E81; /* Record C1 */
3947 if (j->ver.low == 0x12) {
3948 cmd = 0x1F03; /* Record C1 */
3951 cmd = 0x1F01; /* Record C1 */
3956 if (j->ver.low == 0x12) {
3957 cmd = 0x1F83; /* Record C1 */
3959 cmd = 0x1F81; /* Record C1 */
3963 if (ixj_WriteDSPCommand(cmd, j))
3966 if (j->flags.playing) {
3967 ixj_aec_start(j, j->aec_level);
3972 static void ixj_record_stop(IXJ *j)
3974 if (ixjdebug & 0x0002)
3975 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3977 kfree(j->read_buffer);
3978 j->read_buffer = NULL;
3979 j->read_buffer_size = 0;
3980 if (j->rec_mode > -1) {
3981 ixj_WriteDSPCommand(0x5120, j);
3984 j->flags.recording = 0;
3986 static void ixj_vad(IXJ *j, int arg)
3989 ixj_WriteDSPCommand(0x513F, j);
3991 ixj_WriteDSPCommand(0x513E, j);
3994 static void set_rec_depth(IXJ *j, int depth)
4000 ixj_WriteDSPCommand(0x5180 + depth, j);
4003 static void set_dtmf_prescale(IXJ *j, int volume)
4005 ixj_WriteDSPCommand(0xCF07, j);
4006 ixj_WriteDSPCommand(volume, j);
4009 static int get_dtmf_prescale(IXJ *j)
4011 ixj_WriteDSPCommand(0xCF05, j);
4012 return j->ssr.high << 8 | j->ssr.low;
4015 static void set_rec_volume(IXJ *j, int volume)
4017 if(j->aec_level == AEC_AGC) {
4018 if (ixjdebug & 0x0002)
4019 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4020 ixj_WriteDSPCommand(0xCF96, j);
4021 ixj_WriteDSPCommand(volume, j);
4023 if (ixjdebug & 0x0002)
4024 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4025 ixj_WriteDSPCommand(0xCF03, j);
4026 ixj_WriteDSPCommand(volume, j);
4030 static int set_rec_volume_linear(IXJ *j, int volume)
4032 int newvolume, dsprecmax;
4034 if (ixjdebug & 0x0002)
4035 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4036 if(volume > 100 || volume < 0) {
4040 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4041 switch (j->cardtype) {
4047 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4048 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4049 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4051 case QTI_PHONEJACK_LITE:
4054 case QTI_PHONEJACK_PCI:
4063 newvolume = (dsprecmax * volume) / 100;
4064 set_rec_volume(j, newvolume);
4068 static int get_rec_volume(IXJ *j)
4070 if(j->aec_level == AEC_AGC) {
4071 if (ixjdebug & 0x0002)
4072 printk(KERN_INFO "Getting AGC Threshold\n");
4073 ixj_WriteDSPCommand(0xCF86, j);
4074 if (ixjdebug & 0x0002)
4075 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4076 return j->ssr.high << 8 | j->ssr.low;
4078 if (ixjdebug & 0x0002)
4079 printk(KERN_INFO "Getting Record Volume\n");
4080 ixj_WriteDSPCommand(0xCF01, j);
4081 return j->ssr.high << 8 | j->ssr.low;
4085 static int get_rec_volume_linear(IXJ *j)
4087 int volume, newvolume, dsprecmax;
4089 switch (j->cardtype) {
4096 case QTI_PHONEJACK_LITE:
4099 case QTI_PHONEJACK_PCI:
4108 volume = get_rec_volume(j);
4109 newvolume = (volume * 100) / dsprecmax;
4115 static int get_rec_level(IXJ *j)
4119 ixj_WriteDSPCommand(0xCF88, j);
4121 retval = j->ssr.high << 8 | j->ssr.low;
4122 retval = (retval * 256) / 240;
4126 static void ixj_aec_start(IXJ *j, int level)
4128 j->aec_level = level;
4129 if (ixjdebug & 0x0002)
4130 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4134 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4135 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4137 ixj_WriteDSPCommand(0x0300, j);
4139 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4141 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4145 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4147 ixj_WriteDSPCommand(0xE011, j);
4148 ixj_WriteDSPCommand(0xFFFF, j);
4150 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4151 ixj_WriteDSPCommand(0x0000, j); /* to off */
4156 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4158 ixj_WriteDSPCommand(0xE011, j);
4159 ixj_WriteDSPCommand(0x0080, j);
4161 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4162 ixj_WriteDSPCommand(0x0000, j); /* to off */
4167 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4169 ixj_WriteDSPCommand(0xE011, j);
4170 ixj_WriteDSPCommand(0x0080, j);
4172 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4173 ixj_WriteDSPCommand(0x0000, j); /* to off */
4178 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4179 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4181 ixj_WriteDSPCommand(0xE011, j);
4182 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4184 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4186 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4187 ixj_WriteDSPCommand(0x0224, j);
4189 ixj_WriteDSPCommand(0x1224, j);
4191 ixj_WriteDSPCommand(0xE014, j);
4192 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4194 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4196 /* Now we can set the AGC initial parameters and turn it on */
4197 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4198 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4200 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4201 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4203 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4204 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4206 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4207 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4209 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4210 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4212 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4213 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4215 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4216 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4218 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4219 ixj_WriteDSPCommand(0x0001, j); /* to on */
4224 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4226 ixj_WriteDSPCommand(0xE011, j);
4227 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4229 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4231 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4232 ixj_WriteDSPCommand(0x0224, j);
4234 ixj_WriteDSPCommand(0x1224, j);
4236 ixj_WriteDSPCommand(0xE014, j);
4237 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4239 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4246 static void aec_stop(IXJ *j)
4248 j->aec_level = AEC_OFF;
4249 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4250 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4252 ixj_WriteDSPCommand(0x0700, j);
4254 if (j->play_mode != -1 && j->rec_mode != -1)
4256 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4260 static int set_play_codec(IXJ *j, int rate)
4264 j->play_codec = rate;
4268 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4269 j->play_frame_size = 12;
4276 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4277 j->play_frame_size = 10;
4284 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4285 j->play_frame_size = 16;
4292 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4293 j->play_frame_size = 9;
4300 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4301 j->play_frame_size = 8;
4308 if (j->dsp.low != 0x20) {
4309 j->play_frame_size = 48;
4316 if (j->dsp.low != 0x20) {
4317 if (!j->flags.g729_loaded) {
4321 switch (j->baseframe.low) {
4323 j->play_frame_size = 10;
4326 j->play_frame_size = 5;
4329 j->play_frame_size = 15;
4338 if (j->dsp.low != 0x20) {
4339 if (!j->flags.g729_loaded) {
4343 switch (j->baseframe.low) {
4345 j->play_frame_size = 12;
4348 j->play_frame_size = 6;
4351 j->play_frame_size = 18;
4360 switch (j->baseframe.low) {
4362 j->play_frame_size = 80;
4365 j->play_frame_size = 40;
4368 j->play_frame_size = 120;
4374 switch (j->baseframe.low) {
4376 j->play_frame_size = 80;
4379 j->play_frame_size = 40;
4382 j->play_frame_size = 120;
4388 switch (j->baseframe.low) {
4390 j->play_frame_size = 160;
4393 j->play_frame_size = 80;
4396 j->play_frame_size = 240;
4402 switch (j->baseframe.low) {
4404 j->play_frame_size = 80;
4407 j->play_frame_size = 40;
4410 j->play_frame_size = 120;
4416 switch (j->baseframe.low) {
4418 j->play_frame_size = 80;
4421 j->play_frame_size = 40;
4424 j->play_frame_size = 120;
4430 kfree(j->write_buffer);
4431 j->play_frame_size = 0;
4433 j->write_buffer = NULL;
4434 j->write_buffer_size = 0;
4441 static int ixj_play_start(IXJ *j)
4443 unsigned short cmd = 0x0000;
4445 if (j->write_buffer) {
4449 if(ixjdebug & 0x0002)
4450 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4452 j->flags.playing = 1;
4453 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4455 j->flags.play_first_frame = 1;
4458 if (!j->play_mode) {
4459 switch (j->play_codec) {
4467 cmd = 0x5230; /* TrueSpeech 8.5 */
4471 cmd = 0x5233; /* TrueSpeech 4.8 */
4475 cmd = 0x5234; /* TrueSpeech 4.1 */
4488 if (ixj_WriteDSPCommand(cmd, j))
4491 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4492 if (!j->write_buffer) {
4493 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4496 /* j->write_buffers_empty = 2; */
4497 j->write_buffers_empty = 1;
4498 j->write_buffer_size = j->play_frame_size * 2;
4499 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4500 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4502 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4506 switch (j->play_mode) {
4511 if (j->ver.low == 0x12) {
4518 if (j->ver.low == 0x12) {
4525 if (j->ver.low == 0x12) {
4532 if (j->ver.low == 0x12) {
4539 if (ixj_WriteDSPCommand(cmd, j))
4542 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4545 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4548 if (j->flags.recording) {
4549 ixj_aec_start(j, j->aec_level);
4555 static void ixj_play_stop(IXJ *j)
4557 if (ixjdebug & 0x0002)
4558 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4560 kfree(j->write_buffer);
4561 j->write_buffer = NULL;
4562 j->write_buffer_size = 0;
4563 if (j->play_mode > -1) {
4564 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4568 j->flags.playing = 0;
4571 static inline int get_play_level(IXJ *j)
4575 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4576 return j->ssr.high << 8 | j->ssr.low;
4577 retval = j->ssr.high << 8 | j->ssr.low;
4578 retval = (retval * 256) / 240;
4582 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4584 unsigned int mask = 0;
4586 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4588 poll_wait(file_p, &(j->poll_q), wait);
4589 if (j->read_buffer_ready > 0)
4590 mask |= POLLIN | POLLRDNORM; /* readable */
4591 if (j->write_buffers_empty > 0)
4592 mask |= POLLOUT | POLLWRNORM; /* writable */
4598 static int ixj_play_tone(IXJ *j, char tone)
4600 if (!j->tone_state) {
4601 if(ixjdebug & 0x0002) {
4602 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4604 if (j->dsp.low == 0x20) {
4607 j->tone_start_jif = jiffies;
4612 j->tone_index = tone;
4613 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4619 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4621 j->tone_on_time = arg;
4623 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4627 if (ixj_WriteDSPCommand(arg, j))
4633 static int SCI_WaitHighSCI(IXJ *j)
4637 j->pld_scrr.byte = inb_p(j->XILINXbase);
4638 if (!j->pld_scrr.bits.sci) {
4639 for (cnt = 0; cnt < 10; cnt++) {
4641 j->pld_scrr.byte = inb_p(j->XILINXbase);
4643 if ((j->pld_scrr.bits.sci))
4646 if (ixjdebug & 0x0001)
4647 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4653 static int SCI_WaitLowSCI(IXJ *j)
4657 j->pld_scrr.byte = inb_p(j->XILINXbase);
4658 if (j->pld_scrr.bits.sci) {
4659 for (cnt = 0; cnt < 10; cnt++) {
4661 j->pld_scrr.byte = inb_p(j->XILINXbase);
4663 if (!(j->pld_scrr.bits.sci))
4666 if (ixjdebug & 0x0001)
4667 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4673 static int SCI_Control(IXJ *j, int control)
4677 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4679 j->pld_scrw.bits.c1 = 0; /* to no selection */
4682 case SCI_Enable_DAA:
4683 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4685 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4688 case SCI_Enable_Mixer:
4689 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4691 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4694 case SCI_Enable_EEPROM:
4695 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4697 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4704 outb_p(j->pld_scrw.byte, j->XILINXbase);
4710 case SCI_Enable_DAA:
4711 case SCI_Enable_Mixer:
4712 case SCI_Enable_EEPROM:
4713 if (!SCI_WaitHighSCI(j))
4723 static int SCI_Prepare(IXJ *j)
4725 if (!SCI_Control(j, SCI_End))
4728 if (!SCI_WaitLowSCI(j))
4734 static int ixj_get_mixer(long val, IXJ *j)
4736 int reg = (val & 0x1F00) >> 8;
4737 return j->mix.vol[reg];
4740 static int ixj_mixer(long val, IXJ *j)
4744 bytes.high = (val & 0x1F00) >> 8;
4745 bytes.low = val & 0x00FF;
4747 /* save mixer value so we can get back later on */
4748 j->mix.vol[bytes.high] = bytes.low;
4750 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4752 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4754 SCI_Control(j, SCI_Enable_Mixer);
4756 SCI_Control(j, SCI_End);
4761 static int daa_load(BYTES * p_bytes, IXJ *j)
4763 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4764 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4765 if (!SCI_Control(j, SCI_Enable_DAA))
4771 static int ixj_daa_cr4(IXJ *j, char reg)
4775 switch (j->daa_mode) {
4779 case SOP_PU_RINGING:
4782 case SOP_PU_CONVERSATION:
4785 case SOP_PU_PULSEDIALING:
4790 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4792 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4794 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4797 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4800 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4803 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4807 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4809 if (!daa_load(&bytes, j))
4812 if (!SCI_Prepare(j))
4818 static char daa_int_read(IXJ *j)
4822 if (!SCI_Prepare(j))
4827 outb_p(bytes.high, j->XILINXbase + 0x03);
4828 outb_p(bytes.low, j->XILINXbase + 0x02);
4830 if (!SCI_Control(j, SCI_Enable_DAA))
4833 bytes.high = inb_p(j->XILINXbase + 0x03);
4834 bytes.low = inb_p(j->XILINXbase + 0x02);
4835 if (bytes.low != ALISDAA_ID_BYTE) {
4836 if (ixjdebug & 0x0001)
4837 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4840 if (!SCI_Control(j, SCI_Enable_DAA))
4842 if (!SCI_Control(j, SCI_End))
4845 bytes.high = inb_p(j->XILINXbase + 0x03);
4846 bytes.low = inb_p(j->XILINXbase + 0x02);
4848 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4853 static char daa_CR_read(IXJ *j, int cr)
4858 if (!SCI_Prepare(j))
4861 switch (j->daa_mode) {
4863 bytes.high = 0x30 + cr;
4865 case SOP_PU_RINGING:
4866 bytes.high = 0x70 + cr;
4868 case SOP_PU_CONVERSATION:
4869 bytes.high = 0xB0 + cr;
4871 case SOP_PU_PULSEDIALING:
4873 bytes.high = 0xF0 + cr;
4879 outb_p(bytes.high, j->XILINXbase + 0x03);
4880 outb_p(bytes.low, j->XILINXbase + 0x02);
4882 if (!SCI_Control(j, SCI_Enable_DAA))
4885 bytes.high = inb_p(j->XILINXbase + 0x03);
4886 bytes.low = inb_p(j->XILINXbase + 0x02);
4887 if (bytes.low != ALISDAA_ID_BYTE) {
4888 if (ixjdebug & 0x0001)
4889 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4892 if (!SCI_Control(j, SCI_Enable_DAA))
4894 if (!SCI_Control(j, SCI_End))
4897 wdata.word = inw_p(j->XILINXbase + 0x02);
4901 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4904 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4907 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4910 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4913 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4916 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4924 static int ixj_daa_cid_reset(IXJ *j)
4929 if (ixjdebug & 0x0002)
4930 printk("DAA Clearing CID ram\n");
4932 if (!SCI_Prepare(j))
4937 outb_p(bytes.high, j->XILINXbase + 0x03);
4938 outb_p(bytes.low, j->XILINXbase + 0x02);
4940 if (!SCI_Control(j, SCI_Enable_DAA))
4943 if (!SCI_WaitHighSCI(j))
4946 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4947 bytes.high = bytes.low = 0x00;
4948 outb_p(bytes.high, j->XILINXbase + 0x03);
4950 if (i < ALISDAA_CALLERID_SIZE - 1)
4951 outb_p(bytes.low, j->XILINXbase + 0x02);
4953 if (!SCI_Control(j, SCI_Enable_DAA))
4956 if (!SCI_WaitHighSCI(j))
4961 if (!SCI_Control(j, SCI_End))
4964 if (ixjdebug & 0x0002)
4965 printk("DAA CID ram cleared\n");
4970 static int ixj_daa_cid_read(IXJ *j)
4974 char CID[ALISDAA_CALLERID_SIZE];
4978 if (!SCI_Prepare(j))
4983 outb_p(bytes.high, j->XILINXbase + 0x03);
4984 outb_p(bytes.low, j->XILINXbase + 0x02);
4986 if (!SCI_Control(j, SCI_Enable_DAA))
4989 if (!SCI_WaitHighSCI(j))
4992 bytes.high = inb_p(j->XILINXbase + 0x03);
4993 bytes.low = inb_p(j->XILINXbase + 0x02);
4994 if (bytes.low != ALISDAA_ID_BYTE) {
4995 if (ixjdebug & 0x0001)
4996 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4999 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5000 bytes.high = bytes.low = 0x00;
5001 outb_p(bytes.high, j->XILINXbase + 0x03);
5002 outb_p(bytes.low, j->XILINXbase + 0x02);
5004 if (!SCI_Control(j, SCI_Enable_DAA))
5007 if (!SCI_WaitHighSCI(j))
5010 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5011 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5014 if (!SCI_Control(j, SCI_End))
5018 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5021 if ((pIn[1] & 0x03) == 0x01) {
5024 if ((pIn[2] & 0x0c) == 0x04) {
5025 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5027 if ((pIn[3] & 0x30) == 0x10) {
5028 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5030 if ((pIn[4] & 0xc0) == 0x40) {
5031 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5035 pIn += 5, pOut += 4;
5037 memset(&j->cid, 0, sizeof(PHONE_CID));
5038 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5040 strncpy(j->cid.month, pOut, 2);
5042 strncpy(j->cid.day, pOut, 2);
5044 strncpy(j->cid.hour, pOut, 2);
5046 strncpy(j->cid.min, pOut, 2);
5048 j->cid.numlen = *pOut;
5050 strncpy(j->cid.number, pOut, j->cid.numlen);
5051 pOut += j->cid.numlen + 1;
5052 j->cid.namelen = *pOut;
5054 strncpy(j->cid.name, pOut, j->cid.namelen);
5056 ixj_daa_cid_reset(j);
5060 static char daa_get_version(IXJ *j)
5064 if (!SCI_Prepare(j))
5069 outb_p(bytes.high, j->XILINXbase + 0x03);
5070 outb_p(bytes.low, j->XILINXbase + 0x02);
5072 if (!SCI_Control(j, SCI_Enable_DAA))
5075 bytes.high = inb_p(j->XILINXbase + 0x03);
5076 bytes.low = inb_p(j->XILINXbase + 0x02);
5077 if (bytes.low != ALISDAA_ID_BYTE) {
5078 if (ixjdebug & 0x0001)
5079 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5082 if (!SCI_Control(j, SCI_Enable_DAA))
5085 if (!SCI_Control(j, SCI_End))
5088 bytes.high = inb_p(j->XILINXbase + 0x03);
5089 bytes.low = inb_p(j->XILINXbase + 0x02);
5090 if (ixjdebug & 0x0002)
5091 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5092 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5096 static int daa_set_mode(IXJ *j, int mode)
5099 The DAA *MUST* be in the conversation mode if the
5100 PSTN line is to be seized (PSTN line off-hook).
5101 Taking the PSTN line off-hook while the DAA is in
5102 a mode other than conversation mode will cause a
5103 hardware failure of the ALIS-A part.
5106 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5107 if the PSTN line is on-hook. Failure to have the PSTN line
5108 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5114 j->flags.pstn_rmr = 0;
5116 if (!SCI_Prepare(j))
5121 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5123 outb_p(j->pld_scrw.byte, j->XILINXbase);
5124 j->pld_slicw.bits.rly2 = 0;
5125 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5127 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5128 daa_load(&bytes, j);
5129 if (!SCI_Prepare(j))
5132 j->daa_mode = SOP_PU_SLEEP;
5135 if(j->daa_mode == SOP_PU_SLEEP)
5139 if (ixjdebug & 0x0008)
5140 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5141 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5143 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5145 outb_p(j->pld_scrw.byte, j->XILINXbase);
5146 j->pld_slicw.bits.rly2 = 0;
5147 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5149 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5150 daa_load(&bytes, j);
5151 if (!SCI_Prepare(j))
5154 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5156 outb_p(j->pld_scrw.byte, j->XILINXbase);
5157 j->pld_slicw.bits.rly2 = 0;
5158 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5160 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5161 daa_load(&bytes, j);
5162 if (!SCI_Prepare(j))
5165 j->daa_mode = SOP_PU_SLEEP;
5166 j->flags.pstn_ringing = 0;
5167 j->ex.bits.pstn_ring = 0;
5168 j->pstn_sleeptil = jiffies + (hertz / 4);
5169 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5170 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5171 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5173 case SOP_PU_RINGING:
5174 if (ixjdebug & 0x0008)
5175 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5176 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5178 outb_p(j->pld_scrw.byte, j->XILINXbase);
5179 j->pld_slicw.bits.rly2 = 0;
5180 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5182 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5183 daa_load(&bytes, j);
5184 if (!SCI_Prepare(j))
5186 j->daa_mode = SOP_PU_RINGING;
5188 case SOP_PU_CONVERSATION:
5189 if (ixjdebug & 0x0008)
5190 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5192 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5193 daa_load(&bytes, j);
5194 if (!SCI_Prepare(j))
5196 j->pld_slicw.bits.rly2 = 1;
5197 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5198 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5200 outb_p(j->pld_scrw.byte, j->XILINXbase);
5201 j->daa_mode = SOP_PU_CONVERSATION;
5202 j->flags.pstn_ringing = 0;
5203 j->ex.bits.pstn_ring = 0;
5204 j->pstn_sleeptil = jiffies;
5205 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5207 case SOP_PU_PULSEDIALING:
5208 if (ixjdebug & 0x0008)
5209 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5210 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5212 outb_p(j->pld_scrw.byte, j->XILINXbase);
5213 j->pld_slicw.bits.rly2 = 0;
5214 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5216 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5217 daa_load(&bytes, j);
5218 if (!SCI_Prepare(j))
5220 j->daa_mode = SOP_PU_PULSEDIALING;
5228 static int ixj_daa_write(IXJ *j)
5232 j->flags.pstncheck = 1;
5234 daa_set_mode(j, SOP_PU_SLEEP);
5236 if (!SCI_Prepare(j))
5239 outb_p(j->pld_scrw.byte, j->XILINXbase);
5242 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5243 if (!daa_load(&bytes, j))
5246 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5247 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5248 if (!daa_load(&bytes, j))
5251 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5252 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5253 if (!daa_load(&bytes, j))
5256 if (!SCI_Prepare(j))
5260 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5261 if (!daa_load(&bytes, j))
5264 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5265 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5266 if (!daa_load(&bytes, j))
5269 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5270 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5271 if (!daa_load(&bytes, j))
5274 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5275 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5276 if (!daa_load(&bytes, j))
5279 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5281 if (!daa_load(&bytes, j))
5284 if (!SCI_Prepare(j))
5288 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5289 if (!daa_load(&bytes, j))
5292 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5293 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5294 if (!daa_load(&bytes, j))
5297 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5298 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5299 if (!daa_load(&bytes, j))
5302 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5303 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5304 if (!daa_load(&bytes, j))
5307 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5309 if (!daa_load(&bytes, j))
5312 if (!SCI_Control(j, SCI_End))
5314 if (!SCI_WaitLowSCI(j))
5318 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5319 if (!daa_load(&bytes, j))
5322 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5323 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5324 if (!daa_load(&bytes, j))
5327 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5328 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5329 if (!daa_load(&bytes, j))
5332 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5333 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5334 if (!daa_load(&bytes, j))
5337 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5339 if (!daa_load(&bytes, j))
5342 if (!SCI_Control(j, SCI_End))
5344 if (!SCI_WaitLowSCI(j))
5348 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5349 if (!daa_load(&bytes, j))
5352 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5353 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5354 if (!daa_load(&bytes, j))
5357 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5358 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5359 if (!daa_load(&bytes, j))
5362 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5363 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5364 if (!daa_load(&bytes, j))
5367 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5369 if (!daa_load(&bytes, j))
5372 if (!SCI_Control(j, SCI_End))
5374 if (!SCI_WaitLowSCI(j))
5378 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5379 if (!daa_load(&bytes, j))
5382 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5383 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5384 if (!daa_load(&bytes, j))
5387 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5388 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5389 if (!daa_load(&bytes, j))
5392 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5393 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5394 if (!daa_load(&bytes, j))
5397 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5399 if (!daa_load(&bytes, j))
5402 if (!SCI_Control(j, SCI_End))
5404 if (!SCI_WaitLowSCI(j))
5408 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5409 if (!daa_load(&bytes, j))
5412 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5413 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5414 if (!daa_load(&bytes, j))
5417 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5418 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5419 if (!daa_load(&bytes, j))
5422 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5423 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5424 if (!daa_load(&bytes, j))
5427 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5429 if (!daa_load(&bytes, j))
5432 if (!SCI_Control(j, SCI_End))
5434 if (!SCI_WaitLowSCI(j))
5438 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5439 if (!daa_load(&bytes, j))
5442 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5443 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5444 if (!daa_load(&bytes, j))
5447 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5448 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5449 if (!daa_load(&bytes, j))
5452 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5453 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5454 if (!daa_load(&bytes, j))
5457 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5459 if (!daa_load(&bytes, j))
5462 if (!SCI_Control(j, SCI_End))
5464 if (!SCI_WaitLowSCI(j))
5468 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5469 if (!daa_load(&bytes, j))
5472 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5473 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5474 if (!daa_load(&bytes, j))
5477 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5478 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5479 if (!daa_load(&bytes, j))
5482 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5483 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5484 if (!daa_load(&bytes, j))
5487 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5489 if (!daa_load(&bytes, j))
5492 if (!SCI_Control(j, SCI_End))
5494 if (!SCI_WaitLowSCI(j))
5498 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5499 if (!daa_load(&bytes, j))
5502 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5503 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5504 if (!daa_load(&bytes, j))
5507 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5508 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5509 if (!daa_load(&bytes, j))
5512 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5513 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5514 if (!daa_load(&bytes, j))
5517 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5519 if (!daa_load(&bytes, j))
5522 if (!SCI_Control(j, SCI_End))
5524 if (!SCI_WaitLowSCI(j))
5528 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5529 if (!daa_load(&bytes, j))
5532 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5533 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5534 if (!daa_load(&bytes, j))
5537 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5538 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5539 if (!daa_load(&bytes, j))
5542 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5543 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5544 if (!daa_load(&bytes, j))
5547 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5549 if (!daa_load(&bytes, j))
5552 if (!SCI_Control(j, SCI_End))
5554 if (!SCI_WaitLowSCI(j))
5558 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5559 if (!daa_load(&bytes, j))
5562 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5563 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5564 if (!daa_load(&bytes, j))
5567 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5569 if (!daa_load(&bytes, j))
5572 if (!SCI_Control(j, SCI_End))
5574 if (!SCI_WaitLowSCI(j))
5578 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5579 if (!daa_load(&bytes, j))
5582 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5583 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5584 if (!daa_load(&bytes, j))
5587 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5589 if (!daa_load(&bytes, j))
5592 if (!SCI_Control(j, SCI_End))
5594 if (!SCI_WaitLowSCI(j))
5598 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5599 if (!daa_load(&bytes, j))
5602 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5603 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5604 if (!daa_load(&bytes, j))
5607 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5609 if (!daa_load(&bytes, j))
5612 if (!SCI_Control(j, SCI_End))
5614 if (!SCI_WaitLowSCI(j))
5618 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5619 if (!daa_load(&bytes, j))
5622 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5623 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5624 if (!daa_load(&bytes, j))
5627 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5629 if (!daa_load(&bytes, j))
5632 if (!SCI_Control(j, SCI_End))
5634 if (!SCI_WaitLowSCI(j))
5638 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5639 if (!daa_load(&bytes, j))
5642 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5643 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5644 if (!daa_load(&bytes, j))
5647 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5649 if (!daa_load(&bytes, j))
5652 if (!SCI_Control(j, SCI_End))
5654 if (!SCI_WaitLowSCI(j))
5658 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5659 if (!daa_load(&bytes, j))
5662 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5663 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5664 if (!daa_load(&bytes, j))
5667 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5668 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5669 if (!daa_load(&bytes, j))
5672 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5673 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5674 if (!daa_load(&bytes, j))
5677 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5679 if (!daa_load(&bytes, j))
5682 if (!SCI_Control(j, SCI_End))
5684 if (!SCI_WaitLowSCI(j))
5688 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5689 if (!daa_load(&bytes, j))
5692 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5693 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5694 if (!daa_load(&bytes, j))
5697 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5698 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5699 if (!daa_load(&bytes, j))
5702 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5703 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5704 if (!daa_load(&bytes, j))
5707 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5709 if (!daa_load(&bytes, j))
5713 j->pld_scrr.byte = inb_p(j->XILINXbase);
5714 if (!SCI_Control(j, SCI_End))
5717 outb_p(j->pld_scrw.byte, j->XILINXbase);
5719 if (ixjdebug & 0x0002)
5720 printk("DAA Coefficients Loaded\n");
5722 j->flags.pstncheck = 0;
5726 static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5728 j->tone_off_time = arg;
5729 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5732 if (ixj_WriteDSPCommand(arg, j))
5737 static int ixj_get_tone_on(IXJ *j)
5739 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5745 static int ixj_get_tone_off(IXJ *j)
5747 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5753 static void ixj_busytone(IXJ *j)
5755 j->flags.ringback = 0;
5756 j->flags.dialtone = 0;
5757 j->flags.busytone = 1;
5758 ixj_set_tone_on(0x07D0, j);
5759 ixj_set_tone_off(0x07D0, j);
5760 ixj_play_tone(j, 27);
5763 static void ixj_dialtone(IXJ *j)
5765 j->flags.ringback = 0;
5766 j->flags.dialtone = 1;
5767 j->flags.busytone = 0;
5768 if (j->dsp.low == 0x20) {
5771 ixj_set_tone_on(0xFFFF, j);
5772 ixj_set_tone_off(0x0000, j);
5773 ixj_play_tone(j, 25);
5777 static void ixj_cpt_stop(IXJ *j)
5779 if(j->tone_state || j->tone_cadence_state)
5781 j->flags.dialtone = 0;
5782 j->flags.busytone = 0;
5783 j->flags.ringback = 0;
5784 ixj_set_tone_on(0x0001, j);
5785 ixj_set_tone_off(0x0000, j);
5786 ixj_play_tone(j, 0);
5787 j->tone_state = j->tone_cadence_state = 0;
5789 kfree(j->cadence_t->ce);
5790 kfree(j->cadence_t);
5791 j->cadence_t = NULL;
5794 if (j->play_mode == -1 && j->rec_mode == -1)
5796 if (j->play_mode != -1 && j->dsp.low == 0x20)
5798 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5799 ixj_record_start(j);
5802 static void ixj_ringback(IXJ *j)
5804 j->flags.busytone = 0;
5805 j->flags.dialtone = 0;
5806 j->flags.ringback = 1;
5807 ixj_set_tone_on(0x0FA0, j);
5808 ixj_set_tone_off(0x2EE0, j);
5809 ixj_play_tone(j, 26);
5812 static void ixj_testram(IXJ *j)
5814 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5817 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5820 IXJ_CADENCE_ELEMENT __user *cep;
5821 IXJ_CADENCE_ELEMENT *lcep;
5825 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5830 if (copy_from_user(&lcp->elements_used,
5831 &cp->elements_used, sizeof(int)))
5833 if (copy_from_user(&lcp->termination,
5834 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5836 if (get_user(cep, &cp->ce))
5840 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5844 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5849 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5853 kfree(j->cadence_t->ce);
5854 kfree(j->cadence_t);
5856 lcp->ce = (void *) lcep;
5858 j->tone_cadence_state = 0;
5859 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5860 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5861 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5862 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5863 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5864 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5865 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5866 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5867 ixj_init_tone(j, &ti);
5869 ixj_play_tone(j, lcp->ce[0].index);
5878 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5880 IXJ_FILTER_CADENCE *lcp;
5881 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5883 if(ixjdebug & 0x0001) {
5884 printk(KERN_INFO "Could not allocate memory for cadence\n");
5888 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5889 if(ixjdebug & 0x0001) {
5890 printk(KERN_INFO "Could not copy cadence to kernel\n");
5895 if (lcp->filter > 5) {
5896 if(ixjdebug & 0x0001) {
5897 printk(KERN_INFO "Cadence out of range\n");
5902 j->cadence_f[lcp->filter].state = 0;
5903 j->cadence_f[lcp->filter].enable = lcp->enable;
5904 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5905 j->cadence_f[lcp->filter].on1 = lcp->on1;
5906 j->cadence_f[lcp->filter].on1min = 0;
5907 j->cadence_f[lcp->filter].on1max = 0;
5908 j->cadence_f[lcp->filter].off1 = lcp->off1;
5909 j->cadence_f[lcp->filter].off1min = 0;
5910 j->cadence_f[lcp->filter].off1max = 0;
5911 j->cadence_f[lcp->filter].on2 = lcp->on2;
5912 j->cadence_f[lcp->filter].on2min = 0;
5913 j->cadence_f[lcp->filter].on2max = 0;
5914 j->cadence_f[lcp->filter].off2 = lcp->off2;
5915 j->cadence_f[lcp->filter].off2min = 0;
5916 j->cadence_f[lcp->filter].off2max = 0;
5917 j->cadence_f[lcp->filter].on3 = lcp->on3;
5918 j->cadence_f[lcp->filter].on3min = 0;
5919 j->cadence_f[lcp->filter].on3max = 0;
5920 j->cadence_f[lcp->filter].off3 = lcp->off3;
5921 j->cadence_f[lcp->filter].off3min = 0;
5922 j->cadence_f[lcp->filter].off3max = 0;
5923 if(ixjdebug & 0x0002) {
5924 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5930 static void add_caps(IXJ *j)
5933 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5934 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5935 j->caplist[j->caps].captype = vendor;
5936 j->caplist[j->caps].handle = j->caps++;
5937 j->caplist[j->caps].captype = device;
5938 switch (j->cardtype) {
5940 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5943 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5945 case QTI_PHONEJACK_LITE:
5946 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5948 case QTI_PHONEJACK_PCI:
5949 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5952 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5955 j->caplist[j->caps].cap = j->cardtype;
5956 j->caplist[j->caps].handle = j->caps++;
5957 strcpy(j->caplist[j->caps].desc, "POTS");
5958 j->caplist[j->caps].captype = port;
5959 j->caplist[j->caps].cap = pots;
5960 j->caplist[j->caps].handle = j->caps++;
5962 /* add devices that can do speaker/mic */
5963 switch (j->cardtype) {
5966 case QTI_PHONEJACK_PCI:
5968 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5969 j->caplist[j->caps].captype = port;
5970 j->caplist[j->caps].cap = speaker;
5971 j->caplist[j->caps].handle = j->caps++;
5976 /* add devices that can do handset */
5977 switch (j->cardtype) {
5979 strcpy(j->caplist[j->caps].desc, "HANDSET");
5980 j->caplist[j->caps].captype = port;
5981 j->caplist[j->caps].cap = handset;
5982 j->caplist[j->caps].handle = j->caps++;
5988 /* add devices that can do PSTN */
5989 switch (j->cardtype) {
5991 strcpy(j->caplist[j->caps].desc, "PSTN");
5992 j->caplist[j->caps].captype = port;
5993 j->caplist[j->caps].cap = pstn;
5994 j->caplist[j->caps].handle = j->caps++;
6000 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6001 strcpy(j->caplist[j->caps].desc, "ULAW");
6002 j->caplist[j->caps].captype = codec;
6003 j->caplist[j->caps].cap = ULAW;
6004 j->caplist[j->caps].handle = j->caps++;
6006 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6007 j->caplist[j->caps].captype = codec;
6008 j->caplist[j->caps].cap = LINEAR16;
6009 j->caplist[j->caps].handle = j->caps++;
6011 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6012 j->caplist[j->caps].captype = codec;
6013 j->caplist[j->caps].cap = LINEAR8;
6014 j->caplist[j->caps].handle = j->caps++;
6016 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6017 j->caplist[j->caps].captype = codec;
6018 j->caplist[j->caps].cap = WSS;
6019 j->caplist[j->caps].handle = j->caps++;
6021 /* software ALAW codec, made from ULAW */
6022 strcpy(j->caplist[j->caps].desc, "ALAW");
6023 j->caplist[j->caps].captype = codec;
6024 j->caplist[j->caps].cap = ALAW;
6025 j->caplist[j->caps].handle = j->caps++;
6027 /* version 12 of the 8020 does the following codecs in a broken way */
6028 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6029 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6030 j->caplist[j->caps].captype = codec;
6031 j->caplist[j->caps].cap = G723_63;
6032 j->caplist[j->caps].handle = j->caps++;
6034 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6035 j->caplist[j->caps].captype = codec;
6036 j->caplist[j->caps].cap = G723_53;
6037 j->caplist[j->caps].handle = j->caps++;
6039 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6040 j->caplist[j->caps].captype = codec;
6041 j->caplist[j->caps].cap = TS48;
6042 j->caplist[j->caps].handle = j->caps++;
6044 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6045 j->caplist[j->caps].captype = codec;
6046 j->caplist[j->caps].cap = TS41;
6047 j->caplist[j->caps].handle = j->caps++;
6050 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6051 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6052 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6053 j->caplist[j->caps].captype = codec;
6054 j->caplist[j->caps].cap = TS85;
6055 j->caplist[j->caps].handle = j->caps++;
6058 /* 8021 chips can do G728 */
6059 if (j->dsp.low == 0x21) {
6060 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6061 j->caplist[j->caps].captype = codec;
6062 j->caplist[j->caps].cap = G728;
6063 j->caplist[j->caps].handle = j->caps++;
6066 /* 8021/8022 chips can do G729 if loaded */
6067 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6068 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6069 j->caplist[j->caps].captype = codec;
6070 j->caplist[j->caps].cap = G729;
6071 j->caplist[j->caps].handle = j->caps++;
6073 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6074 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6075 j->caplist[j->caps].captype = codec;
6076 j->caplist[j->caps].cap = G729B;
6077 j->caplist[j->caps].handle = j->caps++;
6081 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6085 for (cnt = 0; cnt < j->caps; cnt++) {
6086 if (pcreq->captype == j->caplist[cnt].captype
6087 && pcreq->cap == j->caplist[cnt].cap) {
6095 static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6100 void __user *argp = (void __user *)arg;
6101 struct inode *inode = file_p->f_path.dentry->d_inode;
6102 unsigned int minor = iminor(inode);
6103 unsigned int raise, mant;
6104 int board = NUM(inode);
6106 IXJ *j = get_ixj(NUM(inode));
6111 * Set up locks to ensure that only one process is talking to the DSP at a time.
6112 * This is necessary to keep the DSP from locking up.
6114 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6115 schedule_timeout_interruptible(1);
6116 if (ixjdebug & 0x0040)
6117 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6118 if (minor >= IXJMAX) {
6119 clear_bit(board, &j->busyflags);
6123 * Check ioctls only root can use.
6125 if (!capable(CAP_SYS_ADMIN)) {
6127 case IXJCTL_TESTRAM:
6133 case IXJCTL_TESTRAM:
6135 retval = (j->ssr.high << 8) + j->ssr.low;
6137 case IXJCTL_CARDTYPE:
6138 retval = j->cardtype;
6143 case IXJCTL_VERSION:
6146 snprintf(arg_str, sizeof(arg_str),
6147 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6148 IXJ_VER_MINOR, IXJ_BLD_VER);
6149 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6153 case PHONE_RING_CADENCE:
6154 j->ring_cadence = arg;
6158 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6163 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6167 /* Binary compatbility */
6168 case OLD_PHONE_RING_START:
6171 case PHONE_RING_START:
6173 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6179 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6183 case PHONE_RING_STOP:
6184 j->flags.cringing = 0;
6185 if(j->cadence_f[5].enable) {
6186 j->cadence_f[5].state = 0;
6191 retval = ixj_ring(j);
6193 case PHONE_EXCEPTION:
6194 retval = j->ex.bytes;
6195 if(j->ex.bits.flash) {
6197 j->ex.bits.flash = 0;
6199 j->ex.bits.pstn_ring = 0;
6200 j->ex.bits.caller_id = 0;
6201 j->ex.bits.pstn_wink = 0;
6210 j->ex.bits.reserved = 0;
6212 case PHONE_HOOKSTATE:
6213 j->ex.bits.hookstate = 0;
6214 retval = j->hookstate; //j->r_hook;
6216 case IXJCTL_SET_LED:
6217 LED_SetState(arg, j);
6220 retval = set_base_frame(j, arg);
6222 case PHONE_REC_CODEC:
6223 retval = set_rec_codec(j, arg);
6228 case PHONE_REC_START:
6229 ixj_record_start(j);
6231 case PHONE_REC_STOP:
6234 case PHONE_REC_DEPTH:
6235 set_rec_depth(j, arg);
6237 case PHONE_REC_VOLUME:
6239 retval = get_rec_volume(j);
6242 set_rec_volume(j, arg);
6246 case PHONE_REC_VOLUME_LINEAR:
6248 retval = get_rec_volume_linear(j);
6251 set_rec_volume_linear(j, arg);
6255 case IXJCTL_DTMF_PRESCALE:
6257 retval = get_dtmf_prescale(j);
6260 set_dtmf_prescale(j, arg);
6264 case PHONE_REC_LEVEL:
6265 retval = get_rec_level(j);
6268 retval = ixj_siadc(j, arg);
6271 retval = ixj_sidac(j, arg);
6273 case IXJCTL_AEC_START:
6274 ixj_aec_start(j, arg);
6276 case IXJCTL_AEC_STOP:
6279 case IXJCTL_AEC_GET_LEVEL:
6280 retval = j->aec_level;
6282 case PHONE_PLAY_CODEC:
6283 retval = set_play_codec(j, arg);
6285 case PHONE_PLAY_START:
6286 retval = ixj_play_start(j);
6288 case PHONE_PLAY_STOP:
6291 case PHONE_PLAY_DEPTH:
6292 set_play_depth(j, arg);
6294 case PHONE_PLAY_VOLUME:
6296 retval = get_play_volume(j);
6299 set_play_volume(j, arg);
6303 case PHONE_PLAY_VOLUME_LINEAR:
6305 retval = get_play_volume_linear(j);
6308 set_play_volume_linear(j, arg);
6312 case PHONE_PLAY_LEVEL:
6313 retval = get_play_level(j);
6315 case IXJCTL_DSP_TYPE:
6316 retval = (j->dsp.high << 8) + j->dsp.low;
6318 case IXJCTL_DSP_VERSION:
6319 retval = (j->ver.high << 8) + j->ver.low;
6330 case IXJCTL_DRYBUFFER_READ:
6331 put_user(j->drybuffer, (unsigned long __user *) argp);
6333 case IXJCTL_DRYBUFFER_CLEAR:
6336 case IXJCTL_FRAMES_READ:
6337 put_user(j->framesread, (unsigned long __user *) argp);
6339 case IXJCTL_FRAMES_WRITTEN:
6340 put_user(j->frameswritten, (unsigned long __user *) argp);
6342 case IXJCTL_READ_WAIT:
6343 put_user(j->read_wait, (unsigned long __user *) argp);
6345 case IXJCTL_WRITE_WAIT:
6346 put_user(j->write_wait, (unsigned long __user *) argp);
6348 case PHONE_MAXRINGS:
6351 case PHONE_SET_TONE_ON_TIME:
6352 ixj_set_tone_on(arg, j);
6354 case PHONE_SET_TONE_OFF_TIME:
6355 ixj_set_tone_off(arg, j);
6357 case PHONE_GET_TONE_ON_TIME:
6358 if (ixj_get_tone_on(j)) {
6361 retval = (j->ssr.high << 8) + j->ssr.low;
6364 case PHONE_GET_TONE_OFF_TIME:
6365 if (ixj_get_tone_off(j)) {
6368 retval = (j->ssr.high << 8) + j->ssr.low;
6371 case PHONE_PLAY_TONE:
6373 retval = ixj_play_tone(j, arg);
6377 case PHONE_GET_TONE_STATE:
6378 retval = j->tone_state;
6380 case PHONE_DTMF_READY:
6381 retval = j->ex.bits.dtmf_ready;
6383 case PHONE_GET_DTMF:
6384 if (ixj_hookstate(j)) {
6385 if (j->dtmf_rp != j->dtmf_wp) {
6386 retval = j->dtmfbuffer[j->dtmf_rp];
6388 if (j->dtmf_rp == 79)
6390 if (j->dtmf_rp == j->dtmf_wp) {
6391 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6396 case PHONE_GET_DTMF_ASCII:
6397 if (ixj_hookstate(j)) {
6398 if (j->dtmf_rp != j->dtmf_wp) {
6399 switch (j->dtmfbuffer[j->dtmf_rp]) {
6401 retval = 42; /* '*'; */
6405 retval = 48; /*'0'; */
6409 retval = 35; /*'#'; */
6413 retval = 65; /*'A'; */
6417 retval = 66; /*'B'; */
6421 retval = 67; /*'C'; */
6425 retval = 68; /*'D'; */
6429 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6433 if (j->dtmf_rp == 79)
6435 if(j->dtmf_rp == j->dtmf_wp)
6437 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6442 case PHONE_DTMF_OOB:
6443 j->flags.dtmf_oob = arg;
6445 case PHONE_DIALTONE:
6451 case PHONE_RINGBACK:
6455 if(j->cardtype == QTI_PHONEJACK)
6458 retval = ixj_wink(j);
6460 case PHONE_CPT_STOP:
6463 case PHONE_QUERY_CODEC:
6465 struct phone_codec_data pd;
6467 int proto_size[] = {
6469 12, 10, 16, 9, 8, 48, 5,
6470 40, 40, 80, 40, 40, 6
6472 if(copy_from_user(&pd, argp, sizeof(pd))) {
6476 if(pd.type<1 || pd.type>13) {
6477 retval = -EPROTONOSUPPORT;
6481 val=proto_size[pd.type];
6482 else switch(j->baseframe.low)
6484 case 0xA0:val=2*proto_size[pd.type];break;
6485 case 0x50:val=proto_size[pd.type];break;
6486 default:val=proto_size[pd.type]*3;break;
6488 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6489 if(copy_to_user(argp, &pd, sizeof(pd)))
6493 case IXJCTL_DSP_IDLE:
6497 if ((arg & 0xff) == 0xff)
6498 retval = ixj_get_mixer(arg, j);
6502 case IXJCTL_DAA_COEFF_SET:
6506 retval = ixj_daa_write(j);
6510 retval = ixj_daa_write(j);
6513 DAA_Coeff_France(j);
6514 retval = ixj_daa_write(j);
6517 DAA_Coeff_Germany(j);
6518 retval = ixj_daa_write(j);
6521 DAA_Coeff_Australia(j);
6522 retval = ixj_daa_write(j);
6526 retval = ixj_daa_write(j);
6533 case IXJCTL_DAA_AGAIN:
6534 ixj_daa_cr4(j, arg | 0x02);
6536 case IXJCTL_PSTN_LINETEST:
6537 retval = ixj_linetest(j);
6540 ixj_write_vmwi(j, arg);
6543 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6545 j->ex.bits.caller_id = 0;
6547 case IXJCTL_WINK_DURATION:
6552 retval = ixj_set_port(j, arg);
6556 case IXJCTL_POTS_PSTN:
6557 retval = ixj_set_pots(j, arg);
6559 case PHONE_CAPABILITIES:
6563 case PHONE_CAPABILITIES_LIST:
6565 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6568 case PHONE_CAPABILITIES_CHECK:
6570 struct phone_capability cap;
6571 if (copy_from_user(&cap, argp, sizeof(cap)))
6575 retval = capabilities_check(j, &cap);
6579 case PHONE_PSTN_SET_STATE:
6580 daa_set_mode(j, arg);
6582 case PHONE_PSTN_GET_STATE:
6583 retval = j->daa_mode;
6584 j->ex.bits.pstn_ring = 0;
6586 case IXJCTL_SET_FILTER:
6587 if (copy_from_user(&jf, argp, sizeof(jf)))
6589 retval = ixj_init_filter(j, &jf);
6591 case IXJCTL_SET_FILTER_RAW:
6592 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6595 retval = ixj_init_filter_raw(j, &jfr);
6597 case IXJCTL_GET_FILTER_HIST:
6601 retval = j->filter_hist[arg];
6603 case IXJCTL_INIT_TONE:
6604 if (copy_from_user(&ti, argp, sizeof(ti)))
6607 retval = ixj_init_tone(j, &ti);
6609 case IXJCTL_TONE_CADENCE:
6610 retval = ixj_build_cadence(j, argp);
6612 case IXJCTL_FILTER_CADENCE:
6613 retval = ixj_build_filter_cadence(j, argp);
6616 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6620 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6621 if(j->sigdef.event < 33) {
6623 for(mant = 0; mant < j->sigdef.event; mant++){
6626 if(j->sigdef.signal)
6627 j->ex_sig.bytes |= raise;
6629 j->ex_sig.bytes &= (raise^0xffff);
6632 case IXJCTL_INTERCOM_STOP:
6633 if(arg < 0 || arg >= IXJMAX)
6639 get_ixj(arg)->intercom = -1;
6640 ixj_record_stop(get_ixj(arg));
6641 ixj_play_stop(get_ixj(arg));
6644 case IXJCTL_INTERCOM_START:
6645 if(arg < 0 || arg >= IXJMAX)
6648 ixj_record_start(j);
6650 get_ixj(arg)->intercom = board;
6651 ixj_play_start(get_ixj(arg));
6652 ixj_record_start(get_ixj(arg));
6655 if (ixjdebug & 0x0040)
6656 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6657 clear_bit(board, &j->busyflags);
6661 static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6665 ret = do_ixj_ioctl(file_p, cmd, arg);
6670 static int ixj_fasync(int fd, struct file *file_p, int mode)
6672 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6674 return fasync_helper(fd, file_p, mode, &j->async_queue);
6677 static const struct file_operations ixj_fops =
6679 .owner = THIS_MODULE,
6680 .read = ixj_enhanced_read,
6681 .write = ixj_enhanced_write,
6683 .unlocked_ioctl = ixj_ioctl,
6684 .release = ixj_release,
6685 .fasync = ixj_fasync
6688 static int ixj_linetest(IXJ *j)
6690 j->flags.pstncheck = 1; /* Testing */
6691 j->flags.pstn_present = 0; /* Assume the line is not there */
6693 daa_int_read(j); /*Clear DAA Interrupt flags */
6695 /* Hold all relays in the normally de-energized position. */
6698 j->pld_slicw.bits.rly1 = 0;
6699 j->pld_slicw.bits.rly2 = 0;
6700 j->pld_slicw.bits.rly3 = 0;
6701 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6702 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6704 outb_p(j->pld_scrw.byte, j->XILINXbase);
6705 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6706 if (j->pld_slicr.bits.potspstn) {
6707 j->flags.pots_pstn = 1;
6708 j->flags.pots_correct = 0;
6709 LED_SetState(0x4, j);
6711 j->flags.pots_pstn = 0;
6712 j->pld_slicw.bits.rly1 = 0;
6713 j->pld_slicw.bits.rly2 = 0;
6714 j->pld_slicw.bits.rly3 = 1;
6715 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6716 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6718 outb_p(j->pld_scrw.byte, j->XILINXbase);
6719 daa_set_mode(j, SOP_PU_CONVERSATION);
6722 daa_set_mode(j, SOP_PU_RESET);
6723 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6724 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6725 LED_SetState(0x4, j);
6726 j->pld_slicw.bits.rly3 = 0;
6727 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6729 j->flags.pots_correct = 1;
6730 LED_SetState(0x8, j);
6731 j->pld_slicw.bits.rly1 = 1;
6732 j->pld_slicw.bits.rly2 = 0;
6733 j->pld_slicw.bits.rly3 = 0;
6734 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6737 j->pld_slicw.bits.rly3 = 0;
6738 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6739 daa_set_mode(j, SOP_PU_CONVERSATION);
6742 daa_set_mode(j, SOP_PU_RESET);
6743 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6744 j->pstn_sleeptil = jiffies + (hertz / 4);
6745 j->flags.pstn_present = 1;
6747 j->flags.pstn_present = 0;
6749 if (j->flags.pstn_present) {
6750 if (j->flags.pots_correct) {
6751 LED_SetState(0xA, j);
6753 LED_SetState(0x6, j);
6756 if (j->flags.pots_correct) {
6757 LED_SetState(0x9, j);
6759 LED_SetState(0x5, j);
6762 j->flags.pstncheck = 0; /* Testing */
6763 return j->flags.pstn_present;
6766 static int ixj_selfprobe(IXJ *j)
6772 init_waitqueue_head(&j->poll_q);
6773 init_waitqueue_head(&j->read_q);
6774 init_waitqueue_head(&j->write_q);
6776 while(atomic_read(&j->DSPWrite) > 0)
6777 atomic_dec(&j->DSPWrite);
6778 if (ixjdebug & 0x0002)
6779 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6780 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6782 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6784 /* The read values of the SSR should be 0x00 for the IDLE command */
6785 if (j->ssr.low || j->ssr.high)
6787 if (ixjdebug & 0x0002)
6788 printk(KERN_INFO "Get Device ID Code\n");
6789 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6791 j->dsp.low = j->ssr.low;
6792 j->dsp.high = j->ssr.high;
6793 if (ixjdebug & 0x0002)
6794 printk(KERN_INFO "Get Device Version Code\n");
6795 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6797 j->ver.low = j->ssr.low;
6798 j->ver.high = j->ssr.high;
6800 if (j->dsp.low == 0x21) {
6801 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6802 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6803 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6804 bytes.low = inb_p(j->XILINXbase + 0x02);
6805 if (bytes.low == bytes.high) /* Register is read only on */
6806 /* Internet PhoneJack Lite */
6808 j->cardtype = QTI_PHONEJACK_LITE;
6809 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6810 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6813 j->pld_slicw.pcib.e1 = 1;
6814 outb_p(j->pld_slicw.byte, j->XILINXbase);
6816 j->cardtype = QTI_LINEJACK;
6818 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6819 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6823 } else if (j->dsp.low == 0x22) {
6824 j->cardtype = QTI_PHONEJACK_PCI;
6825 request_region(j->XILINXbase, 4, "ixj control");
6826 j->pld_slicw.pcib.e1 = 1;
6827 outb_p(j->pld_slicw.byte, j->XILINXbase);
6829 j->cardtype = QTI_PHONEJACK;
6831 switch (j->cardtype) {
6833 if (!j->dsp.low != 0x20) {
6836 ixj_WriteDSPCommand(0x3800, j);
6837 j->ver.low = j->ssr.low;
6838 j->ver.high = j->ssr.high;
6842 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6843 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6847 case QTI_PHONEJACK_LITE:
6848 case QTI_PHONEJACK_PCI:
6849 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6850 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6853 j->pld_slicw.pcib.e1 = 1;
6854 outb_p(j->pld_slicw.byte, j->XILINXbase);
6860 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6861 if (ixjdebug & 0x0002)
6862 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6863 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6865 if (ixjdebug & 0x0002)
6866 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6867 if (j->cardtype == QTI_PHONEJACK) {
6872 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6875 if (set_base_frame(j, 30) != 30)
6877 if (ixjdebug & 0x0002)
6878 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6879 if (j->cardtype == QTI_PHONECARD) {
6880 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6883 if (j->cardtype == QTI_LINEJACK) {
6884 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6886 if (ixjdebug & 0x0002)
6887 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6888 j->pld_clock.byte = 0;
6889 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6893 if (j->dsp.low == 0x20) {
6894 if (ixjdebug & 0x0002)
6895 printk(KERN_INFO "Configure GPIO pins\n");
6896 j->gpio.bytes.high = 0x09;
6897 /* bytes.low = 0xEF; 0xF7 */
6898 j->gpio.bits.gpio1 = 1;
6899 j->gpio.bits.gpio2 = 1;
6900 j->gpio.bits.gpio3 = 0;
6901 j->gpio.bits.gpio4 = 1;
6902 j->gpio.bits.gpio5 = 1;
6903 j->gpio.bits.gpio6 = 1;
6904 j->gpio.bits.gpio7 = 1;
6905 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6906 if (ixjdebug & 0x0002)
6907 printk(KERN_INFO "Enable SLIC\n");
6908 j->gpio.bytes.high = 0x0B;
6909 j->gpio.bytes.low = 0x00;
6910 j->gpio.bits.gpio1 = 0;
6911 j->gpio.bits.gpio2 = 1;
6912 j->gpio.bits.gpio5 = 0;
6913 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6914 j->port = PORT_POTS;
6916 if (j->cardtype == QTI_LINEJACK) {
6917 LED_SetState(0x1, j);
6919 LED_SetState(0x2, j);
6921 LED_SetState(0x4, j);
6923 LED_SetState(0x8, j);
6925 LED_SetState(0x0, j);
6927 if (ixjdebug & 0x0002)
6928 printk("Loading DAA Coefficients\n");
6930 if (!ixj_daa_write(j)) {
6931 printk("DAA write failed on board %d\n", j->board);
6934 if(!ixj_daa_cid_reset(j)) {
6935 printk("DAA CID reset failed on board %d\n", j->board);
6938 j->flags.pots_correct = 0;
6939 j->flags.pstn_present = 0;
6941 if (j->flags.pots_correct) {
6942 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6944 outb_p(j->pld_scrw.byte, j->XILINXbase);
6945 j->pld_slicw.bits.rly1 = 1;
6946 j->pld_slicw.bits.spken = 1;
6947 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6948 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6949 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6950 j->port = PORT_POTS;
6952 ixj_set_port(j, PORT_PSTN);
6954 if (ixjdebug & 0x0002)
6955 printk(KERN_INFO "Enable Mixer\n");
6956 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
6957 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
6959 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
6960 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
6962 ixj_mixer(0x0480, j); /*FM Left mute */
6963 ixj_mixer(0x0580, j); /*FM Right mute */
6965 ixj_mixer(0x0680, j); /*CD Left mute */
6966 ixj_mixer(0x0780, j); /*CD Right mute */
6968 ixj_mixer(0x0880, j); /*Line Left mute */
6969 ixj_mixer(0x0980, j); /*Line Right mute */
6971 ixj_mixer(0x0A80, j); /*Aux left mute */
6972 ixj_mixer(0x0B80, j); /*Aux right mute */
6974 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
6975 ixj_mixer(0x0D80, j); /*Mono2 mute */
6977 ixj_mixer(0x0E80, j); /*Mic mute */
6979 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
6981 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
6982 ixj_mixer(0x110C, j);
6985 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
6986 ixj_mixer(0x1401, j);
6988 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
6989 ixj_mixer(0x1501, j);
6991 ixj_mixer(0x1700, j); /*Clock select */
6993 ixj_mixer(0x1800, j); /*ADC input from mixer */
6995 ixj_mixer(0x1901, j); /*Mic gain 30db */
6997 if (ixjdebug & 0x0002)
6998 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6999 j->cadence_f[4].state = 0;
7000 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7001 j->cadence_f[4].off1 = 0;
7002 j->cadence_f[4].on2 = 0;
7003 j->cadence_f[4].off2 = 0;
7004 j->cadence_f[4].on3 = 0;
7005 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7006 j->pstn_last_rmr = jiffies;
7009 if (j->cardtype == QTI_PHONECARD) {
7010 ixj_WriteDSPCommand(0xCF07, j);
7011 ixj_WriteDSPCommand(0x00B0, j);
7012 ixj_set_port(j, PORT_SPEAKER);
7014 ixj_set_port(j, PORT_POTS);
7015 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7016 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7022 j->framesread = j->frameswritten = 0;
7023 j->read_wait = j->write_wait = 0;
7024 j->rxreadycheck = j->txreadycheck = 0;
7026 /* initialise the DTMF prescale to a sensible value */
7027 if (j->cardtype == QTI_LINEJACK) {
7028 set_dtmf_prescale(j, 0x10);
7030 set_dtmf_prescale(j, 0x40);
7032 set_play_volume(j, 0x100);
7033 set_rec_volume(j, 0x100);
7035 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7037 /* The read values of the SSR should be 0x00 for the IDLE command */
7038 if (j->ssr.low || j->ssr.high)
7041 if (ixjdebug & 0x0002)
7042 printk(KERN_INFO "Enable Line Monitor\n");
7044 if (ixjdebug & 0x0002)
7045 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7047 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7050 if (ixjdebug & 0x002)
7051 printk(KERN_INFO "Enable DTMF Detectors\n");
7053 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7056 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7059 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7061 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7063 j->ex.bits.dtmf_ready = 0;
7065 j->dtmf_wp = j->dtmf_rp = 0;
7066 j->rec_mode = j->play_mode = -1;
7067 j->flags.ringing = 0;
7068 j->maxrings = MAXRINGS;
7069 j->ring_cadence = USA_RING_CADENCE;
7072 j->flags.dtmf_oob = 0;
7073 for (cnt = 0; cnt < 4; cnt++)
7074 j->cadence_f[cnt].enable = 0;
7075 /* must be a device on the specified address */
7076 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7078 /* Set up the default signals for events */
7079 for (cnt = 0; cnt < 35; cnt++)
7080 j->ixj_signals[cnt] = SIGIO;
7082 /* Set the excetion signal enable flags */
7083 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7084 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 =
7085 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;
7086 #ifdef IXJ_DYN_ALLOC
7092 /* Register with the Telephony for Linux subsystem */
7093 j->p.f_op = &ixj_fops;
7094 j->p.open = ixj_open;
7095 j->p.board = j->board;
7096 phone_register_device(&j->p, PHONE_UNIT_ANY);
7104 * Exported service for pcmcia card handling
7107 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7109 IXJ *j = ixj_alloc();
7114 j->XILINXbase = xilinx;
7115 j->cardtype = QTI_PHONECARD;
7120 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7122 static int ixj_get_status_proc(char *buf)
7128 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7129 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7130 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7131 len += sprintf(buf + len, "\nUsing old telephony API");
7132 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7134 for (cnt = 0; cnt < IXJMAX; cnt++) {
7139 len += sprintf(buf + len, "\nCard Num %d", cnt);
7140 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7141 if (j->cardtype != QTI_PHONEJACK)
7142 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7143 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7144 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7145 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7146 switch (j->cardtype) {
7147 case (QTI_PHONEJACK):
7148 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7150 case (QTI_LINEJACK):
7151 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7152 if (j->flags.g729_loaded)
7153 len += sprintf(buf + len, " w/G.729 A/B");
7154 len += sprintf(buf + len, " Country = %d", j->daa_country);
7156 case (QTI_PHONEJACK_LITE):
7157 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7158 if (j->flags.g729_loaded)
7159 len += sprintf(buf + len, " w/G.729 A/B");
7161 case (QTI_PHONEJACK_PCI):
7162 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7163 if (j->flags.g729_loaded)
7164 len += sprintf(buf + len, " w/G.729 A/B");
7166 case (QTI_PHONECARD):
7167 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7168 if (j->flags.g729_loaded)
7169 len += sprintf(buf + len, " w/G.729 A/B");
7170 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7171 if (!j->pccr1.bits.drf)
7172 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7173 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7176 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7179 len += sprintf(buf + len, "\nReaders %d", j->readers);
7180 len += sprintf(buf + len, "\nWriters %d", j->writers);
7182 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7183 if (j->dsp.low != 0x20)
7184 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7185 if (j->flags.cidsent)
7186 len += sprintf(buf + len, "\nCaller ID data sent");
7188 len += sprintf(buf + len, "\nCaller ID data not sent");
7190 len += sprintf(buf + len, "\nPlay CODEC ");
7191 switch (j->play_codec) {
7193 len += sprintf(buf + len, "G.723.1 6.3");
7196 len += sprintf(buf + len, "G.723.1 5.3");
7199 len += sprintf(buf + len, "TrueSpeech 8.5");
7202 len += sprintf(buf + len, "TrueSpeech 4.8");
7205 len += sprintf(buf + len, "TrueSpeech 4.1");
7208 len += sprintf(buf + len, "G.728");
7211 len += sprintf(buf + len, "G.729");
7214 len += sprintf(buf + len, "G.729B");
7217 len += sprintf(buf + len, "uLaw");
7220 len += sprintf(buf + len, "aLaw");
7223 len += sprintf(buf + len, "16 bit Linear");
7226 len += sprintf(buf + len, "8 bit Linear");
7229 len += sprintf(buf + len, "Windows Sound System");
7232 len += sprintf(buf + len, "NO CODEC CHOSEN");
7235 len += sprintf(buf + len, "\nRecord CODEC ");
7236 switch (j->rec_codec) {
7238 len += sprintf(buf + len, "G.723.1 6.3");
7241 len += sprintf(buf + len, "G.723.1 5.3");
7244 len += sprintf(buf + len, "TrueSpeech 8.5");
7247 len += sprintf(buf + len, "TrueSpeech 4.8");
7250 len += sprintf(buf + len, "TrueSpeech 4.1");
7253 len += sprintf(buf + len, "G.728");
7256 len += sprintf(buf + len, "G.729");
7259 len += sprintf(buf + len, "G.729B");
7262 len += sprintf(buf + len, "uLaw");
7265 len += sprintf(buf + len, "aLaw");
7268 len += sprintf(buf + len, "16 bit Linear");
7271 len += sprintf(buf + len, "8 bit Linear");
7274 len += sprintf(buf + len, "Windows Sound System");
7277 len += sprintf(buf + len, "NO CODEC CHOSEN");
7280 len += sprintf(buf + len, "\nAEC ");
7281 switch (j->aec_level) {
7283 len += sprintf(buf + len, "Off");
7286 len += sprintf(buf + len, "Low");
7289 len += sprintf(buf + len, "Med");
7292 len += sprintf(buf + len, "High");
7295 len += sprintf(buf + len, "Auto");
7298 len += sprintf(buf + len, "AEC/AGC");
7301 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7305 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7306 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7307 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7309 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7311 if (j->cardtype == QTI_LINEJACK) {
7312 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7313 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7314 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7315 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7316 switch (j->daa_mode) {
7318 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7320 case SOP_PU_RINGING:
7321 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7322 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7324 case SOP_PU_CONVERSATION:
7325 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7327 case SOP_PU_PULSEDIALING:
7328 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7331 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7332 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7333 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7334 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7335 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7336 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7337 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7338 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7339 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7340 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7344 len += sprintf(buf + len, "\nPort POTS");
7347 len += sprintf(buf + len, "\nPort PSTN");
7350 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7353 len += sprintf(buf + len, "\nPort HANDSET");
7356 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7357 len += sprintf(buf + len, "\nSLIC state ");
7358 switch (SLIC_GetState(j)) {
7359 case PLD_SLIC_STATE_OC:
7360 len += sprintf(buf + len, "OC");
7362 case PLD_SLIC_STATE_RINGING:
7363 len += sprintf(buf + len, "RINGING");
7365 case PLD_SLIC_STATE_ACTIVE:
7366 len += sprintf(buf + len, "ACTIVE");
7368 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7369 len += sprintf(buf + len, "OHT");
7371 case PLD_SLIC_STATE_TIPOPEN:
7372 len += sprintf(buf + len, "TIPOPEN");
7374 case PLD_SLIC_STATE_STANDBY:
7375 len += sprintf(buf + len, "STANDBY");
7377 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7378 len += sprintf(buf + len, "APR");
7380 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7381 len += sprintf(buf + len, "OHTPR");
7384 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7388 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7389 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7390 #ifdef PERFMON_STATS
7391 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7392 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7393 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7394 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7395 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7396 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7397 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7398 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7399 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7400 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7401 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7402 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7403 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7404 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7407 len += sprintf(buf + len, "\n");
7413 static int ixj_read_proc(char *page, char **start, off_t off,
7414 int count, int *eof, void *data)
7416 int len = ixj_get_status_proc(page);
7417 if (len <= off+count) *eof = 1;
7418 *start = page + off;
7420 if (len>count) len = count;
7426 static void cleanup(void)
7431 for (cnt = 0; cnt < IXJMAX; cnt++) {
7433 if(j != NULL && j->DSPbase) {
7434 if (ixjdebug & 0x0002)
7435 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7436 del_timer(&j->timer);
7437 if (j->cardtype == QTI_LINEJACK) {
7438 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7440 outb_p(j->pld_scrw.byte, j->XILINXbase);
7441 j->pld_slicw.bits.rly1 = 0;
7442 j->pld_slicw.bits.rly2 = 0;
7443 j->pld_slicw.bits.rly3 = 0;
7444 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7445 LED_SetState(0x0, j);
7446 if (ixjdebug & 0x0002)
7447 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7448 release_region(j->XILINXbase, 8);
7449 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7450 if (ixjdebug & 0x0002)
7451 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7452 release_region(j->XILINXbase, 4);
7454 kfree(j->read_buffer);
7455 kfree(j->write_buffer);
7457 pnp_device_detach(j->dev);
7458 if (ixjdebug & 0x0002)
7459 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7460 phone_unregister_device(&j->p);
7461 if (ixjdebug & 0x0002)
7462 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7463 release_region(j->DSPbase, 16);
7464 #ifdef IXJ_DYN_ALLOC
7465 if (ixjdebug & 0x0002)
7466 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7472 if (ixjdebug & 0x0002)
7473 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7474 remove_proc_entry ("ixj", NULL);
7483 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7485 lastLCC = lastLCC & 0xfb;
7486 lastLCC = lastLCC | (byData ? 4 : 0);
7487 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7490 lastLCC = lastLCC | 0x01;
7491 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7493 byData = byData << 1;
7494 lastLCC = lastLCC & 0xfe;
7496 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7500 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7503 lastLCC = lastLCC | 0x01;
7504 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7506 lastLCC = lastLCC & 0xfe;
7508 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7510 return ((inb(wEEPROMAddress) >> 3) & 1);
7513 static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7516 WORD wEEPROMAddress = wAddress + 3;
7520 lastLCC = inb(wEEPROMAddress);
7521 lastLCC = lastLCC | 0x02;
7522 lastLCC = lastLCC & 0xfe;
7523 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7525 mdelay(1); /* delay */
7527 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7528 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7529 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7530 for (i = 0; i < 8; i++) {
7531 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7535 for (i = 0; i < 16; i++) {
7536 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7537 *pwResult = (*pwResult << 1) | byResult;
7540 mdelay(1); /* another delay */
7542 lastLCC = lastLCC & 0xfd;
7543 outb(lastLCC, wEEPROMAddress); /* negate CS */
7548 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7551 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7553 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7555 return (((DWORD) wHi << 16) | wLo);
7558 static int dspio[IXJMAX + 1] =
7562 static int xio[IXJMAX + 1] =
7567 module_param_array(dspio, int, NULL, 0);
7568 module_param_array(xio, int, NULL, 0);
7569 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7570 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7571 MODULE_LICENSE("GPL");
7573 static void __exit ixj_exit(void)
7578 static IXJ *new_ixj(unsigned long port)
7581 if (!request_region(port, 16, "ixj DSP")) {
7582 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7587 release_region(port, 16);
7588 printk(KERN_INFO "ixj: out of memory\n");
7591 res->DSPbase = port;
7595 static int __init ixj_probe_isapnp(int *cnt)
7599 struct pnp_dev *dev = NULL, *old_dev = NULL;
7607 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7608 ISAPNP_FUNCTION(func), old_dev);
7609 if (!dev || !dev->card)
7611 result = pnp_device_attach(dev);
7613 printk("pnp attach failed %d \n", result);
7616 if (pnp_activate_dev(dev) < 0) {
7617 printk("pnp activate failed (out of resources?)\n");
7618 pnp_device_detach(dev);
7622 if (!pnp_port_valid(dev, 0)) {
7623 pnp_device_detach(dev);
7627 j = new_ixj(pnp_port_start(dev, 0));
7632 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7636 j->cardtype = QTI_PHONEJACK;
7639 j->cardtype = QTI_LINEJACK;
7642 j->cardtype = QTI_PHONEJACK_LITE;
7646 probe = ixj_selfprobe(j);
7648 j->serial = dev->card->serial;
7652 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7655 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7658 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7675 static int __init ixj_probe_isa(int *cnt)
7679 /* Use passed parameters for older kernels without PnP */
7680 for (i = 0; i < IXJMAX; i++) {
7682 IXJ *j = new_ixj(dspio[i]);
7687 j->XILINXbase = xio[i];
7691 probe = ixj_selfprobe(j);
7699 static int __init ixj_probe_pci(int *cnt)
7701 struct pci_dev *pci = NULL;
7705 for (i = 0; i < IXJMAX - *cnt; i++) {
7706 pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7707 PCI_DEVICE_ID_QUICKNET_XJ, pci);
7711 if (pci_enable_device(pci))
7713 j = new_ixj(pci_resource_start(pci, 0));
7717 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7718 j->XILINXbase = j->DSPbase + 0x10;
7719 j->cardtype = QTI_PHONEJACK_PCI;
7721 probe = ixj_selfprobe(j);
7723 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7730 static int __init ixj_init(void)
7737 /* These might be no-ops, see above. */
7738 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7741 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7744 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7747 printk(KERN_INFO "ixj driver initialized.\n");
7748 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7752 module_init(ixj_init);
7753 module_exit(ixj_exit);
7755 static void DAA_Coeff_US(IXJ *j)
7759 j->daa_country = DAA_US;
7760 /*----------------------------------------------- */
7762 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7763 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7766 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7767 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7768 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7769 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7771 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7772 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7773 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7774 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7775 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7776 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7777 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7778 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7779 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7780 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7781 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7782 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7783 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7784 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7785 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7786 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7787 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7788 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7789 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7790 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7791 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7792 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7793 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7794 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7795 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7796 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7797 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7798 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7799 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7800 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7801 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7802 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7803 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7804 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7805 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7806 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7807 /* Bytes for AR-filter (09): 52,D3,11,42 */
7808 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7809 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7810 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7811 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7812 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7815 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7817 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7818 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7821 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7822 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7824 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7826 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7827 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7828 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7829 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7830 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7831 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7832 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7833 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7834 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7835 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7836 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7837 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7838 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7839 /* ; (10K, 0.68uF) */
7841 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7842 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7843 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7844 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7846 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7847 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7848 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7849 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7850 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7851 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7852 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7853 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7854 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7855 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7856 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7857 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7858 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7860 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7861 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7862 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7863 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7864 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7866 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7867 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7868 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7869 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7870 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7871 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7872 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7873 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7874 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7875 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7876 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7877 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7878 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7879 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7880 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7881 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7882 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7883 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7885 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7886 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7887 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7888 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7889 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7891 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7892 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7893 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7894 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7896 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7897 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7898 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7899 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7900 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7901 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7902 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7903 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7904 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7905 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7906 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7907 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7908 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7911 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7912 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7913 /* Config. Reg. 1 (dialing) (cr1):05 */
7914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7915 /* Config. Reg. 2 (caller ID) (cr2):04 */
7916 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7917 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7918 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7919 /* Config. Reg. 4 (analog gain) (cr4):02 */
7920 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7921 /* Config. Reg. 5 (Version) (cr5):02 */
7922 /* Config. Reg. 6 (Reserved) (cr6):00 */
7923 /* Config. Reg. 7 (Reserved) (cr7):00 */
7926 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7928 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7929 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7931 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7932 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7933 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7934 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7935 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7936 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7938 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7939 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7940 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7941 /* Ext. Reg. 6 (Power State) (xr6):00 */
7942 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7943 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7944 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7946 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7947 /* 12,33,5A,C3 ; 770 Hz */
7948 /* 13,3C,5B,32 ; 852 Hz */
7949 /* 1D,1B,5C,CC ; 941 Hz */
7951 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7952 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7953 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7954 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7955 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7956 /* EC,1D,52,22 ; 1336 Hz */
7957 /* AA,AC,51,D2 ; 1477 Hz */
7958 /* 9B,3B,51,25 ; 1633 Hz */
7959 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7960 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7961 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7962 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7965 static void DAA_Coeff_UK(IXJ *j)
7969 j->daa_country = DAA_UK;
7970 /*----------------------------------------------- */
7972 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7973 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7976 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7977 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7978 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7979 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7981 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7982 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7983 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7984 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7985 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7986 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7987 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7988 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7989 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7990 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7991 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7992 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7993 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7994 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7995 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7996 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7997 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7998 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7999 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8000 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8001 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8002 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8003 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8004 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8005 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8006 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8007 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8008 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8009 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8010 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8011 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8012 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8013 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8014 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8015 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8016 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8017 /* Bytes for AR-filter (09): E2,27,10,D6 */
8018 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8019 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8020 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8021 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8022 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8023 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8024 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8025 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8027 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8028 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8031 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8032 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8034 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8036 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8037 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8038 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8039 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8040 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8041 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8042 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8043 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8044 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8045 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8046 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8047 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8048 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8050 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8051 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8052 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8053 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8055 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8056 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8057 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8058 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8059 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8060 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8061 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8062 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8063 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8064 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8065 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8066 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8067 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8068 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8069 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8070 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8071 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8072 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8073 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8074 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8075 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8076 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8078 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8079 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8080 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8081 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8082 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8083 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8084 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8085 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8086 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8087 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8088 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8089 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8090 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8092 /* Config. Reg. 0 (filters) (cr0):FF */
8093 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8094 /* Config. Reg. 1 (dialing) (cr1):05 */
8095 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8096 /* Config. Reg. 2 (caller ID) (cr2):04 */
8097 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8098 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8099 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8100 /* Config. Reg. 4 (analog gain) (cr4):02 */
8101 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8102 /* Config. Reg. 5 (Version) (cr5):02 */
8103 /* Config. Reg. 6 (Reserved) (cr6):00 */
8104 /* Config. Reg. 7 (Reserved) (cr7):00 */
8106 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8108 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8109 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8111 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8112 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8114 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8115 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8116 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8117 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8118 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8119 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8120 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8121 /* Ext. Reg. 6 (Power State) (xr6):00 */
8122 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8123 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8124 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8125 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8126 /* 12,33,5A,C3 ; 770 Hz */
8127 /* 13,3C,5B,32 ; 852 Hz */
8128 /* 1D,1B,5C,CC ; 941 Hz */
8130 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8131 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8132 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8133 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8134 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8135 /* EC,1D,52,22 ; 1336 Hz */
8136 /* AA,AC,51,D2 ; 1477 Hz */
8137 /* 9B,3B,51,25 ; 1633 Hz */
8138 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8139 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8140 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8141 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8145 static void DAA_Coeff_France(IXJ *j)
8149 j->daa_country = DAA_FRANCE;
8150 /*----------------------------------------------- */
8152 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8153 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8156 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8157 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8158 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8159 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8161 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8162 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8163 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8164 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8165 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8166 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8167 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8168 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8169 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8170 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8171 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8172 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8173 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8174 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8175 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8176 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8177 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8178 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8179 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8180 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8181 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8182 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8183 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8184 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8185 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8186 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8187 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8188 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8189 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8190 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8191 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8192 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8193 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8194 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8195 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8196 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8197 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8198 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8199 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8200 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8201 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8202 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8203 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8204 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8205 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8207 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8208 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8211 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8212 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8214 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8216 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8217 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8218 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8219 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8220 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8221 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8222 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8223 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8224 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8225 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8226 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8227 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8228 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8230 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8231 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8232 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8233 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8235 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8236 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8237 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8238 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8239 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8240 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8241 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8242 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8243 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8244 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8245 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8246 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8247 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8248 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8249 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8250 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8251 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8252 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8253 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8254 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8255 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8256 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8258 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8259 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8260 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8261 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8262 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8263 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8264 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8265 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8266 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8267 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8268 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8269 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8270 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8272 /* Config. Reg. 0 (filters) (cr0):FF */
8273 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8274 /* Config. Reg. 1 (dialing) (cr1):05 */
8275 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8276 /* Config. Reg. 2 (caller ID) (cr2):04 */
8277 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8278 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8279 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8280 /* Config. Reg. 4 (analog gain) (cr4):02 */
8281 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8282 /* Config. Reg. 5 (Version) (cr5):02 */
8283 /* Config. Reg. 6 (Reserved) (cr6):00 */
8284 /* Config. Reg. 7 (Reserved) (cr7):00 */
8286 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8288 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8289 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8291 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8292 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8294 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8295 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8296 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8297 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8298 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8299 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8300 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8301 /* Ext. Reg. 6 (Power State) (xr6):00 */
8302 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8303 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8304 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8305 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8306 /* 12,33,5A,C3 ; 770 Hz */
8307 /* 13,3C,5B,32 ; 852 Hz */
8308 /* 1D,1B,5C,CC ; 941 Hz */
8310 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8311 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8312 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8313 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8314 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8315 /* EC,1D,52,22 ; 1336 Hz */
8316 /* AA,AC,51,D2 ; 1477 Hz */
8317 /* 9B,3B,51,25 ; 1633 Hz */
8318 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8319 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8320 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8321 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8325 static void DAA_Coeff_Germany(IXJ *j)
8329 j->daa_country = DAA_GERMANY;
8330 /*----------------------------------------------- */
8332 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8333 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8336 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8337 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8338 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8339 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8341 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8342 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8343 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8344 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8345 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8346 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8347 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8348 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8349 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8350 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8351 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8352 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8353 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8354 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8355 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8356 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8357 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8358 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8359 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8360 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8361 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8362 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8363 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8364 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8365 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8366 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8367 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8368 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8369 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8370 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8371 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8372 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8373 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8374 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8375 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8376 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8377 /* Bytes for AR-filter (09): 72,42,13,4B */
8378 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8379 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8380 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8381 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8382 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8383 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8384 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8385 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8387 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8388 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8391 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8392 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8394 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8396 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8397 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8398 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8399 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8400 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8401 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8402 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8403 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8404 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8405 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8406 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8407 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8408 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8409 /* ; (10K, 0.68uF) */
8410 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8411 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8412 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8413 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8415 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8416 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8417 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8418 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8419 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8420 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8421 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8422 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8423 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8424 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8425 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8426 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8427 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8428 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8429 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8430 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8431 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8432 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8433 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8434 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8435 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8436 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8438 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8439 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8440 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8441 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8442 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8443 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8444 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8445 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8446 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8447 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8448 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8449 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8450 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8452 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8453 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8454 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8455 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8456 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8457 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8458 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8459 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8460 /* Config. Reg. 4 (analog gain) (cr4):02 */
8461 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8462 /* Config. Reg. 5 (Version) (cr5):02 */
8463 /* Config. Reg. 6 (Reserved) (cr6):00 */
8464 /* Config. Reg. 7 (Reserved) (cr7):00 */
8466 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8468 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8469 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8471 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8472 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8474 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8475 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8476 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8477 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8478 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8479 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8480 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8481 /* Ext. Reg. 6 (Power State) (xr6):00 */
8482 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8483 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8484 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8485 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8486 /* 12,33,5A,C3 ; 770 Hz */
8487 /* 13,3C,5B,32 ; 852 Hz */
8488 /* 1D,1B,5C,CC ; 941 Hz */
8490 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8491 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8492 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8493 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8494 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8495 /* EC,1D,52,22 ; 1336 Hz */
8496 /* AA,AC,51,D2 ; 1477 Hz */
8497 /* 9B,3B,51,25 ; 1633 Hz */
8498 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8499 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8500 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8501 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8505 static void DAA_Coeff_Australia(IXJ *j)
8509 j->daa_country = DAA_AUSTRALIA;
8510 /*----------------------------------------------- */
8512 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8513 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8516 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8517 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8518 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8519 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8521 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8522 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8523 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8524 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8525 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8526 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8527 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8528 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8529 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8530 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8531 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8532 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8533 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8534 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8535 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8536 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8537 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8538 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8539 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8540 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8541 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8542 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8543 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8544 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8545 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8546 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8547 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8548 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8549 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8550 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8551 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8552 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8553 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8554 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8555 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8556 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8557 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8558 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8559 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8560 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8561 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8562 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8563 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8564 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8565 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8567 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8568 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8571 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8572 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8574 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8576 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8577 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8578 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8579 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8580 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8581 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8582 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8583 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8584 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8585 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8586 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8587 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8588 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8590 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8591 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8592 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8593 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8595 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8596 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8597 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8598 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8599 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8600 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8601 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8602 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8603 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8604 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8605 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8606 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8607 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8608 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8609 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8610 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8611 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8612 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8613 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8614 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8615 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8616 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8618 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8619 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8620 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8621 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8622 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8623 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8624 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8625 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8626 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8627 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8628 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8629 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8630 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8632 /* Config. Reg. 0 (filters) (cr0):FF */
8633 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8634 /* Config. Reg. 1 (dialing) (cr1):05 */
8635 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8636 /* Config. Reg. 2 (caller ID) (cr2):04 */
8637 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8638 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8639 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8640 /* Config. Reg. 4 (analog gain) (cr4):02 */
8641 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8642 /* Config. Reg. 5 (Version) (cr5):02 */
8643 /* Config. Reg. 6 (Reserved) (cr6):00 */
8644 /* Config. Reg. 7 (Reserved) (cr7):00 */
8646 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8648 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8649 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8651 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8652 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8654 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8655 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8656 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8657 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8658 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8659 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8660 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8661 /* Ext. Reg. 6 (Power State) (xr6):00 */
8662 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8663 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8664 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8666 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8667 /* 12,33,5A,C3 ; 770 Hz */
8668 /* 13,3C,5B,32 ; 852 Hz */
8669 /* 1D,1B,5C,CC ; 941 Hz */
8670 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8671 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8672 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8673 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8675 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8676 /* EC,1D,52,22 ; 1336 Hz */
8677 /* AA,AC,51,D2 ; 1477 Hz */
8678 /* 9B,3B,51,25 ; 1633 Hz */
8679 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8680 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8681 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8682 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8685 static void DAA_Coeff_Japan(IXJ *j)
8689 j->daa_country = DAA_JAPAN;
8690 /*----------------------------------------------- */
8692 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8693 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8696 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8697 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8698 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8699 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8701 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8702 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8703 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8704 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8705 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8706 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8707 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8708 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8709 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8710 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8711 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8712 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8713 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8714 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8715 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8716 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8717 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8718 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8719 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8720 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8721 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8722 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8723 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8724 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8725 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8726 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8727 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8728 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8729 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8730 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8731 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8732 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8733 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8734 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8735 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8736 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8737 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8738 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8739 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8740 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8741 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8742 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8743 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8744 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8745 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8747 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8748 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8751 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8752 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8754 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8756 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8757 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8758 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8759 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8760 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8761 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8762 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8763 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8764 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8765 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8766 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8767 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8768 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8770 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8771 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8772 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8773 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8775 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8776 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8777 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8778 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8779 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8780 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8781 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8782 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8783 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8784 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8785 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8786 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8787 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8788 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8789 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8790 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8791 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8792 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8793 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8794 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8795 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8796 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8798 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8799 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8800 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8801 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8802 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8803 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8804 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8805 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8806 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8807 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8808 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8809 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8810 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8812 /* Config. Reg. 0 (filters) (cr0):FF */
8813 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8814 /* Config. Reg. 1 (dialing) (cr1):05 */
8815 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8816 /* Config. Reg. 2 (caller ID) (cr2):04 */
8817 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8818 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8819 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8820 /* Config. Reg. 4 (analog gain) (cr4):02 */
8821 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8822 /* Config. Reg. 5 (Version) (cr5):02 */
8823 /* Config. Reg. 6 (Reserved) (cr6):00 */
8824 /* Config. Reg. 7 (Reserved) (cr7):00 */
8826 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8828 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8829 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8831 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8832 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8834 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8835 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8836 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8837 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8838 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8839 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8840 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8841 /* Ext. Reg. 6 (Power State) (xr6):00 */
8842 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8843 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8844 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8845 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8846 /* 12,33,5A,C3 ; 770 Hz */
8847 /* 13,3C,5B,32 ; 852 Hz */
8848 /* 1D,1B,5C,CC ; 941 Hz */
8850 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8851 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8852 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8853 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8854 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8855 /* EC,1D,52,22 ; 1336 Hz */
8856 /* AA,AC,51,D2 ; 1477 Hz */
8857 /* 9B,3B,51,25 ; 1633 Hz */
8858 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8859 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8860 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8861 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8864 static s16 tone_table[][19] =
8867 32538, /* A1 = 1.985962 */
8868 -32325, /* A2 = -0.986511 */
8869 -343, /* B2 = -0.010493 */
8871 343, /* B0 = 0.010493 */
8872 32619, /* A1 = 1.990906 */
8873 -32520, /* A2 = -0.992462 */
8874 19179, /* B2 = 0.585327 */
8875 -19178, /* B1 = -1.170593 */
8876 19179, /* B0 = 0.585327 */
8877 32723, /* A1 = 1.997314 */
8878 -32686, /* A2 = -0.997528 */
8879 9973, /* B2 = 0.304352 */
8880 -9955, /* B1 = -0.607605 */
8881 9973, /* B0 = 0.304352 */
8882 7, /* Internal filter scaling */
8883 159, /* Minimum in-band energy threshold */
8884 21, /* 21/32 in-band to broad-band ratio */
8885 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8887 { /* f133_200[] 12 */
8888 32072, /* A1 = 1.95752 */
8889 -31896, /* A2 = -0.973419 */
8890 -435, /* B2 = -0.013294 */
8892 435, /* B0 = 0.013294 */
8893 32188, /* A1 = 1.9646 */
8894 -32400, /* A2 = -0.98877 */
8895 15139, /* B2 = 0.462036 */
8896 -14882, /* B1 = -0.908356 */
8897 15139, /* B0 = 0.462036 */
8898 32473, /* A1 = 1.981995 */
8899 -32524, /* A2 = -0.992584 */
8900 23200, /* B2 = 0.708008 */
8901 -23113, /* B1 = -1.410706 */
8902 23200, /* B0 = 0.708008 */
8903 7, /* Internal filter scaling */
8904 159, /* Minimum in-band energy threshold */
8905 21, /* 21/32 in-band to broad-band ratio */
8906 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8909 31769, /* A1 = -1.939026 */
8910 -32584, /* A2 = 0.994385 */
8911 -475, /* B2 = -0.014522 */
8912 0, /* B1 = 0.000000 */
8913 475, /* B0 = 0.014522 */
8914 31789, /* A1 = -1.940247 */
8915 -32679, /* A2 = 0.997284 */
8916 17280, /* B2 = 0.527344 */
8917 -16865, /* B1 = -1.029358 */
8918 17280, /* B0 = 0.527344 */
8919 31841, /* A1 = -1.943481 */
8920 -32681, /* A2 = 0.997345 */
8921 543, /* B2 = 0.016579 */
8922 -525, /* B1 = -0.032097 */
8923 543, /* B0 = 0.016579 */
8924 5, /* Internal filter scaling */
8925 159, /* Minimum in-band energy threshold */
8926 21, /* 21/32 in-band to broad-band ratio */
8927 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8929 { /* f300_420[] 14 */
8930 30750, /* A1 = 1.876892 */
8931 -31212, /* A2 = -0.952515 */
8932 -804, /* B2 = -0.024541 */
8934 804, /* B0 = 0.024541 */
8935 30686, /* A1 = 1.872925 */
8936 -32145, /* A2 = -0.980988 */
8937 14747, /* B2 = 0.450043 */
8938 -13703, /* B1 = -0.836395 */
8939 14747, /* B0 = 0.450043 */
8940 31651, /* A1 = 1.931824 */
8941 -32321, /* A2 = -0.986389 */
8942 24425, /* B2 = 0.745422 */
8943 -23914, /* B1 = -1.459595 */
8944 24427, /* B0 = 0.745483 */
8945 7, /* Internal filter scaling */
8946 159, /* Minimum in-band energy threshold */
8947 21, /* 21/32 in-band to broad-band ratio */
8948 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8951 31613, /* A1 = -1.929565 */
8952 -32646, /* A2 = 0.996277 */
8953 -185, /* B2 = -0.005657 */
8954 0, /* B1 = 0.000000 */
8955 185, /* B0 = 0.005657 */
8956 31620, /* A1 = -1.929932 */
8957 -32713, /* A2 = 0.998352 */
8958 19253, /* B2 = 0.587585 */
8959 -18566, /* B1 = -1.133179 */
8960 19253, /* B0 = 0.587585 */
8961 31674, /* A1 = -1.933228 */
8962 -32715, /* A2 = 0.998413 */
8963 2575, /* B2 = 0.078590 */
8964 -2495, /* B1 = -0.152283 */
8965 2575, /* B0 = 0.078590 */
8966 5, /* Internal filter scaling */
8967 159, /* Minimum in-band energy threshold */
8968 21, /* 21/32 in-band to broad-band ratio */
8969 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8971 { /* f300_425[] 16 */
8972 30741, /* A1 = 1.876282 */
8973 -31475, /* A2 = -0.960541 */
8974 -703, /* B2 = -0.021484 */
8976 703, /* B0 = 0.021484 */
8977 30688, /* A1 = 1.873047 */
8978 -32248, /* A2 = -0.984161 */
8979 14542, /* B2 = 0.443787 */
8980 -13523, /* B1 = -0.825439 */
8981 14542, /* B0 = 0.443817 */
8982 31494, /* A1 = 1.922302 */
8983 -32366, /* A2 = -0.987762 */
8984 21577, /* B2 = 0.658508 */
8985 -21013, /* B1 = -1.282532 */
8986 21577, /* B0 = 0.658508 */
8987 7, /* Internal filter scaling */
8988 159, /* Minimum in-band energy threshold */
8989 21, /* 21/32 in-band to broad-band ratio */
8990 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8992 { /* f330_440[] 17 */
8993 30627, /* A1 = 1.869324 */
8994 -31338, /* A2 = -0.95636 */
8995 -843, /* B2 = -0.025749 */
8997 843, /* B0 = 0.025749 */
8998 30550, /* A1 = 1.864685 */
8999 -32221, /* A2 = -0.983337 */
9000 13594, /* B2 = 0.414886 */
9001 -12589, /* B1 = -0.768402 */
9002 13594, /* B0 = 0.414886 */
9003 31488, /* A1 = 1.921936 */
9004 -32358, /* A2 = -0.987518 */
9005 24684, /* B2 = 0.753296 */
9006 -24029, /* B1 = -1.466614 */
9007 24684, /* B0 = 0.753296 */
9008 7, /* Internal filter scaling */
9009 159, /* Minimum in-band energy threshold */
9010 21, /* 21/32 in-band to broad-band ratio */
9011 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9014 31546, /* A1 = -1.925476 */
9015 -32646, /* A2 = 0.996277 */
9016 -445, /* B2 = -0.013588 */
9017 0, /* B1 = 0.000000 */
9018 445, /* B0 = 0.013588 */
9019 31551, /* A1 = -1.925781 */
9020 -32713, /* A2 = 0.998352 */
9021 23884, /* B2 = 0.728882 */
9022 -22979, /* B1 = -1.402527 */
9023 23884, /* B0 = 0.728882 */
9024 31606, /* A1 = -1.929138 */
9025 -32715, /* A2 = 0.998413 */
9026 863, /* B2 = 0.026367 */
9027 -835, /* B1 = -0.050985 */
9028 863, /* B0 = 0.026367 */
9029 5, /* Internal filter scaling */
9030 159, /* Minimum in-band energy threshold */
9031 21, /* 21/32 in-band to broad-band ratio */
9032 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9034 { /* f350_400[] 19 */
9035 31006, /* A1 = 1.892517 */
9036 -32029, /* A2 = -0.977448 */
9037 -461, /* B2 = -0.014096 */
9039 461, /* B0 = 0.014096 */
9040 30999, /* A1 = 1.892029 */
9041 -32487, /* A2 = -0.991455 */
9042 11325, /* B2 = 0.345612 */
9043 -10682, /* B1 = -0.651978 */
9044 11325, /* B0 = 0.345612 */
9045 31441, /* A1 = 1.919067 */
9046 -32526, /* A2 = -0.992615 */
9047 24324, /* B2 = 0.74231 */
9048 -23535, /* B1 = -1.436523 */
9049 24324, /* B0 = 0.74231 */
9050 7, /* Internal filter scaling */
9051 159, /* Minimum in-band energy threshold */
9052 21, /* 21/32 in-band to broad-band ratio */
9053 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9056 30634, /* A1 = 1.869751 */
9057 -31533, /* A2 = -0.962341 */
9058 -680, /* B2 = -0.020782 */
9060 680, /* B0 = 0.020782 */
9061 30571, /* A1 = 1.865906 */
9062 -32277, /* A2 = -0.985016 */
9063 12894, /* B2 = 0.393524 */
9064 -11945, /* B1 = -0.729065 */
9065 12894, /* B0 = 0.393524 */
9066 31367, /* A1 = 1.91449 */
9067 -32379, /* A2 = -0.988129 */
9068 23820, /* B2 = 0.726929 */
9069 -23104, /* B1 = -1.410217 */
9070 23820, /* B0 = 0.726929 */
9071 7, /* Internal filter scaling */
9072 159, /* Minimum in-band energy threshold */
9073 21, /* 21/32 in-band to broad-band ratio */
9074 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9077 30552, /* A1 = 1.864807 */
9078 -31434, /* A2 = -0.95929 */
9079 -690, /* B2 = -0.021066 */
9081 690, /* B0 = 0.021066 */
9082 30472, /* A1 = 1.859924 */
9083 -32248, /* A2 = -0.984161 */
9084 13385, /* B2 = 0.408478 */
9085 -12357, /* B1 = -0.754242 */
9086 13385, /* B0 = 0.408478 */
9087 31358, /* A1 = 1.914001 */
9088 -32366, /* A2 = -0.987732 */
9089 26488, /* B2 = 0.80835 */
9090 -25692, /* B1 = -1.568176 */
9091 26490, /* B0 = 0.808411 */
9092 7, /* Internal filter scaling */
9093 159, /* Minimum in-band energy threshold */
9094 21, /* 21/32 in-band to broad-band ratio */
9095 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9098 31397, /* A1 = -1.916321 */
9099 -32623, /* A2 = 0.995605 */
9100 -117, /* B2 = -0.003598 */
9101 0, /* B1 = 0.000000 */
9102 117, /* B0 = 0.003598 */
9103 31403, /* A1 = -1.916687 */
9104 -32700, /* A2 = 0.997925 */
9105 3388, /* B2 = 0.103401 */
9106 -3240, /* B1 = -0.197784 */
9107 3388, /* B0 = 0.103401 */
9108 31463, /* A1 = -1.920410 */
9109 -32702, /* A2 = 0.997986 */
9110 13346, /* B2 = 0.407288 */
9111 -12863, /* B1 = -0.785126 */
9112 13346, /* B0 = 0.407288 */
9113 5, /* Internal filter scaling */
9114 159, /* Minimum in-band energy threshold */
9115 21, /* 21/32 in-band to broad-band ratio */
9116 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9119 30831, /* A1 = 1.881775 */
9120 -32064, /* A2 = -0.978546 */
9121 -367, /* B2 = -0.01122 */
9123 367, /* B0 = 0.01122 */
9124 30813, /* A1 = 1.880737 */
9125 -32456, /* A2 = -0.990509 */
9126 11068, /* B2 = 0.337769 */
9127 -10338, /* B1 = -0.631042 */
9128 11068, /* B0 = 0.337769 */
9129 31214, /* A1 = 1.905212 */
9130 -32491, /* A2 = -0.991577 */
9131 16374, /* B2 = 0.499695 */
9132 -15781, /* B1 = -0.963196 */
9133 16374, /* B0 = 0.499695 */
9134 7, /* Internal filter scaling */
9135 159, /* Minimum in-band energy threshold */
9136 21, /* 21/32 in-band to broad-band ratio */
9137 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9140 31152, /* A1 = -1.901428 */
9141 -32613, /* A2 = 0.995300 */
9142 -314, /* B2 = -0.009605 */
9143 0, /* B1 = 0.000000 */
9144 314, /* B0 = 0.009605 */
9145 31156, /* A1 = -1.901672 */
9146 -32694, /* A2 = 0.997742 */
9147 28847, /* B2 = 0.880371 */
9148 -2734, /* B1 = -0.166901 */
9149 28847, /* B0 = 0.880371 */
9150 31225, /* A1 = -1.905823 */
9151 -32696, /* A2 = 0.997803 */
9152 462, /* B2 = 0.014108 */
9153 -442, /* B1 = -0.027019 */
9154 462, /* B0 = 0.014108 */
9155 5, /* Internal filter scaling */
9156 159, /* Minimum in-band energy threshold */
9157 21, /* 21/32 in-band to broad-band ratio */
9158 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9161 30836, /* A1 = 1.882141 */
9162 -32296, /* A2 = -0.985596 */
9163 -324, /* B2 = -0.009903 */
9165 324, /* B0 = 0.009903 */
9166 30825, /* A1 = 1.881409 */
9167 -32570, /* A2 = -0.993958 */
9168 16847, /* B2 = 0.51416 */
9169 -15792, /* B1 = -0.963898 */
9170 16847, /* B0 = 0.51416 */
9171 31106, /* A1 = 1.89856 */
9172 -32584, /* A2 = -0.994415 */
9173 9579, /* B2 = 0.292328 */
9174 -9164, /* B1 = -0.559357 */
9175 9579, /* B0 = 0.292328 */
9176 7, /* Internal filter scaling */
9177 159, /* Minimum in-band energy threshold */
9178 21, /* 21/32 in-band to broad-band ratio */
9179 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9182 30702, /* A1 = 1.873962 */
9183 -32134, /* A2 = -0.980682 */
9184 -517, /* B2 = -0.015793 */
9186 517, /* B0 = 0.015793 */
9187 30676, /* A1 = 1.872375 */
9188 -32520, /* A2 = -0.992462 */
9189 8144, /* B2 = 0.24855 */
9190 -7596, /* B1 = -0.463684 */
9191 8144, /* B0 = 0.24855 */
9192 31084, /* A1 = 1.897217 */
9193 -32547, /* A2 = -0.993256 */
9194 22713, /* B2 = 0.693176 */
9195 -21734, /* B1 = -1.326599 */
9196 22713, /* B0 = 0.693176 */
9197 7, /* Internal filter scaling */
9198 159, /* Minimum in-band energy threshold */
9199 21, /* 21/32 in-band to broad-band ratio */
9200 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9203 30613, /* A1 = 1.86853 */
9204 -32031, /* A2 = -0.977509 */
9205 -618, /* B2 = -0.018866 */
9207 618, /* B0 = 0.018866 */
9208 30577, /* A1 = 1.866272 */
9209 -32491, /* A2 = -0.991577 */
9210 9612, /* B2 = 0.293335 */
9211 -8935, /* B1 = -0.54541 */
9212 9612, /* B0 = 0.293335 */
9213 31071, /* A1 = 1.896484 */
9214 -32524, /* A2 = -0.992584 */
9215 21596, /* B2 = 0.659058 */
9216 -20667, /* B1 = -1.261414 */
9217 21596, /* B0 = 0.659058 */
9218 7, /* Internal filter scaling */
9219 159, /* Minimum in-band energy threshold */
9220 21, /* 21/32 in-band to broad-band ratio */
9221 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9224 30914, /* A1 = -1.886841 */
9225 -32584, /* A2 = 0.994385 */
9226 -426, /* B2 = -0.013020 */
9227 0, /* B1 = 0.000000 */
9228 426, /* B0 = 0.013020 */
9229 30914, /* A1 = -1.886841 */
9230 -32679, /* A2 = 0.997314 */
9231 17520, /* B2 = 0.534668 */
9232 -16471, /* B1 = -1.005310 */
9233 17520, /* B0 = 0.534668 */
9234 31004, /* A1 = -1.892334 */
9235 -32683, /* A2 = 0.997406 */
9236 819, /* B2 = 0.025023 */
9237 -780, /* B1 = -0.047619 */
9238 819, /* B0 = 0.025023 */
9239 5, /* Internal filter scaling */
9240 159, /* Minimum in-band energy threshold */
9241 21, /* 21/32 in-band to broad-band ratio */
9242 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9246 30881, /* A1 = -1.884827 */
9247 -32603, /* A2 = 0.994965 */
9248 -496, /* B2 = -0.015144 */
9249 0, /* B1 = 0.000000 */
9250 496, /* B0 = 0.015144 */
9251 30880, /* A1 = -1.884766 */
9252 -32692, /* A2 = 0.997711 */
9253 24767, /* B2 = 0.755859 */
9254 -23290, /* B1 = -1.421509 */
9255 24767, /* B0 = 0.755859 */
9256 30967, /* A1 = -1.890076 */
9257 -32694, /* A2 = 0.997772 */
9258 728, /* B2 = 0.022232 */
9259 -691, /* B1 = -0.042194 */
9260 728, /* B0 = 0.022232 */
9261 5, /* Internal filter scaling */
9262 159, /* Minimum in-band energy threshold */
9263 21, /* 21/32 in-band to broad-band ratio */
9264 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9290 30646, /* A1 = 1.870544 */
9291 -32327, /* A2 = -0.986572 */
9292 -287, /* B2 = -0.008769 */
9294 287, /* B0 = 0.008769 */
9295 30627, /* A1 = 1.869324 */
9296 -32607, /* A2 = -0.995087 */
9297 13269, /* B2 = 0.404968 */
9298 -12376, /* B1 = -0.755432 */
9299 13269, /* B0 = 0.404968 */
9300 30924, /* A1 = 1.887512 */
9301 -32619, /* A2 = -0.995453 */
9302 19950, /* B2 = 0.608826 */
9303 -18940, /* B1 = -1.156006 */
9304 19950, /* B0 = 0.608826 */
9305 7, /* Internal filter scaling */
9306 159, /* Minimum in-band energy threshold */
9307 21, /* 21/32 in-band to broad-band ratio */
9308 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9311 30396, /* A1 = 1.855225 */
9312 -32014, /* A2 = -0.97699 */
9313 -395, /* B2 = -0.012055 */
9315 395, /* B0 = 0.012055 */
9316 30343, /* A1 = 1.85199 */
9317 -32482, /* A2 = -0.991302 */
9318 17823, /* B2 = 0.543945 */
9319 -16431, /* B1 = -1.002869 */
9320 17823, /* B0 = 0.543945 */
9321 30872, /* A1 = 1.884338 */
9322 -32516, /* A2 = -0.99231 */
9323 18124, /* B2 = 0.553101 */
9324 -17246, /* B1 = -1.052673 */
9325 18124, /* B0 = 0.553101 */
9326 7, /* Internal filter scaling */
9327 159, /* Minimum in-band energy threshold */
9328 21, /* 21/32 in-band to broad-band ratio */
9329 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9332 30796, /* A1 = -1.879639 */
9333 -32603, /* A2 = 0.994965 */
9334 -254, /* B2 = -0.007762 */
9335 0, /* B1 = 0.000000 */
9336 254, /* B0 = 0.007762 */
9337 30793, /* A1 = -1.879456 */
9338 -32692, /* A2 = 0.997711 */
9339 18934, /* B2 = 0.577820 */
9340 -17751, /* B1 = -1.083496 */
9341 18934, /* B0 = 0.577820 */
9342 30882, /* A1 = -1.884888 */
9343 -32694, /* A2 = 0.997772 */
9344 1858, /* B2 = 0.056713 */
9345 -1758, /* B1 = -0.107357 */
9346 1858, /* B0 = 0.056713 */
9347 5, /* Internal filter scaling */
9348 159, /* Minimum in-band energy threshold */
9349 21, /* 21/32 in-band to broad-band ratio */
9350 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9353 30641, /* A1 = 1.870239 */
9354 -32458, /* A2 = -0.99057 */
9355 -155, /* B2 = -0.004735 */
9357 155, /* B0 = 0.004735 */
9358 30631, /* A1 = 1.869568 */
9359 -32630, /* A2 = -0.995789 */
9360 11453, /* B2 = 0.349548 */
9361 -10666, /* B1 = -0.651001 */
9362 11453, /* B0 = 0.349548 */
9363 30810, /* A1 = 1.880554 */
9364 -32634, /* A2 = -0.995941 */
9365 12237, /* B2 = 0.373474 */
9366 -11588, /* B1 = -0.707336 */
9367 12237, /* B0 = 0.373474 */
9368 7, /* Internal filter scaling */
9369 159, /* Minimum in-band energy threshold */
9370 21, /* 21/32 in-band to broad-band ratio */
9371 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9374 30367, /* A1 = 1.853455 */
9375 -32147, /* A2 = -0.981079 */
9376 -495, /* B2 = -0.015113 */
9378 495, /* B0 = 0.015113 */
9379 30322, /* A1 = 1.850769 */
9380 -32543, /* A2 = -0.993134 */
9381 10031, /* B2 = 0.306152 */
9382 -9252, /* B1 = -0.564728 */
9383 10031, /* B0 = 0.306152 */
9384 30770, /* A1 = 1.878052 */
9385 -32563, /* A2 = -0.993774 */
9386 22674, /* B2 = 0.691956 */
9387 -21465, /* B1 = -1.31012 */
9388 22674, /* B0 = 0.691956 */
9389 7, /* Internal filter scaling */
9390 159, /* Minimum in-band energy threshold */
9391 21, /* 21/32 in-band to broad-band ratio */
9392 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9395 30709, /* A1 = -1.874329 */
9396 -32603, /* A2 = 0.994965 */
9397 -83, /* B2 = -0.002545 */
9398 0, /* B1 = 0.000000 */
9399 83, /* B0 = 0.002545 */
9400 30704, /* A1 = -1.874084 */
9401 -32692, /* A2 = 0.997711 */
9402 10641, /* B2 = 0.324738 */
9403 -9947, /* B1 = -0.607147 */
9404 10641, /* B0 = 0.324738 */
9405 30796, /* A1 = -1.879639 */
9406 -32694, /* A2 = 0.997772 */
9407 10079, /* B2 = 0.307587 */
9408 9513, /* B1 = 0.580688 */
9409 10079, /* B0 = 0.307587 */
9410 5, /* Internal filter scaling */
9411 159, /* Minimum in-band energy threshold */
9412 21, /* 21/32 in-band to broad-band ratio */
9413 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9416 30664, /* A1 = -1.871643 */
9417 -32603, /* A2 = 0.994965 */
9418 -164, /* B2 = -0.005029 */
9419 0, /* B1 = 0.000000 */
9420 164, /* B0 = 0.005029 */
9421 30661, /* A1 = -1.871399 */
9422 -32692, /* A2 = 0.997711 */
9423 15294, /* B2 = 0.466736 */
9424 -14275, /* B1 = -0.871307 */
9425 15294, /* B0 = 0.466736 */
9426 30751, /* A1 = -1.876953 */
9427 -32694, /* A2 = 0.997772 */
9428 3548, /* B2 = 0.108284 */
9429 -3344, /* B1 = -0.204155 */
9430 3548, /* B0 = 0.108284 */
9431 5, /* Internal filter scaling */
9432 159, /* Minimum in-band energy threshold */
9433 21, /* 21/32 in-band to broad-band ratio */
9434 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9437 30653, /* A1 = -1.870911 */
9438 -32615, /* A2 = 0.995361 */
9439 -209, /* B2 = -0.006382 */
9440 0, /* B1 = 0.000000 */
9441 209, /* B0 = 0.006382 */
9442 30647, /* A1 = -1.870605 */
9443 -32702, /* A2 = 0.997986 */
9444 18971, /* B2 = 0.578979 */
9445 -17716, /* B1 = -1.081299 */
9446 18971, /* B0 = 0.578979 */
9447 30738, /* A1 = -1.876099 */
9448 -32702, /* A2 = 0.998016 */
9449 2967, /* B2 = 0.090561 */
9450 -2793, /* B1 = -0.170502 */
9451 2967, /* B0 = 0.090561 */
9452 5, /* Internal filter scaling */
9453 159, /* Minimum in-band energy threshold */
9454 21, /* 21/32 in-band to broad-band ratio */
9455 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9458 30437, /* A1 = -1.857727 */
9459 -32603, /* A2 = 0.994965 */
9460 -264, /* B2 = -0.008062 */
9461 0, /* B1 = 0.000000 */
9462 264, /* B0 = 0.008062 */
9463 30430, /* A1 = -1.857300 */
9464 -32692, /* A2 = 0.997711 */
9465 21681, /* B2 = 0.661682 */
9466 -20082, /* B1 = -1.225708 */
9467 21681, /* B0 = 0.661682 */
9468 30526, /* A1 = -1.863220 */
9469 -32694, /* A2 = 0.997742 */
9470 1559, /* B2 = 0.047600 */
9471 -1459, /* B1 = -0.089096 */
9472 1559, /* B0 = 0.047600 */
9473 5, /* Internal filter scaling */
9474 159, /* Minimum in-band energy threshold */
9475 21, /* 21/32 in-band to broad-band ratio */
9476 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9479 28975, /* A1 = 1.768494 */
9480 -30955, /* A2 = -0.944672 */
9481 -1026, /* B2 = -0.03133 */
9483 1026, /* B0 = 0.03133 */
9484 28613, /* A1 = 1.746399 */
9485 -32089, /* A2 = -0.979309 */
9486 14214, /* B2 = 0.433807 */
9487 -12202, /* B1 = -0.744812 */
9488 14214, /* B0 = 0.433807 */
9489 30243, /* A1 = 1.845947 */
9490 -32238, /* A2 = -0.983856 */
9491 24825, /* B2 = 0.757629 */
9492 -23402, /* B1 = -1.428345 */
9493 24825, /* B0 = 0.757629 */
9494 7, /* Internal filter scaling */
9495 159, /* Minimum in-band energy threshold */
9496 21, /* 21/32 in-band to broad-band ratio */
9497 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9500 30257, /* A1 = -1.846741 */
9501 -32605, /* A2 = 0.995056 */
9502 -249, /* B2 = -0.007625 */
9503 0, /* B1 = 0.000000 */
9504 249, /* B0 = 0.007625 */
9505 30247, /* A1 = -1.846191 */
9506 -32694, /* A2 = 0.997772 */
9507 18088, /* B2 = 0.552002 */
9508 -16652, /* B1 = -1.016418 */
9509 18088, /* B0 = 0.552002 */
9510 30348, /* A1 = -1.852295 */
9511 -32696, /* A2 = 0.997803 */
9512 2099, /* B2 = 0.064064 */
9513 -1953, /* B1 = -0.119202 */
9514 2099, /* B0 = 0.064064 */
9515 5, /* Internal filter scaling */
9516 159, /* Minimum in-band energy threshold */
9517 21, /* 21/32 in-band to broad-band ratio */
9518 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9521 30202, /* A1 = -1.843431 */
9522 -32624, /* A2 = 0.995622 */
9523 -413, /* B2 = -0.012622 */
9524 0, /* B1 = 0.000000 */
9525 413, /* B0 = 0.012622 */
9526 30191, /* A1 = -1.842721 */
9527 -32714, /* A2 = 0.998364 */
9528 25954, /* B2 = 0.792057 */
9529 -23890, /* B1 = -1.458131 */
9530 25954, /* B0 = 0.792057 */
9531 30296, /* A1 = -1.849172 */
9532 -32715, /* A2 = 0.998397 */
9533 2007, /* B2 = 0.061264 */
9534 -1860, /* B1 = -0.113568 */
9535 2007, /* B0 = 0.061264 */
9536 5, /* Internal filter scaling */
9537 159, /* Minimum in-band energy threshold */
9538 21, /* 21/32 in-band to broad-band ratio */
9539 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9542 30001, /* A1 = -1.831116 */
9543 -32613, /* A2 = 0.995270 */
9544 -155, /* B2 = -0.004750 */
9545 0, /* B1 = 0.000000 */
9546 155, /* B0 = 0.004750 */
9547 29985, /* A1 = -1.830200 */
9548 -32710, /* A2 = 0.998260 */
9549 6584, /* B2 = 0.200928 */
9550 -6018, /* B1 = -0.367355 */
9551 6584, /* B0 = 0.200928 */
9552 30105, /* A1 = -1.837524 */
9553 -32712, /* A2 = 0.998291 */
9554 23812, /* B2 = 0.726685 */
9555 -21936, /* B1 = -1.338928 */
9556 23812, /* B0 = 0.726685 */
9557 5, /* Internal filter scaling */
9558 159, /* Minimum in-band energy threshold */
9559 21, /* 21/32 in-band to broad-band ratio */
9560 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9563 29964, /* A1 = -1.828918 */
9564 -32601, /* A2 = 0.994904 */
9565 -101, /* B2 = -0.003110 */
9566 0, /* B1 = 0.000000 */
9567 101, /* B0 = 0.003110 */
9568 29949, /* A1 = -1.827942 */
9569 -32700, /* A2 = 0.997925 */
9570 11041, /* B2 = 0.336975 */
9571 -10075, /* B1 = -0.614960 */
9572 11041, /* B0 = 0.336975 */
9573 30070, /* A1 = -1.835388 */
9574 -32702, /* A2 = 0.997986 */
9575 16762, /* B2 = 0.511536 */
9576 -15437, /* B1 = -0.942230 */
9577 16762, /* B0 = 0.511536 */
9578 5, /* Internal filter scaling */
9579 159, /* Minimum in-band energy threshold */
9580 21, /* 21/32 in-band to broad-band ratio */
9581 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9584 29936, /* A1 = -1.827209 */
9585 -32584, /* A2 = 0.994415 */
9586 -91, /* B2 = -0.002806 */
9587 0, /* B1 = 0.000000 */
9588 91, /* B0 = 0.002806 */
9589 29921, /* A1 = -1.826233 */
9590 -32688, /* A2 = 0.997559 */
9591 11449, /* B2 = 0.349396 */
9592 -10426, /* B1 = -0.636383 */
9593 11449, /* B0 = 0.349396 */
9594 30045, /* A1 = -1.833862 */
9595 -32688, /* A2 = 0.997589 */
9596 13055, /* B2 = 0.398407 */
9597 -12028, /* B1 = -0.734161 */
9598 13055, /* B0 = 0.398407 */
9599 5, /* Internal filter scaling */
9600 159, /* Minimum in-band energy threshold */
9601 21, /* 21/32 in-band to broad-band ratio */
9602 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9605 28499, /* A1 = 1.739441 */
9606 -31129, /* A2 = -0.949982 */
9607 -849, /* B2 = -0.025922 */
9609 849, /* B0 = 0.025922 */
9610 28128, /* A1 = 1.716797 */
9611 -32130, /* A2 = -0.98056 */
9612 14556, /* B2 = 0.444214 */
9613 -12251, /* B1 = -0.747772 */
9614 14556, /* B0 = 0.444244 */
9615 29667, /* A1 = 1.81073 */
9616 -32244, /* A2 = -0.984039 */
9617 23038, /* B2 = 0.703064 */
9618 -21358, /* B1 = -1.303589 */
9619 23040, /* B0 = 0.703125 */
9620 7, /* Internal filter scaling */
9621 159, /* Minimum in-band energy threshold */
9622 21, /* 21/32 in-band to broad-band ratio */
9623 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9626 29271, /* A1 = -1.786560 */
9627 -32599, /* A2 = 0.994873 */
9628 -490, /* B2 = -0.014957 */
9629 0, /* B1 = 0.000000 */
9630 490, /* B0 = 0.014957 */
9631 29246, /* A1 = -1.785095 */
9632 -32700, /* A2 = 0.997925 */
9633 28961, /* B2 = 0.883850 */
9634 -25796, /* B1 = -1.574463 */
9635 28961, /* B0 = 0.883850 */
9636 29383, /* A1 = -1.793396 */
9637 -32700, /* A2 = 0.997955 */
9638 1299, /* B2 = 0.039650 */
9639 -1169, /* B1 = -0.071396 */
9640 1299, /* B0 = 0.039650 */
9641 5, /* Internal filter scaling */
9642 159, /* Minimum in-band energy threshold */
9643 21, /* 21/32 in-band to broad-band ratio */
9644 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9647 29230, /* A1 = -1.784058 */
9648 -32584, /* A2 = 0.994415 */
9649 -418, /* B2 = -0.012757 */
9650 0, /* B1 = 0.000000 */
9651 418, /* B0 = 0.012757 */
9652 29206, /* A1 = -1.782593 */
9653 -32688, /* A2 = 0.997559 */
9654 36556, /* B2 = 1.115601 */
9655 -32478, /* B1 = -1.982300 */
9656 36556, /* B0 = 1.115601 */
9657 29345, /* A1 = -1.791077 */
9658 -32688, /* A2 = 0.997589 */
9659 897, /* B2 = 0.027397 */
9660 -808, /* B1 = -0.049334 */
9661 897, /* B0 = 0.027397 */
9662 5, /* Internal filter scaling */
9663 159, /* Minimum in-band energy threshold */
9664 21, /* 21/32 in-band to broad-band ratio */
9665 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9668 29116, /* A1 = -1.777100 */
9669 -32603, /* A2 = 0.994965 */
9670 -165, /* B2 = -0.005039 */
9671 0, /* B1 = 0.000000 */
9672 165, /* B0 = 0.005039 */
9673 29089, /* A1 = -1.775452 */
9674 -32708, /* A2 = 0.998199 */
9675 6963, /* B2 = 0.212494 */
9676 -6172, /* B1 = -0.376770 */
9677 6963, /* B0 = 0.212494 */
9678 29237, /* A1 = -1.784485 */
9679 -32710, /* A2 = 0.998230 */
9680 24197, /* B2 = 0.738464 */
9681 -21657, /* B1 = -1.321899 */
9682 24197, /* B0 = 0.738464 */
9683 5, /* Internal filter scaling */
9684 159, /* Minimum in-band energy threshold */
9685 21, /* 21/32 in-band to broad-band ratio */
9686 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9689 28376, /* A1 = -1.731934 */
9690 -32567, /* A2 = 0.993896 */
9691 -363, /* B2 = -0.011102 */
9692 0, /* B1 = 0.000000 */
9693 363, /* B0 = 0.011102 */
9694 28337, /* A1 = -1.729614 */
9695 -32683, /* A2 = 0.997434 */
9696 21766, /* B2 = 0.664246 */
9697 -18761, /* B1 = -1.145081 */
9698 21766, /* B0 = 0.664246 */
9699 28513, /* A1 = -1.740356 */
9700 -32686, /* A2 = 0.997498 */
9701 2509, /* B2 = 0.076584 */
9702 -2196, /* B1 = -0.134041 */
9703 2509, /* B0 = 0.076584 */
9704 5, /* Internal filter scaling */
9705 159, /* Minimum in-band energy threshold */
9706 21, /* 21/32 in-band to broad-band ratio */
9707 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9710 27844, /* A1 = -1.699463 */
9711 -32563, /* A2 = 0.993744 */
9712 -366, /* B2 = -0.011187 */
9713 0, /* B1 = 0.000000 */
9714 366, /* B0 = 0.011187 */
9715 27797, /* A1 = -1.696655 */
9716 -32686, /* A2 = 0.997498 */
9717 22748, /* B2 = 0.694214 */
9718 -19235, /* B1 = -1.174072 */
9719 22748, /* B0 = 0.694214 */
9720 27995, /* A1 = -1.708740 */
9721 -32688, /* A2 = 0.997559 */
9722 2964, /* B2 = 0.090477 */
9723 -2546, /* B1 = -0.155449 */
9724 2964, /* B0 = 0.090477 */
9725 5, /* Internal filter scaling */
9726 159, /* Minimum in-band energy threshold */
9727 21, /* 21/32 in-band to broad-band ratio */
9728 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9731 27297, /* A1 = -1.666077 */
9732 -32551, /* A2 = 0.993408 */
9733 -345, /* B2 = -0.010540 */
9734 0, /* B1 = 0.000000 */
9735 345, /* B0 = 0.010540 */
9736 27240, /* A1 = -1.662598 */
9737 -32683, /* A2 = 0.997406 */
9738 22560, /* B2 = 0.688477 */
9739 -18688, /* B1 = -1.140625 */
9740 22560, /* B0 = 0.688477 */
9741 27461, /* A1 = -1.676147 */
9742 -32684, /* A2 = 0.997467 */
9743 3541, /* B2 = 0.108086 */
9744 -2985, /* B1 = -0.182220 */
9745 3541, /* B0 = 0.108086 */
9746 5, /* Internal filter scaling */
9747 159, /* Minimum in-band energy threshold */
9748 21, /* 21/32 in-band to broad-band ratio */
9749 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9752 27155, /* A1 = -1.657410 */
9753 -32551, /* A2 = 0.993408 */
9754 -462, /* B2 = -0.014117 */
9755 0, /* B1 = 0.000000 */
9756 462, /* B0 = 0.014117 */
9757 27097, /* A1 = -1.653870 */
9758 -32683, /* A2 = 0.997406 */
9759 32495, /* B2 = 0.991699 */
9760 -26776, /* B1 = -1.634338 */
9761 32495, /* B0 = 0.991699 */
9762 27321, /* A1 = -1.667542 */
9763 -32684, /* A2 = 0.997467 */
9764 1835, /* B2 = 0.056007 */
9765 -1539, /* B1 = -0.093948 */
9766 1835, /* B0 = 0.056007 */
9767 5, /* Internal filter scaling */
9768 159, /* Minimum in-band energy threshold */
9769 21, /* 21/32 in-band to broad-band ratio */
9770 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9773 19298, /* A1 = 1.177917 */
9774 -24471, /* A2 = -0.746796 */
9775 -4152, /* B2 = -0.126709 */
9777 4152, /* B0 = 0.126709 */
9778 12902, /* A1 = 0.787476 */
9779 -29091, /* A2 = -0.887817 */
9780 12491, /* B2 = 0.38121 */
9781 -1794, /* B1 = -0.109528 */
9782 12494, /* B0 = 0.381317 */
9783 26291, /* A1 = 1.604736 */
9784 -30470, /* A2 = -0.929901 */
9785 28859, /* B2 = 0.880737 */
9786 -26084, /* B1 = -1.592102 */
9787 28861, /* B0 = 0.880798 */
9788 7, /* Internal filter scaling */
9789 159, /* Minimum in-band energy threshold */
9790 21, /* 21/32 in-band to broad-band ratio */
9791 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9794 26867, /* A1 = -1.639832 */
9795 -32551, /* A2 = 0.993408 */
9796 -123, /* B2 = -0.003755 */
9797 0, /* B1 = 0.000000 */
9798 123, /* B0 = 0.003755 */
9799 26805, /* A1 = -1.636108 */
9800 -32683, /* A2 = 0.997406 */
9801 17297, /* B2 = 0.527863 */
9802 -14096, /* B1 = -0.860382 */
9803 17297, /* B0 = 0.527863 */
9804 27034, /* A1 = -1.650085 */
9805 -32684, /* A2 = 0.997467 */
9806 12958, /* B2 = 0.395477 */
9807 -10756, /* B1 = -0.656525 */
9808 12958, /* B0 = 0.395477 */
9809 5, /* Internal filter scaling */
9810 159, /* Minimum in-band energy threshold */
9811 21, /* 21/32 in-band to broad-band ratio */
9812 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9815 26413, /* A1 = -1.612122 */
9816 -32547, /* A2 = 0.993286 */
9817 -223, /* B2 = -0.006825 */
9818 0, /* B1 = 0.000000 */
9819 223, /* B0 = 0.006825 */
9820 26342, /* A1 = -1.607849 */
9821 -32686, /* A2 = 0.997498 */
9822 6391, /* B2 = 0.195053 */
9823 -5120, /* B1 = -0.312531 */
9824 6391, /* B0 = 0.195053 */
9825 26593, /* A1 = -1.623108 */
9826 -32688, /* A2 = 0.997559 */
9827 23681, /* B2 = 0.722717 */
9828 -19328, /* B1 = -1.179688 */
9829 23681, /* B0 = 0.722717 */
9830 5, /* Internal filter scaling */
9831 159, /* Minimum in-band energy threshold */
9832 21, /* 21/32 in-band to broad-band ratio */
9833 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9836 26168, /* A1 = -1.597209 */
9837 -32528, /* A2 = 0.992706 */
9838 -235, /* B2 = -0.007182 */
9839 0, /* B1 = 0.000000 */
9840 235, /* B0 = 0.007182 */
9841 26092, /* A1 = -1.592590 */
9842 -32675, /* A2 = 0.997192 */
9843 20823, /* B2 = 0.635498 */
9844 -16510, /* B1 = -1.007751 */
9845 20823, /* B0 = 0.635498 */
9846 26363, /* A1 = -1.609070 */
9847 -32677, /* A2 = 0.997253 */
9848 6739, /* B2 = 0.205688 */
9849 -5459, /* B1 = -0.333206 */
9850 6739, /* B0 = 0.205688 */
9851 5, /* Internal filter scaling */
9852 159, /* Minimum in-band energy threshold */
9853 21, /* 21/32 in-band to broad-band ratio */
9854 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9857 25641, /* A1 = -1.565063 */
9858 -32536, /* A2 = 0.992950 */
9859 -121, /* B2 = -0.003707 */
9860 0, /* B1 = 0.000000 */
9861 121, /* B0 = 0.003707 */
9862 25560, /* A1 = -1.560059 */
9863 -32684, /* A2 = 0.997437 */
9864 18341, /* B2 = 0.559753 */
9865 -14252, /* B1 = -0.869904 */
9866 18341, /* B0 = 0.559753 */
9867 25837, /* A1 = -1.577026 */
9868 -32684, /* A2 = 0.997467 */
9869 16679, /* B2 = 0.509003 */
9870 -13232, /* B1 = -0.807648 */
9871 16679, /* B0 = 0.509003 */
9872 5, /* Internal filter scaling */
9873 159, /* Minimum in-band energy threshold */
9874 21, /* 21/32 in-band to broad-band ratio */
9875 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9878 16415, /* A1 = 1.001953 */
9879 -23669, /* A2 = -0.722321 */
9880 -4549, /* B2 = -0.138847 */
9882 4549, /* B0 = 0.138847 */
9883 8456, /* A1 = 0.516174 */
9884 -28996, /* A2 = -0.884918 */
9885 13753, /* B2 = 0.419724 */
9886 -12, /* B1 = -0.000763 */
9887 13757, /* B0 = 0.419846 */
9888 24632, /* A1 = 1.503418 */
9889 -30271, /* A2 = -0.923828 */
9890 29070, /* B2 = 0.887146 */
9891 -25265, /* B1 = -1.542114 */
9892 29073, /* B0 = 0.887268 */
9893 7, /* Internal filter scaling */
9894 159, /* Minimum in-band energy threshold */
9895 21, /* 21/32 in-band to broad-band ratio */
9896 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9899 24806, /* A1 = -1.514099 */
9900 -32501, /* A2 = 0.991852 */
9901 -326, /* B2 = -0.009969 */
9902 0, /* B1 = 0.000000 */
9903 326, /* B0 = 0.009969 */
9904 24709, /* A1 = -1.508118 */
9905 -32659, /* A2 = 0.996674 */
9906 20277, /* B2 = 0.618835 */
9907 -15182, /* B1 = -0.926636 */
9908 20277, /* B0 = 0.618835 */
9909 25022, /* A1 = -1.527222 */
9910 -32661, /* A2 = 0.996735 */
9911 4320, /* B2 = 0.131836 */
9912 -3331, /* B1 = -0.203339 */
9913 4320, /* B0 = 0.131836 */
9914 5, /* Internal filter scaling */
9915 159, /* Minimum in-band energy threshold */
9916 21, /* 21/32 in-band to broad-band ratio */
9917 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9920 19776, /* A1 = 1.207092 */
9921 -27437, /* A2 = -0.837341 */
9922 -2666, /* B2 = -0.081371 */
9924 2666, /* B0 = 0.081371 */
9925 16302, /* A1 = 0.995026 */
9926 -30354, /* A2 = -0.926361 */
9927 10389, /* B2 = 0.317062 */
9928 -3327, /* B1 = -0.203064 */
9929 10389, /* B0 = 0.317062 */
9930 24299, /* A1 = 1.483154 */
9931 -30930, /* A2 = -0.943909 */
9932 25016, /* B2 = 0.763428 */
9933 -21171, /* B1 = -1.292236 */
9934 25016, /* B0 = 0.763428 */
9935 7, /* Internal filter scaling */
9936 159, /* Minimum in-band energy threshold */
9937 21, /* 21/32 in-band to broad-band ratio */
9938 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9941 20554, /* A1 = 1.254517 */
9942 -28764, /* A2 = -0.877838 */
9943 -2048, /* B2 = -0.062515 */
9945 2048, /* B0 = 0.062515 */
9946 18209, /* A1 = 1.11145 */
9947 -30951, /* A2 = -0.94458 */
9948 9390, /* B2 = 0.286575 */
9949 -3955, /* B1 = -0.241455 */
9950 9390, /* B0 = 0.286575 */
9951 23902, /* A1 = 1.458923 */
9952 -31286, /* A2 = -0.954803 */
9953 23252, /* B2 = 0.709595 */
9954 -19132, /* B1 = -1.167725 */
9955 23252, /* B0 = 0.709595 */
9956 7, /* Internal filter scaling */
9957 159, /* Minimum in-band energy threshold */
9958 21, /* 21/32 in-band to broad-band ratio */
9959 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9962 17543, /* A1 = 1.07074 */
9963 -26220, /* A2 = -0.800201 */
9964 -3298, /* B2 = -0.100647 */
9966 3298, /* B0 = 0.100647 */
9967 12423, /* A1 = 0.75827 */
9968 -30036, /* A2 = -0.916626 */
9969 12651, /* B2 = 0.386078 */
9970 -2444, /* B1 = -0.14917 */
9971 12653, /* B0 = 0.386154 */
9972 23518, /* A1 = 1.435425 */
9973 -30745, /* A2 = -0.938293 */
9974 27282, /* B2 = 0.832581 */
9975 -22529, /* B1 = -1.375122 */
9976 27286, /* B0 = 0.832703 */
9977 7, /* Internal filter scaling */
9978 159, /* Minimum in-band energy threshold */
9979 21, /* 21/32 in-band to broad-band ratio */
9980 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9983 24104, /* A1 = -1.471252 */
9984 -32507, /* A2 = 0.992065 */
9985 -351, /* B2 = -0.010722 */
9986 0, /* B1 = 0.000000 */
9987 351, /* B0 = 0.010722 */
9988 23996, /* A1 = -1.464600 */
9989 -32671, /* A2 = 0.997040 */
9990 22848, /* B2 = 0.697266 */
9991 -16639, /* B1 = -1.015564 */
9992 22848, /* B0 = 0.697266 */
9993 24332, /* A1 = -1.485168 */
9994 -32673, /* A2 = 0.997101 */
9995 4906, /* B2 = 0.149727 */
9996 -3672, /* B1 = -0.224174 */
9997 4906, /* B0 = 0.149727 */
9998 5, /* Internal filter scaling */
9999 159, /* Minimum in-band energy threshold */
10000 21, /* 21/32 in-band to broad-band ratio */
10001 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10004 23967, /* A1 = -1.462830 */
10005 -32507, /* A2 = 0.992065 */
10006 -518, /* B2 = -0.015821 */
10007 0, /* B1 = 0.000000 */
10008 518, /* B0 = 0.015821 */
10009 23856, /* A1 = -1.456055 */
10010 -32671, /* A2 = 0.997040 */
10011 26287, /* B2 = 0.802246 */
10012 -19031, /* B1 = -1.161560 */
10013 26287, /* B0 = 0.802246 */
10014 24195, /* A1 = -1.476746 */
10015 -32673, /* A2 = 0.997101 */
10016 2890, /* B2 = 0.088196 */
10017 -2151, /* B1 = -0.131317 */
10018 2890, /* B0 = 0.088196 */
10019 5, /* Internal filter scaling */
10020 159, /* Minimum in-band energy threshold */
10021 21, /* 21/32 in-band to broad-band ratio */
10022 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10024 { /* f950_1400[] */
10025 18294, /* A1 = 1.116638 */
10026 -26962, /* A2 = -0.822845 */
10027 -2914, /* B2 = -0.088936 */
10029 2914, /* B0 = 0.088936 */
10030 14119, /* A1 = 0.861786 */
10031 -30227, /* A2 = -0.922455 */
10032 11466, /* B2 = 0.349945 */
10033 -2833, /* B1 = -0.172943 */
10034 11466, /* B0 = 0.349945 */
10035 23431, /* A1 = 1.430115 */
10036 -30828, /* A2 = -0.940796 */
10037 25331, /* B2 = 0.773071 */
10038 -20911, /* B1 = -1.276367 */
10039 25331, /* B0 = 0.773071 */
10040 7, /* Internal filter scaling */
10041 159, /* Minimum in-band energy threshold */
10042 21, /* 21/32 in-band to broad-band ratio */
10043 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10046 23521, /* A1 = -1.435608 */
10047 -32489, /* A2 = 0.991516 */
10048 -193, /* B2 = -0.005915 */
10049 0, /* B1 = 0.000000 */
10050 193, /* B0 = 0.005915 */
10051 23404, /* A1 = -1.428467 */
10052 -32655, /* A2 = 0.996582 */
10053 17740, /* B2 = 0.541412 */
10054 -12567, /* B1 = -0.767029 */
10055 17740, /* B0 = 0.541412 */
10056 23753, /* A1 = -1.449829 */
10057 -32657, /* A2 = 0.996613 */
10058 9090, /* B2 = 0.277405 */
10059 -6662, /* B1 = -0.406647 */
10060 9090, /* B0 = 0.277405 */
10061 5, /* Internal filter scaling */
10062 159, /* Minimum in-band energy threshold */
10063 21, /* 21/32 in-band to broad-band ratio */
10064 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10067 23071, /* A1 = -1.408203 */
10068 -32489, /* A2 = 0.991516 */
10069 -293, /* B2 = -0.008965 */
10070 0, /* B1 = 0.000000 */
10071 293, /* B0 = 0.008965 */
10072 22951, /* A1 = -1.400818 */
10073 -32655, /* A2 = 0.996582 */
10074 5689, /* B2 = 0.173645 */
10075 -3951, /* B1 = -0.241150 */
10076 5689, /* B0 = 0.173645 */
10077 23307, /* A1 = -1.422607 */
10078 -32657, /* A2 = 0.996613 */
10079 18692, /* B2 = 0.570435 */
10080 -13447, /* B1 = -0.820770 */
10081 18692, /* B0 = 0.570435 */
10082 5, /* Internal filter scaling */
10083 159, /* Minimum in-band energy threshold */
10084 21, /* 21/32 in-band to broad-band ratio */
10085 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10088 22701, /* A1 = -1.385620 */
10089 -32474, /* A2 = 0.991058 */
10090 -292, /* B2 = -0.008933 */
10091 0, /*163840 , B1 = 10.000000 */
10092 292, /* B0 = 0.008933 */
10093 22564, /* A1 = -1.377258 */
10094 -32655, /* A2 = 0.996552 */
10095 20756, /* B2 = 0.633423 */
10096 -14176, /* B1 = -0.865295 */
10097 20756, /* B0 = 0.633423 */
10098 22960, /* A1 = -1.401428 */
10099 -32657, /* A2 = 0.996613 */
10100 6520, /* B2 = 0.198990 */
10101 -4619, /* B1 = -0.281937 */
10102 6520, /* B0 = 0.198990 */
10103 5, /* Internal filter scaling */
10104 159, /* Minimum in-band energy threshold */
10105 21, /* 21/32 in-band to broad-band ratio */
10106 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10109 22142, /* A1 = -1.351501 */
10110 -32474, /* A2 = 0.991058 */
10111 -147, /* B2 = -0.004493 */
10112 0, /* B1 = 0.000000 */
10113 147, /* B0 = 0.004493 */
10114 22000, /* A1 = -1.342834 */
10115 -32655, /* A2 = 0.996552 */
10116 15379, /* B2 = 0.469360 */
10117 -10237, /* B1 = -0.624847 */
10118 15379, /* B0 = 0.469360 */
10119 22406, /* A1 = -1.367554 */
10120 -32657, /* A2 = 0.996613 */
10121 17491, /* B2 = 0.533783 */
10122 -12096, /* B1 = -0.738312 */
10123 17491, /* B0 = 0.533783 */
10124 5, /* Internal filter scaling */
10125 159, /* Minimum in-band energy threshold */
10126 21, /* 21/32 in-band to broad-band ratio */
10127 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10129 { /* f1100_1750[] */
10130 12973, /* A1 = 0.79184 */
10131 -24916, /* A2 = -0.760376 */
10132 6655, /* B2 = 0.203102 */
10133 367, /* B1 = 0.0224 */
10134 6657, /* B0 = 0.203171 */
10135 5915, /* A1 = 0.361053 */
10136 -29560, /* A2 = -0.90213 */
10137 -7777, /* B2 = -0.23735 */
10139 7777, /* B0 = 0.23735 */
10140 20510, /* A1 = 1.251892 */
10141 -30260, /* A2 = -0.923462 */
10142 26662, /* B2 = 0.81366 */
10143 -20573, /* B1 = -1.255737 */
10144 26668, /* B0 = 0.813843 */
10145 7, /* Internal filter scaling */
10146 159, /* Minimum in-band energy threshold */
10147 21, /* 21/32 in-band to broad-band ratio */
10148 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10151 20392, /* A1 = -1.244629 */
10152 -32460, /* A2 = 0.990601 */
10153 -270, /* B2 = -0.008240 */
10154 0, /* B1 = 0.000000 */
10155 270, /* B0 = 0.008240 */
10156 20218, /* A1 = -1.234009 */
10157 -32655, /* A2 = 0.996582 */
10158 21337, /* B2 = 0.651154 */
10159 -13044, /* B1 = -0.796143 */
10160 21337, /* B0 = 0.651154 */
10161 20684, /* A1 = -1.262512 */
10162 -32657, /* A2 = 0.996643 */
10163 8572, /* B2 = 0.261612 */
10164 -5476, /* B1 = -0.334244 */
10165 8572, /* B0 = 0.261612 */
10166 5, /* Internal filter scaling */
10167 159, /* Minimum in-band energy threshold */
10168 21, /* 21/32 in-band to broad-band ratio */
10169 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10172 19159, /* A1 = -1.169373 */
10173 -32456, /* A2 = 0.990509 */
10174 -335, /* B2 = -0.010252 */
10175 0, /* B1 = 0.000000 */
10176 335, /* B0 = 0.010252 */
10177 18966, /* A1 = -1.157593 */
10178 -32661, /* A2 = 0.996735 */
10179 6802, /* B2 = 0.207588 */
10180 -3900, /* B1 = -0.238098 */
10181 6802, /* B0 = 0.207588 */
10182 19467, /* A1 = -1.188232 */
10183 -32661, /* A2 = 0.996765 */
10184 25035, /* B2 = 0.764008 */
10185 -15049, /* B1 = -0.918579 */
10186 25035, /* B0 = 0.764008 */
10187 5, /* Internal filter scaling */
10188 159, /* Minimum in-band energy threshold */
10189 21, /* 21/32 in-band to broad-band ratio */
10190 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10193 18976, /* A1 = -1.158264 */
10194 -32439, /* A2 = 0.989990 */
10195 -183, /* B2 = -0.005588 */
10196 0, /* B1 = 0.000000 */
10197 183, /* B0 = 0.005588 */
10198 18774, /* A1 = -1.145874 */
10199 -32650, /* A2 = 0.996429 */
10200 15468, /* B2 = 0.472076 */
10201 -8768, /* B1 = -0.535217 */
10202 15468, /* B0 = 0.472076 */
10203 19300, /* A1 = -1.177979 */
10204 -32652, /* A2 = 0.996490 */
10205 19840, /* B2 = 0.605499 */
10206 -11842, /* B1 = -0.722809 */
10207 19840, /* B0 = 0.605499 */
10208 5, /* Internal filter scaling */
10209 159, /* Minimum in-band energy threshold */
10210 21, /* 21/32 in-band to broad-band ratio */
10211 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10214 16357, /* A1 = -0.998413 */
10215 -32368, /* A2 = 0.987793 */
10216 -217, /* B2 = -0.006652 */
10217 0, /* B1 = 0.000000 */
10218 217, /* B0 = 0.006652 */
10219 16107, /* A1 = -0.983126 */
10220 -32601, /* A2 = 0.994904 */
10221 11602, /* B2 = 0.354065 */
10222 -5555, /* B1 = -0.339111 */
10223 11602, /* B0 = 0.354065 */
10224 16722, /* A1 = -1.020630 */
10225 -32603, /* A2 = 0.994965 */
10226 15574, /* B2 = 0.475311 */
10227 -8176, /* B1 = -0.499069 */
10228 15574, /* B0 = 0.475311 */
10229 5, /* Internal filter scaling */
10230 159, /* Minimum in-band energy threshold */
10231 21, /* 21/32 in-band to broad-band ratio */
10232 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10235 16234, /* A1 = -0.990875 */
10236 32404, /* A2 = -0.988922 */
10237 -193, /* B2 = -0.005908 */
10238 0, /* B1 = 0.000000 */
10239 193, /* B0 = 0.005908 */
10240 15986, /* A1 = -0.975769 */
10241 -32632, /* A2 = 0.995880 */
10242 18051, /* B2 = 0.550903 */
10243 -8658, /* B1 = -0.528473 */
10244 18051, /* B0 = 0.550903 */
10245 16591, /* A1 = -1.012695 */
10246 -32634, /* A2 = 0.995941 */
10247 15736, /* B2 = 0.480240 */
10248 -8125, /* B1 = -0.495926 */
10249 15736, /* B0 = 0.480240 */
10250 5, /* Internal filter scaling */
10251 159, /* Minimum in-band energy threshold */
10252 21, /* 21/32 in-band to broad-band ratio */
10253 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10256 15564, /* A1 = -0.949982 */
10257 -32404, /* A2 = 0.988922 */
10258 -269, /* B2 = -0.008216 */
10259 0, /* B1 = 0.000000 */
10260 269, /* B0 = 0.008216 */
10261 15310, /* A1 = -0.934479 */
10262 -32632, /* A2 = 0.995880 */
10263 10815, /* B2 = 0.330063 */
10264 -4962, /* B1 = -0.302887 */
10265 10815, /* B0 = 0.330063 */
10266 15924, /* A1 = -0.971924 */
10267 -32634, /* A2 = 0.995941 */
10268 18880, /* B2 = 0.576172 */
10269 -9364, /* B1 = -0.571594 */
10270 18880, /* B0 = 0.576172 */
10271 5, /* Internal filter scaling */
10272 159, /* Minimum in-band energy threshold */
10273 21, /* 21/32 in-band to broad-band ratio */
10274 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10277 15247, /* A1 = -0.930603 */
10278 -32397, /* A2 = 0.988708 */
10279 -244, /* B2 = -0.007451 */
10280 0, /* B1 = 0.000000 */
10281 244, /* B0 = 0.007451 */
10282 14989, /* A1 = -0.914886 */
10283 -32627, /* A2 = 0.995697 */
10284 18961, /* B2 = 0.578644 */
10285 -8498, /* B1 = -0.518707 */
10286 18961, /* B0 = 0.578644 */
10287 15608, /* A1 = -0.952667 */
10288 -32628, /* A2 = 0.995758 */
10289 11145, /* B2 = 0.340134 */
10290 -5430, /* B1 = -0.331467 */
10291 11145, /* B0 = 0.340134 */
10292 5, /* Internal filter scaling */
10293 159, /* Minimum in-band energy threshold */
10294 21, /* 21/32 in-band to broad-band ratio */
10295 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10298 14780, /* A1 = -0.902130 */
10299 -32393, /* A2 = 0.988586 */
10300 -396, /* B2 = -0.012086 */
10301 0, /* B1 = 0.000000 */
10302 396, /* B0 = 0.012086 */
10303 14510, /* A1 = -0.885651 */
10304 -32630, /* A2 = 0.995819 */
10305 6326, /* B2 = 0.193069 */
10306 -2747, /* B1 = -0.167671 */
10307 6326, /* B0 = 0.193069 */
10308 15154, /* A1 = -0.924957 */
10309 -32632, /* A2 = 0.995850 */
10310 23235, /* B2 = 0.709076 */
10311 -10983, /* B1 = -0.670380 */
10312 23235, /* B0 = 0.709076 */
10313 5, /* Internal filter scaling */
10314 159, /* Minimum in-band energy threshold */
10315 21, /* 21/32 in-band to broad-band ratio */
10316 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10319 13005, /* A1 = -0.793793 */
10320 -32368, /* A2 = 0.987823 */
10321 -500, /* B2 = -0.015265 */
10322 0, /* B1 = 0.000000 */
10323 500, /* B0 = 0.015265 */
10324 12708, /* A1 = -0.775665 */
10325 -32615, /* A2 = 0.995331 */
10326 11420, /* B2 = 0.348526 */
10327 -4306, /* B1 = -0.262833 */
10328 11420, /* B0 = 0.348526 */
10329 13397, /* A1 = -0.817688 */
10330 -32615, /* A2 = 0.995361 */
10331 9454, /* B2 = 0.288528 */
10332 -3981, /* B1 = -0.243027 */
10333 9454, /* B0 = 0.288528 */
10334 5, /* Internal filter scaling */
10335 159, /* Minimum in-band energy threshold */
10336 21, /* 21/32 in-band to broad-band ratio */
10337 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10340 10046, /* A1 = -0.613190 */
10341 -32331, /* A2 = 0.986694 */
10342 -455, /* B2 = -0.013915 */
10343 0, /* B1 = 0.000000 */
10344 455, /* B0 = 0.013915 */
10345 9694, /* A1 = -0.591705 */
10346 -32601, /* A2 = 0.994934 */
10347 6023, /* B2 = 0.183815 */
10348 -1708, /* B1 = -0.104279 */
10349 6023, /* B0 = 0.183815 */
10350 10478, /* A1 = -0.639587 */
10351 -32603, /* A2 = 0.994965 */
10352 22031, /* B2 = 0.672333 */
10353 -7342, /* B1 = -0.448151 */
10354 22031, /* B0 = 0.672333 */
10355 5, /* Internal filter scaling */
10356 159, /* Minimum in-band energy threshold */
10357 21, /* 21/32 in-band to broad-band ratio */
10358 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10360 { /* f1633_1638[] */
10361 9181, /* A1 = 0.560394 */
10362 -32256, /* A2 = -0.984375 */
10363 -556, /* B2 = -0.016975 */
10365 556, /* B0 = 0.016975 */
10366 8757, /* A1 = 0.534515 */
10367 -32574, /* A2 = -0.99408 */
10368 8443, /* B2 = 0.25769 */
10369 -2135, /* B1 = -0.130341 */
10370 8443, /* B0 = 0.25769 */
10371 9691, /* A1 = 0.591522 */
10372 -32574, /* A2 = -0.99411 */
10373 15446, /* B2 = 0.471375 */
10374 -4809, /* B1 = -0.293579 */
10375 15446, /* B0 = 0.471375 */
10376 7, /* Internal filter scaling */
10377 159, /* Minimum in-band energy threshold */
10378 21, /* 21/32 in-band to broad-band ratio */
10379 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10382 5076, /* A1 = -0.309875 */
10383 -32304, /* A2 = 0.985840 */
10384 -508, /* B2 = -0.015503 */
10385 0, /* B1 = 0.000000 */
10386 508, /* B0 = 0.015503 */
10387 4646, /* A1 = -0.283600 */
10388 -32605, /* A2 = 0.995026 */
10389 6742, /* B2 = 0.205780 */
10390 -878, /* B1 = -0.053635 */
10391 6742, /* B0 = 0.205780 */
10392 5552, /* A1 = -0.338928 */
10393 -32605, /* A2 = 0.995056 */
10394 23667, /* B2 = 0.722260 */
10395 -4297, /* B1 = -0.262329 */
10396 23667, /* B0 = 0.722260 */
10397 5, /* Internal filter scaling */
10398 159, /* Minimum in-band energy threshold */
10399 21, /* 21/32 in-band to broad-band ratio */
10400 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10403 3569, /* A1 = -0.217865 */
10404 -32292, /* A2 = 0.985504 */
10405 -239, /* B2 = -0.007322 */
10406 0, /* B1 = 0.000000 */
10407 239, /* B0 = 0.007322 */
10408 3117, /* A1 = -0.190277 */
10409 -32603, /* A2 = 0.994965 */
10410 18658, /* B2 = 0.569427 */
10411 -1557, /* B1 = -0.095032 */
10412 18658, /* B0 = 0.569427 */
10413 4054, /* A1 = -0.247437 */
10414 -32603, /* A2 = 0.994965 */
10415 18886, /* B2 = 0.576385 */
10416 -2566, /* B1 = -0.156647 */
10417 18886, /* B0 = 0.576385 */
10418 5, /* Internal filter scaling */
10419 159, /* Minimum in-band energy threshold */
10420 21, /* 21/32 in-band to broad-band ratio */
10421 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10424 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10426 unsigned short cmd;
10429 if (jf->filter > 3) {
10432 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10436 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10442 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10445 /* Select the filter (f0 - f3) to use. */
10446 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10449 if (jf->freq < 12 && jf->freq > 3) {
10450 /* Select the frequency for the selected filter. */
10451 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10453 } else if (jf->freq > 11) {
10454 /* We need to load a programmable filter set for undefined */
10455 /* frequencies. So we will point the filter to a programmable set. */
10456 /* Since there are only 4 filters and 4 programmable sets, we will */
10457 /* just point the filter to the same number set and program it for the */
10458 /* frequency we want. */
10459 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10461 if (j->ver.low != 0x12) {
10468 if (ixj_WriteDSPCommand(cmd, j))
10470 for (cnt = 0; cnt < max; cnt++) {
10471 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10475 j->filter_en[jf->filter] = jf->enable;
10479 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10481 unsigned short cmd;
10483 if (jfr->filter > 3) {
10486 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10489 if (!jfr->enable) {
10490 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10495 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10497 /* Select the filter (f0 - f3) to use. */
10498 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10501 /* We need to load a programmable filter set for undefined */
10502 /* frequencies. So we will point the filter to a programmable set. */
10503 /* Since there are only 4 filters and 4 programmable sets, we will */
10504 /* just point the filter to the same number set and program it for the */
10505 /* frequency we want. */
10506 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10508 if (j->ver.low != 0x12) {
10515 if (ixj_WriteDSPCommand(cmd, j))
10517 for (cnt = 0; cnt < max; cnt++) {
10518 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10521 j->filter_en[jfr->filter] = jfr->enable;
10525 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10528 unsigned short data;
10541 if(ti->tone_index > 12 && ti->tone_index < 28)
10543 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10545 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10548 if (ixj_WriteDSPCommand(data, j))
10551 if (ixj_WriteDSPCommand(data, j))