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 ***************************************************************************/
44 static char ixj_c_rcsid[] = "$Id: ixj.c,v 4.7 2001/08/13 06:19:33 craigs Exp $";
45 static char ixj_c_revision[] = "$Revision: 4.7 $";
50 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
51 * Audit some copy_*_user and minor cleanup.
53 * Revision 4.7 2001/08/13 06:19:33 craigs
54 * Added additional changes from Alan Cox and John Anderson for
55 * 2.2 to 2.4 cleanup and bounds checking
57 * Revision 4.6 2001/08/13 01:05:05 craigs
58 * Really fixed PHONE_QUERY_CODEC problem this time
60 * Revision 4.5 2001/08/13 00:11:03 craigs
61 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
63 * Revision 4.4 2001/08/07 07:58:12 craigs
64 * Changed back to three digit version numbers
65 * Added tagbuild target to allow automatic and easy tagging of versions
67 * Revision 4.3 2001/08/07 07:24:47 craigs
68 * Added ixj-ver.h to allow easy configuration management of driver
69 * Added display of version number in /prox/ixj
71 * Revision 4.2 2001/08/06 07:07:19 craigs
72 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
73 * behaviour of returning int rather than short *
75 * Revision 4.1 2001/08/05 00:17:37 craigs
76 * More changes for correct PCMCIA installation
77 * Start of changes for backward Linux compatibility
79 * Revision 4.0 2001/08/04 12:33:12 craigs
80 * New version using GNU autoconf
82 * Revision 3.105 2001/07/20 23:14:32 eokerson
83 * More work on CallerID generation when using ring cadences.
85 * Revision 3.104 2001/07/06 01:33:55 eokerson
86 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
88 * Revision 3.103 2001/07/05 19:20:16 eokerson
90 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
92 * Revision 3.102 2001/07/03 23:51:21 eokerson
93 * Un-mute mic on Internet LineJACK when in speakerphone mode.
95 * Revision 3.101 2001/07/02 19:26:56 eokerson
96 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
98 * Revision 3.100 2001/07/02 19:18:27 eokerson
99 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
100 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
101 * Fixed speaker mode on Internet LineJACK.
103 * Revision 3.99 2001/05/09 14:11:16 eokerson
104 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
106 * Revision 3.98 2001/05/08 19:55:33 eokerson
107 * Fixed POTS hookstate detection while it is connected to PSTN port.
109 * Revision 3.97 2001/05/08 00:01:04 eokerson
110 * Fixed kernel oops when sending caller ID data.
112 * Revision 3.96 2001/05/04 23:09:30 eokerson
113 * Now uses one kernel timer for each card, instead of one for the entire driver.
115 * Revision 3.95 2001/04/25 22:06:47 eokerson
116 * Fixed squawking at beginning of some G.723.1 calls.
118 * Revision 3.94 2001/04/03 23:42:00 eokerson
119 * Added linear volume ioctls
120 * Added raw filter load ioctl
122 * Revision 3.93 2001/02/27 01:00:06 eokerson
123 * Fixed blocking in CallerID.
124 * Reduced size of ixj structure for smaller driver footprint.
126 * Revision 3.92 2001/02/20 22:02:59 eokerson
127 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
128 * Improved PSTN ring detection.
129 * Fixed wink generation on POTS ports.
131 * Revision 3.91 2001/02/13 00:55:44 eokerson
132 * Turn AEC back on after changing frame sizes.
134 * Revision 3.90 2001/02/12 16:42:00 eokerson
135 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
137 * Revision 3.89 2001/02/12 15:41:16 eokerson
138 * Fix from Artis Kugevics - Tone gains were not being set correctly.
140 * Revision 3.88 2001/02/05 23:25:42 eokerson
141 * Fixed lockup bugs with deregister.
143 * Revision 3.87 2001/01/29 21:00:39 eokerson
144 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
145 * Updated copyright date.
147 * Revision 3.86 2001/01/23 23:53:46 eokerson
148 * Fixes to G.729 compatibility.
150 * Revision 3.85 2001/01/23 21:30:36 eokerson
151 * Added verbage about cards supported.
152 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
154 * Revision 3.84 2001/01/22 23:32:10 eokerson
155 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
157 * Revision 3.83 2001/01/19 14:51:41 eokerson
158 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
160 * Revision 3.82 2001/01/19 00:34:49 eokerson
161 * Added verbosity to write overlap errors.
163 * Revision 3.81 2001/01/18 23:56:54 eokerson
164 * Fixed PSTN line test functions.
166 * Revision 3.80 2001/01/18 22:29:27 eokerson
167 * Updated AEC/AGC values for different cards.
169 * Revision 3.79 2001/01/17 02:58:54 eokerson
170 * Fixed AEC reset after Caller ID.
171 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
173 * Revision 3.78 2001/01/16 19:43:09 eokerson
174 * Added support for Linux 2.4.x kernels.
176 * Revision 3.77 2001/01/09 04:00:52 eokerson
177 * Linetest will now test the line, even if it has previously succeded.
179 * Revision 3.76 2001/01/08 19:27:00 eokerson
180 * Fixed problem with standard cable on Internet PhoneCARD.
182 * Revision 3.75 2000/12/22 16:52:14 eokerson
183 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
185 * Revision 3.74 2000/12/08 22:41:50 eokerson
186 * Added capability for G729B.
188 * Revision 3.73 2000/12/07 23:35:16 eokerson
189 * Added capability to have different ring pattern before CallerID data.
190 * Added hookstate checks in CallerID routines to stop FSK.
192 * Revision 3.72 2000/12/06 19:31:31 eokerson
193 * Modified signal behavior to only send one signal per event.
195 * Revision 3.71 2000/12/06 03:23:08 eokerson
196 * Fixed CallerID on Call Waiting.
198 * Revision 3.70 2000/12/04 21:29:37 eokerson
199 * Added checking to Smart Cable gain functions.
201 * Revision 3.69 2000/12/04 21:05:20 eokerson
202 * Changed ixjdebug levels.
203 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
205 * Revision 3.68 2000/12/04 00:17:21 craigs
206 * Changed mixer voice gain to +6dB rather than 0dB
208 * Revision 3.67 2000/11/30 21:25:51 eokerson
209 * Fixed write signal errors.
211 * Revision 3.66 2000/11/29 22:42:44 eokerson
212 * Fixed PSTN ring detect problems.
214 * Revision 3.65 2000/11/29 07:31:55 craigs
215 * Added new 425Hz filter co-efficients
216 * Added card-specific DTMF prescaler initialisation
218 * Revision 3.64 2000/11/28 14:03:32 craigs
219 * Changed certain mixer initialisations to be 0dB rather than 12dB
220 * Added additional information to /proc/ixj
222 * Revision 3.63 2000/11/28 11:38:41 craigs
223 * Added display of AEC modes in AUTO and AGC mode
225 * Revision 3.62 2000/11/28 04:05:44 eokerson
226 * Improved PSTN ring detection routine.
228 * Revision 3.61 2000/11/27 21:53:12 eokerson
229 * Fixed flash detection.
231 * Revision 3.60 2000/11/27 15:57:29 eokerson
232 * More work on G.729 load routines.
234 * Revision 3.59 2000/11/25 21:55:12 eokerson
235 * Fixed errors in G.729 load routine.
237 * Revision 3.58 2000/11/25 04:08:29 eokerson
238 * Added board locks around G.729 and TS85 load routines.
240 * Revision 3.57 2000/11/24 05:35:17 craigs
241 * Added ability to retrieve mixer values on LineJACK
242 * Added complete initialisation of all mixer values at startup
243 * Fixed spelling mistake
245 * Revision 3.56 2000/11/23 02:52:11 robertj
246 * Added cvs change log keyword.
247 * Fixed bug in capabilities list when using G.729 module.
253 #define PERFMON_STATS
257 #include <linux/module.h>
259 #include <linux/init.h>
260 #include <linux/sched.h>
261 #include <linux/kernel.h> /* printk() */
262 #include <linux/fs.h> /* everything... */
263 #include <linux/errno.h> /* error codes */
264 #include <linux/slab.h>
265 #include <linux/mm.h>
266 #include <linux/ioport.h>
267 #include <linux/interrupt.h>
268 #include <linux/proc_fs.h>
269 #include <linux/poll.h>
270 #include <linux/timer.h>
271 #include <linux/delay.h>
272 #include <linux/pci.h>
275 #include <asm/uaccess.h>
277 #include <linux/isapnp.h>
281 #define TYPE(inode) (iminor(inode) >> 4)
282 #define NUM(inode) (iminor(inode) & 0xf)
285 static int hertz = HZ;
286 static int samplerate = 100;
288 module_param(ixjdebug, int, 0);
290 /************************************************************************
292 * ixjdebug meanings are now bit mapped instead of level based
293 * Values can be or'ed together to turn on multiple messages
295 * bit 0 (0x0001) = any failure
296 * bit 1 (0x0002) = general messages
297 * bit 2 (0x0004) = POTS ringing related
298 * bit 3 (0x0008) = PSTN events
299 * bit 4 (0x0010) = PSTN Cadence state details
300 * bit 5 (0x0020) = Tone detection triggers
301 * bit 6 (0x0040) = Tone detection cadence details
302 * bit 7 (0x0080) = ioctl tracking
303 * bit 8 (0x0100) = signal tracking
304 * bit 9 (0x0200) = CallerID generation details
306 ************************************************************************/
310 static IXJ *ixj[IXJMAX];
311 #define get_ixj(b) ixj[(b)]
314 * Allocate a free IXJ device
317 static IXJ *ixj_alloc()
319 for(cnt=0; cnt<IXJMAX; cnt++)
321 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
323 j = kmalloc(sizeof(IXJ), GFP_KERNEL);
333 static void ixj_fsk_free(IXJ *j)
335 if(j->fskdata != NULL) {
341 static void ixj_fsk_alloc(IXJ *j)
344 j->fskdata = kmalloc(8000, GFP_KERNEL);
346 if(ixjdebug & 0x0200) {
347 printk("IXJ phone%d - allocate failed\n", j->board);
352 if(ixjdebug & 0x0200) {
353 printk("IXJ phone%d - allocate succeded\n", j->board);
361 static IXJ ixj[IXJMAX];
362 #define get_ixj(b) (&ixj[(b)])
365 * Allocate a free IXJ device
368 static IXJ *ixj_alloc(void)
371 for(cnt=0; cnt<IXJMAX; cnt++) {
372 if(!ixj[cnt].DSPbase)
378 static inline void ixj_fsk_free(IXJ *j) {;}
380 static inline void ixj_fsk_alloc(IXJ *j)
388 #define ixj_perfmon(x) ((x)++)
390 #define ixj_perfmon(x) do { } while(0)
393 static int ixj_convert_loaded;
395 static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
397 /************************************************************************
399 * These are function definitions to allow external modules to register
400 * enhanced functionality call backs.
402 ************************************************************************/
404 static int Stub(IXJ * J, unsigned long arg)
409 static IXJ_REGFUNC ixj_PreRead = &Stub;
410 static IXJ_REGFUNC ixj_PostRead = &Stub;
411 static IXJ_REGFUNC ixj_PreWrite = &Stub;
412 static IXJ_REGFUNC ixj_PostWrite = &Stub;
414 static void ixj_read_frame(IXJ *j);
415 static void ixj_write_frame(IXJ *j);
416 static void ixj_init_timer(IXJ *j);
417 static void ixj_add_timer(IXJ * j);
418 static void ixj_timeout(unsigned long ptr);
419 static int read_filters(IXJ *j);
420 static int LineMonitor(IXJ *j);
421 static int ixj_fasync(int fd, struct file *, int mode);
422 static int ixj_set_port(IXJ *j, int arg);
423 static int ixj_set_pots(IXJ *j, int arg);
424 static int ixj_hookstate(IXJ *j);
425 static int ixj_record_start(IXJ *j);
426 static void ixj_record_stop(IXJ *j);
427 static void set_rec_volume(IXJ *j, int volume);
428 static int get_rec_volume(IXJ *j);
429 static int set_rec_codec(IXJ *j, int rate);
430 static void ixj_vad(IXJ *j, int arg);
431 static int ixj_play_start(IXJ *j);
432 static void ixj_play_stop(IXJ *j);
433 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
434 static int ixj_set_tone_off(unsigned short, IXJ *j);
435 static int ixj_play_tone(IXJ *j, char tone);
436 static void ixj_aec_start(IXJ *j, int level);
437 static int idle(IXJ *j);
438 static void ixj_ring_on(IXJ *j);
439 static void ixj_ring_off(IXJ *j);
440 static void aec_stop(IXJ *j);
441 static void ixj_ringback(IXJ *j);
442 static void ixj_busytone(IXJ *j);
443 static void ixj_dialtone(IXJ *j);
444 static void ixj_cpt_stop(IXJ *j);
445 static char daa_int_read(IXJ *j);
446 static char daa_CR_read(IXJ *j, int cr);
447 static int daa_set_mode(IXJ *j, int mode);
448 static int ixj_linetest(IXJ *j);
449 static int ixj_daa_write(IXJ *j);
450 static int ixj_daa_cid_read(IXJ *j);
451 static void DAA_Coeff_US(IXJ *j);
452 static void DAA_Coeff_UK(IXJ *j);
453 static void DAA_Coeff_France(IXJ *j);
454 static void DAA_Coeff_Germany(IXJ *j);
455 static void DAA_Coeff_Australia(IXJ *j);
456 static void DAA_Coeff_Japan(IXJ *j);
457 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
458 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
459 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
460 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
461 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
462 /* Serial Control Interface funtions */
463 static int SCI_Control(IXJ *j, int control);
464 static int SCI_Prepare(IXJ *j);
465 static int SCI_WaitHighSCI(IXJ *j);
466 static int SCI_WaitLowSCI(IXJ *j);
467 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
468 static int ixj_PCcontrol_wait(IXJ *j);
469 static void ixj_pre_cid(IXJ *j);
470 static void ixj_write_cid(IXJ *j);
471 static void ixj_write_cid_bit(IXJ *j, int bit);
472 static int set_base_frame(IXJ *j, int size);
473 static int set_play_codec(IXJ *j, int rate);
474 static void set_rec_depth(IXJ *j, int depth);
475 static int ixj_mixer(long val, IXJ *j);
477 /************************************************************************
478 CT8020/CT8021 Host Programmers Model
479 Host address Function Access
481 0-1 Aux Software Status Register (reserved) Read Only
482 2-3 Software Status Register Read Only
483 4-5 Aux Software Control Register (reserved) Read Write
484 6-7 Software Control Register Read Write
485 8-9 Hardware Status Register Read Only
486 A-B Hardware Control Register Read Write
487 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
488 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
489 ************************************************************************/
491 static inline void ixj_read_HSR(IXJ *j)
493 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
494 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
497 static inline int IsControlReady(IXJ *j)
500 return j->hsr.bits.controlrdy ? 1 : 0;
503 static inline int IsPCControlReady(IXJ *j)
505 j->pccr1.byte = inb_p(j->XILINXbase + 3);
506 return j->pccr1.bits.crr ? 1 : 0;
509 static inline int IsStatusReady(IXJ *j)
512 return j->hsr.bits.statusrdy ? 1 : 0;
515 static inline int IsRxReady(IXJ *j)
518 ixj_perfmon(j->rxreadycheck);
519 return j->hsr.bits.rxrdy ? 1 : 0;
522 static inline int IsTxReady(IXJ *j)
525 ixj_perfmon(j->txreadycheck);
526 return j->hsr.bits.txrdy ? 1 : 0;
529 static inline void set_play_volume(IXJ *j, int volume)
531 if (ixjdebug & 0x0002)
532 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
533 ixj_WriteDSPCommand(0xCF02, j);
534 ixj_WriteDSPCommand(volume, j);
537 static int set_play_volume_linear(IXJ *j, int volume)
539 int newvolume, dspplaymax;
541 if (ixjdebug & 0x0002)
542 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
543 if(volume > 100 || volume < 0) {
547 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
548 switch (j->cardtype) {
553 if(j->port == PORT_PSTN) {
559 case QTI_PHONEJACK_LITE:
562 case QTI_PHONEJACK_PCI:
571 newvolume = (dspplaymax * volume) / 100;
572 set_play_volume(j, newvolume);
576 static inline void set_play_depth(IXJ *j, int depth)
582 ixj_WriteDSPCommand(0x5280 + depth, j);
585 static inline int get_play_volume(IXJ *j)
587 ixj_WriteDSPCommand(0xCF00, j);
588 return j->ssr.high << 8 | j->ssr.low;
591 static int get_play_volume_linear(IXJ *j)
593 int volume, newvolume, dspplaymax;
595 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
596 switch (j->cardtype) {
601 if(j->port == PORT_PSTN) {
607 case QTI_PHONEJACK_LITE:
610 case QTI_PHONEJACK_PCI:
619 volume = get_play_volume(j);
620 newvolume = (volume * 100) / dspplaymax;
626 static inline BYTE SLIC_GetState(IXJ *j)
628 if (j->cardtype == QTI_PHONECARD) {
630 j->psccr.bits.dev = 3;
631 j->psccr.bits.rw = 1;
632 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
633 ixj_PCcontrol_wait(j);
634 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
635 ixj_PCcontrol_wait(j);
636 if (j->pslic.bits.powerdown)
637 return PLD_SLIC_STATE_OC;
638 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
639 return PLD_SLIC_STATE_ACTIVE;
641 return PLD_SLIC_STATE_RINGING;
643 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
645 return j->pld_slicr.bits.state;
648 static BOOL SLIC_SetState(BYTE byState, IXJ *j)
650 BOOL fRetVal = FALSE;
652 if (j->cardtype == QTI_PHONECARD) {
653 if (j->flags.pcmciasct) {
655 case PLD_SLIC_STATE_TIPOPEN:
656 case PLD_SLIC_STATE_OC:
657 j->pslic.bits.powerdown = 1;
658 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
661 case PLD_SLIC_STATE_RINGING:
662 if (j->readers || j->writers) {
663 j->pslic.bits.powerdown = 0;
664 j->pslic.bits.ring0 = 1;
665 j->pslic.bits.ring1 = 0;
669 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
671 case PLD_SLIC_STATE_STANDBY:
672 case PLD_SLIC_STATE_ACTIVE:
673 if (j->readers || j->writers) {
674 j->pslic.bits.powerdown = 0;
676 j->pslic.bits.powerdown = 1;
678 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
681 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
683 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
689 j->psccr.bits.dev = 3;
690 j->psccr.bits.rw = 0;
691 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
692 ixj_PCcontrol_wait(j);
695 /* Set the C1, C2, C3 & B2EN signals. */
697 case PLD_SLIC_STATE_OC:
698 j->pld_slicw.bits.c1 = 0;
699 j->pld_slicw.bits.c2 = 0;
700 j->pld_slicw.bits.c3 = 0;
701 j->pld_slicw.bits.b2en = 0;
702 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
705 case PLD_SLIC_STATE_RINGING:
706 j->pld_slicw.bits.c1 = 1;
707 j->pld_slicw.bits.c2 = 0;
708 j->pld_slicw.bits.c3 = 0;
709 j->pld_slicw.bits.b2en = 1;
710 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
713 case PLD_SLIC_STATE_ACTIVE:
714 j->pld_slicw.bits.c1 = 0;
715 j->pld_slicw.bits.c2 = 1;
716 j->pld_slicw.bits.c3 = 0;
717 j->pld_slicw.bits.b2en = 0;
718 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
721 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
723 j->pld_slicw.bits.c1 = 1;
724 j->pld_slicw.bits.c2 = 1;
725 j->pld_slicw.bits.c3 = 0;
726 j->pld_slicw.bits.b2en = 0;
727 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
730 case PLD_SLIC_STATE_TIPOPEN:
731 j->pld_slicw.bits.c1 = 0;
732 j->pld_slicw.bits.c2 = 0;
733 j->pld_slicw.bits.c3 = 1;
734 j->pld_slicw.bits.b2en = 0;
735 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
738 case PLD_SLIC_STATE_STANDBY:
739 j->pld_slicw.bits.c1 = 1;
740 j->pld_slicw.bits.c2 = 0;
741 j->pld_slicw.bits.c3 = 1;
742 j->pld_slicw.bits.b2en = 1;
743 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
746 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
748 j->pld_slicw.bits.c1 = 0;
749 j->pld_slicw.bits.c2 = 1;
750 j->pld_slicw.bits.c3 = 1;
751 j->pld_slicw.bits.b2en = 0;
752 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
755 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
757 j->pld_slicw.bits.c1 = 1;
758 j->pld_slicw.bits.c2 = 1;
759 j->pld_slicw.bits.c3 = 1;
760 j->pld_slicw.bits.b2en = 0;
761 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
773 static int ixj_wink(IXJ *j)
777 slicnow = SLIC_GetState(j);
779 j->pots_winkstart = jiffies;
780 SLIC_SetState(PLD_SLIC_STATE_OC, j);
782 while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
783 set_current_state(TASK_INTERRUPTIBLE);
787 SLIC_SetState(slicnow, j);
791 static void ixj_init_timer(IXJ *j)
793 init_timer(&j->timer);
794 j->timer.function = ixj_timeout;
795 j->timer.data = (unsigned long)j;
798 static void ixj_add_timer(IXJ *j)
800 j->timer.expires = jiffies + (hertz / samplerate);
801 add_timer(&j->timer);
804 static void ixj_tone_timeout(IXJ *j)
809 if (j->tone_state == 3) {
812 j->tone_cadence_state++;
813 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
814 switch (j->cadence_t->termination) {
818 case REPEAT_LAST_ELEMENT:
819 j->tone_cadence_state--;
820 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
823 j->tone_cadence_state = 0;
824 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
825 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
826 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
827 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
828 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
829 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
830 ixj_init_tone(j, &ti);
832 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
833 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
834 ixj_play_tone(j, j->cadence_t->ce[0].index);
838 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
839 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
840 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
841 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
842 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
843 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
844 ixj_init_tone(j, &ti);
846 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
847 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
848 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
854 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
856 if(j->ixj_signals[event]) {
857 if(ixjdebug & 0x0100)
858 printk("Sending signal for event %d\n", event);
859 /* Send apps notice of change */
860 /* see config.h for macro definition */
861 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
865 static void ixj_pstn_state(IXJ *j)
868 union XOPXR0 XR0, daaint;
872 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
874 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
876 j->pld_scrr.byte = inb_p(j->XILINXbase);
877 if (j->pld_scrr.bits.daaflag) {
879 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
880 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
881 daaint.bitreg.RING = 1;
882 if(ixjdebug & 0x0008) {
883 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
886 daa_set_mode(j, SOP_PU_RESET);
889 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
890 daaint.bitreg.Caller_ID = 1;
891 j->pstn_cid_intr = 1;
892 j->pstn_cid_received = jiffies;
893 if(ixjdebug & 0x0008) {
894 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
897 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
898 daaint.bitreg.Cadence = 1;
899 if(ixjdebug & 0x0008) {
900 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
903 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
904 daaint.bitreg.VDD_OK = 1;
905 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
909 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)) {
910 daaint.bitreg.RMR = 1;
911 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
912 if(ixjdebug & 0x0008) {
913 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);
915 j->pstn_prev_rmr = j->pstn_last_rmr;
916 j->pstn_last_rmr = jiffies;
918 switch(j->daa_mode) {
920 if (daaint.bitreg.RING) {
921 if (!j->flags.pstn_ringing) {
922 if (j->daa_mode != SOP_PU_RINGING) {
923 j->pstn_ring_int = jiffies;
924 daa_set_mode(j, SOP_PU_RINGING);
930 if (daaint.bitreg.RMR) {
931 if (ixjdebug & 0x0008) {
932 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
934 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
935 j->flags.pstn_rmr = 1;
936 j->pstn_ring_start = jiffies;
937 j->pstn_ring_stop = 0;
938 j->ex.bits.pstn_ring = 0;
939 if (j->cadence_f[4].state == 0) {
940 j->cadence_f[4].state = 1;
941 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
942 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
943 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
944 } else if (j->cadence_f[4].state == 2) {
945 if((time_after(jiffies, j->cadence_f[4].off1min) &&
946 time_before(jiffies, j->cadence_f[4].off1max))) {
947 if (j->cadence_f[4].on2) {
948 j->cadence_f[4].state = 3;
949 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
950 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
951 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
953 j->cadence_f[4].state = 7;
956 if (ixjdebug & 0x0008) {
957 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
958 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
959 j->cadence_f[4].off1);
961 j->cadence_f[4].state = 0;
963 } else if (j->cadence_f[4].state == 4) {
964 if((time_after(jiffies, j->cadence_f[4].off2min) &&
965 time_before(jiffies, j->cadence_f[4].off2max))) {
966 if (j->cadence_f[4].on3) {
967 j->cadence_f[4].state = 5;
968 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
969 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
970 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
972 j->cadence_f[4].state = 7;
975 if (ixjdebug & 0x0008) {
976 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
977 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
978 j->cadence_f[4].off2);
980 j->cadence_f[4].state = 0;
982 } else if (j->cadence_f[4].state == 6) {
983 if((time_after(jiffies, j->cadence_f[4].off3min) &&
984 time_before(jiffies, j->cadence_f[4].off3max))) {
985 j->cadence_f[4].state = 7;
987 if (ixjdebug & 0x0008) {
988 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
989 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
990 j->cadence_f[4].off3);
992 j->cadence_f[4].state = 0;
995 j->cadence_f[4].state = 0;
997 } else { /* Falling edge of RMR */
998 j->pstn_ring_start = 0;
999 j->pstn_ring_stop = jiffies;
1000 if (j->cadence_f[4].state == 1) {
1001 if(!j->cadence_f[4].on1) {
1002 j->cadence_f[4].state = 7;
1003 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1004 time_before(jiffies, j->cadence_f[4].on1max))) {
1005 if (j->cadence_f[4].off1) {
1006 j->cadence_f[4].state = 2;
1007 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1008 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1009 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1011 j->cadence_f[4].state = 7;
1014 if (ixjdebug & 0x0008) {
1015 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1016 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1017 j->cadence_f[4].on1);
1019 j->cadence_f[4].state = 0;
1021 } else if (j->cadence_f[4].state == 3) {
1022 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1023 time_before(jiffies, j->cadence_f[4].on2max))) {
1024 if (j->cadence_f[4].off2) {
1025 j->cadence_f[4].state = 4;
1026 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1027 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1028 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1030 j->cadence_f[4].state = 7;
1033 if (ixjdebug & 0x0008) {
1034 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1035 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1036 j->cadence_f[4].on2);
1038 j->cadence_f[4].state = 0;
1040 } else if (j->cadence_f[4].state == 5) {
1041 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1042 time_before(jiffies, j->cadence_f[4].on3max))) {
1043 if (j->cadence_f[4].off3) {
1044 j->cadence_f[4].state = 6;
1045 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1046 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1047 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1049 j->cadence_f[4].state = 7;
1052 j->cadence_f[4].state = 0;
1055 if (ixjdebug & 0x0008) {
1056 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1057 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1058 j->cadence_f[4].on3);
1060 j->cadence_f[4].state = 0;
1063 if (ixjdebug & 0x0010) {
1064 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1066 if (ixjdebug & 0x0010) {
1067 switch(j->cadence_f[4].state) {
1069 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1070 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1073 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1074 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1077 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1078 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1081 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1082 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1085 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1086 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1089 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1090 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1095 if (j->cadence_f[4].state == 7) {
1096 j->cadence_f[4].state = 0;
1097 j->pstn_ring_stop = jiffies;
1098 j->ex.bits.pstn_ring = 1;
1099 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1100 if(ixjdebug & 0x0008) {
1101 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1104 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1105 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1106 if(ixjdebug & 0x0008) {
1107 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1108 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1109 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1111 j->pstn_ring_stop = j->pstn_ring_int = 0;
1112 daa_set_mode(j, SOP_PU_SLEEP);
1114 outb_p(j->pld_scrw.byte, j->XILINXbase);
1115 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1116 ixj_daa_cid_read(j);
1117 j->ex.bits.caller_id = 1;
1118 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1119 j->pstn_cid_intr = 0;
1121 if (daaint.bitreg.Cadence) {
1122 if(ixjdebug & 0x0008) {
1123 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1125 daa_set_mode(j, SOP_PU_SLEEP);
1126 j->ex.bits.pstn_ring = 0;
1129 case SOP_PU_CONVERSATION:
1130 if (daaint.bitreg.VDD_OK) {
1131 if(!daaint.bitreg.SI_0) {
1132 if (!j->pstn_winkstart) {
1133 if(ixjdebug & 0x0008) {
1134 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1136 j->pstn_winkstart = jiffies;
1139 if (j->pstn_winkstart) {
1140 if(ixjdebug & 0x0008) {
1141 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1143 j->pstn_winkstart = 0;
1147 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1148 if(ixjdebug & 0x0008) {
1149 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1151 daa_set_mode(j, SOP_PU_SLEEP);
1152 j->pstn_winkstart = 0;
1153 j->ex.bits.pstn_wink = 1;
1154 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1160 static void ixj_timeout(unsigned long ptr)
1163 unsigned long jifon;
1164 IXJ *j = (IXJ *)ptr;
1167 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1168 ixj_perfmon(j->timerchecks);
1169 j->hookstate = ixj_hookstate(j);
1170 if (j->tone_state) {
1171 if (!(j->hookstate)) {
1175 j->ex.bits.hookstate = 1;
1176 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1178 clear_bit(board, &j->busyflags);
1182 if (j->tone_state == 1)
1183 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1185 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1186 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1187 if (j->tone_state == 1) {
1188 ixj_play_tone(j, j->tone_index);
1189 if (j->dsp.low == 0x20) {
1190 clear_bit(board, &j->busyflags);
1195 ixj_play_tone(j, 0);
1196 if (j->dsp.low == 0x20) {
1197 clear_bit(board, &j->busyflags);
1203 ixj_tone_timeout(j);
1204 if (j->flags.dialtone) {
1207 if (j->flags.busytone) {
1209 if (j->dsp.low == 0x20) {
1210 clear_bit(board, &j->busyflags);
1215 if (j->flags.ringback) {
1217 if (j->dsp.low == 0x20) {
1218 clear_bit(board, &j->busyflags);
1223 if (!j->tone_state) {
1228 if (!(j->tone_state && j->dsp.low == 0x20)) {
1236 if (j->flags.cringing) {
1237 if (j->hookstate & 1) {
1238 j->flags.cringing = 0;
1240 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1241 switch(j->cadence_f[5].state) {
1243 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1244 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1245 if(ixjdebug & 0x0004) {
1246 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1250 j->cadence_f[5].state = 1;
1253 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1254 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1255 if(ixjdebug & 0x0004) {
1256 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1259 j->cadence_f[5].state = 2;
1263 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1264 if(ixjdebug & 0x0004) {
1265 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1268 if (j->cadence_f[5].on2) {
1269 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1270 j->cadence_f[5].state = 3;
1272 j->cadence_f[5].state = 7;
1277 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1278 if(ixjdebug & 0x0004) {
1279 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1282 if (j->cadence_f[5].off2) {
1283 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1284 j->cadence_f[5].state = 4;
1286 j->cadence_f[5].state = 7;
1291 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1292 if(ixjdebug & 0x0004) {
1293 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1296 if (j->cadence_f[5].on3) {
1297 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1298 j->cadence_f[5].state = 5;
1300 j->cadence_f[5].state = 7;
1305 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1306 if(ixjdebug & 0x0004) {
1307 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1310 if (j->cadence_f[5].off3) {
1311 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1312 j->cadence_f[5].state = 6;
1314 j->cadence_f[5].state = 7;
1319 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1320 if(ixjdebug & 0x0004) {
1321 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1323 j->cadence_f[5].state = 7;
1327 if(ixjdebug & 0x0004) {
1328 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1330 j->flags.cidring = 1;
1331 j->cadence_f[5].state = 0;
1334 if (j->flags.cidring && !j->flags.cidsent) {
1335 j->flags.cidsent = 1;
1337 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1340 j->flags.cidring = 0;
1342 clear_bit(board, &j->busyflags);
1346 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1347 if (j->flags.cidring && !j->flags.cidsent) {
1348 j->flags.cidsent = 1;
1350 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1353 j->flags.cidring = 0;
1355 j->ring_cadence_t--;
1356 if (j->ring_cadence_t == -1)
1357 j->ring_cadence_t = 15;
1358 j->ring_cadence_jif = jiffies;
1360 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1361 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1362 j->flags.firstring = 1;
1367 if(!j->flags.cidsent)
1368 j->flags.cidring = 1;
1371 clear_bit(board, &j->busyflags);
1376 if (!j->flags.ringing) {
1377 if (j->hookstate) { /* & 1) { */
1378 if (j->dsp.low != 0x20 &&
1379 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1380 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1384 ixj_WriteDSPCommand(0x511B, j);
1385 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1386 if (!j->m_hook && (j->hookstate & 1)) {
1387 j->m_hook = j->ex.bits.hookstate = 1;
1388 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1391 if (j->ex.bits.dtmf_ready) {
1392 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1396 j->ex.bits.hookstate = 1;
1397 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1401 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1405 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1407 clear_bit(board, &j->busyflags);
1412 static int ixj_status_wait(IXJ *j)
1416 jif = jiffies + ((60 * hertz) / 100);
1417 while (!IsStatusReady(j)) {
1418 ixj_perfmon(j->statuswait);
1419 if (time_after(jiffies, jif)) {
1420 ixj_perfmon(j->statuswaitfail);
1427 static int ixj_PCcontrol_wait(IXJ *j)
1431 jif = jiffies + ((60 * hertz) / 100);
1432 while (!IsPCControlReady(j)) {
1433 ixj_perfmon(j->pcontrolwait);
1434 if (time_after(jiffies, jif)) {
1435 ixj_perfmon(j->pcontrolwaitfail);
1442 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1447 atomic_inc(&j->DSPWrite);
1448 if(atomic_read(&j->DSPWrite) > 1) {
1449 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1452 bytes.high = (cmd & 0xFF00) >> 8;
1453 bytes.low = cmd & 0x00FF;
1454 jif = jiffies + ((60 * hertz) / 100);
1455 while (!IsControlReady(j)) {
1456 ixj_perfmon(j->iscontrolready);
1457 if (time_after(jiffies, jif)) {
1458 ixj_perfmon(j->iscontrolreadyfail);
1459 atomic_dec(&j->DSPWrite);
1460 if(atomic_read(&j->DSPWrite) > 0) {
1461 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1462 while(atomic_read(&j->DSPWrite) > 0) {
1463 atomic_dec(&j->DSPWrite);
1469 outb(bytes.low, j->DSPbase + 6);
1470 outb(bytes.high, j->DSPbase + 7);
1472 if (ixj_status_wait(j)) {
1475 atomic_dec(&j->DSPWrite);
1476 if(atomic_read(&j->DSPWrite) > 0) {
1477 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1478 while(atomic_read(&j->DSPWrite) > 0) {
1479 atomic_dec(&j->DSPWrite);
1484 /* Read Software Status Register */
1485 j->ssr.low = inb_p(j->DSPbase + 2);
1486 j->ssr.high = inb_p(j->DSPbase + 3);
1487 atomic_dec(&j->DSPWrite);
1488 if(atomic_read(&j->DSPWrite) > 0) {
1489 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1490 while(atomic_read(&j->DSPWrite) > 0) {
1491 atomic_dec(&j->DSPWrite);
1497 /***************************************************************************
1499 * General Purpose IO Register read routine
1501 ***************************************************************************/
1502 static inline int ixj_gpio_read(IXJ *j)
1504 if (ixj_WriteDSPCommand(0x5143, j))
1507 j->gpio.bytes.low = j->ssr.low;
1508 j->gpio.bytes.high = j->ssr.high;
1513 static inline void LED_SetState(int state, IXJ *j)
1515 if (j->cardtype == QTI_LINEJACK) {
1516 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1517 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1518 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1519 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1521 outb(j->pld_scrw.byte, j->XILINXbase);
1525 /*********************************************************************
1526 * GPIO Pins are configured as follows on the Quicknet Internet
1527 * PhoneJACK Telephony Cards
1529 * POTS Select GPIO_6=0 GPIO_7=0
1530 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1531 * Handset Select GPIO_6=1 GPIO_7=0
1533 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1534 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1535 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1537 * Hook Switch changes reported on GPIO_3
1538 *********************************************************************/
1539 static int ixj_set_port(IXJ *j, int arg)
1541 if (j->cardtype == QTI_PHONEJACK_LITE) {
1542 if (arg != PORT_POTS)
1549 j->port = PORT_POTS;
1550 switch (j->cardtype) {
1552 if (j->flags.pcmciasct == 1)
1553 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1557 case QTI_PHONEJACK_PCI:
1558 j->pld_slicw.pcib.mic = 0;
1559 j->pld_slicw.pcib.spk = 0;
1560 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1563 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1564 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1565 Software Control Register */
1567 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1569 outb(j->pld_scrw.byte, j->XILINXbase);
1570 j->pld_clock.byte = 0;
1571 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1572 j->pld_slicw.bits.rly1 = 1;
1573 j->pld_slicw.bits.spken = 0;
1574 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1575 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1576 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1577 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1578 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1579 ixj_mixer(0x0E80, j); /*Mic mute */
1580 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1581 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1582 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1583 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1584 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1587 j->gpio.bytes.high = 0x0B;
1588 j->gpio.bits.gpio6 = 0;
1589 j->gpio.bits.gpio7 = 0;
1590 ixj_WriteDSPCommand(j->gpio.word, j);
1595 if (j->cardtype == QTI_LINEJACK) {
1596 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1598 j->pld_slicw.bits.rly3 = 0;
1599 j->pld_slicw.bits.rly1 = 1;
1600 j->pld_slicw.bits.spken = 0;
1601 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1602 j->port = PORT_PSTN;
1608 j->port = PORT_SPEAKER;
1609 switch (j->cardtype) {
1611 if (j->flags.pcmciasct) {
1612 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1615 case QTI_PHONEJACK_PCI:
1616 j->pld_slicw.pcib.mic = 1;
1617 j->pld_slicw.pcib.spk = 1;
1618 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1621 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1622 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1623 Software Control Register */
1625 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1627 outb(j->pld_scrw.byte, j->XILINXbase);
1628 j->pld_clock.byte = 0;
1629 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1630 j->pld_slicw.bits.rly1 = 1;
1631 j->pld_slicw.bits.spken = 1;
1632 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1633 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1634 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1635 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1636 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1637 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1638 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1639 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1640 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1643 j->gpio.bytes.high = 0x0B;
1644 j->gpio.bits.gpio6 = 0;
1645 j->gpio.bits.gpio7 = 1;
1646 ixj_WriteDSPCommand(j->gpio.word, j);
1651 if (j->cardtype != QTI_PHONEJACK) {
1654 j->gpio.bytes.high = 0x0B;
1655 j->gpio.bits.gpio6 = 1;
1656 j->gpio.bits.gpio7 = 0;
1657 ixj_WriteDSPCommand(j->gpio.word, j);
1658 j->port = PORT_HANDSET;
1668 static int ixj_set_pots(IXJ *j, int arg)
1670 if (j->cardtype == QTI_LINEJACK) {
1672 if (j->port == PORT_PSTN) {
1673 j->pld_slicw.bits.rly1 = 0;
1674 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1675 j->flags.pots_pstn = 1;
1678 j->flags.pots_pstn = 0;
1682 j->pld_slicw.bits.rly1 = 1;
1683 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1684 j->flags.pots_pstn = 0;
1692 static void ixj_ring_on(IXJ *j)
1694 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1696 if (ixjdebug & 0x0004)
1697 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1699 j->gpio.bytes.high = 0x0B;
1700 j->gpio.bytes.low = 0x00;
1701 j->gpio.bits.gpio1 = 1;
1702 j->gpio.bits.gpio2 = 1;
1703 j->gpio.bits.gpio5 = 0;
1704 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1705 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1707 if (ixjdebug & 0x0004)
1708 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1710 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1714 static int ixj_siadc(IXJ *j, int val)
1716 if(j->cardtype == QTI_PHONECARD){
1717 if(j->flags.pcmciascp){
1719 return j->siadc.bits.rxg;
1721 if(val < 0 || val > 0x1F)
1724 j->siadc.bits.hom = 0; /* Handset Out Mute */
1725 j->siadc.bits.lom = 0; /* Line Out Mute */
1726 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1727 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1728 j->psccr.bits.rw = 0; /* Read / Write flag */
1729 j->psccr.bits.dev = 0;
1730 outb(j->siadc.byte, j->XILINXbase + 0x00);
1731 outb(j->psccr.byte, j->XILINXbase + 0x01);
1732 ixj_PCcontrol_wait(j);
1733 return j->siadc.bits.rxg;
1739 static int ixj_sidac(IXJ *j, int val)
1741 if(j->cardtype == QTI_PHONECARD){
1742 if(j->flags.pcmciascp){
1744 return j->sidac.bits.txg;
1746 if(val < 0 || val > 0x1F)
1749 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1750 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1751 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1752 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1753 j->psccr.bits.rw = 0; /* Read / Write flag */
1754 j->psccr.bits.dev = 0;
1755 outb(j->sidac.byte, j->XILINXbase + 0x00);
1756 outb(j->psccr.byte, j->XILINXbase + 0x01);
1757 ixj_PCcontrol_wait(j);
1758 return j->sidac.bits.txg;
1764 static int ixj_pcmcia_cable_check(IXJ *j)
1766 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1767 if (!j->flags.pcmciastate) {
1768 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1769 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1770 j->flags.pcmciastate = 4;
1773 if (j->pccr1.bits.ed) {
1774 j->pccr1.bits.ed = 0;
1775 j->psccr.bits.dev = 3;
1776 j->psccr.bits.rw = 1;
1777 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1778 ixj_PCcontrol_wait(j);
1779 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1780 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1781 j->psccr.bits.dev = 3;
1782 j->psccr.bits.rw = 0;
1783 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1784 ixj_PCcontrol_wait(j);
1785 return j->pslic.bits.led2 ? 1 : 0;
1786 } else if (j->flags.pcmciasct) {
1791 } else if (j->flags.pcmciastate == 4) {
1792 if (!j->pccr1.bits.drf) {
1793 j->flags.pcmciastate = 3;
1796 } else if (j->flags.pcmciastate == 3) {
1797 j->pccr2.bits.pwr = 0;
1798 j->pccr2.bits.rstc = 1;
1799 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1800 j->checkwait = jiffies + (hertz * 2);
1801 j->flags.incheck = 1;
1802 j->flags.pcmciastate = 2;
1804 } else if (j->flags.pcmciastate == 2) {
1805 if (j->flags.incheck) {
1806 if (time_before(jiffies, j->checkwait)) {
1809 j->flags.incheck = 0;
1812 j->pccr2.bits.pwr = 0;
1813 j->pccr2.bits.rstc = 0;
1814 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1815 j->flags.pcmciastate = 1;
1817 } else if (j->flags.pcmciastate == 1) {
1818 j->flags.pcmciastate = 0;
1819 if (!j->pccr1.bits.drf) {
1820 j->psccr.bits.dev = 3;
1821 j->psccr.bits.rw = 1;
1822 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1823 ixj_PCcontrol_wait(j);
1824 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1826 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1828 if (j->flags.pcmciasct == 3) {
1829 j->flags.pcmciastate = 4;
1831 } else if (j->flags.pcmciasct == 0) {
1832 j->pccr2.bits.pwr = 1;
1833 j->pccr2.bits.rstc = 0;
1834 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1835 j->port = PORT_SPEAKER;
1837 j->port = PORT_POTS;
1839 j->sic1.bits.cpd = 0; /* Chip Power Down */
1840 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1841 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1842 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1843 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1844 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1845 j->psccr.bits.rw = 0; /* Read / Write flag */
1846 j->psccr.bits.dev = 0;
1847 outb(j->sic1.byte, j->XILINXbase + 0x00);
1848 outb(j->psccr.byte, j->XILINXbase + 0x01);
1849 ixj_PCcontrol_wait(j);
1851 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1852 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1853 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1854 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1855 j->sic2.bits.hpd = 0; /* HPF disable */
1856 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1857 j->psccr.bits.rw = 0; /* Read / Write flag */
1858 j->psccr.bits.dev = 0;
1859 outb(j->sic2.byte, j->XILINXbase + 0x00);
1860 outb(j->psccr.byte, j->XILINXbase + 0x01);
1861 ixj_PCcontrol_wait(j);
1863 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1864 j->psccr.bits.rw = 0; /* Read / Write flag */
1865 j->psccr.bits.dev = 0;
1866 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1867 outb(j->psccr.byte, j->XILINXbase + 0x01);
1868 ixj_PCcontrol_wait(j);
1870 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1871 j->psccr.bits.rw = 0; /* Read / Write flag */
1872 j->psccr.bits.dev = 0;
1873 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1874 outb(j->psccr.byte, j->XILINXbase + 0x01);
1875 ixj_PCcontrol_wait(j);
1877 j->sirxg.bits.lig = 1; /* Line In Gain */
1878 j->sirxg.bits.lim = 1; /* Line In Mute */
1879 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1880 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1881 j->sirxg.bits.him = 0; /* Handset In Mute */
1882 j->sirxg.bits.iir = 1; /* IIR */
1883 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1884 j->psccr.bits.rw = 0; /* Read / Write flag */
1885 j->psccr.bits.dev = 0;
1886 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1887 outb(j->psccr.byte, j->XILINXbase + 0x01);
1888 ixj_PCcontrol_wait(j);
1893 j->siaatt.bits.sot = 0;
1894 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1895 j->psccr.bits.rw = 0; /* Read / Write flag */
1896 j->psccr.bits.dev = 0;
1897 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1898 outb(j->psccr.byte, j->XILINXbase + 0x01);
1899 ixj_PCcontrol_wait(j);
1901 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1902 j->psccr.byte = j->pslic.byte = 0;
1903 j->pslic.bits.powerdown = 1;
1904 j->psccr.bits.dev = 3;
1905 j->psccr.bits.rw = 0;
1906 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1907 ixj_PCcontrol_wait(j);
1912 j->flags.pcmciascp = 0;
1918 static int ixj_hookstate(IXJ *j)
1923 switch (j->cardtype) {
1926 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1929 case QTI_PHONEJACK_LITE:
1930 case QTI_PHONEJACK_PCI:
1932 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1933 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1934 if(fOffHook != j->p_hook) {
1936 j->checkwait = jiffies;
1938 if(time_before(jiffies, j->checkwait + 2)) {
1943 j->p_hook = fOffHook;
1944 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1947 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1948 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1949 if (j->flags.ringing || j->flags.cringing) {
1950 if (!in_interrupt()) {
1951 det = jiffies + (hertz / 50);
1952 while (time_before(jiffies, det)) {
1953 set_current_state(TASK_INTERRUPTIBLE);
1954 schedule_timeout(1);
1958 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1962 if (j->cardtype == QTI_PHONEJACK_PCI) {
1963 j->pld_scrr.byte = inb_p(j->XILINXbase);
1964 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1966 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1971 fOffHook = ixj_pcmcia_cable_check(j);
1974 if (j->r_hook != fOffHook) {
1975 j->r_hook = fOffHook;
1976 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1977 j->ex.bits.hookstate = 1;
1978 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1979 } else if (!fOffHook) {
1980 j->flash_end = jiffies + ((60 * hertz) / 100);
1984 if(time_before(jiffies, j->flash_end)) {
1985 j->ex.bits.flash = 1;
1987 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1990 if(time_before(jiffies, j->flash_end)) {
1995 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1998 if (j->port == PORT_SPEAKER) {
1999 if(j->cardtype == QTI_PHONECARD) {
2000 if(j->flags.pcmciascp && j->flags.pcmciasct) {
2008 if (j->port == PORT_HANDSET)
2014 static void ixj_ring_off(IXJ *j)
2016 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2018 if (ixjdebug & 0x0004)
2019 printk(KERN_INFO "IXJ Ring Off\n");
2020 j->gpio.bytes.high = 0x0B;
2021 j->gpio.bytes.low = 0x00;
2022 j->gpio.bits.gpio1 = 0;
2023 j->gpio.bits.gpio2 = 1;
2024 j->gpio.bits.gpio5 = 0;
2025 ixj_WriteDSPCommand(j->gpio.word, j);
2026 } else /* Internet LineJACK */
2028 if (ixjdebug & 0x0004)
2029 printk(KERN_INFO "IXJ Ring Off\n");
2031 if(!j->flags.cidplay)
2032 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2038 static void ixj_ring_start(IXJ *j)
2040 j->flags.cringing = 1;
2041 if (ixjdebug & 0x0004)
2042 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2043 if (ixj_hookstate(j) & 1) {
2044 if (j->port == PORT_POTS)
2046 j->flags.cringing = 0;
2047 if (ixjdebug & 0x0004)
2048 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2049 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2050 j->ring_cadence_jif = jiffies;
2051 j->flags.cidsent = j->flags.cidring = 0;
2052 j->cadence_f[5].state = 0;
2053 if(j->cadence_f[5].on1)
2056 j->ring_cadence_jif = jiffies;
2057 j->ring_cadence_t = 15;
2058 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2063 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2067 static int ixj_ring(IXJ *j)
2070 unsigned long jif, det;
2072 j->flags.ringing = 1;
2073 if (ixj_hookstate(j) & 1) {
2075 j->flags.ringing = 0;
2079 for (cntr = 0; cntr < j->maxrings; cntr++) {
2080 jif = jiffies + (1 * hertz);
2082 while (time_before(jiffies, jif)) {
2083 if (ixj_hookstate(j) & 1) {
2085 j->flags.ringing = 0;
2088 set_current_state(TASK_INTERRUPTIBLE);
2089 schedule_timeout(1);
2090 if (signal_pending(current))
2093 jif = jiffies + (3 * hertz);
2095 while (time_before(jiffies, jif)) {
2096 if (ixj_hookstate(j) & 1) {
2097 det = jiffies + (hertz / 100);
2098 while (time_before(jiffies, det)) {
2099 set_current_state(TASK_INTERRUPTIBLE);
2100 schedule_timeout(1);
2101 if (signal_pending(current))
2104 if (ixj_hookstate(j) & 1) {
2105 j->flags.ringing = 0;
2109 set_current_state(TASK_INTERRUPTIBLE);
2110 schedule_timeout(1);
2111 if (signal_pending(current))
2116 j->flags.ringing = 0;
2120 static int ixj_open(struct phone_device *p, struct file *file_p)
2122 IXJ *j = get_ixj(p->board);
2123 file_p->private_data = j;
2128 if (file_p->f_mode & FMODE_READ) {
2136 if (file_p->f_mode & FMODE_WRITE) {
2140 if (file_p->f_mode & FMODE_READ){
2147 if (j->cardtype == QTI_PHONECARD) {
2148 j->pslic.bits.powerdown = 0;
2149 j->psccr.bits.dev = 3;
2150 j->psccr.bits.rw = 0;
2151 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2152 ixj_PCcontrol_wait(j);
2155 j->flags.cidplay = 0;
2156 j->flags.cidcw_ack = 0;
2158 if (ixjdebug & 0x0002)
2159 printk(KERN_INFO "Opening board %d\n", p->board);
2161 j->framesread = j->frameswritten = 0;
2165 static int ixj_release(struct inode *inode, struct file *file_p)
2169 IXJ *j = file_p->private_data;
2170 int board = j->p.board;
2173 * Set up locks to ensure that only one process is talking to the DSP at a time.
2174 * This is necessary to keep the DSP from locking up.
2176 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
2177 set_current_state(TASK_INTERRUPTIBLE);
2178 schedule_timeout(1);
2180 if (ixjdebug & 0x0002)
2181 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2183 if (j->cardtype == QTI_PHONECARD)
2184 ixj_set_port(j, PORT_SPEAKER);
2186 ixj_set_port(j, PORT_POTS);
2191 set_play_volume(j, 0x100);
2192 set_rec_volume(j, 0x100);
2195 /* Restore the tone table to default settings. */
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);
2291 ixj_init_tone(j, &ti);
2297 ixj_init_tone(j, &ti);
2303 ixj_init_tone(j, &ti);
2305 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2307 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2309 j->ex.bits.dtmf_ready = 0;
2311 j->dtmf_wp = j->dtmf_rp = 0;
2312 j->rec_mode = j->play_mode = -1;
2313 j->flags.ringing = 0;
2314 j->maxrings = MAXRINGS;
2315 j->ring_cadence = USA_RING_CADENCE;
2316 if(j->cadence_f[5].enable) {
2317 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2321 j->flags.dtmf_oob = 0;
2322 for (cnt = 0; cnt < 4; cnt++)
2323 j->cadence_f[cnt].enable = 0;
2327 if(j->cardtype == QTI_PHONECARD) {
2328 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2331 if (file_p->f_mode & FMODE_READ)
2333 if (file_p->f_mode & FMODE_WRITE)
2336 if (j->read_buffer && !j->readers) {
2337 kfree(j->read_buffer);
2338 j->read_buffer = NULL;
2339 j->read_buffer_size = 0;
2341 if (j->write_buffer && !j->writers) {
2342 kfree(j->write_buffer);
2343 j->write_buffer = NULL;
2344 j->write_buffer_size = 0;
2346 j->rec_codec = j->play_codec = 0;
2347 j->rec_frame_size = j->play_frame_size = 0;
2348 j->flags.cidsent = j->flags.cidring = 0;
2349 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2351 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2352 ixj_set_port(j, PORT_PSTN);
2353 daa_set_mode(j, SOP_PU_SLEEP);
2356 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2358 /* Set up the default signals for events */
2359 for (cnt = 0; cnt < 35; cnt++)
2360 j->ixj_signals[cnt] = SIGIO;
2362 /* Set the excetion signal enable flags */
2363 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2364 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 =
2365 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;
2367 file_p->private_data = NULL;
2368 clear_bit(board, &j->busyflags);
2372 static int read_filters(IXJ *j)
2374 unsigned short fc, cnt, trg;
2378 if (ixj_WriteDSPCommand(0x5144, j)) {
2379 if(ixjdebug & 0x0001) {
2380 printk(KERN_INFO "Read Frame Counter failed!\n");
2384 fc = j->ssr.high << 8 | j->ssr.low;
2385 if (fc == j->frame_count)
2388 j->frame_count = fc;
2395 for (cnt = 0; cnt < 4; cnt++) {
2396 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2397 if(ixjdebug & 0x0001) {
2398 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2402 if (ixj_WriteDSPCommand(0x515C, j)) {
2403 if(ixjdebug & 0x0001) {
2404 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2408 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2410 if (j->cadence_f[cnt].enable) {
2411 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2412 if (j->cadence_f[cnt].state == 0) {
2413 j->cadence_f[cnt].state = 1;
2414 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2415 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2416 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2417 } else if (j->cadence_f[cnt].state == 2 &&
2418 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2419 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2420 if (j->cadence_f[cnt].on2) {
2421 j->cadence_f[cnt].state = 3;
2422 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2423 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2424 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2426 j->cadence_f[cnt].state = 7;
2428 } else if (j->cadence_f[cnt].state == 4 &&
2429 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2430 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2431 if (j->cadence_f[cnt].on3) {
2432 j->cadence_f[cnt].state = 5;
2433 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2434 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2435 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2437 j->cadence_f[cnt].state = 7;
2440 j->cadence_f[cnt].state = 0;
2442 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2443 if (j->cadence_f[cnt].state == 1) {
2444 if(!j->cadence_f[cnt].on1) {
2445 j->cadence_f[cnt].state = 7;
2446 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2447 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2448 if(j->cadence_f[cnt].off1) {
2449 j->cadence_f[cnt].state = 2;
2450 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2451 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2452 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2454 j->cadence_f[cnt].state = 7;
2457 j->cadence_f[cnt].state = 0;
2459 } else if (j->cadence_f[cnt].state == 3) {
2460 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2461 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2462 if(j->cadence_f[cnt].off2) {
2463 j->cadence_f[cnt].state = 4;
2464 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2465 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2466 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2468 j->cadence_f[cnt].state = 7;
2471 j->cadence_f[cnt].state = 0;
2473 } else if (j->cadence_f[cnt].state == 5) {
2474 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2475 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2476 if(j->cadence_f[cnt].off3) {
2477 j->cadence_f[cnt].state = 6;
2478 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2479 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2480 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2482 j->cadence_f[cnt].state = 7;
2485 j->cadence_f[cnt].state = 0;
2488 j->cadence_f[cnt].state = 0;
2491 switch(j->cadence_f[cnt].state) {
2493 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2494 !j->cadence_f[cnt].off1 &&
2495 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2496 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2497 j->cadence_f[cnt].state = 7;
2501 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2502 !j->cadence_f[cnt].off2 &&
2503 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2504 j->cadence_f[cnt].state = 7;
2508 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2509 !j->cadence_f[cnt].off3) {
2510 j->cadence_f[cnt].state = 7;
2516 if (ixjdebug & 0x0040) {
2517 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2518 switch(j->cadence_f[cnt].state) {
2520 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2523 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2524 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2527 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2528 j->cadence_f[cnt].off1max);
2531 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2532 j->cadence_f[cnt].on2max);
2535 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2536 j->cadence_f[cnt].off2max);
2539 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2540 j->cadence_f[cnt].on3max);
2543 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2544 j->cadence_f[cnt].off3max);
2549 if (j->cadence_f[cnt].state == 7) {
2550 j->cadence_f[cnt].state = 0;
2551 if (j->cadence_f[cnt].enable == 1)
2552 j->cadence_f[cnt].enable = 0;
2555 if(ixjdebug & 0x0020) {
2556 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2559 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2562 if(ixjdebug & 0x0020) {
2563 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2566 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2569 if(ixjdebug & 0x0020) {
2570 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2573 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2576 if(ixjdebug & 0x0020) {
2577 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2580 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2584 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2585 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2586 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2588 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2593 if(ixjdebug & 0x0020) {
2594 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2597 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2600 if(ixjdebug & 0x0020) {
2601 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2604 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2607 if(ixjdebug & 0x0020) {
2608 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2611 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2614 if(ixjdebug & 0x0020) {
2615 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2618 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2626 static int LineMonitor(IXJ *j)
2633 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2636 j->dtmf.bytes.high = j->ssr.high;
2637 j->dtmf.bytes.low = j->ssr.low;
2638 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2640 j->dtmf_current = j->dtmf.bits.digit;
2642 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2644 if(!j->cidcw_wait) {
2645 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2647 if (j->dtmf_wp == 79)
2649 j->ex.bits.dtmf_ready = 1;
2650 if(j->ex_sig.bits.dtmf_ready) {
2651 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2654 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2655 if(ixjdebug & 0x0020) {
2656 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2658 j->flags.cidcw_ack = 1;
2667 /************************************************************************
2669 * Functions to allow alaw <-> ulaw conversions.
2671 ************************************************************************/
2673 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2675 static unsigned char table_ulaw2alaw[] =
2677 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2678 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2679 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2680 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2681 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2682 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2683 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2684 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2685 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2686 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2687 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2688 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2689 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2690 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2691 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2692 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2693 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2694 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2695 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2696 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2697 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2698 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2699 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2700 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2701 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2702 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2703 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2704 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2705 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2706 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2707 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2708 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2713 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2718 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2720 static unsigned char table_alaw2ulaw[] =
2722 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2723 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2724 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2725 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2726 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2727 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2728 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2729 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2730 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2731 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2732 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2733 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2734 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2735 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2736 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2737 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2738 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2739 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2740 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2741 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2742 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2743 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2744 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2745 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2746 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2747 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2748 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2749 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2750 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2751 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2752 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2753 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2758 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2763 static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2765 unsigned long i = *ppos;
2766 IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode));
2768 DECLARE_WAITQUEUE(wait, current);
2770 if (j->flags.inread)
2773 j->flags.inread = 1;
2775 add_wait_queue(&j->read_q, &wait);
2776 set_current_state(TASK_INTERRUPTIBLE);
2779 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2781 if (file_p->f_flags & O_NONBLOCK) {
2782 set_current_state(TASK_RUNNING);
2783 remove_wait_queue(&j->read_q, &wait);
2784 j->flags.inread = 0;
2787 if (!ixj_hookstate(j)) {
2788 set_current_state(TASK_RUNNING);
2789 remove_wait_queue(&j->read_q, &wait);
2790 j->flags.inread = 0;
2793 interruptible_sleep_on(&j->read_q);
2794 if (signal_pending(current)) {
2795 set_current_state(TASK_RUNNING);
2796 remove_wait_queue(&j->read_q, &wait);
2797 j->flags.inread = 0;
2802 remove_wait_queue(&j->read_q, &wait);
2803 set_current_state(TASK_RUNNING);
2804 /* Don't ever copy more than the user asks */
2805 if(j->rec_codec == ALAW)
2806 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2807 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2808 j->read_buffer_ready = 0;
2810 j->flags.inread = 0;
2813 j->flags.inread = 0;
2814 return min(length, j->read_buffer_size);
2818 static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2822 ssize_t read_retval = 0;
2823 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2825 pre_retval = ixj_PreRead(j, 0L);
2826 switch (pre_retval) {
2828 read_retval = ixj_read(file_p, buf, length, ppos);
2829 ixj_PostRead(j, 0L);
2832 read_retval = ixj_read(file_p, buf, length, ppos);
2835 ixj_PostRead(j, 0L);
2838 read_retval = pre_retval;
2843 static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2845 unsigned long i = *ppos;
2846 IXJ *j = file_p->private_data;
2848 DECLARE_WAITQUEUE(wait, current);
2850 if (j->flags.inwrite)
2853 j->flags.inwrite = 1;
2855 add_wait_queue(&j->write_q, &wait);
2856 set_current_state(TASK_INTERRUPTIBLE);
2860 while (!j->write_buffers_empty) {
2862 if (file_p->f_flags & O_NONBLOCK) {
2863 set_current_state(TASK_RUNNING);
2864 remove_wait_queue(&j->write_q, &wait);
2865 j->flags.inwrite = 0;
2868 if (!ixj_hookstate(j)) {
2869 set_current_state(TASK_RUNNING);
2870 remove_wait_queue(&j->write_q, &wait);
2871 j->flags.inwrite = 0;
2874 interruptible_sleep_on(&j->write_q);
2875 if (signal_pending(current)) {
2876 set_current_state(TASK_RUNNING);
2877 remove_wait_queue(&j->write_q, &wait);
2878 j->flags.inwrite = 0;
2882 set_current_state(TASK_RUNNING);
2883 remove_wait_queue(&j->write_q, &wait);
2884 if (j->write_buffer_wp + count >= j->write_buffer_end)
2885 j->write_buffer_wp = j->write_buffer;
2886 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2888 j->flags.inwrite = 0;
2891 if(j->play_codec == ALAW)
2892 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2893 j->flags.inwrite = 0;
2894 return min(count, j->write_buffer_size);
2897 static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2900 ssize_t write_retval = 0;
2902 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2904 pre_retval = ixj_PreWrite(j, 0L);
2905 switch (pre_retval) {
2907 write_retval = ixj_write(file_p, buf, count, ppos);
2908 if (write_retval > 0) {
2909 ixj_PostWrite(j, 0L);
2910 j->write_buffer_wp += write_retval;
2911 j->write_buffers_empty--;
2915 write_retval = ixj_write(file_p, buf, count, ppos);
2916 if (write_retval > 0) {
2917 j->write_buffer_wp += write_retval;
2918 j->write_buffers_empty--;
2922 ixj_PostWrite(j, 0L);
2925 write_retval = pre_retval;
2927 return write_retval;
2930 static void ixj_read_frame(IXJ *j)
2934 if (j->read_buffer) {
2935 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2936 if (!(cnt % 16) && !IsRxReady(j)) {
2938 while (!IsRxReady(j)) {
2946 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2947 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2948 inb_p(j->DSPbase + 0x0E);
2949 inb_p(j->DSPbase + 0x0F);
2951 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2952 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2955 if (j->intercom != -1) {
2956 if (IsTxReady(get_ixj(j->intercom))) {
2957 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2958 if (!(cnt % 16) && !IsTxReady(j)) {
2960 while (!IsTxReady(j)) {
2968 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2969 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2971 get_ixj(j->intercom)->frameswritten++;
2974 j->read_buffer_ready = 1;
2975 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2977 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2979 if(j->ixj_signals[SIG_READ_READY])
2980 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2985 static short fsk[][6][20] =
2989 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2990 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2993 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2994 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2997 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2998 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
3001 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
3002 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
3005 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
3006 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
3009 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
3010 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
3015 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3016 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3019 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3020 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3023 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3024 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3027 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3028 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3031 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3032 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3035 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3036 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3042 static void ixj_write_cid_bit(IXJ *j, int bit)
3044 while (j->fskcnt < 20) {
3045 if(j->fskdcnt < (j->fsksize - 1))
3046 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3059 static void ixj_write_cid_byte(IXJ *j, char byte)
3064 ixj_write_cid_bit(j, 0);
3065 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3066 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3067 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3068 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3069 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3070 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3071 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3072 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3073 ixj_write_cid_bit(j, 1);
3076 static void ixj_write_cid_seize(IXJ *j)
3080 for (cnt = 0; cnt < 150; cnt++) {
3081 ixj_write_cid_bit(j, 0);
3082 ixj_write_cid_bit(j, 1);
3084 for (cnt = 0; cnt < 180; cnt++) {
3085 ixj_write_cid_bit(j, 1);
3089 static void ixj_write_cidcw_seize(IXJ *j)
3093 for (cnt = 0; cnt < 80; cnt++) {
3094 ixj_write_cid_bit(j, 1);
3098 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3102 for (cnt = 0; cnt < strlen(s); cnt++) {
3103 ixj_write_cid_byte(j, s[cnt]);
3104 checksum = (checksum + s[cnt]);
3109 static void ixj_pad_fsk(IXJ *j, int pad)
3113 for (cnt = 0; cnt < pad; cnt++) {
3114 if(j->fskdcnt < (j->fsksize - 1))
3115 j->fskdata[j->fskdcnt++] = 0x0000;
3117 for (cnt = 0; cnt < 720; cnt++) {
3118 if(j->fskdcnt < (j->fsksize - 1))
3119 j->fskdata[j->fskdcnt++] = 0x0000;
3123 static void ixj_pre_cid(IXJ *j)
3125 j->cid_play_codec = j->play_codec;
3126 j->cid_play_frame_size = j->play_frame_size;
3127 j->cid_play_volume = get_play_volume(j);
3128 j->cid_play_flag = j->flags.playing;
3130 j->cid_rec_codec = j->rec_codec;
3131 j->cid_rec_volume = get_rec_volume(j);
3132 j->cid_rec_flag = j->flags.recording;
3134 j->cid_play_aec_level = j->aec_level;
3136 switch(j->baseframe.low) {
3138 j->cid_base_frame_size = 20;
3141 j->cid_base_frame_size = 10;
3144 j->cid_base_frame_size = 30;
3151 j->flags.cidplay = 1;
3153 set_base_frame(j, 30);
3154 set_play_codec(j, LINEAR16);
3155 set_play_volume(j, 0x1B);
3159 static void ixj_post_cid(IXJ *j)
3163 if(j->cidsize > 5000) {
3164 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3166 j->flags.cidplay = 0;
3167 if(ixjdebug & 0x0200) {
3168 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3174 set_base_frame(j, j->cid_base_frame_size);
3175 set_play_codec(j, j->cid_play_codec);
3176 ixj_aec_start(j, j->cid_play_aec_level);
3177 set_play_volume(j, j->cid_play_volume);
3179 set_rec_codec(j, j->cid_rec_codec);
3180 set_rec_volume(j, j->cid_rec_volume);
3183 ixj_record_start(j);
3185 if(j->cid_play_flag)
3188 if(j->cid_play_flag) {
3189 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3193 static void ixj_write_cid(IXJ *j)
3198 char mdmflen, len1, len2, len3;
3203 if (j->dsp.low == 0x20 || j->flags.cidplay)
3206 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3207 j->cidsize = j->cidcnt = 0;
3211 strcpy(sdmf1, j->cid_send.month);
3212 strcat(sdmf1, j->cid_send.day);
3213 strcat(sdmf1, j->cid_send.hour);
3214 strcat(sdmf1, j->cid_send.min);
3215 strcpy(sdmf2, j->cid_send.number);
3216 strcpy(sdmf3, j->cid_send.name);
3218 len1 = strlen(sdmf1);
3219 len2 = strlen(sdmf2);
3220 len3 = strlen(sdmf3);
3221 mdmflen = len1 + len2 + len3 + 6;
3224 ixj_write_cid_seize(j);
3226 ixj_write_cid_byte(j, 0x80);
3228 ixj_write_cid_byte(j, mdmflen);
3229 checksum = checksum + mdmflen;
3231 ixj_write_cid_byte(j, 0x01);
3232 checksum = checksum + 0x01;
3233 ixj_write_cid_byte(j, len1);
3234 checksum = checksum + len1;
3235 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3236 if(ixj_hookstate(j) & 1)
3239 ixj_write_cid_byte(j, 0x02);
3240 checksum = checksum + 0x02;
3241 ixj_write_cid_byte(j, len2);
3242 checksum = checksum + len2;
3243 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3244 if(ixj_hookstate(j) & 1)
3247 ixj_write_cid_byte(j, 0x07);
3248 checksum = checksum + 0x07;
3249 ixj_write_cid_byte(j, len3);
3250 checksum = checksum + len3;
3251 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3252 if(ixj_hookstate(j) & 1)
3259 ixj_write_cid_byte(j, (char) checksum);
3261 pad = j->fskdcnt % 240;
3265 ixj_pad_fsk(j, pad);
3272 static void ixj_write_cidcw(IXJ *j)
3279 char mdmflen, len1, len2, len3;
3284 if (j->dsp.low == 0x20 || j->flags.cidplay)
3287 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3288 j->cidsize = j->cidcnt = 0;
3292 j->flags.cidcw_ack = 0;
3299 ixj_init_tone(j, &ti);
3301 ixj_set_tone_on(1500, j);
3302 ixj_set_tone_off(32, j);
3303 if(ixjdebug & 0x0200) {
3304 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3306 ixj_play_tone(j, 23);
3308 clear_bit(j->board, &j->busyflags);
3309 while(j->tone_state) {
3310 set_current_state(TASK_INTERRUPTIBLE);
3311 schedule_timeout(1);
3313 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3314 set_current_state(TASK_INTERRUPTIBLE);
3315 schedule_timeout(1);
3317 if(ixjdebug & 0x0200) {
3318 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3326 ixj_init_tone(j, &ti);
3328 ixj_set_tone_off(10, j);
3329 ixj_set_tone_on(600, j);
3330 if(ixjdebug & 0x0200) {
3331 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3333 ixj_play_tone(j, 24);
3335 clear_bit(j->board, &j->busyflags);
3336 while(j->tone_state) {
3337 set_current_state(TASK_INTERRUPTIBLE);
3338 schedule_timeout(1);
3340 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3341 set_current_state(TASK_INTERRUPTIBLE);
3342 schedule_timeout(1);
3344 if(ixjdebug & 0x0200) {
3345 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3348 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3350 clear_bit(j->board, &j->busyflags);
3351 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
3352 set_current_state(TASK_INTERRUPTIBLE);
3353 schedule_timeout(1);
3355 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3356 set_current_state(TASK_INTERRUPTIBLE);
3357 schedule_timeout(1);
3360 if(!j->flags.cidcw_ack) {
3361 if(ixjdebug & 0x0200) {
3362 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3365 if(j->cid_play_flag) {
3366 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3372 j->flags.cidcw_ack = 0;
3373 strcpy(sdmf1, j->cid_send.month);
3374 strcat(sdmf1, j->cid_send.day);
3375 strcat(sdmf1, j->cid_send.hour);
3376 strcat(sdmf1, j->cid_send.min);
3377 strcpy(sdmf2, j->cid_send.number);
3378 strcpy(sdmf3, j->cid_send.name);
3380 len1 = strlen(sdmf1);
3381 len2 = strlen(sdmf2);
3382 len3 = strlen(sdmf3);
3383 mdmflen = len1 + len2 + len3 + 6;
3385 ixj_write_cidcw_seize(j);
3387 ixj_write_cid_byte(j, 0x80);
3389 ixj_write_cid_byte(j, mdmflen);
3390 checksum = checksum + mdmflen;
3392 ixj_write_cid_byte(j, 0x01);
3393 checksum = checksum + 0x01;
3394 ixj_write_cid_byte(j, len1);
3395 checksum = checksum + len1;
3396 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3398 ixj_write_cid_byte(j, 0x02);
3399 checksum = checksum + 0x02;
3400 ixj_write_cid_byte(j, len2);
3401 checksum = checksum + len2;
3402 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3404 ixj_write_cid_byte(j, 0x07);
3405 checksum = checksum + 0x07;
3406 ixj_write_cid_byte(j, len3);
3407 checksum = checksum + len3;
3408 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3414 ixj_write_cid_byte(j, (char) checksum);
3416 pad = j->fskdcnt % 240;
3420 ixj_pad_fsk(j, pad);
3421 if(ixjdebug & 0x0200) {
3422 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3426 static void ixj_write_vmwi(IXJ *j, int msg)
3433 if (j->dsp.low == 0x20 || j->flags.cidplay)
3436 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3437 j->cidsize = j->cidcnt = 0;
3443 if (j->port == PORT_POTS)
3444 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3446 ixj_write_cid_seize(j);
3448 ixj_write_cid_byte(j, 0x82);
3450 ixj_write_cid_byte(j, mdmflen);
3451 checksum = checksum + mdmflen;
3453 ixj_write_cid_byte(j, 0x0B);
3454 checksum = checksum + 0x0B;
3455 ixj_write_cid_byte(j, 1);
3456 checksum = checksum + 1;
3459 ixj_write_cid_byte(j, 0xFF);
3460 checksum = checksum + 0xFF;
3463 ixj_write_cid_byte(j, 0x00);
3464 checksum = checksum + 0x00;
3471 ixj_write_cid_byte(j, (char) checksum);
3473 pad = j->fskdcnt % 240;
3477 ixj_pad_fsk(j, pad);
3480 static void ixj_write_frame(IXJ *j)
3482 int cnt, frame_count, dly;
3487 if(j->flags.cidplay) {
3488 for(cnt = 0; cnt < 480; cnt++) {
3489 if (!(cnt % 16) && !IsTxReady(j)) {
3491 while (!IsTxReady(j)) {
3499 dat.word = j->fskdata[j->cidcnt++];
3500 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3501 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3504 if(j->cidcnt >= j->fskdcnt) {
3507 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3508 and there is real audio data in the buffer, we need to throw it away because
3509 we just used it's time slot */
3510 if (j->write_buffer_rp > j->write_buffer_wp) {
3511 j->write_buffer_rp += j->cid_play_frame_size * 2;
3512 if (j->write_buffer_rp >= j->write_buffer_end) {
3513 j->write_buffer_rp = j->write_buffer;
3515 j->write_buffers_empty++;
3516 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3518 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3520 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3521 if (j->write_buffer_wp > j->write_buffer_rp) {
3523 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3525 if (j->write_buffer_rp > j->write_buffer_wp) {
3527 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3528 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3530 if (frame_count >= 1) {
3531 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3532 switch (j->play_mode) {
3533 case PLAYBACK_MODE_ULAW:
3534 case PLAYBACK_MODE_ALAW:
3535 blankword.low = blankword.high = 0xFF;
3537 case PLAYBACK_MODE_8LINEAR:
3538 case PLAYBACK_MODE_16LINEAR:
3539 blankword.low = blankword.high = 0x00;
3541 case PLAYBACK_MODE_8LINEAR_WSS:
3542 blankword.low = blankword.high = 0x80;
3545 for (cnt = 0; cnt < 16; cnt++) {
3546 if (!(cnt % 16) && !IsTxReady(j)) {
3548 while (!IsTxReady(j)) {
3556 outb_p((blankword.low), j->DSPbase + 0x0C);
3557 outb_p((blankword.high), j->DSPbase + 0x0D);
3559 j->flags.play_first_frame = 0;
3560 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3561 for (cnt = 0; cnt < 24; cnt++) {
3563 blankword.low = 0x02;
3564 blankword.high = 0x00;
3567 blankword.low = blankword.high = 0x00;
3569 if (!(cnt % 16) && !IsTxReady(j)) {
3571 while (!IsTxReady(j)) {
3579 outb_p((blankword.low), j->DSPbase + 0x0C);
3580 outb_p((blankword.high), j->DSPbase + 0x0D);
3582 j->flags.play_first_frame = 0;
3584 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3585 if (!(cnt % 16) && !IsTxReady(j)) {
3587 while (!IsTxReady(j)) {
3595 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3596 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3597 if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
3598 j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
3599 j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
3600 j->write_buffer_rp + cnt + 9 == 0) {
3601 /* someone is trying to write silence lets make this a type 0 frame. */
3602 outb_p(0x00, j->DSPbase + 0x0C);
3603 outb_p(0x00, j->DSPbase + 0x0D);
3605 /* so all other frames are type 1. */
3606 outb_p(0x01, j->DSPbase + 0x0C);
3607 outb_p(0x00, j->DSPbase + 0x0D);
3610 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3611 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3612 *(j->write_buffer_rp + cnt) = 0;
3613 *(j->write_buffer_rp + cnt + 1) = 0;
3615 j->write_buffer_rp += j->play_frame_size * 2;
3616 if (j->write_buffer_rp >= j->write_buffer_end) {
3617 j->write_buffer_rp = j->write_buffer;
3619 j->write_buffers_empty++;
3620 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3622 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3629 if(j->ixj_signals[SIG_WRITE_READY]) {
3630 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3634 static int idle(IXJ *j)
3636 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3640 if (j->ssr.high || j->ssr.low) {
3644 j->flags.playing = 0;
3646 j->flags.recording = 0;
3651 static int set_base_frame(IXJ *j, int size)
3657 j->cid_play_aec_level = j->aec_level;
3659 for (cnt = 0; cnt < 10; cnt++) {
3663 if (j->ssr.high || j->ssr.low)
3665 if (j->dsp.low != 0x20) {
3669 /* Set Base Frame Size to 240 pg9-10 8021 */
3673 /* Set Base Frame Size to 160 pg9-10 8021 */
3677 /* Set Base Frame Size to 80 pg9-10 8021 */
3688 if (ixj_WriteDSPCommand(cmd, j)) {
3689 j->baseframe.high = j->baseframe.low = 0xFF;
3692 j->baseframe.high = j->ssr.high;
3693 j->baseframe.low = j->ssr.low;
3694 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3695 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3699 ixj_aec_start(j, j->cid_play_aec_level);
3703 static int set_rec_codec(IXJ *j, int rate)
3707 j->rec_codec = rate;
3711 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3712 j->rec_frame_size = 12;
3719 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3720 j->rec_frame_size = 10;
3727 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3728 j->rec_frame_size = 16;
3735 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3736 j->rec_frame_size = 9;
3743 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3744 j->rec_frame_size = 8;
3751 if (j->dsp.low != 0x20) {
3752 j->rec_frame_size = 48;
3759 if (j->dsp.low != 0x20) {
3760 if (!j->flags.g729_loaded) {
3764 switch (j->baseframe.low) {
3766 j->rec_frame_size = 10;
3769 j->rec_frame_size = 5;
3772 j->rec_frame_size = 15;
3781 if (j->dsp.low != 0x20) {
3782 if (!j->flags.g729_loaded) {
3786 switch (j->baseframe.low) {
3788 j->rec_frame_size = 12;
3791 j->rec_frame_size = 6;
3794 j->rec_frame_size = 18;
3803 switch (j->baseframe.low) {
3805 j->rec_frame_size = 80;
3808 j->rec_frame_size = 40;
3811 j->rec_frame_size = 120;
3817 switch (j->baseframe.low) {
3819 j->rec_frame_size = 80;
3822 j->rec_frame_size = 40;
3825 j->rec_frame_size = 120;
3831 switch (j->baseframe.low) {
3833 j->rec_frame_size = 160;
3836 j->rec_frame_size = 80;
3839 j->rec_frame_size = 240;
3845 switch (j->baseframe.low) {
3847 j->rec_frame_size = 80;
3850 j->rec_frame_size = 40;
3853 j->rec_frame_size = 120;
3859 switch (j->baseframe.low) {
3861 j->rec_frame_size = 80;
3864 j->rec_frame_size = 40;
3867 j->rec_frame_size = 120;
3873 j->rec_frame_size = 0;
3875 if (j->read_buffer) {
3876 kfree(j->read_buffer);
3877 j->read_buffer = NULL;
3878 j->read_buffer_size = 0;
3886 static int ixj_record_start(IXJ *j)
3888 unsigned short cmd = 0x0000;
3890 if (j->read_buffer) {
3893 j->flags.recording = 1;
3894 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3896 if(ixjdebug & 0x0002)
3897 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3900 switch (j->rec_codec) {
3908 cmd = 0x5130; /* TrueSpeech 8.5 */
3912 cmd = 0x5133; /* TrueSpeech 4.8 */
3916 cmd = 0x5134; /* TrueSpeech 4.1 */
3929 if (ixj_WriteDSPCommand(cmd, j))
3932 if (!j->read_buffer) {
3933 if (!j->read_buffer)
3934 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3935 if (!j->read_buffer) {
3936 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3940 j->read_buffer_size = j->rec_frame_size * 2;
3942 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3946 switch (j->rec_mode) {
3948 cmd = 0x1C03; /* Record C1 */
3952 if (j->ver.low == 0x12) {
3953 cmd = 0x1E03; /* Record C1 */
3956 cmd = 0x1E01; /* Record C1 */
3961 if (j->ver.low == 0x12) {
3962 cmd = 0x1E83; /* Record C1 */
3965 cmd = 0x1E81; /* Record C1 */
3970 if (j->ver.low == 0x12) {
3971 cmd = 0x1F03; /* Record C1 */
3974 cmd = 0x1F01; /* Record C1 */
3979 if (j->ver.low == 0x12) {
3980 cmd = 0x1F83; /* Record C1 */
3982 cmd = 0x1F81; /* Record C1 */
3986 if (ixj_WriteDSPCommand(cmd, j))
3989 if (j->flags.playing) {
3990 ixj_aec_start(j, j->aec_level);
3995 static void ixj_record_stop(IXJ *j)
3997 if(ixjdebug & 0x0002)
3998 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
4000 if (j->read_buffer) {
4001 kfree(j->read_buffer);
4002 j->read_buffer = NULL;
4003 j->read_buffer_size = 0;
4005 if (j->rec_mode > -1) {
4006 ixj_WriteDSPCommand(0x5120, j);
4009 j->flags.recording = 0;
4011 static void ixj_vad(IXJ *j, int arg)
4014 ixj_WriteDSPCommand(0x513F, j);
4016 ixj_WriteDSPCommand(0x513E, j);
4019 static void set_rec_depth(IXJ *j, int depth)
4025 ixj_WriteDSPCommand(0x5180 + depth, j);
4028 static void set_dtmf_prescale(IXJ *j, int volume)
4030 ixj_WriteDSPCommand(0xCF07, j);
4031 ixj_WriteDSPCommand(volume, j);
4034 static int get_dtmf_prescale(IXJ *j)
4036 ixj_WriteDSPCommand(0xCF05, j);
4037 return j->ssr.high << 8 | j->ssr.low;
4040 static void set_rec_volume(IXJ *j, int volume)
4042 if(j->aec_level == AEC_AGC) {
4043 if (ixjdebug & 0x0002)
4044 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4045 ixj_WriteDSPCommand(0xCF96, j);
4046 ixj_WriteDSPCommand(volume, j);
4048 if (ixjdebug & 0x0002)
4049 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4050 ixj_WriteDSPCommand(0xCF03, j);
4051 ixj_WriteDSPCommand(volume, j);
4055 static int set_rec_volume_linear(IXJ *j, int volume)
4057 int newvolume, dsprecmax;
4059 if (ixjdebug & 0x0002)
4060 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4061 if(volume > 100 || volume < 0) {
4065 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4066 switch (j->cardtype) {
4072 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4073 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4074 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4076 case QTI_PHONEJACK_LITE:
4079 case QTI_PHONEJACK_PCI:
4088 newvolume = (dsprecmax * volume) / 100;
4089 set_rec_volume(j, newvolume);
4093 static int get_rec_volume(IXJ *j)
4095 if(j->aec_level == AEC_AGC) {
4096 if (ixjdebug & 0x0002)
4097 printk(KERN_INFO "Getting AGC Threshold\n");
4098 ixj_WriteDSPCommand(0xCF86, j);
4099 if (ixjdebug & 0x0002)
4100 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4101 return j->ssr.high << 8 | j->ssr.low;
4103 if (ixjdebug & 0x0002)
4104 printk(KERN_INFO "Getting Record Volume\n");
4105 ixj_WriteDSPCommand(0xCF01, j);
4106 return j->ssr.high << 8 | j->ssr.low;
4110 static int get_rec_volume_linear(IXJ *j)
4112 int volume, newvolume, dsprecmax;
4114 switch (j->cardtype) {
4121 case QTI_PHONEJACK_LITE:
4124 case QTI_PHONEJACK_PCI:
4133 volume = get_rec_volume(j);
4134 newvolume = (volume * 100) / dsprecmax;
4140 static int get_rec_level(IXJ *j)
4144 ixj_WriteDSPCommand(0xCF88, j);
4146 retval = j->ssr.high << 8 | j->ssr.low;
4147 retval = (retval * 256) / 240;
4151 static void ixj_aec_start(IXJ *j, int level)
4153 j->aec_level = level;
4154 if (ixjdebug & 0x0002)
4155 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4159 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4160 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4162 ixj_WriteDSPCommand(0x0300, j);
4164 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4166 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4170 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4172 ixj_WriteDSPCommand(0xE011, j);
4173 ixj_WriteDSPCommand(0xFFFF, j);
4175 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4176 ixj_WriteDSPCommand(0x0000, j); /* to off */
4181 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4183 ixj_WriteDSPCommand(0xE011, j);
4184 ixj_WriteDSPCommand(0x0080, j);
4186 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4187 ixj_WriteDSPCommand(0x0000, j); /* to off */
4192 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4194 ixj_WriteDSPCommand(0xE011, j);
4195 ixj_WriteDSPCommand(0x0080, j);
4197 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4198 ixj_WriteDSPCommand(0x0000, j); /* to off */
4203 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4204 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4206 ixj_WriteDSPCommand(0xE011, j);
4207 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4209 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4211 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4212 ixj_WriteDSPCommand(0x0224, j);
4214 ixj_WriteDSPCommand(0x1224, j);
4216 ixj_WriteDSPCommand(0xE014, j);
4217 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4219 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4221 /* Now we can set the AGC initial parameters and turn it on */
4222 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4223 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4225 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4226 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4228 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4229 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4231 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4232 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4234 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4235 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4237 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4238 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4240 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4241 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4243 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4244 ixj_WriteDSPCommand(0x0001, j); /* to on */
4249 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4251 ixj_WriteDSPCommand(0xE011, j);
4252 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4254 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4256 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4257 ixj_WriteDSPCommand(0x0224, j);
4259 ixj_WriteDSPCommand(0x1224, j);
4261 ixj_WriteDSPCommand(0xE014, j);
4262 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4264 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4271 static void aec_stop(IXJ *j)
4273 j->aec_level = AEC_OFF;
4274 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4275 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4277 ixj_WriteDSPCommand(0x0700, j);
4279 if (j->play_mode != -1 && j->rec_mode != -1)
4281 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4285 static int set_play_codec(IXJ *j, int rate)
4289 j->play_codec = rate;
4293 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4294 j->play_frame_size = 12;
4301 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4302 j->play_frame_size = 10;
4309 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4310 j->play_frame_size = 16;
4317 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4318 j->play_frame_size = 9;
4325 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4326 j->play_frame_size = 8;
4333 if (j->dsp.low != 0x20) {
4334 j->play_frame_size = 48;
4341 if (j->dsp.low != 0x20) {
4342 if (!j->flags.g729_loaded) {
4346 switch (j->baseframe.low) {
4348 j->play_frame_size = 10;
4351 j->play_frame_size = 5;
4354 j->play_frame_size = 15;
4363 if (j->dsp.low != 0x20) {
4364 if (!j->flags.g729_loaded) {
4368 switch (j->baseframe.low) {
4370 j->play_frame_size = 12;
4373 j->play_frame_size = 6;
4376 j->play_frame_size = 18;
4385 switch (j->baseframe.low) {
4387 j->play_frame_size = 80;
4390 j->play_frame_size = 40;
4393 j->play_frame_size = 120;
4399 switch (j->baseframe.low) {
4401 j->play_frame_size = 80;
4404 j->play_frame_size = 40;
4407 j->play_frame_size = 120;
4413 switch (j->baseframe.low) {
4415 j->play_frame_size = 160;
4418 j->play_frame_size = 80;
4421 j->play_frame_size = 240;
4427 switch (j->baseframe.low) {
4429 j->play_frame_size = 80;
4432 j->play_frame_size = 40;
4435 j->play_frame_size = 120;
4441 switch (j->baseframe.low) {
4443 j->play_frame_size = 80;
4446 j->play_frame_size = 40;
4449 j->play_frame_size = 120;
4455 j->play_frame_size = 0;
4457 if (j->write_buffer) {
4458 kfree(j->write_buffer);
4459 j->write_buffer = NULL;
4460 j->write_buffer_size = 0;
4468 static int ixj_play_start(IXJ *j)
4470 unsigned short cmd = 0x0000;
4472 if (j->write_buffer) {
4476 if(ixjdebug & 0x0002)
4477 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4479 j->flags.playing = 1;
4480 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4482 j->flags.play_first_frame = 1;
4485 if (!j->play_mode) {
4486 switch (j->play_codec) {
4494 cmd = 0x5230; /* TrueSpeech 8.5 */
4498 cmd = 0x5233; /* TrueSpeech 4.8 */
4502 cmd = 0x5234; /* TrueSpeech 4.1 */
4515 if (ixj_WriteDSPCommand(cmd, j))
4518 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4519 if (!j->write_buffer) {
4520 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4523 /* j->write_buffers_empty = 2; */
4524 j->write_buffers_empty = 1;
4525 j->write_buffer_size = j->play_frame_size * 2;
4526 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4527 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4529 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4533 switch (j->play_mode) {
4538 if (j->ver.low == 0x12) {
4545 if (j->ver.low == 0x12) {
4552 if (j->ver.low == 0x12) {
4559 if (j->ver.low == 0x12) {
4566 if (ixj_WriteDSPCommand(cmd, j))
4569 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4572 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4575 if (j->flags.recording) {
4576 ixj_aec_start(j, j->aec_level);
4582 static void ixj_play_stop(IXJ *j)
4584 if(ixjdebug & 0x0002)
4585 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4587 if (j->write_buffer) {
4588 kfree(j->write_buffer);
4589 j->write_buffer = NULL;
4590 j->write_buffer_size = 0;
4592 if (j->play_mode > -1) {
4593 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4597 j->flags.playing = 0;
4600 static inline int get_play_level(IXJ *j)
4604 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4605 return j->ssr.high << 8 | j->ssr.low;
4606 retval = j->ssr.high << 8 | j->ssr.low;
4607 retval = (retval * 256) / 240;
4611 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4613 unsigned int mask = 0;
4615 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
4617 poll_wait(file_p, &(j->poll_q), wait);
4618 if (j->read_buffer_ready > 0)
4619 mask |= POLLIN | POLLRDNORM; /* readable */
4620 if (j->write_buffers_empty > 0)
4621 mask |= POLLOUT | POLLWRNORM; /* writable */
4627 static int ixj_play_tone(IXJ *j, char tone)
4629 if (!j->tone_state) {
4630 if(ixjdebug & 0x0002) {
4631 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4633 if (j->dsp.low == 0x20) {
4636 j->tone_start_jif = jiffies;
4641 j->tone_index = tone;
4642 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4648 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4650 j->tone_on_time = arg;
4652 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4656 if (ixj_WriteDSPCommand(arg, j))
4662 static int SCI_WaitHighSCI(IXJ *j)
4666 j->pld_scrr.byte = inb_p(j->XILINXbase);
4667 if (!j->pld_scrr.bits.sci) {
4668 for (cnt = 0; cnt < 10; cnt++) {
4670 j->pld_scrr.byte = inb_p(j->XILINXbase);
4672 if ((j->pld_scrr.bits.sci))
4675 if (ixjdebug & 0x0001)
4676 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4682 static int SCI_WaitLowSCI(IXJ *j)
4686 j->pld_scrr.byte = inb_p(j->XILINXbase);
4687 if (j->pld_scrr.bits.sci) {
4688 for (cnt = 0; cnt < 10; cnt++) {
4690 j->pld_scrr.byte = inb_p(j->XILINXbase);
4692 if (!(j->pld_scrr.bits.sci))
4695 if (ixjdebug & 0x0001)
4696 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4702 static int SCI_Control(IXJ *j, int control)
4706 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4708 j->pld_scrw.bits.c1 = 0; /* to no selection */
4711 case SCI_Enable_DAA:
4712 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4714 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4717 case SCI_Enable_Mixer:
4718 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4720 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4723 case SCI_Enable_EEPROM:
4724 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4726 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4733 outb_p(j->pld_scrw.byte, j->XILINXbase);
4739 case SCI_Enable_DAA:
4740 case SCI_Enable_Mixer:
4741 case SCI_Enable_EEPROM:
4742 if (!SCI_WaitHighSCI(j))
4752 static int SCI_Prepare(IXJ *j)
4754 if (!SCI_Control(j, SCI_End))
4757 if (!SCI_WaitLowSCI(j))
4763 static int ixj_get_mixer(long val, IXJ *j)
4765 int reg = (val & 0x1F00) >> 8;
4766 return j->mix.vol[reg];
4769 static int ixj_mixer(long val, IXJ *j)
4773 bytes.high = (val & 0x1F00) >> 8;
4774 bytes.low = val & 0x00FF;
4776 /* save mixer value so we can get back later on */
4777 j->mix.vol[bytes.high] = bytes.low;
4779 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4781 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4783 SCI_Control(j, SCI_Enable_Mixer);
4785 SCI_Control(j, SCI_End);
4790 static int daa_load(BYTES * p_bytes, IXJ *j)
4792 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4793 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4794 if (!SCI_Control(j, SCI_Enable_DAA))
4800 static int ixj_daa_cr4(IXJ *j, char reg)
4804 switch (j->daa_mode) {
4808 case SOP_PU_RINGING:
4811 case SOP_PU_CONVERSATION:
4814 case SOP_PU_PULSEDIALING:
4819 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4821 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4823 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4826 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4829 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4832 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4836 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4838 if (!daa_load(&bytes, j))
4841 if (!SCI_Prepare(j))
4847 static char daa_int_read(IXJ *j)
4851 if (!SCI_Prepare(j))
4856 outb_p(bytes.high, j->XILINXbase + 0x03);
4857 outb_p(bytes.low, j->XILINXbase + 0x02);
4859 if (!SCI_Control(j, SCI_Enable_DAA))
4862 bytes.high = inb_p(j->XILINXbase + 0x03);
4863 bytes.low = inb_p(j->XILINXbase + 0x02);
4864 if (bytes.low != ALISDAA_ID_BYTE) {
4865 if (ixjdebug & 0x0001)
4866 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4869 if (!SCI_Control(j, SCI_Enable_DAA))
4871 if (!SCI_Control(j, SCI_End))
4874 bytes.high = inb_p(j->XILINXbase + 0x03);
4875 bytes.low = inb_p(j->XILINXbase + 0x02);
4877 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4882 static char daa_CR_read(IXJ *j, int cr)
4887 if (!SCI_Prepare(j))
4890 switch (j->daa_mode) {
4892 bytes.high = 0x30 + cr;
4894 case SOP_PU_RINGING:
4895 bytes.high = 0x70 + cr;
4897 case SOP_PU_CONVERSATION:
4898 bytes.high = 0xB0 + cr;
4900 case SOP_PU_PULSEDIALING:
4901 bytes.high = 0xF0 + cr;
4907 outb_p(bytes.high, j->XILINXbase + 0x03);
4908 outb_p(bytes.low, j->XILINXbase + 0x02);
4910 if (!SCI_Control(j, SCI_Enable_DAA))
4913 bytes.high = inb_p(j->XILINXbase + 0x03);
4914 bytes.low = inb_p(j->XILINXbase + 0x02);
4915 if (bytes.low != ALISDAA_ID_BYTE) {
4916 if (ixjdebug & 0x0001)
4917 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4920 if (!SCI_Control(j, SCI_Enable_DAA))
4922 if (!SCI_Control(j, SCI_End))
4925 wdata.word = inw_p(j->XILINXbase + 0x02);
4929 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4932 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4935 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4938 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4941 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4944 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4952 static int ixj_daa_cid_reset(IXJ *j)
4957 if (ixjdebug & 0x0002)
4958 printk("DAA Clearing CID ram\n");
4960 if (!SCI_Prepare(j))
4965 outb_p(bytes.high, j->XILINXbase + 0x03);
4966 outb_p(bytes.low, j->XILINXbase + 0x02);
4968 if (!SCI_Control(j, SCI_Enable_DAA))
4971 if (!SCI_WaitHighSCI(j))
4974 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4975 bytes.high = bytes.low = 0x00;
4976 outb_p(bytes.high, j->XILINXbase + 0x03);
4978 if (i < ALISDAA_CALLERID_SIZE - 1)
4979 outb_p(bytes.low, j->XILINXbase + 0x02);
4981 if (!SCI_Control(j, SCI_Enable_DAA))
4984 if (!SCI_WaitHighSCI(j))
4989 if (!SCI_Control(j, SCI_End))
4992 if (ixjdebug & 0x0002)
4993 printk("DAA CID ram cleared\n");
4998 static int ixj_daa_cid_read(IXJ *j)
5002 char CID[ALISDAA_CALLERID_SIZE], mContinue;
5005 if (!SCI_Prepare(j))
5010 outb_p(bytes.high, j->XILINXbase + 0x03);
5011 outb_p(bytes.low, j->XILINXbase + 0x02);
5013 if (!SCI_Control(j, SCI_Enable_DAA))
5016 if (!SCI_WaitHighSCI(j))
5019 bytes.high = inb_p(j->XILINXbase + 0x03);
5020 bytes.low = inb_p(j->XILINXbase + 0x02);
5021 if (bytes.low != ALISDAA_ID_BYTE) {
5022 if (ixjdebug & 0x0001)
5023 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5026 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5027 bytes.high = bytes.low = 0x00;
5028 outb_p(bytes.high, j->XILINXbase + 0x03);
5029 outb_p(bytes.low, j->XILINXbase + 0x02);
5031 if (!SCI_Control(j, SCI_Enable_DAA))
5034 if (!SCI_WaitHighSCI(j))
5037 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5038 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5041 if (!SCI_Control(j, SCI_End))
5045 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5048 if ((pIn[1] & 0x03) == 0x01) {
5051 if ((pIn[2] & 0x0c) == 0x04) {
5052 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5054 if ((pIn[3] & 0x30) == 0x10) {
5055 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5057 if ((pIn[4] & 0xc0) == 0x40) {
5058 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5062 pIn += 5, pOut += 4;
5064 memset(&j->cid, 0, sizeof(PHONE_CID));
5065 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5067 strncpy(j->cid.month, pOut, 2);
5069 strncpy(j->cid.day, pOut, 2);
5071 strncpy(j->cid.hour, pOut, 2);
5073 strncpy(j->cid.min, pOut, 2);
5075 j->cid.numlen = *pOut;
5077 strncpy(j->cid.number, pOut, j->cid.numlen);
5078 pOut += j->cid.numlen + 1;
5079 j->cid.namelen = *pOut;
5081 strncpy(j->cid.name, pOut, j->cid.namelen);
5083 ixj_daa_cid_reset(j);
5087 static char daa_get_version(IXJ *j)
5091 if (!SCI_Prepare(j))
5096 outb_p(bytes.high, j->XILINXbase + 0x03);
5097 outb_p(bytes.low, j->XILINXbase + 0x02);
5099 if (!SCI_Control(j, SCI_Enable_DAA))
5102 bytes.high = inb_p(j->XILINXbase + 0x03);
5103 bytes.low = inb_p(j->XILINXbase + 0x02);
5104 if (bytes.low != ALISDAA_ID_BYTE) {
5105 if (ixjdebug & 0x0001)
5106 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5109 if (!SCI_Control(j, SCI_Enable_DAA))
5112 if (!SCI_Control(j, SCI_End))
5115 bytes.high = inb_p(j->XILINXbase + 0x03);
5116 bytes.low = inb_p(j->XILINXbase + 0x02);
5117 if (ixjdebug & 0x0002)
5118 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5119 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5123 static int daa_set_mode(IXJ *j, int mode)
5126 The DAA *MUST* be in the conversation mode if the
5127 PSTN line is to be seized (PSTN line off-hook).
5128 Taking the PSTN line off-hook while the DAA is in
5129 a mode other than conversation mode will cause a
5130 hardware failure of the ALIS-A part.
5133 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5134 if the PSTN line is on-hook. Failure to have the PSTN line
5135 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5141 j->flags.pstn_rmr = 0;
5143 if (!SCI_Prepare(j))
5148 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5150 outb_p(j->pld_scrw.byte, j->XILINXbase);
5151 j->pld_slicw.bits.rly2 = 0;
5152 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5154 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5155 daa_load(&bytes, j);
5156 if (!SCI_Prepare(j))
5159 j->daa_mode = SOP_PU_SLEEP;
5162 if(j->daa_mode == SOP_PU_SLEEP)
5166 if (ixjdebug & 0x0008)
5167 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5168 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5170 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5172 outb_p(j->pld_scrw.byte, j->XILINXbase);
5173 j->pld_slicw.bits.rly2 = 0;
5174 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5176 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5177 daa_load(&bytes, j);
5178 if (!SCI_Prepare(j))
5181 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5183 outb_p(j->pld_scrw.byte, j->XILINXbase);
5184 j->pld_slicw.bits.rly2 = 0;
5185 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5187 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5188 daa_load(&bytes, j);
5189 if (!SCI_Prepare(j))
5192 j->daa_mode = SOP_PU_SLEEP;
5193 j->flags.pstn_ringing = 0;
5194 j->ex.bits.pstn_ring = 0;
5195 j->pstn_sleeptil = jiffies + (hertz / 4);
5196 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5197 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5198 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5200 case SOP_PU_RINGING:
5201 if (ixjdebug & 0x0008)
5202 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5203 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5205 outb_p(j->pld_scrw.byte, j->XILINXbase);
5206 j->pld_slicw.bits.rly2 = 0;
5207 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5209 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5210 daa_load(&bytes, j);
5211 if (!SCI_Prepare(j))
5213 j->daa_mode = SOP_PU_RINGING;
5215 case SOP_PU_CONVERSATION:
5216 if (ixjdebug & 0x0008)
5217 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5219 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5220 daa_load(&bytes, j);
5221 if (!SCI_Prepare(j))
5223 j->pld_slicw.bits.rly2 = 1;
5224 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5225 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5227 outb_p(j->pld_scrw.byte, j->XILINXbase);
5228 j->daa_mode = SOP_PU_CONVERSATION;
5229 j->flags.pstn_ringing = 0;
5230 j->ex.bits.pstn_ring = 0;
5231 j->pstn_sleeptil = jiffies;
5232 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5234 case SOP_PU_PULSEDIALING:
5235 if (ixjdebug & 0x0008)
5236 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5237 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5239 outb_p(j->pld_scrw.byte, j->XILINXbase);
5240 j->pld_slicw.bits.rly2 = 0;
5241 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5243 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5244 daa_load(&bytes, j);
5245 if (!SCI_Prepare(j))
5247 j->daa_mode = SOP_PU_PULSEDIALING;
5255 static int ixj_daa_write(IXJ *j)
5259 j->flags.pstncheck = 1;
5261 daa_set_mode(j, SOP_PU_SLEEP);
5263 if (!SCI_Prepare(j))
5266 outb_p(j->pld_scrw.byte, j->XILINXbase);
5269 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5270 if (!daa_load(&bytes, j))
5273 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5274 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5275 if (!daa_load(&bytes, j))
5278 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5279 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5280 if (!daa_load(&bytes, j))
5283 if (!SCI_Prepare(j))
5287 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5288 if (!daa_load(&bytes, j))
5291 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5292 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5293 if (!daa_load(&bytes, j))
5296 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5297 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5298 if (!daa_load(&bytes, j))
5301 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5302 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5303 if (!daa_load(&bytes, j))
5306 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5308 if (!daa_load(&bytes, j))
5311 if (!SCI_Prepare(j))
5315 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5316 if (!daa_load(&bytes, j))
5319 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5320 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5321 if (!daa_load(&bytes, j))
5324 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5325 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5326 if (!daa_load(&bytes, j))
5329 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5330 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5331 if (!daa_load(&bytes, j))
5334 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5336 if (!daa_load(&bytes, j))
5339 if (!SCI_Control(j, SCI_End))
5341 if (!SCI_WaitLowSCI(j))
5345 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5346 if (!daa_load(&bytes, j))
5349 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5350 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5351 if (!daa_load(&bytes, j))
5354 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5355 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5356 if (!daa_load(&bytes, j))
5359 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5360 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5361 if (!daa_load(&bytes, j))
5364 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5366 if (!daa_load(&bytes, j))
5369 if (!SCI_Control(j, SCI_End))
5371 if (!SCI_WaitLowSCI(j))
5375 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5376 if (!daa_load(&bytes, j))
5379 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5380 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5381 if (!daa_load(&bytes, j))
5384 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5385 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5386 if (!daa_load(&bytes, j))
5389 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5390 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5391 if (!daa_load(&bytes, j))
5394 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5396 if (!daa_load(&bytes, j))
5399 if (!SCI_Control(j, SCI_End))
5401 if (!SCI_WaitLowSCI(j))
5405 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5406 if (!daa_load(&bytes, j))
5409 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5410 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5411 if (!daa_load(&bytes, j))
5414 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5415 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5416 if (!daa_load(&bytes, j))
5419 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5420 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5421 if (!daa_load(&bytes, j))
5424 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5426 if (!daa_load(&bytes, j))
5429 if (!SCI_Control(j, SCI_End))
5431 if (!SCI_WaitLowSCI(j))
5435 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5436 if (!daa_load(&bytes, j))
5439 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5440 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5441 if (!daa_load(&bytes, j))
5444 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5445 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5446 if (!daa_load(&bytes, j))
5449 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5450 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5451 if (!daa_load(&bytes, j))
5454 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5456 if (!daa_load(&bytes, j))
5459 if (!SCI_Control(j, SCI_End))
5461 if (!SCI_WaitLowSCI(j))
5465 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5466 if (!daa_load(&bytes, j))
5469 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5470 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5471 if (!daa_load(&bytes, j))
5474 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5475 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5476 if (!daa_load(&bytes, j))
5479 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5480 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5481 if (!daa_load(&bytes, j))
5484 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5486 if (!daa_load(&bytes, j))
5489 if (!SCI_Control(j, SCI_End))
5491 if (!SCI_WaitLowSCI(j))
5495 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5496 if (!daa_load(&bytes, j))
5499 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5500 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5501 if (!daa_load(&bytes, j))
5504 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5505 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5506 if (!daa_load(&bytes, j))
5509 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5510 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5511 if (!daa_load(&bytes, j))
5514 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5516 if (!daa_load(&bytes, j))
5519 if (!SCI_Control(j, SCI_End))
5521 if (!SCI_WaitLowSCI(j))
5525 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5526 if (!daa_load(&bytes, j))
5529 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5530 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5531 if (!daa_load(&bytes, j))
5534 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5535 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5536 if (!daa_load(&bytes, j))
5539 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5540 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5541 if (!daa_load(&bytes, j))
5544 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5546 if (!daa_load(&bytes, j))
5549 if (!SCI_Control(j, SCI_End))
5551 if (!SCI_WaitLowSCI(j))
5555 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5556 if (!daa_load(&bytes, j))
5559 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5560 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5561 if (!daa_load(&bytes, j))
5564 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5565 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5566 if (!daa_load(&bytes, j))
5569 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5570 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5571 if (!daa_load(&bytes, j))
5574 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5576 if (!daa_load(&bytes, j))
5579 if (!SCI_Control(j, SCI_End))
5581 if (!SCI_WaitLowSCI(j))
5585 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5586 if (!daa_load(&bytes, j))
5589 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5590 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5591 if (!daa_load(&bytes, j))
5594 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5596 if (!daa_load(&bytes, j))
5599 if (!SCI_Control(j, SCI_End))
5601 if (!SCI_WaitLowSCI(j))
5605 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5606 if (!daa_load(&bytes, j))
5609 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5610 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5611 if (!daa_load(&bytes, j))
5614 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5616 if (!daa_load(&bytes, j))
5619 if (!SCI_Control(j, SCI_End))
5621 if (!SCI_WaitLowSCI(j))
5625 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5626 if (!daa_load(&bytes, j))
5629 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5630 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5631 if (!daa_load(&bytes, j))
5634 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5636 if (!daa_load(&bytes, j))
5639 if (!SCI_Control(j, SCI_End))
5641 if (!SCI_WaitLowSCI(j))
5645 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5646 if (!daa_load(&bytes, j))
5649 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5650 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5651 if (!daa_load(&bytes, j))
5654 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5656 if (!daa_load(&bytes, j))
5659 if (!SCI_Control(j, SCI_End))
5661 if (!SCI_WaitLowSCI(j))
5665 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5666 if (!daa_load(&bytes, j))
5669 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5670 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5671 if (!daa_load(&bytes, j))
5674 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5676 if (!daa_load(&bytes, j))
5679 if (!SCI_Control(j, SCI_End))
5681 if (!SCI_WaitLowSCI(j))
5685 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5686 if (!daa_load(&bytes, j))
5689 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5690 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5691 if (!daa_load(&bytes, j))
5694 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5695 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5696 if (!daa_load(&bytes, j))
5699 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5700 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5701 if (!daa_load(&bytes, j))
5704 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5706 if (!daa_load(&bytes, j))
5709 if (!SCI_Control(j, SCI_End))
5711 if (!SCI_WaitLowSCI(j))
5715 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5716 if (!daa_load(&bytes, j))
5719 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5720 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5721 if (!daa_load(&bytes, j))
5724 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5725 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5726 if (!daa_load(&bytes, j))
5729 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5730 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5731 if (!daa_load(&bytes, j))
5734 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5736 if (!daa_load(&bytes, j))
5740 j->pld_scrr.byte = inb_p(j->XILINXbase);
5741 if (!SCI_Control(j, SCI_End))
5744 outb_p(j->pld_scrw.byte, j->XILINXbase);
5746 if (ixjdebug & 0x0002)
5747 printk("DAA Coefficients Loaded\n");
5749 j->flags.pstncheck = 0;
5753 int ixj_set_tone_off(unsigned short arg, IXJ *j)
5755 j->tone_off_time = arg;
5756 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5759 if (ixj_WriteDSPCommand(arg, j))
5764 static int ixj_get_tone_on(IXJ *j)
5766 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5772 static int ixj_get_tone_off(IXJ *j)
5774 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5780 static void ixj_busytone(IXJ *j)
5782 j->flags.ringback = 0;
5783 j->flags.dialtone = 0;
5784 j->flags.busytone = 1;
5785 ixj_set_tone_on(0x07D0, j);
5786 ixj_set_tone_off(0x07D0, j);
5787 ixj_play_tone(j, 27);
5790 static void ixj_dialtone(IXJ *j)
5792 j->flags.ringback = 0;
5793 j->flags.dialtone = 1;
5794 j->flags.busytone = 0;
5795 if (j->dsp.low == 0x20) {
5798 ixj_set_tone_on(0xFFFF, j);
5799 ixj_set_tone_off(0x0000, j);
5800 ixj_play_tone(j, 25);
5804 static void ixj_cpt_stop(IXJ *j)
5806 if(j->tone_state || j->tone_cadence_state)
5808 j->flags.dialtone = 0;
5809 j->flags.busytone = 0;
5810 j->flags.ringback = 0;
5811 ixj_set_tone_on(0x0001, j);
5812 ixj_set_tone_off(0x0000, j);
5813 ixj_play_tone(j, 0);
5814 j->tone_state = j->tone_cadence_state = 0;
5816 if (j->cadence_t->ce) {
5817 kfree(j->cadence_t->ce);
5819 kfree(j->cadence_t);
5820 j->cadence_t = NULL;
5823 if (j->play_mode == -1 && j->rec_mode == -1)
5825 if (j->play_mode != -1 && j->dsp.low == 0x20)
5827 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5828 ixj_record_start(j);
5831 static void ixj_ringback(IXJ *j)
5833 j->flags.busytone = 0;
5834 j->flags.dialtone = 0;
5835 j->flags.ringback = 1;
5836 ixj_set_tone_on(0x0FA0, j);
5837 ixj_set_tone_off(0x2EE0, j);
5838 ixj_play_tone(j, 26);
5841 static void ixj_testram(IXJ *j)
5843 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5846 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5849 IXJ_CADENCE_ELEMENT __user *cep;
5850 IXJ_CADENCE_ELEMENT *lcep;
5854 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5859 if (copy_from_user(&lcp->elements_used,
5860 &cp->elements_used, sizeof(int)))
5862 if (copy_from_user(&lcp->termination,
5863 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5865 if (get_user(cep, &cp->ce))
5869 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5873 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5878 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5882 kfree(j->cadence_t->ce);
5883 kfree(j->cadence_t);
5885 lcp->ce = (void *) lcep;
5887 j->tone_cadence_state = 0;
5888 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5889 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5890 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5891 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5892 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5893 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5894 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5895 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5896 ixj_init_tone(j, &ti);
5898 ixj_play_tone(j, lcp->ce[0].index);
5907 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5909 IXJ_FILTER_CADENCE *lcp;
5910 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5912 if(ixjdebug & 0x0001) {
5913 printk(KERN_INFO "Could not allocate memory for cadence\n");
5917 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5918 if(ixjdebug & 0x0001) {
5919 printk(KERN_INFO "Could not copy cadence to kernel\n");
5924 if (lcp->filter > 5) {
5925 if(ixjdebug & 0x0001) {
5926 printk(KERN_INFO "Cadence out of range\n");
5931 j->cadence_f[lcp->filter].state = 0;
5932 j->cadence_f[lcp->filter].enable = lcp->enable;
5933 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5934 j->cadence_f[lcp->filter].on1 = lcp->on1;
5935 j->cadence_f[lcp->filter].on1min = 0;
5936 j->cadence_f[lcp->filter].on1max = 0;
5937 j->cadence_f[lcp->filter].off1 = lcp->off1;
5938 j->cadence_f[lcp->filter].off1min = 0;
5939 j->cadence_f[lcp->filter].off1max = 0;
5940 j->cadence_f[lcp->filter].on2 = lcp->on2;
5941 j->cadence_f[lcp->filter].on2min = 0;
5942 j->cadence_f[lcp->filter].on2max = 0;
5943 j->cadence_f[lcp->filter].off2 = lcp->off2;
5944 j->cadence_f[lcp->filter].off2min = 0;
5945 j->cadence_f[lcp->filter].off2max = 0;
5946 j->cadence_f[lcp->filter].on3 = lcp->on3;
5947 j->cadence_f[lcp->filter].on3min = 0;
5948 j->cadence_f[lcp->filter].on3max = 0;
5949 j->cadence_f[lcp->filter].off3 = lcp->off3;
5950 j->cadence_f[lcp->filter].off3min = 0;
5951 j->cadence_f[lcp->filter].off3max = 0;
5952 if(ixjdebug & 0x0002) {
5953 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5959 static void add_caps(IXJ *j)
5962 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5963 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5964 j->caplist[j->caps].captype = vendor;
5965 j->caplist[j->caps].handle = j->caps++;
5966 j->caplist[j->caps].captype = device;
5967 switch (j->cardtype) {
5969 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5972 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5974 case QTI_PHONEJACK_LITE:
5975 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5977 case QTI_PHONEJACK_PCI:
5978 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5981 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5984 j->caplist[j->caps].cap = j->cardtype;
5985 j->caplist[j->caps].handle = j->caps++;
5986 strcpy(j->caplist[j->caps].desc, "POTS");
5987 j->caplist[j->caps].captype = port;
5988 j->caplist[j->caps].cap = pots;
5989 j->caplist[j->caps].handle = j->caps++;
5991 /* add devices that can do speaker/mic */
5992 switch (j->cardtype) {
5995 case QTI_PHONEJACK_PCI:
5997 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5998 j->caplist[j->caps].captype = port;
5999 j->caplist[j->caps].cap = speaker;
6000 j->caplist[j->caps].handle = j->caps++;
6005 /* add devices that can do handset */
6006 switch (j->cardtype) {
6008 strcpy(j->caplist[j->caps].desc, "HANDSET");
6009 j->caplist[j->caps].captype = port;
6010 j->caplist[j->caps].cap = handset;
6011 j->caplist[j->caps].handle = j->caps++;
6017 /* add devices that can do PSTN */
6018 switch (j->cardtype) {
6020 strcpy(j->caplist[j->caps].desc, "PSTN");
6021 j->caplist[j->caps].captype = port;
6022 j->caplist[j->caps].cap = pstn;
6023 j->caplist[j->caps].handle = j->caps++;
6029 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6030 strcpy(j->caplist[j->caps].desc, "ULAW");
6031 j->caplist[j->caps].captype = codec;
6032 j->caplist[j->caps].cap = ULAW;
6033 j->caplist[j->caps].handle = j->caps++;
6035 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6036 j->caplist[j->caps].captype = codec;
6037 j->caplist[j->caps].cap = LINEAR16;
6038 j->caplist[j->caps].handle = j->caps++;
6040 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6041 j->caplist[j->caps].captype = codec;
6042 j->caplist[j->caps].cap = LINEAR8;
6043 j->caplist[j->caps].handle = j->caps++;
6045 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6046 j->caplist[j->caps].captype = codec;
6047 j->caplist[j->caps].cap = WSS;
6048 j->caplist[j->caps].handle = j->caps++;
6050 /* software ALAW codec, made from ULAW */
6051 strcpy(j->caplist[j->caps].desc, "ALAW");
6052 j->caplist[j->caps].captype = codec;
6053 j->caplist[j->caps].cap = ALAW;
6054 j->caplist[j->caps].handle = j->caps++;
6056 /* version 12 of the 8020 does the following codecs in a broken way */
6057 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6058 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6059 j->caplist[j->caps].captype = codec;
6060 j->caplist[j->caps].cap = G723_63;
6061 j->caplist[j->caps].handle = j->caps++;
6063 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6064 j->caplist[j->caps].captype = codec;
6065 j->caplist[j->caps].cap = G723_53;
6066 j->caplist[j->caps].handle = j->caps++;
6068 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6069 j->caplist[j->caps].captype = codec;
6070 j->caplist[j->caps].cap = TS48;
6071 j->caplist[j->caps].handle = j->caps++;
6073 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6074 j->caplist[j->caps].captype = codec;
6075 j->caplist[j->caps].cap = TS41;
6076 j->caplist[j->caps].handle = j->caps++;
6079 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6080 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6081 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6082 j->caplist[j->caps].captype = codec;
6083 j->caplist[j->caps].cap = TS85;
6084 j->caplist[j->caps].handle = j->caps++;
6087 /* 8021 chips can do G728 */
6088 if (j->dsp.low == 0x21) {
6089 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6090 j->caplist[j->caps].captype = codec;
6091 j->caplist[j->caps].cap = G728;
6092 j->caplist[j->caps].handle = j->caps++;
6095 /* 8021/8022 chips can do G729 if loaded */
6096 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6097 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6098 j->caplist[j->caps].captype = codec;
6099 j->caplist[j->caps].cap = G729;
6100 j->caplist[j->caps].handle = j->caps++;
6102 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6103 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6104 j->caplist[j->caps].captype = codec;
6105 j->caplist[j->caps].cap = G729B;
6106 j->caplist[j->caps].handle = j->caps++;
6110 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6114 for (cnt = 0; cnt < j->caps; cnt++) {
6115 if (pcreq->captype == j->caplist[cnt].captype
6116 && pcreq->cap == j->caplist[cnt].cap) {
6124 static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6129 void __user *argp = (void __user *)arg;
6131 unsigned int raise, mant;
6132 unsigned int minor = iminor(inode);
6133 int board = NUM(inode);
6135 IXJ *j = get_ixj(NUM(inode));
6140 * Set up locks to ensure that only one process is talking to the DSP at a time.
6141 * This is necessary to keep the DSP from locking up.
6143 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
6144 set_current_state(TASK_INTERRUPTIBLE);
6145 schedule_timeout(1);
6147 if (ixjdebug & 0x0040)
6148 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6149 if (minor >= IXJMAX) {
6150 clear_bit(board, &j->busyflags);
6154 * Check ioctls only root can use.
6156 if (!capable(CAP_SYS_ADMIN)) {
6158 case IXJCTL_TESTRAM:
6164 case IXJCTL_TESTRAM:
6166 retval = (j->ssr.high << 8) + j->ssr.low;
6168 case IXJCTL_CARDTYPE:
6169 retval = j->cardtype;
6174 case IXJCTL_VERSION:
6175 if (copy_to_user(argp, ixj_c_revision, strlen(ixj_c_revision)))
6178 case PHONE_RING_CADENCE:
6179 j->ring_cadence = arg;
6183 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6188 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6192 /* Binary compatbility */
6193 case OLD_PHONE_RING_START:
6196 case PHONE_RING_START:
6198 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6204 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6208 case PHONE_RING_STOP:
6209 j->flags.cringing = 0;
6210 if(j->cadence_f[5].enable) {
6211 j->cadence_f[5].state = 0;
6216 retval = ixj_ring(j);
6218 case PHONE_EXCEPTION:
6219 retval = j->ex.bytes;
6220 if(j->ex.bits.flash) {
6222 j->ex.bits.flash = 0;
6224 j->ex.bits.pstn_ring = 0;
6225 j->ex.bits.caller_id = 0;
6226 j->ex.bits.pstn_wink = 0;
6235 j->ex.bits.reserved = 0;
6237 case PHONE_HOOKSTATE:
6238 j->ex.bits.hookstate = 0;
6239 retval = j->hookstate; //j->r_hook;
6241 case IXJCTL_SET_LED:
6242 LED_SetState(arg, j);
6245 retval = set_base_frame(j, arg);
6247 case PHONE_REC_CODEC:
6248 retval = set_rec_codec(j, arg);
6253 case PHONE_REC_START:
6254 ixj_record_start(j);
6256 case PHONE_REC_STOP:
6259 case PHONE_REC_DEPTH:
6260 set_rec_depth(j, arg);
6262 case PHONE_REC_VOLUME:
6264 retval = get_rec_volume(j);
6267 set_rec_volume(j, arg);
6271 case PHONE_REC_VOLUME_LINEAR:
6273 retval = get_rec_volume_linear(j);
6276 set_rec_volume_linear(j, arg);
6280 case IXJCTL_DTMF_PRESCALE:
6282 retval = get_dtmf_prescale(j);
6285 set_dtmf_prescale(j, arg);
6289 case PHONE_REC_LEVEL:
6290 retval = get_rec_level(j);
6293 retval = ixj_siadc(j, arg);
6296 retval = ixj_sidac(j, arg);
6298 case IXJCTL_AEC_START:
6299 ixj_aec_start(j, arg);
6301 case IXJCTL_AEC_STOP:
6304 case IXJCTL_AEC_GET_LEVEL:
6305 retval = j->aec_level;
6307 case PHONE_PLAY_CODEC:
6308 retval = set_play_codec(j, arg);
6310 case PHONE_PLAY_START:
6311 retval = ixj_play_start(j);
6313 case PHONE_PLAY_STOP:
6316 case PHONE_PLAY_DEPTH:
6317 set_play_depth(j, arg);
6319 case PHONE_PLAY_VOLUME:
6321 retval = get_play_volume(j);
6324 set_play_volume(j, arg);
6328 case PHONE_PLAY_VOLUME_LINEAR:
6330 retval = get_play_volume_linear(j);
6333 set_play_volume_linear(j, arg);
6337 case PHONE_PLAY_LEVEL:
6338 retval = get_play_level(j);
6340 case IXJCTL_DSP_TYPE:
6341 retval = (j->dsp.high << 8) + j->dsp.low;
6343 case IXJCTL_DSP_VERSION:
6344 retval = (j->ver.high << 8) + j->ver.low;
6355 case IXJCTL_DRYBUFFER_READ:
6356 put_user(j->drybuffer, (unsigned long __user *) argp);
6358 case IXJCTL_DRYBUFFER_CLEAR:
6361 case IXJCTL_FRAMES_READ:
6362 put_user(j->framesread, (unsigned long __user *) argp);
6364 case IXJCTL_FRAMES_WRITTEN:
6365 put_user(j->frameswritten, (unsigned long __user *) argp);
6367 case IXJCTL_READ_WAIT:
6368 put_user(j->read_wait, (unsigned long __user *) argp);
6370 case IXJCTL_WRITE_WAIT:
6371 put_user(j->write_wait, (unsigned long __user *) argp);
6373 case PHONE_MAXRINGS:
6376 case PHONE_SET_TONE_ON_TIME:
6377 ixj_set_tone_on(arg, j);
6379 case PHONE_SET_TONE_OFF_TIME:
6380 ixj_set_tone_off(arg, j);
6382 case PHONE_GET_TONE_ON_TIME:
6383 if (ixj_get_tone_on(j)) {
6386 retval = (j->ssr.high << 8) + j->ssr.low;
6389 case PHONE_GET_TONE_OFF_TIME:
6390 if (ixj_get_tone_off(j)) {
6393 retval = (j->ssr.high << 8) + j->ssr.low;
6396 case PHONE_PLAY_TONE:
6398 retval = ixj_play_tone(j, arg);
6402 case PHONE_GET_TONE_STATE:
6403 retval = j->tone_state;
6405 case PHONE_DTMF_READY:
6406 retval = j->ex.bits.dtmf_ready;
6408 case PHONE_GET_DTMF:
6409 if (ixj_hookstate(j)) {
6410 if (j->dtmf_rp != j->dtmf_wp) {
6411 retval = j->dtmfbuffer[j->dtmf_rp];
6413 if (j->dtmf_rp == 79)
6415 if (j->dtmf_rp == j->dtmf_wp) {
6416 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6421 case PHONE_GET_DTMF_ASCII:
6422 if (ixj_hookstate(j)) {
6423 if (j->dtmf_rp != j->dtmf_wp) {
6424 switch (j->dtmfbuffer[j->dtmf_rp]) {
6426 retval = 42; /* '*'; */
6430 retval = 48; /*'0'; */
6434 retval = 35; /*'#'; */
6438 retval = 65; /*'A'; */
6442 retval = 66; /*'B'; */
6446 retval = 67; /*'C'; */
6450 retval = 68; /*'D'; */
6454 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6458 if (j->dtmf_rp == 79)
6460 if(j->dtmf_rp == j->dtmf_wp)
6462 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6467 case PHONE_DTMF_OOB:
6468 j->flags.dtmf_oob = arg;
6470 case PHONE_DIALTONE:
6476 case PHONE_RINGBACK:
6480 if(j->cardtype == QTI_PHONEJACK)
6483 retval = ixj_wink(j);
6485 case PHONE_CPT_STOP:
6488 case PHONE_QUERY_CODEC:
6490 struct phone_codec_data pd;
6492 int proto_size[] = {
6494 12, 10, 16, 9, 8, 48, 5,
6495 40, 40, 80, 40, 40, 6
6497 if(copy_from_user(&pd, argp, sizeof(pd))) {
6501 if(pd.type<1 || pd.type>13) {
6502 retval = -EPROTONOSUPPORT;
6506 val=proto_size[pd.type];
6507 else switch(j->baseframe.low)
6509 case 0xA0:val=2*proto_size[pd.type];break;
6510 case 0x50:val=proto_size[pd.type];break;
6511 default:val=proto_size[pd.type]*3;break;
6513 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6514 if(copy_to_user(argp, &pd, sizeof(pd)))
6518 case IXJCTL_DSP_IDLE:
6522 if ((arg & 0xff) == 0xff)
6523 retval = ixj_get_mixer(arg, j);
6527 case IXJCTL_DAA_COEFF_SET:
6531 retval = ixj_daa_write(j);
6535 retval = ixj_daa_write(j);
6538 DAA_Coeff_France(j);
6539 retval = ixj_daa_write(j);
6542 DAA_Coeff_Germany(j);
6543 retval = ixj_daa_write(j);
6546 DAA_Coeff_Australia(j);
6547 retval = ixj_daa_write(j);
6551 retval = ixj_daa_write(j);
6558 case IXJCTL_DAA_AGAIN:
6559 ixj_daa_cr4(j, arg | 0x02);
6561 case IXJCTL_PSTN_LINETEST:
6562 retval = ixj_linetest(j);
6565 ixj_write_vmwi(j, arg);
6568 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6570 j->ex.bits.caller_id = 0;
6572 case IXJCTL_WINK_DURATION:
6577 retval = ixj_set_port(j, arg);
6581 case IXJCTL_POTS_PSTN:
6582 retval = ixj_set_pots(j, arg);
6584 case PHONE_CAPABILITIES:
6588 case PHONE_CAPABILITIES_LIST:
6590 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6593 case PHONE_CAPABILITIES_CHECK:
6595 struct phone_capability cap;
6596 if (copy_from_user(&cap, argp, sizeof(cap)))
6600 retval = capabilities_check(j, &cap);
6604 case PHONE_PSTN_SET_STATE:
6605 daa_set_mode(j, arg);
6607 case PHONE_PSTN_GET_STATE:
6608 retval = j->daa_mode;
6609 j->ex.bits.pstn_ring = 0;
6611 case IXJCTL_SET_FILTER:
6612 if (copy_from_user(&jf, argp, sizeof(jf)))
6614 retval = ixj_init_filter(j, &jf);
6616 case IXJCTL_SET_FILTER_RAW:
6617 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6620 retval = ixj_init_filter_raw(j, &jfr);
6622 case IXJCTL_GET_FILTER_HIST:
6626 retval = j->filter_hist[arg];
6628 case IXJCTL_INIT_TONE:
6629 if (copy_from_user(&ti, argp, sizeof(ti)))
6632 retval = ixj_init_tone(j, &ti);
6634 case IXJCTL_TONE_CADENCE:
6635 retval = ixj_build_cadence(j, argp);
6637 case IXJCTL_FILTER_CADENCE:
6638 retval = ixj_build_filter_cadence(j, argp);
6641 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6645 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6646 if(j->sigdef.event < 33) {
6648 for(mant = 0; mant < j->sigdef.event; mant++){
6651 if(j->sigdef.signal)
6652 j->ex_sig.bytes |= raise;
6654 j->ex_sig.bytes &= (raise^0xffff);
6657 case IXJCTL_INTERCOM_STOP:
6658 if(arg < 0 || arg >= IXJMAX)
6664 get_ixj(arg)->intercom = -1;
6665 ixj_record_stop(get_ixj(arg));
6666 ixj_play_stop(get_ixj(arg));
6669 case IXJCTL_INTERCOM_START:
6670 if(arg < 0 || arg >= IXJMAX)
6673 ixj_record_start(j);
6675 get_ixj(arg)->intercom = board;
6676 ixj_play_start(get_ixj(arg));
6677 ixj_record_start(get_ixj(arg));
6680 if (ixjdebug & 0x0040)
6681 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6682 clear_bit(board, &j->busyflags);
6686 static int ixj_fasync(int fd, struct file *file_p, int mode)
6688 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
6690 return fasync_helper(fd, file_p, mode, &j->async_queue);
6693 static struct file_operations ixj_fops =
6695 .owner = THIS_MODULE,
6696 .read = ixj_enhanced_read,
6697 .write = ixj_enhanced_write,
6700 .release = ixj_release,
6701 .fasync = ixj_fasync
6704 static int ixj_linetest(IXJ *j)
6706 unsigned long jifwait;
6708 j->flags.pstncheck = 1; /* Testing */
6709 j->flags.pstn_present = 0; /* Assume the line is not there */
6711 daa_int_read(j); /*Clear DAA Interrupt flags */
6713 /* Hold all relays in the normally de-energized position. */
6716 j->pld_slicw.bits.rly1 = 0;
6717 j->pld_slicw.bits.rly2 = 0;
6718 j->pld_slicw.bits.rly3 = 0;
6719 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6720 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6722 outb_p(j->pld_scrw.byte, j->XILINXbase);
6723 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6724 if (j->pld_slicr.bits.potspstn) {
6725 j->flags.pots_pstn = 1;
6726 j->flags.pots_correct = 0;
6727 LED_SetState(0x4, j);
6729 j->flags.pots_pstn = 0;
6730 j->pld_slicw.bits.rly1 = 0;
6731 j->pld_slicw.bits.rly2 = 0;
6732 j->pld_slicw.bits.rly3 = 1;
6733 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6734 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6736 outb_p(j->pld_scrw.byte, j->XILINXbase);
6737 daa_set_mode(j, SOP_PU_CONVERSATION);
6738 jifwait = jiffies + hertz;
6739 while (time_before(jiffies, jifwait)) {
6740 set_current_state(TASK_INTERRUPTIBLE);
6741 schedule_timeout(1);
6744 daa_set_mode(j, SOP_PU_RESET);
6745 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6746 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6747 LED_SetState(0x4, j);
6748 j->pld_slicw.bits.rly3 = 0;
6749 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6751 j->flags.pots_correct = 1;
6752 LED_SetState(0x8, j);
6753 j->pld_slicw.bits.rly1 = 1;
6754 j->pld_slicw.bits.rly2 = 0;
6755 j->pld_slicw.bits.rly3 = 0;
6756 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6759 j->pld_slicw.bits.rly3 = 0;
6760 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6761 daa_set_mode(j, SOP_PU_CONVERSATION);
6762 jifwait = jiffies + hertz;
6763 while (time_before(jiffies, jifwait)) {
6764 set_current_state(TASK_INTERRUPTIBLE);
6765 schedule_timeout(1);
6768 daa_set_mode(j, SOP_PU_RESET);
6769 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6770 j->pstn_sleeptil = jiffies + (hertz / 4);
6771 j->flags.pstn_present = 1;
6773 j->flags.pstn_present = 0;
6775 if (j->flags.pstn_present) {
6776 if (j->flags.pots_correct) {
6777 LED_SetState(0xA, j);
6779 LED_SetState(0x6, j);
6782 if (j->flags.pots_correct) {
6783 LED_SetState(0x9, j);
6785 LED_SetState(0x5, j);
6788 j->flags.pstncheck = 0; /* Testing */
6789 return j->flags.pstn_present;
6792 static int ixj_selfprobe(IXJ *j)
6799 init_waitqueue_head(&j->poll_q);
6800 init_waitqueue_head(&j->read_q);
6801 init_waitqueue_head(&j->write_q);
6803 while(atomic_read(&j->DSPWrite) > 0)
6804 atomic_dec(&j->DSPWrite);
6805 if (ixjdebug & 0x0002)
6806 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6807 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6809 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6811 /* The read values of the SSR should be 0x00 for the IDLE command */
6812 if (j->ssr.low || j->ssr.high)
6814 if (ixjdebug & 0x0002)
6815 printk(KERN_INFO "Get Device ID Code\n");
6816 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6818 j->dsp.low = j->ssr.low;
6819 j->dsp.high = j->ssr.high;
6820 if (ixjdebug & 0x0002)
6821 printk(KERN_INFO "Get Device Version Code\n");
6822 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6824 j->ver.low = j->ssr.low;
6825 j->ver.high = j->ssr.high;
6827 if (j->dsp.low == 0x21) {
6828 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6829 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6830 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6831 bytes.low = inb_p(j->XILINXbase + 0x02);
6832 if (bytes.low == bytes.high) /* Register is read only on */
6833 /* Internet PhoneJack Lite */
6835 j->cardtype = QTI_PHONEJACK_LITE;
6836 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6837 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6840 j->pld_slicw.pcib.e1 = 1;
6841 outb_p(j->pld_slicw.byte, j->XILINXbase);
6843 j->cardtype = QTI_LINEJACK;
6845 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6846 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6850 } else if (j->dsp.low == 0x22) {
6851 j->cardtype = QTI_PHONEJACK_PCI;
6852 request_region(j->XILINXbase, 4, "ixj control");
6853 j->pld_slicw.pcib.e1 = 1;
6854 outb_p(j->pld_slicw.byte, j->XILINXbase);
6856 j->cardtype = QTI_PHONEJACK;
6858 switch (j->cardtype) {
6860 if (!j->dsp.low != 0x20) {
6863 ixj_WriteDSPCommand(0x3800, j);
6864 j->ver.low = j->ssr.low;
6865 j->ver.high = j->ssr.high;
6869 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6870 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6874 case QTI_PHONEJACK_LITE:
6875 case QTI_PHONEJACK_PCI:
6876 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6877 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6880 j->pld_slicw.pcib.e1 = 1;
6881 outb_p(j->pld_slicw.byte, j->XILINXbase);
6887 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6888 if (ixjdebug & 0x0002)
6889 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6890 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6892 if (ixjdebug & 0x0002)
6893 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6894 if (j->cardtype == QTI_PHONEJACK) {
6899 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6902 if (set_base_frame(j, 30) != 30)
6904 if (ixjdebug & 0x0002)
6905 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6906 if (j->cardtype == QTI_PHONECARD) {
6907 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6910 if (j->cardtype == QTI_LINEJACK) {
6911 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6913 if (ixjdebug & 0x0002)
6914 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6915 j->pld_clock.byte = 0;
6916 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6920 if (j->dsp.low == 0x20) {
6921 if (ixjdebug & 0x0002)
6922 printk(KERN_INFO "Configure GPIO pins\n");
6923 j->gpio.bytes.high = 0x09;
6924 /* bytes.low = 0xEF; 0xF7 */
6925 j->gpio.bits.gpio1 = 1;
6926 j->gpio.bits.gpio2 = 1;
6927 j->gpio.bits.gpio3 = 0;
6928 j->gpio.bits.gpio4 = 1;
6929 j->gpio.bits.gpio5 = 1;
6930 j->gpio.bits.gpio6 = 1;
6931 j->gpio.bits.gpio7 = 1;
6932 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6933 if (ixjdebug & 0x0002)
6934 printk(KERN_INFO "Enable SLIC\n");
6935 j->gpio.bytes.high = 0x0B;
6936 j->gpio.bytes.low = 0x00;
6937 j->gpio.bits.gpio1 = 0;
6938 j->gpio.bits.gpio2 = 1;
6939 j->gpio.bits.gpio5 = 0;
6940 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6941 j->port = PORT_POTS;
6943 if (j->cardtype == QTI_LINEJACK) {
6944 LED_SetState(0x1, j);
6945 jif = jiffies + (hertz / 10);
6946 while (time_before(jiffies, jif)) {
6947 set_current_state(TASK_INTERRUPTIBLE);
6948 schedule_timeout(1);
6950 LED_SetState(0x2, j);
6951 jif = jiffies + (hertz / 10);
6952 while (time_before(jiffies, jif)) {
6953 set_current_state(TASK_INTERRUPTIBLE);
6954 schedule_timeout(1);
6956 LED_SetState(0x4, j);
6957 jif = jiffies + (hertz / 10);
6958 while (time_before(jiffies, jif)) {
6959 set_current_state(TASK_INTERRUPTIBLE);
6960 schedule_timeout(1);
6962 LED_SetState(0x8, j);
6963 jif = jiffies + (hertz / 10);
6964 while (time_before(jiffies, jif)) {
6965 set_current_state(TASK_INTERRUPTIBLE);
6966 schedule_timeout(1);
6968 LED_SetState(0x0, j);
6970 if (ixjdebug & 0x0002)
6971 printk("Loading DAA Coefficients\n");
6973 if (!ixj_daa_write(j)) {
6974 printk("DAA write failed on board %d\n", j->board);
6977 if(!ixj_daa_cid_reset(j)) {
6978 printk("DAA CID reset failed on board %d\n", j->board);
6981 j->flags.pots_correct = 0;
6982 j->flags.pstn_present = 0;
6984 if (j->flags.pots_correct) {
6985 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6987 outb_p(j->pld_scrw.byte, j->XILINXbase);
6988 j->pld_slicw.bits.rly1 = 1;
6989 j->pld_slicw.bits.spken = 1;
6990 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6991 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6992 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6993 j->port = PORT_POTS;
6995 ixj_set_port(j, PORT_PSTN);
6997 if (ixjdebug & 0x0002)
6998 printk(KERN_INFO "Enable Mixer\n");
6999 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
7000 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
7002 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
7003 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
7005 ixj_mixer(0x0480, j); /*FM Left mute */
7006 ixj_mixer(0x0580, j); /*FM Right mute */
7008 ixj_mixer(0x0680, j); /*CD Left mute */
7009 ixj_mixer(0x0780, j); /*CD Right mute */
7011 ixj_mixer(0x0880, j); /*Line Left mute */
7012 ixj_mixer(0x0980, j); /*Line Right mute */
7014 ixj_mixer(0x0A80, j); /*Aux left mute */
7015 ixj_mixer(0x0B80, j); /*Aux right mute */
7017 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
7018 ixj_mixer(0x0D80, j); /*Mono2 mute */
7020 ixj_mixer(0x0E80, j); /*Mic mute */
7022 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
7024 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
7025 ixj_mixer(0x110C, j);
7028 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
7029 ixj_mixer(0x1401, j);
7031 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
7032 ixj_mixer(0x1501, j);
7034 ixj_mixer(0x1700, j); /*Clock select */
7036 ixj_mixer(0x1800, j); /*ADC input from mixer */
7038 ixj_mixer(0x1901, j); /*Mic gain 30db */
7040 if (ixjdebug & 0x0002)
7041 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
7042 j->cadence_f[4].state = 0;
7043 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7044 j->cadence_f[4].off1 = 0;
7045 j->cadence_f[4].on2 = 0;
7046 j->cadence_f[4].off2 = 0;
7047 j->cadence_f[4].on3 = 0;
7048 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7049 j->pstn_last_rmr = jiffies;
7052 if (j->cardtype == QTI_PHONECARD) {
7053 ixj_WriteDSPCommand(0xCF07, j);
7054 ixj_WriteDSPCommand(0x00B0, j);
7055 ixj_set_port(j, PORT_SPEAKER);
7057 ixj_set_port(j, PORT_POTS);
7058 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7059 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7065 j->framesread = j->frameswritten = 0;
7066 j->read_wait = j->write_wait = 0;
7067 j->rxreadycheck = j->txreadycheck = 0;
7069 /* initialise the DTMF prescale to a sensible value */
7070 if (j->cardtype == QTI_LINEJACK) {
7071 set_dtmf_prescale(j, 0x10);
7073 set_dtmf_prescale(j, 0x40);
7075 set_play_volume(j, 0x100);
7076 set_rec_volume(j, 0x100);
7078 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7080 /* The read values of the SSR should be 0x00 for the IDLE command */
7081 if (j->ssr.low || j->ssr.high)
7084 if (ixjdebug & 0x0002)
7085 printk(KERN_INFO "Enable Line Monitor\n");
7087 if (ixjdebug & 0x0002)
7088 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7090 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7093 if (ixjdebug & 0x002)
7094 printk(KERN_INFO "Enable DTMF Detectors\n");
7096 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7099 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7102 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7104 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7106 j->ex.bits.dtmf_ready = 0;
7108 j->dtmf_wp = j->dtmf_rp = 0;
7109 j->rec_mode = j->play_mode = -1;
7110 j->flags.ringing = 0;
7111 j->maxrings = MAXRINGS;
7112 j->ring_cadence = USA_RING_CADENCE;
7115 j->flags.dtmf_oob = 0;
7116 for (cnt = 0; cnt < 4; cnt++)
7117 j->cadence_f[cnt].enable = 0;
7118 /* must be a device on the specified address */
7119 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7121 /* Set up the default signals for events */
7122 for (cnt = 0; cnt < 35; cnt++)
7123 j->ixj_signals[cnt] = SIGIO;
7125 /* Set the excetion signal enable flags */
7126 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7127 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 =
7128 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;
7129 #ifdef IXJ_DYN_ALLOC
7135 /* Register with the Telephony for Linux subsystem */
7136 j->p.f_op = &ixj_fops;
7137 j->p.open = ixj_open;
7138 j->p.board = j->board;
7139 phone_register_device(&j->p, PHONE_UNIT_ANY);
7147 * Exported service for pcmcia card handling
7150 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7152 IXJ *j = ixj_alloc();
7157 j->XILINXbase = xilinx;
7158 j->cardtype = QTI_PHONECARD;
7163 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7165 static int ixj_get_status_proc(char *buf)
7171 len += sprintf(buf + len, "%s", ixj_c_rcsid);
7172 len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
7173 len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
7174 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7175 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7176 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7177 len += sprintf(buf + len, "\nUsing old telephony API");
7178 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7180 for (cnt = 0; cnt < IXJMAX; cnt++) {
7185 len += sprintf(buf + len, "\nCard Num %d", cnt);
7186 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7187 if (j->cardtype != QTI_PHONEJACK)
7188 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7189 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7190 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7191 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7192 switch (j->cardtype) {
7193 case (QTI_PHONEJACK):
7194 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7196 case (QTI_LINEJACK):
7197 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7198 if (j->flags.g729_loaded)
7199 len += sprintf(buf + len, " w/G.729 A/B");
7200 len += sprintf(buf + len, " Country = %d", j->daa_country);
7202 case (QTI_PHONEJACK_LITE):
7203 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7204 if (j->flags.g729_loaded)
7205 len += sprintf(buf + len, " w/G.729 A/B");
7207 case (QTI_PHONEJACK_PCI):
7208 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7209 if (j->flags.g729_loaded)
7210 len += sprintf(buf + len, " w/G.729 A/B");
7212 case (QTI_PHONECARD):
7213 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7214 if (j->flags.g729_loaded)
7215 len += sprintf(buf + len, " w/G.729 A/B");
7216 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7217 if (!j->pccr1.bits.drf)
7218 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7219 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7222 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7225 len += sprintf(buf + len, "\nReaders %d", j->readers);
7226 len += sprintf(buf + len, "\nWriters %d", j->writers);
7228 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7229 if (j->dsp.low != 0x20)
7230 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7231 if (j->flags.cidsent)
7232 len += sprintf(buf + len, "\nCaller ID data sent");
7234 len += sprintf(buf + len, "\nCaller ID data not sent");
7236 len += sprintf(buf + len, "\nPlay CODEC ");
7237 switch (j->play_codec) {
7239 len += sprintf(buf + len, "G.723.1 6.3");
7242 len += sprintf(buf + len, "G.723.1 5.3");
7245 len += sprintf(buf + len, "TrueSpeech 8.5");
7248 len += sprintf(buf + len, "TrueSpeech 4.8");
7251 len += sprintf(buf + len, "TrueSpeech 4.1");
7254 len += sprintf(buf + len, "G.728");
7257 len += sprintf(buf + len, "G.729");
7260 len += sprintf(buf + len, "G.729B");
7263 len += sprintf(buf + len, "uLaw");
7266 len += sprintf(buf + len, "aLaw");
7269 len += sprintf(buf + len, "16 bit Linear");
7272 len += sprintf(buf + len, "8 bit Linear");
7275 len += sprintf(buf + len, "Windows Sound System");
7278 len += sprintf(buf + len, "NO CODEC CHOSEN");
7281 len += sprintf(buf + len, "\nRecord CODEC ");
7282 switch (j->rec_codec) {
7284 len += sprintf(buf + len, "G.723.1 6.3");
7287 len += sprintf(buf + len, "G.723.1 5.3");
7290 len += sprintf(buf + len, "TrueSpeech 8.5");
7293 len += sprintf(buf + len, "TrueSpeech 4.8");
7296 len += sprintf(buf + len, "TrueSpeech 4.1");
7299 len += sprintf(buf + len, "G.728");
7302 len += sprintf(buf + len, "G.729");
7305 len += sprintf(buf + len, "G.729B");
7308 len += sprintf(buf + len, "uLaw");
7311 len += sprintf(buf + len, "aLaw");
7314 len += sprintf(buf + len, "16 bit Linear");
7317 len += sprintf(buf + len, "8 bit Linear");
7320 len += sprintf(buf + len, "Windows Sound System");
7323 len += sprintf(buf + len, "NO CODEC CHOSEN");
7326 len += sprintf(buf + len, "\nAEC ");
7327 switch (j->aec_level) {
7329 len += sprintf(buf + len, "Off");
7332 len += sprintf(buf + len, "Low");
7335 len += sprintf(buf + len, "Med");
7338 len += sprintf(buf + len, "High");
7341 len += sprintf(buf + len, "Auto");
7344 len += sprintf(buf + len, "AEC/AGC");
7347 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7351 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7352 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7353 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7355 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7357 if (j->cardtype == QTI_LINEJACK) {
7358 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7359 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7360 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7361 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7362 switch (j->daa_mode) {
7364 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7366 case SOP_PU_RINGING:
7367 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7368 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7370 case SOP_PU_CONVERSATION:
7371 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7373 case SOP_PU_PULSEDIALING:
7374 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7377 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7378 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7379 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7380 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7381 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7382 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7383 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7384 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7385 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7386 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7390 len += sprintf(buf + len, "\nPort POTS");
7393 len += sprintf(buf + len, "\nPort PSTN");
7396 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7399 len += sprintf(buf + len, "\nPort HANDSET");
7402 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7403 len += sprintf(buf + len, "\nSLIC state ");
7404 switch (SLIC_GetState(j)) {
7405 case PLD_SLIC_STATE_OC:
7406 len += sprintf(buf + len, "OC");
7408 case PLD_SLIC_STATE_RINGING:
7409 len += sprintf(buf + len, "RINGING");
7411 case PLD_SLIC_STATE_ACTIVE:
7412 len += sprintf(buf + len, "ACTIVE");
7414 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7415 len += sprintf(buf + len, "OHT");
7417 case PLD_SLIC_STATE_TIPOPEN:
7418 len += sprintf(buf + len, "TIPOPEN");
7420 case PLD_SLIC_STATE_STANDBY:
7421 len += sprintf(buf + len, "STANDBY");
7423 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7424 len += sprintf(buf + len, "APR");
7426 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7427 len += sprintf(buf + len, "OHTPR");
7430 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7434 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7435 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7436 #ifdef PERFMON_STATS
7437 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7438 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7439 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7440 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7441 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7442 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7443 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7444 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7445 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7446 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7447 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7448 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7449 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7450 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7453 len += sprintf(buf + len, "\n");
7459 static int ixj_read_proc(char *page, char **start, off_t off,
7460 int count, int *eof, void *data)
7462 int len = ixj_get_status_proc(page);
7463 if (len <= off+count) *eof = 1;
7464 *start = page + off;
7466 if (len>count) len = count;
7472 static void cleanup(void)
7477 for (cnt = 0; cnt < IXJMAX; cnt++) {
7479 if(j != NULL && j->DSPbase) {
7480 if (ixjdebug & 0x0002)
7481 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7482 del_timer(&j->timer);
7483 if (j->cardtype == QTI_LINEJACK) {
7484 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7486 outb_p(j->pld_scrw.byte, j->XILINXbase);
7487 j->pld_slicw.bits.rly1 = 0;
7488 j->pld_slicw.bits.rly2 = 0;
7489 j->pld_slicw.bits.rly3 = 0;
7490 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7491 LED_SetState(0x0, j);
7492 if (ixjdebug & 0x0002)
7493 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7494 release_region(j->XILINXbase, 8);
7495 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7496 if (ixjdebug & 0x0002)
7497 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7498 release_region(j->XILINXbase, 4);
7501 kfree(j->read_buffer);
7502 if (j->write_buffer)
7503 kfree(j->write_buffer);
7505 pnp_device_detach(j->dev);
7506 if (ixjdebug & 0x0002)
7507 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7508 phone_unregister_device(&j->p);
7509 if (ixjdebug & 0x0002)
7510 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7511 release_region(j->DSPbase, 16);
7512 #ifdef IXJ_DYN_ALLOC
7513 if (ixjdebug & 0x0002)
7514 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7520 if (ixjdebug & 0x0002)
7521 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7522 remove_proc_entry ("ixj", NULL);
7531 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7533 lastLCC = lastLCC & 0xfb;
7534 lastLCC = lastLCC | (byData ? 4 : 0);
7535 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7538 lastLCC = lastLCC | 0x01;
7539 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7541 byData = byData << 1;
7542 lastLCC = lastLCC & 0xfe;
7544 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7548 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7551 lastLCC = lastLCC | 0x01;
7552 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7554 lastLCC = lastLCC & 0xfe;
7556 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7558 return ((inb(wEEPROMAddress) >> 3) & 1);
7561 static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7564 WORD wEEPROMAddress = wAddress + 3;
7568 lastLCC = inb(wEEPROMAddress);
7569 lastLCC = lastLCC | 0x02;
7570 lastLCC = lastLCC & 0xfe;
7571 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7573 mdelay(1); /* delay */
7575 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7576 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7577 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7578 for (i = 0; i < 8; i++) {
7579 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7583 for (i = 0; i < 16; i++) {
7584 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7585 *pwResult = (*pwResult << 1) | byResult;
7588 mdelay(1); /* another delay */
7590 lastLCC = lastLCC & 0xfd;
7591 outb(lastLCC, wEEPROMAddress); /* negate CS */
7596 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7599 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7601 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7603 return (((DWORD) wHi << 16) | wLo);
7606 static int dspio[IXJMAX + 1] =
7610 static int xio[IXJMAX + 1] =
7615 module_param_array(dspio, int, NULL, 0);
7616 module_param_array(xio, int, NULL, 0);
7617 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7618 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7619 MODULE_LICENSE("GPL");
7621 static void __exit ixj_exit(void)
7626 static IXJ *new_ixj(unsigned long port)
7629 if (!request_region(port, 16, "ixj DSP")) {
7630 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7635 release_region(port, 16);
7636 printk(KERN_INFO "ixj: out of memory\n");
7639 res->DSPbase = port;
7643 static int __init ixj_probe_isapnp(int *cnt)
7647 struct pnp_dev *dev = NULL, *old_dev = NULL;
7655 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7656 ISAPNP_FUNCTION(func), old_dev);
7657 if (!dev || !dev->card)
7659 result = pnp_device_attach(dev);
7661 printk("pnp attach failed %d \n", result);
7664 if (pnp_activate_dev(dev) < 0) {
7665 printk("pnp activate failed (out of resources?)\n");
7666 pnp_device_detach(dev);
7670 if (!pnp_port_valid(dev, 0)) {
7671 pnp_device_detach(dev);
7675 j = new_ixj(pnp_port_start(dev, 0));
7680 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7684 j->cardtype = QTI_PHONEJACK;
7687 j->cardtype = QTI_LINEJACK;
7690 j->cardtype = QTI_PHONEJACK_LITE;
7694 probe = ixj_selfprobe(j);
7696 j->serial = dev->card->serial;
7700 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7703 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7706 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7723 static int __init ixj_probe_isa(int *cnt)
7727 /* Use passed parameters for older kernels without PnP */
7728 for (i = 0; i < IXJMAX; i++) {
7730 IXJ *j = new_ixj(dspio[i]);
7735 j->XILINXbase = xio[i];
7739 probe = ixj_selfprobe(j);
7747 static int __init ixj_probe_pci(int *cnt)
7749 struct pci_dev *pci = NULL;
7753 for (i = 0; i < IXJMAX - *cnt; i++) {
7754 pci = pci_find_device(0x15E2, 0x0500, pci);
7758 if (pci_enable_device(pci))
7760 j = new_ixj(pci_resource_start(pci, 0));
7764 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7765 j->XILINXbase = j->DSPbase + 0x10;
7766 j->cardtype = QTI_PHONEJACK_PCI;
7768 probe = ixj_selfprobe(j);
7770 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7776 static int __init ixj_init(void)
7783 /* These might be no-ops, see above. */
7784 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7787 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7790 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7793 printk("%s\n", ixj_c_rcsid);
7794 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7798 module_init(ixj_init);
7799 module_exit(ixj_exit);
7801 static void DAA_Coeff_US(IXJ *j)
7805 j->daa_country = DAA_US;
7806 /*----------------------------------------------- */
7808 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7809 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7812 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7813 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7814 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7815 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7816 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7817 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7818 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7819 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7820 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7821 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7822 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7823 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7824 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7825 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7826 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7827 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7828 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7829 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7830 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7831 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7832 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7833 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7834 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7835 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7836 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7837 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7838 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7839 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7840 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7841 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7842 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7843 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7844 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7845 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7846 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7847 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7848 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7849 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7850 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7851 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7852 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7853 /* Bytes for AR-filter (09): 52,D3,11,42 */
7854 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7855 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7856 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7857 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7858 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7859 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7860 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7861 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7862 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7863 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7864 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7865 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7866 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7867 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7868 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7869 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7870 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7871 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7872 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7873 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7874 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7875 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7876 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7877 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7878 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7879 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7880 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7881 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7882 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7883 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7884 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7885 /* ; (10K, 0.68uF) */
7887 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7888 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7889 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7890 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7891 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7892 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7893 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7894 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7895 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7896 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7897 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7898 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7899 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7900 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7901 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7902 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7903 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7904 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7906 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7907 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7908 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7909 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7910 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7912 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7913 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7914 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7915 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7916 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7917 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7918 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7919 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7920 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7921 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7922 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7923 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7924 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7925 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7926 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7927 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7928 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7929 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7931 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7932 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7933 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7934 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7935 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7937 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7938 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7939 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7940 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7941 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7942 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7943 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7944 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7945 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7946 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7947 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7948 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7949 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7950 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7951 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7952 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7953 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7954 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7957 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7958 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7959 /* Config. Reg. 1 (dialing) (cr1):05 */
7960 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7961 /* Config. Reg. 2 (caller ID) (cr2):04 */
7962 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7963 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7964 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7965 /* Config. Reg. 4 (analog gain) (cr4):02 */
7966 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7967 /* Config. Reg. 5 (Version) (cr5):02 */
7968 /* Config. Reg. 6 (Reserved) (cr6):00 */
7969 /* Config. Reg. 7 (Reserved) (cr7):00 */
7972 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7974 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7975 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7977 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7978 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7979 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7980 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7981 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7982 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7984 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7985 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7986 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7987 /* Ext. Reg. 6 (Power State) (xr6):00 */
7988 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7989 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7990 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7992 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7993 /* 12,33,5A,C3 ; 770 Hz */
7994 /* 13,3C,5B,32 ; 852 Hz */
7995 /* 1D,1B,5C,CC ; 941 Hz */
7997 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7998 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7999 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8000 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8001 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8002 /* EC,1D,52,22 ; 1336 Hz */
8003 /* AA,AC,51,D2 ; 1477 Hz */
8004 /* 9B,3B,51,25 ; 1633 Hz */
8005 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8006 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8007 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8008 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8011 static void DAA_Coeff_UK(IXJ *j)
8015 j->daa_country = DAA_UK;
8016 /*----------------------------------------------- */
8018 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8019 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8022 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
8023 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8024 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
8025 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8026 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
8027 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
8028 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8029 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8030 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8031 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
8032 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
8033 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
8034 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8035 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
8036 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
8037 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8038 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8039 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8040 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
8041 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8042 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
8043 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
8044 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
8045 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8046 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8047 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8048 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8049 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8050 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8051 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8052 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8053 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8054 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8055 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8056 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8057 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8058 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8059 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8060 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8061 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8062 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8063 /* Bytes for AR-filter (09): E2,27,10,D6 */
8064 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8065 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8066 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8067 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8068 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8069 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8070 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8071 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8072 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8073 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8074 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8075 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8076 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8077 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8078 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8079 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8080 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8081 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8082 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8083 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8084 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8085 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8086 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8087 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8088 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8089 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8090 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8091 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8092 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8093 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8094 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8096 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8097 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8098 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8099 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8100 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8101 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8102 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8103 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8104 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8105 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8106 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8107 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8108 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8109 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8110 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8111 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8112 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8113 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8114 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8115 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8116 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8117 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8118 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8119 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8120 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8121 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8122 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8123 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8124 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8125 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8126 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8127 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8128 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8129 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8130 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8131 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8132 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8133 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8134 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8135 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8136 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8138 /* Config. Reg. 0 (filters) (cr0):FF */
8139 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8140 /* Config. Reg. 1 (dialing) (cr1):05 */
8141 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8142 /* Config. Reg. 2 (caller ID) (cr2):04 */
8143 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8144 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8145 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8146 /* Config. Reg. 4 (analog gain) (cr4):02 */
8147 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8148 /* Config. Reg. 5 (Version) (cr5):02 */
8149 /* Config. Reg. 6 (Reserved) (cr6):00 */
8150 /* Config. Reg. 7 (Reserved) (cr7):00 */
8152 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8154 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8155 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8157 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8158 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8160 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8161 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8162 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8163 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8164 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8165 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8166 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8167 /* Ext. Reg. 6 (Power State) (xr6):00 */
8168 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8169 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8170 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8171 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8172 /* 12,33,5A,C3 ; 770 Hz */
8173 /* 13,3C,5B,32 ; 852 Hz */
8174 /* 1D,1B,5C,CC ; 941 Hz */
8176 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8177 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8178 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8179 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8180 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8181 /* EC,1D,52,22 ; 1336 Hz */
8182 /* AA,AC,51,D2 ; 1477 Hz */
8183 /* 9B,3B,51,25 ; 1633 Hz */
8184 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8185 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8186 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8187 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8191 static void DAA_Coeff_France(IXJ *j)
8195 j->daa_country = DAA_FRANCE;
8196 /*----------------------------------------------- */
8198 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8199 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8202 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8203 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8204 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8205 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8206 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8207 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8208 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8209 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8210 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8211 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8212 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8213 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8214 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8215 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8216 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8217 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8218 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8219 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8220 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8221 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8222 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8223 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8224 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8225 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8226 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8227 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8228 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8229 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8230 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8231 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8232 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8233 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8234 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8235 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8236 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8237 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8238 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8239 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8240 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8241 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8242 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8243 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8244 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8245 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8246 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8247 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8248 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8249 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8250 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8251 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8252 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8253 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8254 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8255 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8256 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8257 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8258 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8259 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8260 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8261 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8262 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8263 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8264 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8265 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8266 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8267 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8268 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8269 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8270 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8271 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8272 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8273 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8274 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8276 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8277 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8278 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8279 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8280 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8281 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8282 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8283 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8284 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8285 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8286 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8287 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8288 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8289 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8290 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8291 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8292 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8293 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8294 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8295 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8296 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8297 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8298 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8299 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8300 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8301 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8302 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8303 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8304 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8305 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8306 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8307 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8308 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8309 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8310 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8311 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8312 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8313 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8314 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8315 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8316 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8318 /* Config. Reg. 0 (filters) (cr0):FF */
8319 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8320 /* Config. Reg. 1 (dialing) (cr1):05 */
8321 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8322 /* Config. Reg. 2 (caller ID) (cr2):04 */
8323 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8324 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8325 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8326 /* Config. Reg. 4 (analog gain) (cr4):02 */
8327 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8328 /* Config. Reg. 5 (Version) (cr5):02 */
8329 /* Config. Reg. 6 (Reserved) (cr6):00 */
8330 /* Config. Reg. 7 (Reserved) (cr7):00 */
8332 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8334 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8335 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8337 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8338 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8340 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8341 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8342 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8343 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8344 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8345 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8346 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8347 /* Ext. Reg. 6 (Power State) (xr6):00 */
8348 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8349 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8350 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8351 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8352 /* 12,33,5A,C3 ; 770 Hz */
8353 /* 13,3C,5B,32 ; 852 Hz */
8354 /* 1D,1B,5C,CC ; 941 Hz */
8356 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8357 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8358 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8359 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8360 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8361 /* EC,1D,52,22 ; 1336 Hz */
8362 /* AA,AC,51,D2 ; 1477 Hz */
8363 /* 9B,3B,51,25 ; 1633 Hz */
8364 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8365 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8366 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8367 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8371 static void DAA_Coeff_Germany(IXJ *j)
8375 j->daa_country = DAA_GERMANY;
8376 /*----------------------------------------------- */
8378 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8379 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8382 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8383 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8384 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8385 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8386 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8387 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8388 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8389 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8390 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8391 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8392 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8393 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8394 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8395 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8396 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8397 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8398 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8399 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8400 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8401 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8402 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8403 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8404 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8405 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8406 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8407 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8408 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8409 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8410 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8411 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8412 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8413 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8414 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8415 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8416 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8417 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8418 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8419 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8420 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8421 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8422 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8423 /* Bytes for AR-filter (09): 72,42,13,4B */
8424 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8425 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8426 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8427 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8428 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8429 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8430 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8431 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8432 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8433 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8434 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8435 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8436 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8437 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8438 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8439 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8440 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8441 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8442 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8443 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8444 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8445 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8446 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8447 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8448 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8449 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8450 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8451 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8452 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8453 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8454 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8455 /* ; (10K, 0.68uF) */
8456 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8457 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8458 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8459 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8460 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8461 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8462 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8463 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8464 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8465 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8466 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8467 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8468 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8469 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8470 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8471 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8472 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8473 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8474 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8475 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8476 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8477 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8478 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8479 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8480 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8481 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8482 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8483 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8484 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8485 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8486 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8487 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8488 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8489 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8490 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8491 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8492 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8493 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8494 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8495 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8496 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8498 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8499 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8500 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8501 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8502 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8503 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8504 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8505 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8506 /* Config. Reg. 4 (analog gain) (cr4):02 */
8507 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8508 /* Config. Reg. 5 (Version) (cr5):02 */
8509 /* Config. Reg. 6 (Reserved) (cr6):00 */
8510 /* Config. Reg. 7 (Reserved) (cr7):00 */
8512 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8514 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8515 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8517 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8518 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8520 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8521 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8522 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8523 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8524 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8525 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8526 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8527 /* Ext. Reg. 6 (Power State) (xr6):00 */
8528 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8529 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8530 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8531 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8532 /* 12,33,5A,C3 ; 770 Hz */
8533 /* 13,3C,5B,32 ; 852 Hz */
8534 /* 1D,1B,5C,CC ; 941 Hz */
8536 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8537 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8538 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8539 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8540 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8541 /* EC,1D,52,22 ; 1336 Hz */
8542 /* AA,AC,51,D2 ; 1477 Hz */
8543 /* 9B,3B,51,25 ; 1633 Hz */
8544 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8545 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8546 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8547 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8551 static void DAA_Coeff_Australia(IXJ *j)
8555 j->daa_country = DAA_AUSTRALIA;
8556 /*----------------------------------------------- */
8558 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8559 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8562 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8563 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8564 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8565 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8566 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8567 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8568 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8569 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8570 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8571 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8572 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8573 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8574 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8575 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8576 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8577 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8578 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8579 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8580 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8581 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8582 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8583 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8584 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8585 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8586 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8587 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8588 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8589 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8590 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8591 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8592 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8593 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8594 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8595 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8596 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8597 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8598 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8599 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8600 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8601 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8602 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8603 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8604 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8605 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8606 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8607 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8608 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8609 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8610 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8611 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8612 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8613 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8614 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8615 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8616 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8617 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8618 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8619 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8620 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8621 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8622 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8623 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8624 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8625 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8626 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8627 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8628 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8629 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8630 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8631 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8632 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8633 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8634 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8636 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8637 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8638 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8639 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8640 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8641 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8642 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8643 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8644 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8645 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8646 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8647 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8648 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8649 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8650 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8651 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8652 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8653 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8654 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8655 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8656 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8657 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8658 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8659 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8660 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8661 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8662 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8663 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8664 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8665 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8666 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8667 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8668 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8669 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8670 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8671 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8672 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8673 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8674 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8675 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8676 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8678 /* Config. Reg. 0 (filters) (cr0):FF */
8679 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8680 /* Config. Reg. 1 (dialing) (cr1):05 */
8681 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8682 /* Config. Reg. 2 (caller ID) (cr2):04 */
8683 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8684 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8685 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8686 /* Config. Reg. 4 (analog gain) (cr4):02 */
8687 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8688 /* Config. Reg. 5 (Version) (cr5):02 */
8689 /* Config. Reg. 6 (Reserved) (cr6):00 */
8690 /* Config. Reg. 7 (Reserved) (cr7):00 */
8692 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8694 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8695 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8697 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8698 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8700 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8701 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8702 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8703 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8704 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8705 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8706 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8707 /* Ext. Reg. 6 (Power State) (xr6):00 */
8708 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8709 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8710 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8712 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8713 /* 12,33,5A,C3 ; 770 Hz */
8714 /* 13,3C,5B,32 ; 852 Hz */
8715 /* 1D,1B,5C,CC ; 941 Hz */
8716 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8717 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8718 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8719 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8721 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8722 /* EC,1D,52,22 ; 1336 Hz */
8723 /* AA,AC,51,D2 ; 1477 Hz */
8724 /* 9B,3B,51,25 ; 1633 Hz */
8725 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8726 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8727 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8728 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8731 static void DAA_Coeff_Japan(IXJ *j)
8735 j->daa_country = DAA_JAPAN;
8736 /*----------------------------------------------- */
8738 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8739 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8742 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8743 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8744 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8745 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8746 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8747 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8748 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8749 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8750 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8751 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8752 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8753 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8754 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8755 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8756 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8757 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8758 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8759 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8760 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8761 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8762 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8763 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8764 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8765 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8766 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8767 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8768 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8769 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8770 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8771 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8772 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8773 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8774 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8775 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8776 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8777 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8778 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8779 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8780 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8781 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8782 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8783 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8784 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8785 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8786 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8787 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8788 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8789 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8790 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8791 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8792 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8793 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8794 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8795 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8796 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8797 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8798 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8799 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8800 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8801 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8802 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8803 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8804 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8805 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8806 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8808 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8809 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8816 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8817 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8818 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8819 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8820 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8821 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8822 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8823 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8824 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8825 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8826 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8827 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8828 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8829 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8830 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8831 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8832 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8833 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8834 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8835 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8836 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8837 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8838 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8839 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8840 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8841 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8842 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8843 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8844 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8845 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8846 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8847 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8848 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8849 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8850 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8851 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8852 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8853 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8854 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8855 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8856 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8858 /* Config. Reg. 0 (filters) (cr0):FF */
8859 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8860 /* Config. Reg. 1 (dialing) (cr1):05 */
8861 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8862 /* Config. Reg. 2 (caller ID) (cr2):04 */
8863 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8864 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8865 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8866 /* Config. Reg. 4 (analog gain) (cr4):02 */
8867 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8868 /* Config. Reg. 5 (Version) (cr5):02 */
8869 /* Config. Reg. 6 (Reserved) (cr6):00 */
8870 /* Config. Reg. 7 (Reserved) (cr7):00 */
8872 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8874 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8875 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8877 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8878 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8880 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8881 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8882 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8883 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8884 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8885 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8886 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8887 /* Ext. Reg. 6 (Power State) (xr6):00 */
8888 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8889 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8890 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8891 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8892 /* 12,33,5A,C3 ; 770 Hz */
8893 /* 13,3C,5B,32 ; 852 Hz */
8894 /* 1D,1B,5C,CC ; 941 Hz */
8896 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8897 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8898 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8899 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8900 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8901 /* EC,1D,52,22 ; 1336 Hz */
8902 /* AA,AC,51,D2 ; 1477 Hz */
8903 /* 9B,3B,51,25 ; 1633 Hz */
8904 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8905 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8906 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8907 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8910 static s16 tone_table[][19] =
8913 32538, /* A1 = 1.985962 */
8914 -32325, /* A2 = -0.986511 */
8915 -343, /* B2 = -0.010493 */
8917 343, /* B0 = 0.010493 */
8918 32619, /* A1 = 1.990906 */
8919 -32520, /* A2 = -0.992462 */
8920 19179, /* B2 = 0.585327 */
8921 -19178, /* B1 = -1.170593 */
8922 19179, /* B0 = 0.585327 */
8923 32723, /* A1 = 1.997314 */
8924 -32686, /* A2 = -0.997528 */
8925 9973, /* B2 = 0.304352 */
8926 -9955, /* B1 = -0.607605 */
8927 9973, /* B0 = 0.304352 */
8928 7, /* Internal filter scaling */
8929 159, /* Minimum in-band energy threshold */
8930 21, /* 21/32 in-band to broad-band ratio */
8931 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8933 { /* f133_200[] 12 */
8934 32072, /* A1 = 1.95752 */
8935 -31896, /* A2 = -0.973419 */
8936 -435, /* B2 = -0.013294 */
8938 435, /* B0 = 0.013294 */
8939 32188, /* A1 = 1.9646 */
8940 -32400, /* A2 = -0.98877 */
8941 15139, /* B2 = 0.462036 */
8942 -14882, /* B1 = -0.908356 */
8943 15139, /* B0 = 0.462036 */
8944 32473, /* A1 = 1.981995 */
8945 -32524, /* A2 = -0.992584 */
8946 23200, /* B2 = 0.708008 */
8947 -23113, /* B1 = -1.410706 */
8948 23200, /* B0 = 0.708008 */
8949 7, /* Internal filter scaling */
8950 159, /* Minimum in-band energy threshold */
8951 21, /* 21/32 in-band to broad-band ratio */
8952 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8955 31769, /* A1 = -1.939026 */
8956 -32584, /* A2 = 0.994385 */
8957 -475, /* B2 = -0.014522 */
8958 0, /* B1 = 0.000000 */
8959 475, /* B0 = 0.014522 */
8960 31789, /* A1 = -1.940247 */
8961 -32679, /* A2 = 0.997284 */
8962 17280, /* B2 = 0.527344 */
8963 -16865, /* B1 = -1.029358 */
8964 17280, /* B0 = 0.527344 */
8965 31841, /* A1 = -1.943481 */
8966 -32681, /* A2 = 0.997345 */
8967 543, /* B2 = 0.016579 */
8968 -525, /* B1 = -0.032097 */
8969 543, /* B0 = 0.016579 */
8970 5, /* Internal filter scaling */
8971 159, /* Minimum in-band energy threshold */
8972 21, /* 21/32 in-band to broad-band ratio */
8973 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8975 { /* f300_420[] 14 */
8976 30750, /* A1 = 1.876892 */
8977 -31212, /* A2 = -0.952515 */
8978 -804, /* B2 = -0.024541 */
8980 804, /* B0 = 0.024541 */
8981 30686, /* A1 = 1.872925 */
8982 -32145, /* A2 = -0.980988 */
8983 14747, /* B2 = 0.450043 */
8984 -13703, /* B1 = -0.836395 */
8985 14747, /* B0 = 0.450043 */
8986 31651, /* A1 = 1.931824 */
8987 -32321, /* A2 = -0.986389 */
8988 24425, /* B2 = 0.745422 */
8989 -23914, /* B1 = -1.459595 */
8990 24427, /* B0 = 0.745483 */
8991 7, /* Internal filter scaling */
8992 159, /* Minimum in-band energy threshold */
8993 21, /* 21/32 in-band to broad-band ratio */
8994 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8997 31613, /* A1 = -1.929565 */
8998 -32646, /* A2 = 0.996277 */
8999 -185, /* B2 = -0.005657 */
9000 0, /* B1 = 0.000000 */
9001 185, /* B0 = 0.005657 */
9002 31620, /* A1 = -1.929932 */
9003 -32713, /* A2 = 0.998352 */
9004 19253, /* B2 = 0.587585 */
9005 -18566, /* B1 = -1.133179 */
9006 19253, /* B0 = 0.587585 */
9007 31674, /* A1 = -1.933228 */
9008 -32715, /* A2 = 0.998413 */
9009 2575, /* B2 = 0.078590 */
9010 -2495, /* B1 = -0.152283 */
9011 2575, /* B0 = 0.078590 */
9012 5, /* Internal filter scaling */
9013 159, /* Minimum in-band energy threshold */
9014 21, /* 21/32 in-band to broad-band ratio */
9015 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9017 { /* f300_425[] 16 */
9018 30741, /* A1 = 1.876282 */
9019 -31475, /* A2 = -0.960541 */
9020 -703, /* B2 = -0.021484 */
9022 703, /* B0 = 0.021484 */
9023 30688, /* A1 = 1.873047 */
9024 -32248, /* A2 = -0.984161 */
9025 14542, /* B2 = 0.443787 */
9026 -13523, /* B1 = -0.825439 */
9027 14542, /* B0 = 0.443817 */
9028 31494, /* A1 = 1.922302 */
9029 -32366, /* A2 = -0.987762 */
9030 21577, /* B2 = 0.658508 */
9031 -21013, /* B1 = -1.282532 */
9032 21577, /* B0 = 0.658508 */
9033 7, /* Internal filter scaling */
9034 159, /* Minimum in-band energy threshold */
9035 21, /* 21/32 in-band to broad-band ratio */
9036 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9038 { /* f330_440[] 17 */
9039 30627, /* A1 = 1.869324 */
9040 -31338, /* A2 = -0.95636 */
9041 -843, /* B2 = -0.025749 */
9043 843, /* B0 = 0.025749 */
9044 30550, /* A1 = 1.864685 */
9045 -32221, /* A2 = -0.983337 */
9046 13594, /* B2 = 0.414886 */
9047 -12589, /* B1 = -0.768402 */
9048 13594, /* B0 = 0.414886 */
9049 31488, /* A1 = 1.921936 */
9050 -32358, /* A2 = -0.987518 */
9051 24684, /* B2 = 0.753296 */
9052 -24029, /* B1 = -1.466614 */
9053 24684, /* B0 = 0.753296 */
9054 7, /* Internal filter scaling */
9055 159, /* Minimum in-band energy threshold */
9056 21, /* 21/32 in-band to broad-band ratio */
9057 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9060 31546, /* A1 = -1.925476 */
9061 -32646, /* A2 = 0.996277 */
9062 -445, /* B2 = -0.013588 */
9063 0, /* B1 = 0.000000 */
9064 445, /* B0 = 0.013588 */
9065 31551, /* A1 = -1.925781 */
9066 -32713, /* A2 = 0.998352 */
9067 23884, /* B2 = 0.728882 */
9068 -22979, /* B1 = -1.402527 */
9069 23884, /* B0 = 0.728882 */
9070 31606, /* A1 = -1.929138 */
9071 -32715, /* A2 = 0.998413 */
9072 863, /* B2 = 0.026367 */
9073 -835, /* B1 = -0.050985 */
9074 863, /* B0 = 0.026367 */
9075 5, /* Internal filter scaling */
9076 159, /* Minimum in-band energy threshold */
9077 21, /* 21/32 in-band to broad-band ratio */
9078 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9080 { /* f350_400[] 19 */
9081 31006, /* A1 = 1.892517 */
9082 -32029, /* A2 = -0.977448 */
9083 -461, /* B2 = -0.014096 */
9085 461, /* B0 = 0.014096 */
9086 30999, /* A1 = 1.892029 */
9087 -32487, /* A2 = -0.991455 */
9088 11325, /* B2 = 0.345612 */
9089 -10682, /* B1 = -0.651978 */
9090 11325, /* B0 = 0.345612 */
9091 31441, /* A1 = 1.919067 */
9092 -32526, /* A2 = -0.992615 */
9093 24324, /* B2 = 0.74231 */
9094 -23535, /* B1 = -1.436523 */
9095 24324, /* B0 = 0.74231 */
9096 7, /* Internal filter scaling */
9097 159, /* Minimum in-band energy threshold */
9098 21, /* 21/32 in-band to broad-band ratio */
9099 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9102 30634, /* A1 = 1.869751 */
9103 -31533, /* A2 = -0.962341 */
9104 -680, /* B2 = -0.020782 */
9106 680, /* B0 = 0.020782 */
9107 30571, /* A1 = 1.865906 */
9108 -32277, /* A2 = -0.985016 */
9109 12894, /* B2 = 0.393524 */
9110 -11945, /* B1 = -0.729065 */
9111 12894, /* B0 = 0.393524 */
9112 31367, /* A1 = 1.91449 */
9113 -32379, /* A2 = -0.988129 */
9114 23820, /* B2 = 0.726929 */
9115 -23104, /* B1 = -1.410217 */
9116 23820, /* B0 = 0.726929 */
9117 7, /* Internal filter scaling */
9118 159, /* Minimum in-band energy threshold */
9119 21, /* 21/32 in-band to broad-band ratio */
9120 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9123 30552, /* A1 = 1.864807 */
9124 -31434, /* A2 = -0.95929 */
9125 -690, /* B2 = -0.021066 */
9127 690, /* B0 = 0.021066 */
9128 30472, /* A1 = 1.859924 */
9129 -32248, /* A2 = -0.984161 */
9130 13385, /* B2 = 0.408478 */
9131 -12357, /* B1 = -0.754242 */
9132 13385, /* B0 = 0.408478 */
9133 31358, /* A1 = 1.914001 */
9134 -32366, /* A2 = -0.987732 */
9135 26488, /* B2 = 0.80835 */
9136 -25692, /* B1 = -1.568176 */
9137 26490, /* B0 = 0.808411 */
9138 7, /* Internal filter scaling */
9139 159, /* Minimum in-band energy threshold */
9140 21, /* 21/32 in-band to broad-band ratio */
9141 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9144 31397, /* A1 = -1.916321 */
9145 -32623, /* A2 = 0.995605 */
9146 -117, /* B2 = -0.003598 */
9147 0, /* B1 = 0.000000 */
9148 117, /* B0 = 0.003598 */
9149 31403, /* A1 = -1.916687 */
9150 -32700, /* A2 = 0.997925 */
9151 3388, /* B2 = 0.103401 */
9152 -3240, /* B1 = -0.197784 */
9153 3388, /* B0 = 0.103401 */
9154 31463, /* A1 = -1.920410 */
9155 -32702, /* A2 = 0.997986 */
9156 13346, /* B2 = 0.407288 */
9157 -12863, /* B1 = -0.785126 */
9158 13346, /* B0 = 0.407288 */
9159 5, /* Internal filter scaling */
9160 159, /* Minimum in-band energy threshold */
9161 21, /* 21/32 in-band to broad-band ratio */
9162 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9165 30831, /* A1 = 1.881775 */
9166 -32064, /* A2 = -0.978546 */
9167 -367, /* B2 = -0.01122 */
9169 367, /* B0 = 0.01122 */
9170 30813, /* A1 = 1.880737 */
9171 -32456, /* A2 = -0.990509 */
9172 11068, /* B2 = 0.337769 */
9173 -10338, /* B1 = -0.631042 */
9174 11068, /* B0 = 0.337769 */
9175 31214, /* A1 = 1.905212 */
9176 -32491, /* A2 = -0.991577 */
9177 16374, /* B2 = 0.499695 */
9178 -15781, /* B1 = -0.963196 */
9179 16374, /* B0 = 0.499695 */
9180 7, /* Internal filter scaling */
9181 159, /* Minimum in-band energy threshold */
9182 21, /* 21/32 in-band to broad-band ratio */
9183 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9186 31152, /* A1 = -1.901428 */
9187 -32613, /* A2 = 0.995300 */
9188 -314, /* B2 = -0.009605 */
9189 0, /* B1 = 0.000000 */
9190 314, /* B0 = 0.009605 */
9191 31156, /* A1 = -1.901672 */
9192 -32694, /* A2 = 0.997742 */
9193 28847, /* B2 = 0.880371 */
9194 -2734, /* B1 = -0.166901 */
9195 28847, /* B0 = 0.880371 */
9196 31225, /* A1 = -1.905823 */
9197 -32696, /* A2 = 0.997803 */
9198 462, /* B2 = 0.014108 */
9199 -442, /* B1 = -0.027019 */
9200 462, /* B0 = 0.014108 */
9201 5, /* Internal filter scaling */
9202 159, /* Minimum in-band energy threshold */
9203 21, /* 21/32 in-band to broad-band ratio */
9204 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9207 30836, /* A1 = 1.882141 */
9208 -32296, /* A2 = -0.985596 */
9209 -324, /* B2 = -0.009903 */
9211 324, /* B0 = 0.009903 */
9212 30825, /* A1 = 1.881409 */
9213 -32570, /* A2 = -0.993958 */
9214 16847, /* B2 = 0.51416 */
9215 -15792, /* B1 = -0.963898 */
9216 16847, /* B0 = 0.51416 */
9217 31106, /* A1 = 1.89856 */
9218 -32584, /* A2 = -0.994415 */
9219 9579, /* B2 = 0.292328 */
9220 -9164, /* B1 = -0.559357 */
9221 9579, /* B0 = 0.292328 */
9222 7, /* Internal filter scaling */
9223 159, /* Minimum in-band energy threshold */
9224 21, /* 21/32 in-band to broad-band ratio */
9225 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9228 30702, /* A1 = 1.873962 */
9229 -32134, /* A2 = -0.980682 */
9230 -517, /* B2 = -0.015793 */
9232 517, /* B0 = 0.015793 */
9233 30676, /* A1 = 1.872375 */
9234 -32520, /* A2 = -0.992462 */
9235 8144, /* B2 = 0.24855 */
9236 -7596, /* B1 = -0.463684 */
9237 8144, /* B0 = 0.24855 */
9238 31084, /* A1 = 1.897217 */
9239 -32547, /* A2 = -0.993256 */
9240 22713, /* B2 = 0.693176 */
9241 -21734, /* B1 = -1.326599 */
9242 22713, /* B0 = 0.693176 */
9243 7, /* Internal filter scaling */
9244 159, /* Minimum in-band energy threshold */
9245 21, /* 21/32 in-band to broad-band ratio */
9246 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9249 30613, /* A1 = 1.86853 */
9250 -32031, /* A2 = -0.977509 */
9251 -618, /* B2 = -0.018866 */
9253 618, /* B0 = 0.018866 */
9254 30577, /* A1 = 1.866272 */
9255 -32491, /* A2 = -0.991577 */
9256 9612, /* B2 = 0.293335 */
9257 -8935, /* B1 = -0.54541 */
9258 9612, /* B0 = 0.293335 */
9259 31071, /* A1 = 1.896484 */
9260 -32524, /* A2 = -0.992584 */
9261 21596, /* B2 = 0.659058 */
9262 -20667, /* B1 = -1.261414 */
9263 21596, /* B0 = 0.659058 */
9264 7, /* Internal filter scaling */
9265 159, /* Minimum in-band energy threshold */
9266 21, /* 21/32 in-band to broad-band ratio */
9267 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9270 30914, /* A1 = -1.886841 */
9271 -32584, /* A2 = 0.994385 */
9272 -426, /* B2 = -0.013020 */
9273 0, /* B1 = 0.000000 */
9274 426, /* B0 = 0.013020 */
9275 30914, /* A1 = -1.886841 */
9276 -32679, /* A2 = 0.997314 */
9277 17520, /* B2 = 0.534668 */
9278 -16471, /* B1 = -1.005310 */
9279 17520, /* B0 = 0.534668 */
9280 31004, /* A1 = -1.892334 */
9281 -32683, /* A2 = 0.997406 */
9282 819, /* B2 = 0.025023 */
9283 -780, /* B1 = -0.047619 */
9284 819, /* B0 = 0.025023 */
9285 5, /* Internal filter scaling */
9286 159, /* Minimum in-band energy threshold */
9287 21, /* 21/32 in-band to broad-band ratio */
9288 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9292 30881, /* A1 = -1.884827 */
9293 -32603, /* A2 = 0.994965 */
9294 -496, /* B2 = -0.015144 */
9295 0, /* B1 = 0.000000 */
9296 496, /* B0 = 0.015144 */
9297 30880, /* A1 = -1.884766 */
9298 -32692, /* A2 = 0.997711 */
9299 24767, /* B2 = 0.755859 */
9300 -23290, /* B1 = -1.421509 */
9301 24767, /* B0 = 0.755859 */
9302 30967, /* A1 = -1.890076 */
9303 -32694, /* A2 = 0.997772 */
9304 728, /* B2 = 0.022232 */
9305 -691, /* B1 = -0.042194 */
9306 728, /* B0 = 0.022232 */
9307 5, /* Internal filter scaling */
9308 159, /* Minimum in-band energy threshold */
9309 21, /* 21/32 in-band to broad-band ratio */
9310 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9336 30646, /* A1 = 1.870544 */
9337 -32327, /* A2 = -0.986572 */
9338 -287, /* B2 = -0.008769 */
9340 287, /* B0 = 0.008769 */
9341 30627, /* A1 = 1.869324 */
9342 -32607, /* A2 = -0.995087 */
9343 13269, /* B2 = 0.404968 */
9344 -12376, /* B1 = -0.755432 */
9345 13269, /* B0 = 0.404968 */
9346 30924, /* A1 = 1.887512 */
9347 -32619, /* A2 = -0.995453 */
9348 19950, /* B2 = 0.608826 */
9349 -18940, /* B1 = -1.156006 */
9350 19950, /* B0 = 0.608826 */
9351 7, /* Internal filter scaling */
9352 159, /* Minimum in-band energy threshold */
9353 21, /* 21/32 in-band to broad-band ratio */
9354 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9357 30396, /* A1 = 1.855225 */
9358 -32014, /* A2 = -0.97699 */
9359 -395, /* B2 = -0.012055 */
9361 395, /* B0 = 0.012055 */
9362 30343, /* A1 = 1.85199 */
9363 -32482, /* A2 = -0.991302 */
9364 17823, /* B2 = 0.543945 */
9365 -16431, /* B1 = -1.002869 */
9366 17823, /* B0 = 0.543945 */
9367 30872, /* A1 = 1.884338 */
9368 -32516, /* A2 = -0.99231 */
9369 18124, /* B2 = 0.553101 */
9370 -17246, /* B1 = -1.052673 */
9371 18124, /* B0 = 0.553101 */
9372 7, /* Internal filter scaling */
9373 159, /* Minimum in-band energy threshold */
9374 21, /* 21/32 in-band to broad-band ratio */
9375 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9378 30796, /* A1 = -1.879639 */
9379 -32603, /* A2 = 0.994965 */
9380 -254, /* B2 = -0.007762 */
9381 0, /* B1 = 0.000000 */
9382 254, /* B0 = 0.007762 */
9383 30793, /* A1 = -1.879456 */
9384 -32692, /* A2 = 0.997711 */
9385 18934, /* B2 = 0.577820 */
9386 -17751, /* B1 = -1.083496 */
9387 18934, /* B0 = 0.577820 */
9388 30882, /* A1 = -1.884888 */
9389 -32694, /* A2 = 0.997772 */
9390 1858, /* B2 = 0.056713 */
9391 -1758, /* B1 = -0.107357 */
9392 1858, /* B0 = 0.056713 */
9393 5, /* Internal filter scaling */
9394 159, /* Minimum in-band energy threshold */
9395 21, /* 21/32 in-band to broad-band ratio */
9396 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9399 30641, /* A1 = 1.870239 */
9400 -32458, /* A2 = -0.99057 */
9401 -155, /* B2 = -0.004735 */
9403 155, /* B0 = 0.004735 */
9404 30631, /* A1 = 1.869568 */
9405 -32630, /* A2 = -0.995789 */
9406 11453, /* B2 = 0.349548 */
9407 -10666, /* B1 = -0.651001 */
9408 11453, /* B0 = 0.349548 */
9409 30810, /* A1 = 1.880554 */
9410 -32634, /* A2 = -0.995941 */
9411 12237, /* B2 = 0.373474 */
9412 -11588, /* B1 = -0.707336 */
9413 12237, /* B0 = 0.373474 */
9414 7, /* Internal filter scaling */
9415 159, /* Minimum in-band energy threshold */
9416 21, /* 21/32 in-band to broad-band ratio */
9417 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9420 30367, /* A1 = 1.853455 */
9421 -32147, /* A2 = -0.981079 */
9422 -495, /* B2 = -0.015113 */
9424 495, /* B0 = 0.015113 */
9425 30322, /* A1 = 1.850769 */
9426 -32543, /* A2 = -0.993134 */
9427 10031, /* B2 = 0.306152 */
9428 -9252, /* B1 = -0.564728 */
9429 10031, /* B0 = 0.306152 */
9430 30770, /* A1 = 1.878052 */
9431 -32563, /* A2 = -0.993774 */
9432 22674, /* B2 = 0.691956 */
9433 -21465, /* B1 = -1.31012 */
9434 22674, /* B0 = 0.691956 */
9435 7, /* Internal filter scaling */
9436 159, /* Minimum in-band energy threshold */
9437 21, /* 21/32 in-band to broad-band ratio */
9438 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9441 30709, /* A1 = -1.874329 */
9442 -32603, /* A2 = 0.994965 */
9443 -83, /* B2 = -0.002545 */
9444 0, /* B1 = 0.000000 */
9445 83, /* B0 = 0.002545 */
9446 30704, /* A1 = -1.874084 */
9447 -32692, /* A2 = 0.997711 */
9448 10641, /* B2 = 0.324738 */
9449 -9947, /* B1 = -0.607147 */
9450 10641, /* B0 = 0.324738 */
9451 30796, /* A1 = -1.879639 */
9452 -32694, /* A2 = 0.997772 */
9453 10079, /* B2 = 0.307587 */
9454 9513, /* B1 = 0.580688 */
9455 10079, /* B0 = 0.307587 */
9456 5, /* Internal filter scaling */
9457 159, /* Minimum in-band energy threshold */
9458 21, /* 21/32 in-band to broad-band ratio */
9459 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9462 30664, /* A1 = -1.871643 */
9463 -32603, /* A2 = 0.994965 */
9464 -164, /* B2 = -0.005029 */
9465 0, /* B1 = 0.000000 */
9466 164, /* B0 = 0.005029 */
9467 30661, /* A1 = -1.871399 */
9468 -32692, /* A2 = 0.997711 */
9469 15294, /* B2 = 0.466736 */
9470 -14275, /* B1 = -0.871307 */
9471 15294, /* B0 = 0.466736 */
9472 30751, /* A1 = -1.876953 */
9473 -32694, /* A2 = 0.997772 */
9474 3548, /* B2 = 0.108284 */
9475 -3344, /* B1 = -0.204155 */
9476 3548, /* B0 = 0.108284 */
9477 5, /* Internal filter scaling */
9478 159, /* Minimum in-band energy threshold */
9479 21, /* 21/32 in-band to broad-band ratio */
9480 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9483 30653, /* A1 = -1.870911 */
9484 -32615, /* A2 = 0.995361 */
9485 -209, /* B2 = -0.006382 */
9486 0, /* B1 = 0.000000 */
9487 209, /* B0 = 0.006382 */
9488 30647, /* A1 = -1.870605 */
9489 -32702, /* A2 = 0.997986 */
9490 18971, /* B2 = 0.578979 */
9491 -17716, /* B1 = -1.081299 */
9492 18971, /* B0 = 0.578979 */
9493 30738, /* A1 = -1.876099 */
9494 -32702, /* A2 = 0.998016 */
9495 2967, /* B2 = 0.090561 */
9496 -2793, /* B1 = -0.170502 */
9497 2967, /* B0 = 0.090561 */
9498 5, /* Internal filter scaling */
9499 159, /* Minimum in-band energy threshold */
9500 21, /* 21/32 in-band to broad-band ratio */
9501 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9504 30437, /* A1 = -1.857727 */
9505 -32603, /* A2 = 0.994965 */
9506 -264, /* B2 = -0.008062 */
9507 0, /* B1 = 0.000000 */
9508 264, /* B0 = 0.008062 */
9509 30430, /* A1 = -1.857300 */
9510 -32692, /* A2 = 0.997711 */
9511 21681, /* B2 = 0.661682 */
9512 -20082, /* B1 = -1.225708 */
9513 21681, /* B0 = 0.661682 */
9514 30526, /* A1 = -1.863220 */
9515 -32694, /* A2 = 0.997742 */
9516 1559, /* B2 = 0.047600 */
9517 -1459, /* B1 = -0.089096 */
9518 1559, /* B0 = 0.047600 */
9519 5, /* Internal filter scaling */
9520 159, /* Minimum in-band energy threshold */
9521 21, /* 21/32 in-band to broad-band ratio */
9522 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9525 28975, /* A1 = 1.768494 */
9526 -30955, /* A2 = -0.944672 */
9527 -1026, /* B2 = -0.03133 */
9529 1026, /* B0 = 0.03133 */
9530 28613, /* A1 = 1.746399 */
9531 -32089, /* A2 = -0.979309 */
9532 14214, /* B2 = 0.433807 */
9533 -12202, /* B1 = -0.744812 */
9534 14214, /* B0 = 0.433807 */
9535 30243, /* A1 = 1.845947 */
9536 -32238, /* A2 = -0.983856 */
9537 24825, /* B2 = 0.757629 */
9538 -23402, /* B1 = -1.428345 */
9539 24825, /* B0 = 0.757629 */
9540 7, /* Internal filter scaling */
9541 159, /* Minimum in-band energy threshold */
9542 21, /* 21/32 in-band to broad-band ratio */
9543 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9546 30257, /* A1 = -1.846741 */
9547 -32605, /* A2 = 0.995056 */
9548 -249, /* B2 = -0.007625 */
9549 0, /* B1 = 0.000000 */
9550 249, /* B0 = 0.007625 */
9551 30247, /* A1 = -1.846191 */
9552 -32694, /* A2 = 0.997772 */
9553 18088, /* B2 = 0.552002 */
9554 -16652, /* B1 = -1.016418 */
9555 18088, /* B0 = 0.552002 */
9556 30348, /* A1 = -1.852295 */
9557 -32696, /* A2 = 0.997803 */
9558 2099, /* B2 = 0.064064 */
9559 -1953, /* B1 = -0.119202 */
9560 2099, /* B0 = 0.064064 */
9561 5, /* Internal filter scaling */
9562 159, /* Minimum in-band energy threshold */
9563 21, /* 21/32 in-band to broad-band ratio */
9564 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9567 30202, /* A1 = -1.843431 */
9568 -32624, /* A2 = 0.995622 */
9569 -413, /* B2 = -0.012622 */
9570 0, /* B1 = 0.000000 */
9571 413, /* B0 = 0.012622 */
9572 30191, /* A1 = -1.842721 */
9573 -32714, /* A2 = 0.998364 */
9574 25954, /* B2 = 0.792057 */
9575 -23890, /* B1 = -1.458131 */
9576 25954, /* B0 = 0.792057 */
9577 30296, /* A1 = -1.849172 */
9578 -32715, /* A2 = 0.998397 */
9579 2007, /* B2 = 0.061264 */
9580 -1860, /* B1 = -0.113568 */
9581 2007, /* B0 = 0.061264 */
9582 5, /* Internal filter scaling */
9583 159, /* Minimum in-band energy threshold */
9584 21, /* 21/32 in-band to broad-band ratio */
9585 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9588 30001, /* A1 = -1.831116 */
9589 -32613, /* A2 = 0.995270 */
9590 -155, /* B2 = -0.004750 */
9591 0, /* B1 = 0.000000 */
9592 155, /* B0 = 0.004750 */
9593 29985, /* A1 = -1.830200 */
9594 -32710, /* A2 = 0.998260 */
9595 6584, /* B2 = 0.200928 */
9596 -6018, /* B1 = -0.367355 */
9597 6584, /* B0 = 0.200928 */
9598 30105, /* A1 = -1.837524 */
9599 -32712, /* A2 = 0.998291 */
9600 23812, /* B2 = 0.726685 */
9601 -21936, /* B1 = -1.338928 */
9602 23812, /* B0 = 0.726685 */
9603 5, /* Internal filter scaling */
9604 159, /* Minimum in-band energy threshold */
9605 21, /* 21/32 in-band to broad-band ratio */
9606 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9609 29964, /* A1 = -1.828918 */
9610 -32601, /* A2 = 0.994904 */
9611 -101, /* B2 = -0.003110 */
9612 0, /* B1 = 0.000000 */
9613 101, /* B0 = 0.003110 */
9614 29949, /* A1 = -1.827942 */
9615 -32700, /* A2 = 0.997925 */
9616 11041, /* B2 = 0.336975 */
9617 -10075, /* B1 = -0.614960 */
9618 11041, /* B0 = 0.336975 */
9619 30070, /* A1 = -1.835388 */
9620 -32702, /* A2 = 0.997986 */
9621 16762, /* B2 = 0.511536 */
9622 -15437, /* B1 = -0.942230 */
9623 16762, /* B0 = 0.511536 */
9624 5, /* Internal filter scaling */
9625 159, /* Minimum in-band energy threshold */
9626 21, /* 21/32 in-band to broad-band ratio */
9627 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9630 29936, /* A1 = -1.827209 */
9631 -32584, /* A2 = 0.994415 */
9632 -91, /* B2 = -0.002806 */
9633 0, /* B1 = 0.000000 */
9634 91, /* B0 = 0.002806 */
9635 29921, /* A1 = -1.826233 */
9636 -32688, /* A2 = 0.997559 */
9637 11449, /* B2 = 0.349396 */
9638 -10426, /* B1 = -0.636383 */
9639 11449, /* B0 = 0.349396 */
9640 30045, /* A1 = -1.833862 */
9641 -32688, /* A2 = 0.997589 */
9642 13055, /* B2 = 0.398407 */
9643 -12028, /* B1 = -0.734161 */
9644 13055, /* B0 = 0.398407 */
9645 5, /* Internal filter scaling */
9646 159, /* Minimum in-band energy threshold */
9647 21, /* 21/32 in-band to broad-band ratio */
9648 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9651 28499, /* A1 = 1.739441 */
9652 -31129, /* A2 = -0.949982 */
9653 -849, /* B2 = -0.025922 */
9655 849, /* B0 = 0.025922 */
9656 28128, /* A1 = 1.716797 */
9657 -32130, /* A2 = -0.98056 */
9658 14556, /* B2 = 0.444214 */
9659 -12251, /* B1 = -0.747772 */
9660 14556, /* B0 = 0.444244 */
9661 29667, /* A1 = 1.81073 */
9662 -32244, /* A2 = -0.984039 */
9663 23038, /* B2 = 0.703064 */
9664 -21358, /* B1 = -1.303589 */
9665 23040, /* B0 = 0.703125 */
9666 7, /* Internal filter scaling */
9667 159, /* Minimum in-band energy threshold */
9668 21, /* 21/32 in-band to broad-band ratio */
9669 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9672 29271, /* A1 = -1.786560 */
9673 -32599, /* A2 = 0.994873 */
9674 -490, /* B2 = -0.014957 */
9675 0, /* B1 = 0.000000 */
9676 490, /* B0 = 0.014957 */
9677 29246, /* A1 = -1.785095 */
9678 -32700, /* A2 = 0.997925 */
9679 28961, /* B2 = 0.883850 */
9680 -25796, /* B1 = -1.574463 */
9681 28961, /* B0 = 0.883850 */
9682 29383, /* A1 = -1.793396 */
9683 -32700, /* A2 = 0.997955 */
9684 1299, /* B2 = 0.039650 */
9685 -1169, /* B1 = -0.071396 */
9686 1299, /* B0 = 0.039650 */
9687 5, /* Internal filter scaling */
9688 159, /* Minimum in-band energy threshold */
9689 21, /* 21/32 in-band to broad-band ratio */
9690 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9693 29230, /* A1 = -1.784058 */
9694 -32584, /* A2 = 0.994415 */
9695 -418, /* B2 = -0.012757 */
9696 0, /* B1 = 0.000000 */
9697 418, /* B0 = 0.012757 */
9698 29206, /* A1 = -1.782593 */
9699 -32688, /* A2 = 0.997559 */
9700 36556, /* B2 = 1.115601 */
9701 -32478, /* B1 = -1.982300 */
9702 36556, /* B0 = 1.115601 */
9703 29345, /* A1 = -1.791077 */
9704 -32688, /* A2 = 0.997589 */
9705 897, /* B2 = 0.027397 */
9706 -808, /* B1 = -0.049334 */
9707 897, /* B0 = 0.027397 */
9708 5, /* Internal filter scaling */
9709 159, /* Minimum in-band energy threshold */
9710 21, /* 21/32 in-band to broad-band ratio */
9711 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9714 29116, /* A1 = -1.777100 */
9715 -32603, /* A2 = 0.994965 */
9716 -165, /* B2 = -0.005039 */
9717 0, /* B1 = 0.000000 */
9718 165, /* B0 = 0.005039 */
9719 29089, /* A1 = -1.775452 */
9720 -32708, /* A2 = 0.998199 */
9721 6963, /* B2 = 0.212494 */
9722 -6172, /* B1 = -0.376770 */
9723 6963, /* B0 = 0.212494 */
9724 29237, /* A1 = -1.784485 */
9725 -32710, /* A2 = 0.998230 */
9726 24197, /* B2 = 0.738464 */
9727 -21657, /* B1 = -1.321899 */
9728 24197, /* B0 = 0.738464 */
9729 5, /* Internal filter scaling */
9730 159, /* Minimum in-band energy threshold */
9731 21, /* 21/32 in-band to broad-band ratio */
9732 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9735 28376, /* A1 = -1.731934 */
9736 -32567, /* A2 = 0.993896 */
9737 -363, /* B2 = -0.011102 */
9738 0, /* B1 = 0.000000 */
9739 363, /* B0 = 0.011102 */
9740 28337, /* A1 = -1.729614 */
9741 -32683, /* A2 = 0.997434 */
9742 21766, /* B2 = 0.664246 */
9743 -18761, /* B1 = -1.145081 */
9744 21766, /* B0 = 0.664246 */
9745 28513, /* A1 = -1.740356 */
9746 -32686, /* A2 = 0.997498 */
9747 2509, /* B2 = 0.076584 */
9748 -2196, /* B1 = -0.134041 */
9749 2509, /* B0 = 0.076584 */
9750 5, /* Internal filter scaling */
9751 159, /* Minimum in-band energy threshold */
9752 21, /* 21/32 in-band to broad-band ratio */
9753 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9756 27844, /* A1 = -1.699463 */
9757 -32563, /* A2 = 0.993744 */
9758 -366, /* B2 = -0.011187 */
9759 0, /* B1 = 0.000000 */
9760 366, /* B0 = 0.011187 */
9761 27797, /* A1 = -1.696655 */
9762 -32686, /* A2 = 0.997498 */
9763 22748, /* B2 = 0.694214 */
9764 -19235, /* B1 = -1.174072 */
9765 22748, /* B0 = 0.694214 */
9766 27995, /* A1 = -1.708740 */
9767 -32688, /* A2 = 0.997559 */
9768 2964, /* B2 = 0.090477 */
9769 -2546, /* B1 = -0.155449 */
9770 2964, /* B0 = 0.090477 */
9771 5, /* Internal filter scaling */
9772 159, /* Minimum in-band energy threshold */
9773 21, /* 21/32 in-band to broad-band ratio */
9774 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9777 27297, /* A1 = -1.666077 */
9778 -32551, /* A2 = 0.993408 */
9779 -345, /* B2 = -0.010540 */
9780 0, /* B1 = 0.000000 */
9781 345, /* B0 = 0.010540 */
9782 27240, /* A1 = -1.662598 */
9783 -32683, /* A2 = 0.997406 */
9784 22560, /* B2 = 0.688477 */
9785 -18688, /* B1 = -1.140625 */
9786 22560, /* B0 = 0.688477 */
9787 27461, /* A1 = -1.676147 */
9788 -32684, /* A2 = 0.997467 */
9789 3541, /* B2 = 0.108086 */
9790 -2985, /* B1 = -0.182220 */
9791 3541, /* B0 = 0.108086 */
9792 5, /* Internal filter scaling */
9793 159, /* Minimum in-band energy threshold */
9794 21, /* 21/32 in-band to broad-band ratio */
9795 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9798 27155, /* A1 = -1.657410 */
9799 -32551, /* A2 = 0.993408 */
9800 -462, /* B2 = -0.014117 */
9801 0, /* B1 = 0.000000 */
9802 462, /* B0 = 0.014117 */
9803 27097, /* A1 = -1.653870 */
9804 -32683, /* A2 = 0.997406 */
9805 32495, /* B2 = 0.991699 */
9806 -26776, /* B1 = -1.634338 */
9807 32495, /* B0 = 0.991699 */
9808 27321, /* A1 = -1.667542 */
9809 -32684, /* A2 = 0.997467 */
9810 1835, /* B2 = 0.056007 */
9811 -1539, /* B1 = -0.093948 */
9812 1835, /* B0 = 0.056007 */
9813 5, /* Internal filter scaling */
9814 159, /* Minimum in-band energy threshold */
9815 21, /* 21/32 in-band to broad-band ratio */
9816 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9819 19298, /* A1 = 1.177917 */
9820 -24471, /* A2 = -0.746796 */
9821 -4152, /* B2 = -0.126709 */
9823 4152, /* B0 = 0.126709 */
9824 12902, /* A1 = 0.787476 */
9825 -29091, /* A2 = -0.887817 */
9826 12491, /* B2 = 0.38121 */
9827 -1794, /* B1 = -0.109528 */
9828 12494, /* B0 = 0.381317 */
9829 26291, /* A1 = 1.604736 */
9830 -30470, /* A2 = -0.929901 */
9831 28859, /* B2 = 0.880737 */
9832 -26084, /* B1 = -1.592102 */
9833 28861, /* B0 = 0.880798 */
9834 7, /* Internal filter scaling */
9835 159, /* Minimum in-band energy threshold */
9836 21, /* 21/32 in-band to broad-band ratio */
9837 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9840 26867, /* A1 = -1.639832 */
9841 -32551, /* A2 = 0.993408 */
9842 -123, /* B2 = -0.003755 */
9843 0, /* B1 = 0.000000 */
9844 123, /* B0 = 0.003755 */
9845 26805, /* A1 = -1.636108 */
9846 -32683, /* A2 = 0.997406 */
9847 17297, /* B2 = 0.527863 */
9848 -14096, /* B1 = -0.860382 */
9849 17297, /* B0 = 0.527863 */
9850 27034, /* A1 = -1.650085 */
9851 -32684, /* A2 = 0.997467 */
9852 12958, /* B2 = 0.395477 */
9853 -10756, /* B1 = -0.656525 */
9854 12958, /* B0 = 0.395477 */
9855 5, /* Internal filter scaling */
9856 159, /* Minimum in-band energy threshold */
9857 21, /* 21/32 in-band to broad-band ratio */
9858 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9861 26413, /* A1 = -1.612122 */
9862 -32547, /* A2 = 0.993286 */
9863 -223, /* B2 = -0.006825 */
9864 0, /* B1 = 0.000000 */
9865 223, /* B0 = 0.006825 */
9866 26342, /* A1 = -1.607849 */
9867 -32686, /* A2 = 0.997498 */
9868 6391, /* B2 = 0.195053 */
9869 -5120, /* B1 = -0.312531 */
9870 6391, /* B0 = 0.195053 */
9871 26593, /* A1 = -1.623108 */
9872 -32688, /* A2 = 0.997559 */
9873 23681, /* B2 = 0.722717 */
9874 -19328, /* B1 = -1.179688 */
9875 23681, /* B0 = 0.722717 */
9876 5, /* Internal filter scaling */
9877 159, /* Minimum in-band energy threshold */
9878 21, /* 21/32 in-band to broad-band ratio */
9879 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9882 26168, /* A1 = -1.597209 */
9883 -32528, /* A2 = 0.992706 */
9884 -235, /* B2 = -0.007182 */
9885 0, /* B1 = 0.000000 */
9886 235, /* B0 = 0.007182 */
9887 26092, /* A1 = -1.592590 */
9888 -32675, /* A2 = 0.997192 */
9889 20823, /* B2 = 0.635498 */
9890 -16510, /* B1 = -1.007751 */
9891 20823, /* B0 = 0.635498 */
9892 26363, /* A1 = -1.609070 */
9893 -32677, /* A2 = 0.997253 */
9894 6739, /* B2 = 0.205688 */
9895 -5459, /* B1 = -0.333206 */
9896 6739, /* B0 = 0.205688 */
9897 5, /* Internal filter scaling */
9898 159, /* Minimum in-band energy threshold */
9899 21, /* 21/32 in-band to broad-band ratio */
9900 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9903 25641, /* A1 = -1.565063 */
9904 -32536, /* A2 = 0.992950 */
9905 -121, /* B2 = -0.003707 */
9906 0, /* B1 = 0.000000 */
9907 121, /* B0 = 0.003707 */
9908 25560, /* A1 = -1.560059 */
9909 -32684, /* A2 = 0.997437 */
9910 18341, /* B2 = 0.559753 */
9911 -14252, /* B1 = -0.869904 */
9912 18341, /* B0 = 0.559753 */
9913 25837, /* A1 = -1.577026 */
9914 -32684, /* A2 = 0.997467 */
9915 16679, /* B2 = 0.509003 */
9916 -13232, /* B1 = -0.807648 */
9917 16679, /* B0 = 0.509003 */
9918 5, /* Internal filter scaling */
9919 159, /* Minimum in-band energy threshold */
9920 21, /* 21/32 in-band to broad-band ratio */
9921 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9924 16415, /* A1 = 1.001953 */
9925 -23669, /* A2 = -0.722321 */
9926 -4549, /* B2 = -0.138847 */
9928 4549, /* B0 = 0.138847 */
9929 8456, /* A1 = 0.516174 */
9930 -28996, /* A2 = -0.884918 */
9931 13753, /* B2 = 0.419724 */
9932 -12, /* B1 = -0.000763 */
9933 13757, /* B0 = 0.419846 */
9934 24632, /* A1 = 1.503418 */
9935 -30271, /* A2 = -0.923828 */
9936 29070, /* B2 = 0.887146 */
9937 -25265, /* B1 = -1.542114 */
9938 29073, /* B0 = 0.887268 */
9939 7, /* Internal filter scaling */
9940 159, /* Minimum in-band energy threshold */
9941 21, /* 21/32 in-band to broad-band ratio */
9942 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9945 24806, /* A1 = -1.514099 */
9946 -32501, /* A2 = 0.991852 */
9947 -326, /* B2 = -0.009969 */
9948 0, /* B1 = 0.000000 */
9949 326, /* B0 = 0.009969 */
9950 24709, /* A1 = -1.508118 */
9951 -32659, /* A2 = 0.996674 */
9952 20277, /* B2 = 0.618835 */
9953 -15182, /* B1 = -0.926636 */
9954 20277, /* B0 = 0.618835 */
9955 25022, /* A1 = -1.527222 */
9956 -32661, /* A2 = 0.996735 */
9957 4320, /* B2 = 0.131836 */
9958 -3331, /* B1 = -0.203339 */
9959 4320, /* B0 = 0.131836 */
9960 5, /* Internal filter scaling */
9961 159, /* Minimum in-band energy threshold */
9962 21, /* 21/32 in-band to broad-band ratio */
9963 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9966 19776, /* A1 = 1.207092 */
9967 -27437, /* A2 = -0.837341 */
9968 -2666, /* B2 = -0.081371 */
9970 2666, /* B0 = 0.081371 */
9971 16302, /* A1 = 0.995026 */
9972 -30354, /* A2 = -0.926361 */
9973 10389, /* B2 = 0.317062 */
9974 -3327, /* B1 = -0.203064 */
9975 10389, /* B0 = 0.317062 */
9976 24299, /* A1 = 1.483154 */
9977 -30930, /* A2 = -0.943909 */
9978 25016, /* B2 = 0.763428 */
9979 -21171, /* B1 = -1.292236 */
9980 25016, /* B0 = 0.763428 */
9981 7, /* Internal filter scaling */
9982 159, /* Minimum in-band energy threshold */
9983 21, /* 21/32 in-band to broad-band ratio */
9984 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9987 20554, /* A1 = 1.254517 */
9988 -28764, /* A2 = -0.877838 */
9989 -2048, /* B2 = -0.062515 */
9991 2048, /* B0 = 0.062515 */
9992 18209, /* A1 = 1.11145 */
9993 -30951, /* A2 = -0.94458 */
9994 9390, /* B2 = 0.286575 */
9995 -3955, /* B1 = -0.241455 */
9996 9390, /* B0 = 0.286575 */
9997 23902, /* A1 = 1.458923 */
9998 -31286, /* A2 = -0.954803 */
9999 23252, /* B2 = 0.709595 */
10000 -19132, /* B1 = -1.167725 */
10001 23252, /* B0 = 0.709595 */
10002 7, /* Internal filter scaling */
10003 159, /* Minimum in-band energy threshold */
10004 21, /* 21/32 in-band to broad-band ratio */
10005 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10007 { /* f941_1477[] */
10008 17543, /* A1 = 1.07074 */
10009 -26220, /* A2 = -0.800201 */
10010 -3298, /* B2 = -0.100647 */
10012 3298, /* B0 = 0.100647 */
10013 12423, /* A1 = 0.75827 */
10014 -30036, /* A2 = -0.916626 */
10015 12651, /* B2 = 0.386078 */
10016 -2444, /* B1 = -0.14917 */
10017 12653, /* B0 = 0.386154 */
10018 23518, /* A1 = 1.435425 */
10019 -30745, /* A2 = -0.938293 */
10020 27282, /* B2 = 0.832581 */
10021 -22529, /* B1 = -1.375122 */
10022 27286, /* B0 = 0.832703 */
10023 7, /* Internal filter scaling */
10024 159, /* Minimum in-band energy threshold */
10025 21, /* 21/32 in-band to broad-band ratio */
10026 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10029 24104, /* A1 = -1.471252 */
10030 -32507, /* A2 = 0.992065 */
10031 -351, /* B2 = -0.010722 */
10032 0, /* B1 = 0.000000 */
10033 351, /* B0 = 0.010722 */
10034 23996, /* A1 = -1.464600 */
10035 -32671, /* A2 = 0.997040 */
10036 22848, /* B2 = 0.697266 */
10037 -16639, /* B1 = -1.015564 */
10038 22848, /* B0 = 0.697266 */
10039 24332, /* A1 = -1.485168 */
10040 -32673, /* A2 = 0.997101 */
10041 4906, /* B2 = 0.149727 */
10042 -3672, /* B1 = -0.224174 */
10043 4906, /* B0 = 0.149727 */
10044 5, /* Internal filter scaling */
10045 159, /* Minimum in-band energy threshold */
10046 21, /* 21/32 in-band to broad-band ratio */
10047 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10050 23967, /* A1 = -1.462830 */
10051 -32507, /* A2 = 0.992065 */
10052 -518, /* B2 = -0.015821 */
10053 0, /* B1 = 0.000000 */
10054 518, /* B0 = 0.015821 */
10055 23856, /* A1 = -1.456055 */
10056 -32671, /* A2 = 0.997040 */
10057 26287, /* B2 = 0.802246 */
10058 -19031, /* B1 = -1.161560 */
10059 26287, /* B0 = 0.802246 */
10060 24195, /* A1 = -1.476746 */
10061 -32673, /* A2 = 0.997101 */
10062 2890, /* B2 = 0.088196 */
10063 -2151, /* B1 = -0.131317 */
10064 2890, /* B0 = 0.088196 */
10065 5, /* Internal filter scaling */
10066 159, /* Minimum in-band energy threshold */
10067 21, /* 21/32 in-band to broad-band ratio */
10068 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10070 { /* f950_1400[] */
10071 18294, /* A1 = 1.116638 */
10072 -26962, /* A2 = -0.822845 */
10073 -2914, /* B2 = -0.088936 */
10075 2914, /* B0 = 0.088936 */
10076 14119, /* A1 = 0.861786 */
10077 -30227, /* A2 = -0.922455 */
10078 11466, /* B2 = 0.349945 */
10079 -2833, /* B1 = -0.172943 */
10080 11466, /* B0 = 0.349945 */
10081 23431, /* A1 = 1.430115 */
10082 -30828, /* A2 = -0.940796 */
10083 25331, /* B2 = 0.773071 */
10084 -20911, /* B1 = -1.276367 */
10085 25331, /* B0 = 0.773071 */
10086 7, /* Internal filter scaling */
10087 159, /* Minimum in-band energy threshold */
10088 21, /* 21/32 in-band to broad-band ratio */
10089 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10092 23521, /* A1 = -1.435608 */
10093 -32489, /* A2 = 0.991516 */
10094 -193, /* B2 = -0.005915 */
10095 0, /* B1 = 0.000000 */
10096 193, /* B0 = 0.005915 */
10097 23404, /* A1 = -1.428467 */
10098 -32655, /* A2 = 0.996582 */
10099 17740, /* B2 = 0.541412 */
10100 -12567, /* B1 = -0.767029 */
10101 17740, /* B0 = 0.541412 */
10102 23753, /* A1 = -1.449829 */
10103 -32657, /* A2 = 0.996613 */
10104 9090, /* B2 = 0.277405 */
10105 -6662, /* B1 = -0.406647 */
10106 9090, /* B0 = 0.277405 */
10107 5, /* Internal filter scaling */
10108 159, /* Minimum in-band energy threshold */
10109 21, /* 21/32 in-band to broad-band ratio */
10110 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10113 23071, /* A1 = -1.408203 */
10114 -32489, /* A2 = 0.991516 */
10115 -293, /* B2 = -0.008965 */
10116 0, /* B1 = 0.000000 */
10117 293, /* B0 = 0.008965 */
10118 22951, /* A1 = -1.400818 */
10119 -32655, /* A2 = 0.996582 */
10120 5689, /* B2 = 0.173645 */
10121 -3951, /* B1 = -0.241150 */
10122 5689, /* B0 = 0.173645 */
10123 23307, /* A1 = -1.422607 */
10124 -32657, /* A2 = 0.996613 */
10125 18692, /* B2 = 0.570435 */
10126 -13447, /* B1 = -0.820770 */
10127 18692, /* B0 = 0.570435 */
10128 5, /* Internal filter scaling */
10129 159, /* Minimum in-band energy threshold */
10130 21, /* 21/32 in-band to broad-band ratio */
10131 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10134 22701, /* A1 = -1.385620 */
10135 -32474, /* A2 = 0.991058 */
10136 -292, /* B2 = -0.008933 */
10137 0, /*163840 , B1 = 10.000000 */
10138 292, /* B0 = 0.008933 */
10139 22564, /* A1 = -1.377258 */
10140 -32655, /* A2 = 0.996552 */
10141 20756, /* B2 = 0.633423 */
10142 -14176, /* B1 = -0.865295 */
10143 20756, /* B0 = 0.633423 */
10144 22960, /* A1 = -1.401428 */
10145 -32657, /* A2 = 0.996613 */
10146 6520, /* B2 = 0.198990 */
10147 -4619, /* B1 = -0.281937 */
10148 6520, /* B0 = 0.198990 */
10149 5, /* Internal filter scaling */
10150 159, /* Minimum in-band energy threshold */
10151 21, /* 21/32 in-band to broad-band ratio */
10152 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10155 22142, /* A1 = -1.351501 */
10156 -32474, /* A2 = 0.991058 */
10157 -147, /* B2 = -0.004493 */
10158 0, /* B1 = 0.000000 */
10159 147, /* B0 = 0.004493 */
10160 22000, /* A1 = -1.342834 */
10161 -32655, /* A2 = 0.996552 */
10162 15379, /* B2 = 0.469360 */
10163 -10237, /* B1 = -0.624847 */
10164 15379, /* B0 = 0.469360 */
10165 22406, /* A1 = -1.367554 */
10166 -32657, /* A2 = 0.996613 */
10167 17491, /* B2 = 0.533783 */
10168 -12096, /* B1 = -0.738312 */
10169 17491, /* B0 = 0.533783 */
10170 5, /* Internal filter scaling */
10171 159, /* Minimum in-band energy threshold */
10172 21, /* 21/32 in-band to broad-band ratio */
10173 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10175 { /* f1100_1750[] */
10176 12973, /* A1 = 0.79184 */
10177 -24916, /* A2 = -0.760376 */
10178 6655, /* B2 = 0.203102 */
10179 367, /* B1 = 0.0224 */
10180 6657, /* B0 = 0.203171 */
10181 5915, /* A1 = 0.361053 */
10182 -29560, /* A2 = -0.90213 */
10183 -7777, /* B2 = -0.23735 */
10185 7777, /* B0 = 0.23735 */
10186 20510, /* A1 = 1.251892 */
10187 -30260, /* A2 = -0.923462 */
10188 26662, /* B2 = 0.81366 */
10189 -20573, /* B1 = -1.255737 */
10190 26668, /* B0 = 0.813843 */
10191 7, /* Internal filter scaling */
10192 159, /* Minimum in-band energy threshold */
10193 21, /* 21/32 in-band to broad-band ratio */
10194 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10197 20392, /* A1 = -1.244629 */
10198 -32460, /* A2 = 0.990601 */
10199 -270, /* B2 = -0.008240 */
10200 0, /* B1 = 0.000000 */
10201 270, /* B0 = 0.008240 */
10202 20218, /* A1 = -1.234009 */
10203 -32655, /* A2 = 0.996582 */
10204 21337, /* B2 = 0.651154 */
10205 -13044, /* B1 = -0.796143 */
10206 21337, /* B0 = 0.651154 */
10207 20684, /* A1 = -1.262512 */
10208 -32657, /* A2 = 0.996643 */
10209 8572, /* B2 = 0.261612 */
10210 -5476, /* B1 = -0.334244 */
10211 8572, /* B0 = 0.261612 */
10212 5, /* Internal filter scaling */
10213 159, /* Minimum in-band energy threshold */
10214 21, /* 21/32 in-band to broad-band ratio */
10215 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10218 19159, /* A1 = -1.169373 */
10219 -32456, /* A2 = 0.990509 */
10220 -335, /* B2 = -0.010252 */
10221 0, /* B1 = 0.000000 */
10222 335, /* B0 = 0.010252 */
10223 18966, /* A1 = -1.157593 */
10224 -32661, /* A2 = 0.996735 */
10225 6802, /* B2 = 0.207588 */
10226 -3900, /* B1 = -0.238098 */
10227 6802, /* B0 = 0.207588 */
10228 19467, /* A1 = -1.188232 */
10229 -32661, /* A2 = 0.996765 */
10230 25035, /* B2 = 0.764008 */
10231 -15049, /* B1 = -0.918579 */
10232 25035, /* B0 = 0.764008 */
10233 5, /* Internal filter scaling */
10234 159, /* Minimum in-band energy threshold */
10235 21, /* 21/32 in-band to broad-band ratio */
10236 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10239 18976, /* A1 = -1.158264 */
10240 -32439, /* A2 = 0.989990 */
10241 -183, /* B2 = -0.005588 */
10242 0, /* B1 = 0.000000 */
10243 183, /* B0 = 0.005588 */
10244 18774, /* A1 = -1.145874 */
10245 -32650, /* A2 = 0.996429 */
10246 15468, /* B2 = 0.472076 */
10247 -8768, /* B1 = -0.535217 */
10248 15468, /* B0 = 0.472076 */
10249 19300, /* A1 = -1.177979 */
10250 -32652, /* A2 = 0.996490 */
10251 19840, /* B2 = 0.605499 */
10252 -11842, /* B1 = -0.722809 */
10253 19840, /* B0 = 0.605499 */
10254 5, /* Internal filter scaling */
10255 159, /* Minimum in-band energy threshold */
10256 21, /* 21/32 in-band to broad-band ratio */
10257 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10260 16357, /* A1 = -0.998413 */
10261 -32368, /* A2 = 0.987793 */
10262 -217, /* B2 = -0.006652 */
10263 0, /* B1 = 0.000000 */
10264 217, /* B0 = 0.006652 */
10265 16107, /* A1 = -0.983126 */
10266 -32601, /* A2 = 0.994904 */
10267 11602, /* B2 = 0.354065 */
10268 -5555, /* B1 = -0.339111 */
10269 11602, /* B0 = 0.354065 */
10270 16722, /* A1 = -1.020630 */
10271 -32603, /* A2 = 0.994965 */
10272 15574, /* B2 = 0.475311 */
10273 -8176, /* B1 = -0.499069 */
10274 15574, /* B0 = 0.475311 */
10275 5, /* Internal filter scaling */
10276 159, /* Minimum in-band energy threshold */
10277 21, /* 21/32 in-band to broad-band ratio */
10278 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10281 16234, /* A1 = -0.990875 */
10282 32404, /* A2 = -0.988922 */
10283 -193, /* B2 = -0.005908 */
10284 0, /* B1 = 0.000000 */
10285 193, /* B0 = 0.005908 */
10286 15986, /* A1 = -0.975769 */
10287 -32632, /* A2 = 0.995880 */
10288 18051, /* B2 = 0.550903 */
10289 -8658, /* B1 = -0.528473 */
10290 18051, /* B0 = 0.550903 */
10291 16591, /* A1 = -1.012695 */
10292 -32634, /* A2 = 0.995941 */
10293 15736, /* B2 = 0.480240 */
10294 -8125, /* B1 = -0.495926 */
10295 15736, /* B0 = 0.480240 */
10296 5, /* Internal filter scaling */
10297 159, /* Minimum in-band energy threshold */
10298 21, /* 21/32 in-band to broad-band ratio */
10299 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10302 15564, /* A1 = -0.949982 */
10303 -32404, /* A2 = 0.988922 */
10304 -269, /* B2 = -0.008216 */
10305 0, /* B1 = 0.000000 */
10306 269, /* B0 = 0.008216 */
10307 15310, /* A1 = -0.934479 */
10308 -32632, /* A2 = 0.995880 */
10309 10815, /* B2 = 0.330063 */
10310 -4962, /* B1 = -0.302887 */
10311 10815, /* B0 = 0.330063 */
10312 15924, /* A1 = -0.971924 */
10313 -32634, /* A2 = 0.995941 */
10314 18880, /* B2 = 0.576172 */
10315 -9364, /* B1 = -0.571594 */
10316 18880, /* B0 = 0.576172 */
10317 5, /* Internal filter scaling */
10318 159, /* Minimum in-band energy threshold */
10319 21, /* 21/32 in-band to broad-band ratio */
10320 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10323 15247, /* A1 = -0.930603 */
10324 -32397, /* A2 = 0.988708 */
10325 -244, /* B2 = -0.007451 */
10326 0, /* B1 = 0.000000 */
10327 244, /* B0 = 0.007451 */
10328 14989, /* A1 = -0.914886 */
10329 -32627, /* A2 = 0.995697 */
10330 18961, /* B2 = 0.578644 */
10331 -8498, /* B1 = -0.518707 */
10332 18961, /* B0 = 0.578644 */
10333 15608, /* A1 = -0.952667 */
10334 -32628, /* A2 = 0.995758 */
10335 11145, /* B2 = 0.340134 */
10336 -5430, /* B1 = -0.331467 */
10337 11145, /* B0 = 0.340134 */
10338 5, /* Internal filter scaling */
10339 159, /* Minimum in-band energy threshold */
10340 21, /* 21/32 in-band to broad-band ratio */
10341 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10344 14780, /* A1 = -0.902130 */
10345 -32393, /* A2 = 0.988586 */
10346 -396, /* B2 = -0.012086 */
10347 0, /* B1 = 0.000000 */
10348 396, /* B0 = 0.012086 */
10349 14510, /* A1 = -0.885651 */
10350 -32630, /* A2 = 0.995819 */
10351 6326, /* B2 = 0.193069 */
10352 -2747, /* B1 = -0.167671 */
10353 6326, /* B0 = 0.193069 */
10354 15154, /* A1 = -0.924957 */
10355 -32632, /* A2 = 0.995850 */
10356 23235, /* B2 = 0.709076 */
10357 -10983, /* B1 = -0.670380 */
10358 23235, /* B0 = 0.709076 */
10359 5, /* Internal filter scaling */
10360 159, /* Minimum in-band energy threshold */
10361 21, /* 21/32 in-band to broad-band ratio */
10362 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10365 13005, /* A1 = -0.793793 */
10366 -32368, /* A2 = 0.987823 */
10367 -500, /* B2 = -0.015265 */
10368 0, /* B1 = 0.000000 */
10369 500, /* B0 = 0.015265 */
10370 12708, /* A1 = -0.775665 */
10371 -32615, /* A2 = 0.995331 */
10372 11420, /* B2 = 0.348526 */
10373 -4306, /* B1 = -0.262833 */
10374 11420, /* B0 = 0.348526 */
10375 13397, /* A1 = -0.817688 */
10376 -32615, /* A2 = 0.995361 */
10377 9454, /* B2 = 0.288528 */
10378 -3981, /* B1 = -0.243027 */
10379 9454, /* B0 = 0.288528 */
10380 5, /* Internal filter scaling */
10381 159, /* Minimum in-band energy threshold */
10382 21, /* 21/32 in-band to broad-band ratio */
10383 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10386 10046, /* A1 = -0.613190 */
10387 -32331, /* A2 = 0.986694 */
10388 -455, /* B2 = -0.013915 */
10389 0, /* B1 = 0.000000 */
10390 455, /* B0 = 0.013915 */
10391 9694, /* A1 = -0.591705 */
10392 -32601, /* A2 = 0.994934 */
10393 6023, /* B2 = 0.183815 */
10394 -1708, /* B1 = -0.104279 */
10395 6023, /* B0 = 0.183815 */
10396 10478, /* A1 = -0.639587 */
10397 -32603, /* A2 = 0.994965 */
10398 22031, /* B2 = 0.672333 */
10399 -7342, /* B1 = -0.448151 */
10400 22031, /* B0 = 0.672333 */
10401 5, /* Internal filter scaling */
10402 159, /* Minimum in-band energy threshold */
10403 21, /* 21/32 in-band to broad-band ratio */
10404 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10406 { /* f1633_1638[] */
10407 9181, /* A1 = 0.560394 */
10408 -32256, /* A2 = -0.984375 */
10409 -556, /* B2 = -0.016975 */
10411 556, /* B0 = 0.016975 */
10412 8757, /* A1 = 0.534515 */
10413 -32574, /* A2 = -0.99408 */
10414 8443, /* B2 = 0.25769 */
10415 -2135, /* B1 = -0.130341 */
10416 8443, /* B0 = 0.25769 */
10417 9691, /* A1 = 0.591522 */
10418 -32574, /* A2 = -0.99411 */
10419 15446, /* B2 = 0.471375 */
10420 -4809, /* B1 = -0.293579 */
10421 15446, /* B0 = 0.471375 */
10422 7, /* Internal filter scaling */
10423 159, /* Minimum in-band energy threshold */
10424 21, /* 21/32 in-band to broad-band ratio */
10425 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10428 5076, /* A1 = -0.309875 */
10429 -32304, /* A2 = 0.985840 */
10430 -508, /* B2 = -0.015503 */
10431 0, /* B1 = 0.000000 */
10432 508, /* B0 = 0.015503 */
10433 4646, /* A1 = -0.283600 */
10434 -32605, /* A2 = 0.995026 */
10435 6742, /* B2 = 0.205780 */
10436 -878, /* B1 = -0.053635 */
10437 6742, /* B0 = 0.205780 */
10438 5552, /* A1 = -0.338928 */
10439 -32605, /* A2 = 0.995056 */
10440 23667, /* B2 = 0.722260 */
10441 -4297, /* B1 = -0.262329 */
10442 23667, /* B0 = 0.722260 */
10443 5, /* Internal filter scaling */
10444 159, /* Minimum in-band energy threshold */
10445 21, /* 21/32 in-band to broad-band ratio */
10446 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10449 3569, /* A1 = -0.217865 */
10450 -32292, /* A2 = 0.985504 */
10451 -239, /* B2 = -0.007322 */
10452 0, /* B1 = 0.000000 */
10453 239, /* B0 = 0.007322 */
10454 3117, /* A1 = -0.190277 */
10455 -32603, /* A2 = 0.994965 */
10456 18658, /* B2 = 0.569427 */
10457 -1557, /* B1 = -0.095032 */
10458 18658, /* B0 = 0.569427 */
10459 4054, /* A1 = -0.247437 */
10460 -32603, /* A2 = 0.994965 */
10461 18886, /* B2 = 0.576385 */
10462 -2566, /* B1 = -0.156647 */
10463 18886, /* B0 = 0.576385 */
10464 5, /* Internal filter scaling */
10465 159, /* Minimum in-band energy threshold */
10466 21, /* 21/32 in-band to broad-band ratio */
10467 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10470 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10472 unsigned short cmd;
10475 if (jf->filter > 3) {
10478 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10482 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10488 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10491 /* Select the filter (f0 - f3) to use. */
10492 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10495 if (jf->freq < 12 && jf->freq > 3) {
10496 /* Select the frequency for the selected filter. */
10497 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10499 } else if (jf->freq > 11) {
10500 /* We need to load a programmable filter set for undefined */
10501 /* frequencies. So we will point the filter to a programmable set. */
10502 /* Since there are only 4 filters and 4 programmable sets, we will */
10503 /* just point the filter to the same number set and program it for the */
10504 /* frequency we want. */
10505 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10507 if (j->ver.low != 0x12) {
10514 if (ixj_WriteDSPCommand(cmd, j))
10516 for (cnt = 0; cnt < max; cnt++) {
10517 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10521 j->filter_en[jf->filter] = jf->enable;
10525 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10527 unsigned short cmd;
10529 if (jfr->filter > 3) {
10532 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10535 if (!jfr->enable) {
10536 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10541 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10543 /* Select the filter (f0 - f3) to use. */
10544 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10547 /* We need to load a programmable filter set for undefined */
10548 /* frequencies. So we will point the filter to a programmable set. */
10549 /* Since there are only 4 filters and 4 programmable sets, we will */
10550 /* just point the filter to the same number set and program it for the */
10551 /* frequency we want. */
10552 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10554 if (j->ver.low != 0x12) {
10561 if (ixj_WriteDSPCommand(cmd, j))
10563 for (cnt = 0; cnt < max; cnt++) {
10564 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10567 j->filter_en[jfr->filter] = jfr->enable;
10571 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10574 unsigned short data;
10587 if(ti->tone_index > 12 && ti->tone_index < 28)
10589 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10591 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10594 if (ixj_WriteDSPCommand(data, j))
10597 if (ixj_WriteDSPCommand(data, j))