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_PARM(ixjdebug, "i");
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_DownloadG729 = &Stub;
410 static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
411 static IXJ_REGFUNC ixj_PreRead = &Stub;
412 static IXJ_REGFUNC ixj_PostRead = &Stub;
413 static IXJ_REGFUNC ixj_PreWrite = &Stub;
414 static IXJ_REGFUNC ixj_PostWrite = &Stub;
415 static IXJ_REGFUNC ixj_PreIoctl = &Stub;
416 static IXJ_REGFUNC ixj_PostIoctl = &Stub;
418 static void ixj_read_frame(IXJ *j);
419 static void ixj_write_frame(IXJ *j);
420 static void ixj_init_timer(IXJ *j);
421 static void ixj_add_timer(IXJ * j);
422 static void ixj_timeout(unsigned long ptr);
423 static int read_filters(IXJ *j);
424 static int LineMonitor(IXJ *j);
425 static int ixj_fasync(int fd, struct file *, int mode);
426 static int ixj_set_port(IXJ *j, int arg);
427 static int ixj_set_pots(IXJ *j, int arg);
428 static int ixj_hookstate(IXJ *j);
429 static int ixj_record_start(IXJ *j);
430 static void ixj_record_stop(IXJ *j);
431 static void set_rec_volume(IXJ *j, int volume);
432 static int get_rec_volume(IXJ *j);
433 static int set_rec_codec(IXJ *j, int rate);
434 static void ixj_vad(IXJ *j, int arg);
435 static int ixj_play_start(IXJ *j);
436 static void ixj_play_stop(IXJ *j);
437 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
438 static int ixj_set_tone_off(unsigned short, IXJ *j);
439 static int ixj_play_tone(IXJ *j, char tone);
440 static void ixj_aec_start(IXJ *j, int level);
441 static int idle(IXJ *j);
442 static void ixj_ring_on(IXJ *j);
443 static void ixj_ring_off(IXJ *j);
444 static void aec_stop(IXJ *j);
445 static void ixj_ringback(IXJ *j);
446 static void ixj_busytone(IXJ *j);
447 static void ixj_dialtone(IXJ *j);
448 static void ixj_cpt_stop(IXJ *j);
449 static char daa_int_read(IXJ *j);
450 static char daa_CR_read(IXJ *j, int cr);
451 static int daa_set_mode(IXJ *j, int mode);
452 static int ixj_linetest(IXJ *j);
453 static int ixj_daa_write(IXJ *j);
454 static int ixj_daa_cid_read(IXJ *j);
455 static void DAA_Coeff_US(IXJ *j);
456 static void DAA_Coeff_UK(IXJ *j);
457 static void DAA_Coeff_France(IXJ *j);
458 static void DAA_Coeff_Germany(IXJ *j);
459 static void DAA_Coeff_Australia(IXJ *j);
460 static void DAA_Coeff_Japan(IXJ *j);
461 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
462 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
463 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
464 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp);
465 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp);
466 /* Serial Control Interface funtions */
467 static int SCI_Control(IXJ *j, int control);
468 static int SCI_Prepare(IXJ *j);
469 static int SCI_WaitHighSCI(IXJ *j);
470 static int SCI_WaitLowSCI(IXJ *j);
471 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
472 static int ixj_PCcontrol_wait(IXJ *j);
473 static void ixj_pre_cid(IXJ *j);
474 static void ixj_write_cid(IXJ *j);
475 static void ixj_write_cid_bit(IXJ *j, int bit);
476 static int set_base_frame(IXJ *j, int size);
477 static int set_play_codec(IXJ *j, int rate);
478 static void set_rec_depth(IXJ *j, int depth);
479 static int ixj_mixer(long val, IXJ *j);
481 /************************************************************************
482 CT8020/CT8021 Host Programmers Model
483 Host address Function Access
485 0-1 Aux Software Status Register (reserved) Read Only
486 2-3 Software Status Register Read Only
487 4-5 Aux Software Control Register (reserved) Read Write
488 6-7 Software Control Register Read Write
489 8-9 Hardware Status Register Read Only
490 A-B Hardware Control Register Read Write
491 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
492 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
493 ************************************************************************/
495 static inline void ixj_read_HSR(IXJ *j)
497 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
498 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
501 static inline int IsControlReady(IXJ *j)
504 return j->hsr.bits.controlrdy ? 1 : 0;
507 static inline int IsPCControlReady(IXJ *j)
509 j->pccr1.byte = inb_p(j->XILINXbase + 3);
510 return j->pccr1.bits.crr ? 1 : 0;
513 static inline int IsStatusReady(IXJ *j)
516 return j->hsr.bits.statusrdy ? 1 : 0;
519 static inline int IsRxReady(IXJ *j)
522 ixj_perfmon(j->rxreadycheck);
523 return j->hsr.bits.rxrdy ? 1 : 0;
526 static inline int IsTxReady(IXJ *j)
529 ixj_perfmon(j->txreadycheck);
530 return j->hsr.bits.txrdy ? 1 : 0;
533 static inline void set_play_volume(IXJ *j, int volume)
535 if (ixjdebug & 0x0002)
536 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
537 ixj_WriteDSPCommand(0xCF02, j);
538 ixj_WriteDSPCommand(volume, j);
541 static int set_play_volume_linear(IXJ *j, int volume)
543 int newvolume, dspplaymax;
545 if (ixjdebug & 0x0002)
546 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
547 if(volume > 100 || volume < 0) {
551 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
552 switch (j->cardtype) {
557 if(j->port == PORT_PSTN) {
563 case QTI_PHONEJACK_LITE:
566 case QTI_PHONEJACK_PCI:
575 newvolume = (dspplaymax * volume) / 100;
576 set_play_volume(j, newvolume);
580 static inline void set_play_depth(IXJ *j, int depth)
586 ixj_WriteDSPCommand(0x5280 + depth, j);
589 static inline int get_play_volume(IXJ *j)
591 ixj_WriteDSPCommand(0xCF00, j);
592 return j->ssr.high << 8 | j->ssr.low;
595 static int get_play_volume_linear(IXJ *j)
597 int volume, newvolume, dspplaymax;
599 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
600 switch (j->cardtype) {
605 if(j->port == PORT_PSTN) {
611 case QTI_PHONEJACK_LITE:
614 case QTI_PHONEJACK_PCI:
623 volume = get_play_volume(j);
624 newvolume = (volume * 100) / dspplaymax;
630 static inline BYTE SLIC_GetState(IXJ *j)
632 if (j->cardtype == QTI_PHONECARD) {
634 j->psccr.bits.dev = 3;
635 j->psccr.bits.rw = 1;
636 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
637 ixj_PCcontrol_wait(j);
638 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
639 ixj_PCcontrol_wait(j);
640 if (j->pslic.bits.powerdown)
641 return PLD_SLIC_STATE_OC;
642 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
643 return PLD_SLIC_STATE_ACTIVE;
645 return PLD_SLIC_STATE_RINGING;
647 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
649 return j->pld_slicr.bits.state;
652 static BOOL SLIC_SetState(BYTE byState, IXJ *j)
654 BOOL fRetVal = FALSE;
656 if (j->cardtype == QTI_PHONECARD) {
657 if (j->flags.pcmciasct) {
659 case PLD_SLIC_STATE_TIPOPEN:
660 case PLD_SLIC_STATE_OC:
661 j->pslic.bits.powerdown = 1;
662 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
665 case PLD_SLIC_STATE_RINGING:
666 if (j->readers || j->writers) {
667 j->pslic.bits.powerdown = 0;
668 j->pslic.bits.ring0 = 1;
669 j->pslic.bits.ring1 = 0;
673 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
675 case PLD_SLIC_STATE_STANDBY:
676 case PLD_SLIC_STATE_ACTIVE:
677 if (j->readers || j->writers) {
678 j->pslic.bits.powerdown = 0;
680 j->pslic.bits.powerdown = 1;
682 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
685 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
687 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
693 j->psccr.bits.dev = 3;
694 j->psccr.bits.rw = 0;
695 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
696 ixj_PCcontrol_wait(j);
699 /* Set the C1, C2, C3 & B2EN signals. */
701 case PLD_SLIC_STATE_OC:
702 j->pld_slicw.bits.c1 = 0;
703 j->pld_slicw.bits.c2 = 0;
704 j->pld_slicw.bits.c3 = 0;
705 j->pld_slicw.bits.b2en = 0;
706 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
709 case PLD_SLIC_STATE_RINGING:
710 j->pld_slicw.bits.c1 = 1;
711 j->pld_slicw.bits.c2 = 0;
712 j->pld_slicw.bits.c3 = 0;
713 j->pld_slicw.bits.b2en = 1;
714 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
717 case PLD_SLIC_STATE_ACTIVE:
718 j->pld_slicw.bits.c1 = 0;
719 j->pld_slicw.bits.c2 = 1;
720 j->pld_slicw.bits.c3 = 0;
721 j->pld_slicw.bits.b2en = 0;
722 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
725 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
727 j->pld_slicw.bits.c1 = 1;
728 j->pld_slicw.bits.c2 = 1;
729 j->pld_slicw.bits.c3 = 0;
730 j->pld_slicw.bits.b2en = 0;
731 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
734 case PLD_SLIC_STATE_TIPOPEN:
735 j->pld_slicw.bits.c1 = 0;
736 j->pld_slicw.bits.c2 = 0;
737 j->pld_slicw.bits.c3 = 1;
738 j->pld_slicw.bits.b2en = 0;
739 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
742 case PLD_SLIC_STATE_STANDBY:
743 j->pld_slicw.bits.c1 = 1;
744 j->pld_slicw.bits.c2 = 0;
745 j->pld_slicw.bits.c3 = 1;
746 j->pld_slicw.bits.b2en = 1;
747 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
750 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
752 j->pld_slicw.bits.c1 = 0;
753 j->pld_slicw.bits.c2 = 1;
754 j->pld_slicw.bits.c3 = 1;
755 j->pld_slicw.bits.b2en = 0;
756 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
759 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
761 j->pld_slicw.bits.c1 = 1;
762 j->pld_slicw.bits.c2 = 1;
763 j->pld_slicw.bits.c3 = 1;
764 j->pld_slicw.bits.b2en = 0;
765 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
777 static int ixj_wink(IXJ *j)
781 slicnow = SLIC_GetState(j);
783 j->pots_winkstart = jiffies;
784 SLIC_SetState(PLD_SLIC_STATE_OC, j);
786 while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
787 set_current_state(TASK_INTERRUPTIBLE);
791 SLIC_SetState(slicnow, j);
795 static int ixj_register(int index, IXJ_REGFUNC regfunc)
801 ixj_DownloadG729 = regfunc;
802 for (cnt = 0; cnt < IXJMAX; cnt++) {
803 IXJ *j = get_ixj(cnt);
804 while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
805 set_current_state(TASK_INTERRUPTIBLE);
808 ixj_DownloadG729(j, 0L);
809 clear_bit(cnt, &j->busyflags);
813 ixj_DownloadTS85 = regfunc;
814 for (cnt = 0; cnt < IXJMAX; cnt++) {
815 IXJ *j = get_ixj(cnt);
816 while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
817 set_current_state(TASK_INTERRUPTIBLE);
820 ixj_DownloadTS85(j, 0L);
821 clear_bit(cnt, &j->busyflags);
825 ixj_PreRead = regfunc;
828 ixj_PostRead = regfunc;
831 ixj_PreWrite = regfunc;
834 ixj_PostWrite = regfunc;
837 ixj_PreIoctl = regfunc;
840 ixj_PostIoctl = regfunc;
848 EXPORT_SYMBOL(ixj_register);
850 static int ixj_unregister(int index)
855 ixj_DownloadG729 = &Stub;
858 ixj_DownloadTS85 = &Stub;
864 ixj_PostRead = &Stub;
867 ixj_PreWrite = &Stub;
870 ixj_PostWrite = &Stub;
873 ixj_PreIoctl = &Stub;
876 ixj_PostIoctl = &Stub;
884 EXPORT_SYMBOL(ixj_unregister);
886 static void ixj_init_timer(IXJ *j)
888 init_timer(&j->timer);
889 j->timer.function = ixj_timeout;
890 j->timer.data = (unsigned long)j;
893 static void ixj_add_timer(IXJ *j)
895 j->timer.expires = jiffies + (hertz / samplerate);
896 add_timer(&j->timer);
899 static void ixj_tone_timeout(IXJ *j)
904 if (j->tone_state == 3) {
907 j->tone_cadence_state++;
908 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
909 switch (j->cadence_t->termination) {
913 case REPEAT_LAST_ELEMENT:
914 j->tone_cadence_state--;
915 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
918 j->tone_cadence_state = 0;
919 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
920 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
921 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
922 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
923 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
924 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
925 ixj_init_tone(j, &ti);
927 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
928 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
929 ixj_play_tone(j, j->cadence_t->ce[0].index);
933 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
934 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
935 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
936 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
937 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
938 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
939 ixj_init_tone(j, &ti);
941 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
942 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
943 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
949 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
951 if(j->ixj_signals[event]) {
952 if(ixjdebug & 0x0100)
953 printk("Sending signal for event %d\n", event);
954 /* Send apps notice of change */
955 /* see config.h for macro definition */
956 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
960 static void ixj_pstn_state(IXJ *j)
963 union XOPXR0 XR0, daaint;
967 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
969 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
971 j->pld_scrr.byte = inb_p(j->XILINXbase);
972 if (j->pld_scrr.bits.daaflag) {
974 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
975 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
976 daaint.bitreg.RING = 1;
977 if(ixjdebug & 0x0008) {
978 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
981 daa_set_mode(j, SOP_PU_RESET);
984 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
985 daaint.bitreg.Caller_ID = 1;
986 j->pstn_cid_intr = 1;
987 j->pstn_cid_received = jiffies;
988 if(ixjdebug & 0x0008) {
989 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
992 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
993 daaint.bitreg.Cadence = 1;
994 if(ixjdebug & 0x0008) {
995 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
998 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
999 daaint.bitreg.VDD_OK = 1;
1000 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
1004 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)) {
1005 daaint.bitreg.RMR = 1;
1006 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
1007 if(ixjdebug & 0x0008) {
1008 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);
1010 j->pstn_prev_rmr = j->pstn_last_rmr;
1011 j->pstn_last_rmr = jiffies;
1013 switch(j->daa_mode) {
1015 if (daaint.bitreg.RING) {
1016 if (!j->flags.pstn_ringing) {
1017 if (j->daa_mode != SOP_PU_RINGING) {
1018 j->pstn_ring_int = jiffies;
1019 daa_set_mode(j, SOP_PU_RINGING);
1024 case SOP_PU_RINGING:
1025 if (daaint.bitreg.RMR) {
1026 if (ixjdebug & 0x0008) {
1027 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1029 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
1030 j->flags.pstn_rmr = 1;
1031 j->pstn_ring_start = jiffies;
1032 j->pstn_ring_stop = 0;
1033 j->ex.bits.pstn_ring = 0;
1034 if (j->cadence_f[4].state == 0) {
1035 j->cadence_f[4].state = 1;
1036 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
1037 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
1038 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
1039 } else if (j->cadence_f[4].state == 2) {
1040 if((time_after(jiffies, j->cadence_f[4].off1min) &&
1041 time_before(jiffies, j->cadence_f[4].off1max))) {
1042 if (j->cadence_f[4].on2) {
1043 j->cadence_f[4].state = 3;
1044 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
1045 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
1046 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
1048 j->cadence_f[4].state = 7;
1051 if (ixjdebug & 0x0008) {
1052 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1053 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1054 j->cadence_f[4].off1);
1056 j->cadence_f[4].state = 0;
1058 } else if (j->cadence_f[4].state == 4) {
1059 if((time_after(jiffies, j->cadence_f[4].off2min) &&
1060 time_before(jiffies, j->cadence_f[4].off2max))) {
1061 if (j->cadence_f[4].on3) {
1062 j->cadence_f[4].state = 5;
1063 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
1064 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
1065 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
1067 j->cadence_f[4].state = 7;
1070 if (ixjdebug & 0x0008) {
1071 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1072 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1073 j->cadence_f[4].off2);
1075 j->cadence_f[4].state = 0;
1077 } else if (j->cadence_f[4].state == 6) {
1078 if((time_after(jiffies, j->cadence_f[4].off3min) &&
1079 time_before(jiffies, j->cadence_f[4].off3max))) {
1080 j->cadence_f[4].state = 7;
1082 if (ixjdebug & 0x0008) {
1083 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1084 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1085 j->cadence_f[4].off3);
1087 j->cadence_f[4].state = 0;
1090 j->cadence_f[4].state = 0;
1092 } else { /* Falling edge of RMR */
1093 j->pstn_ring_start = 0;
1094 j->pstn_ring_stop = jiffies;
1095 if (j->cadence_f[4].state == 1) {
1096 if(!j->cadence_f[4].on1) {
1097 j->cadence_f[4].state = 7;
1098 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1099 time_before(jiffies, j->cadence_f[4].on1max))) {
1100 if (j->cadence_f[4].off1) {
1101 j->cadence_f[4].state = 2;
1102 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1103 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1104 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1106 j->cadence_f[4].state = 7;
1109 if (ixjdebug & 0x0008) {
1110 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1111 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1112 j->cadence_f[4].on1);
1114 j->cadence_f[4].state = 0;
1116 } else if (j->cadence_f[4].state == 3) {
1117 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1118 time_before(jiffies, j->cadence_f[4].on2max))) {
1119 if (j->cadence_f[4].off2) {
1120 j->cadence_f[4].state = 4;
1121 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1122 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1123 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1125 j->cadence_f[4].state = 7;
1128 if (ixjdebug & 0x0008) {
1129 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1130 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1131 j->cadence_f[4].on2);
1133 j->cadence_f[4].state = 0;
1135 } else if (j->cadence_f[4].state == 5) {
1136 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1137 time_before(jiffies, j->cadence_f[4].on3max))) {
1138 if (j->cadence_f[4].off3) {
1139 j->cadence_f[4].state = 6;
1140 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1141 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1142 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1144 j->cadence_f[4].state = 7;
1147 j->cadence_f[4].state = 0;
1150 if (ixjdebug & 0x0008) {
1151 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1152 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1153 j->cadence_f[4].on3);
1155 j->cadence_f[4].state = 0;
1158 if (ixjdebug & 0x0010) {
1159 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1161 if (ixjdebug & 0x0010) {
1162 switch(j->cadence_f[4].state) {
1164 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1165 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1168 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1169 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1172 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1173 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1176 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1177 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1180 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1181 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1184 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1185 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1190 if (j->cadence_f[4].state == 7) {
1191 j->cadence_f[4].state = 0;
1192 j->pstn_ring_stop = jiffies;
1193 j->ex.bits.pstn_ring = 1;
1194 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1195 if(ixjdebug & 0x0008) {
1196 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1199 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1200 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1201 if(ixjdebug & 0x0008) {
1202 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1203 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1204 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1206 j->pstn_ring_stop = j->pstn_ring_int = 0;
1207 daa_set_mode(j, SOP_PU_SLEEP);
1209 outb_p(j->pld_scrw.byte, j->XILINXbase);
1210 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1211 ixj_daa_cid_read(j);
1212 j->ex.bits.caller_id = 1;
1213 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1214 j->pstn_cid_intr = 0;
1216 if (daaint.bitreg.Cadence) {
1217 if(ixjdebug & 0x0008) {
1218 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1220 daa_set_mode(j, SOP_PU_SLEEP);
1221 j->ex.bits.pstn_ring = 0;
1224 case SOP_PU_CONVERSATION:
1225 if (daaint.bitreg.VDD_OK) {
1226 if(!daaint.bitreg.SI_0) {
1227 if (!j->pstn_winkstart) {
1228 if(ixjdebug & 0x0008) {
1229 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1231 j->pstn_winkstart = jiffies;
1234 if (j->pstn_winkstart) {
1235 if(ixjdebug & 0x0008) {
1236 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1238 j->pstn_winkstart = 0;
1242 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1243 if(ixjdebug & 0x0008) {
1244 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1246 daa_set_mode(j, SOP_PU_SLEEP);
1247 j->pstn_winkstart = 0;
1248 j->ex.bits.pstn_wink = 1;
1249 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1255 static void ixj_timeout(unsigned long ptr)
1258 unsigned long jifon;
1259 IXJ *j = (IXJ *)ptr;
1262 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1263 ixj_perfmon(j->timerchecks);
1264 j->hookstate = ixj_hookstate(j);
1265 if (j->tone_state) {
1266 if (!(j->hookstate)) {
1270 j->ex.bits.hookstate = 1;
1271 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1273 clear_bit(board, &j->busyflags);
1277 if (j->tone_state == 1)
1278 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1280 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1281 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1282 if (j->tone_state == 1) {
1283 ixj_play_tone(j, j->tone_index);
1284 if (j->dsp.low == 0x20) {
1285 clear_bit(board, &j->busyflags);
1290 ixj_play_tone(j, 0);
1291 if (j->dsp.low == 0x20) {
1292 clear_bit(board, &j->busyflags);
1298 ixj_tone_timeout(j);
1299 if (j->flags.dialtone) {
1302 if (j->flags.busytone) {
1304 if (j->dsp.low == 0x20) {
1305 clear_bit(board, &j->busyflags);
1310 if (j->flags.ringback) {
1312 if (j->dsp.low == 0x20) {
1313 clear_bit(board, &j->busyflags);
1318 if (!j->tone_state) {
1323 if (!(j->tone_state && j->dsp.low == 0x20)) {
1331 if (j->flags.cringing) {
1332 if (j->hookstate & 1) {
1333 j->flags.cringing = 0;
1335 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1336 switch(j->cadence_f[5].state) {
1338 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1339 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1340 if(ixjdebug & 0x0004) {
1341 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1345 j->cadence_f[5].state = 1;
1348 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1349 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1350 if(ixjdebug & 0x0004) {
1351 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1354 j->cadence_f[5].state = 2;
1358 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1359 if(ixjdebug & 0x0004) {
1360 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1363 if (j->cadence_f[5].on2) {
1364 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1365 j->cadence_f[5].state = 3;
1367 j->cadence_f[5].state = 7;
1372 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1373 if(ixjdebug & 0x0004) {
1374 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1377 if (j->cadence_f[5].off2) {
1378 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1379 j->cadence_f[5].state = 4;
1381 j->cadence_f[5].state = 7;
1386 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1387 if(ixjdebug & 0x0004) {
1388 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1391 if (j->cadence_f[5].on3) {
1392 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1393 j->cadence_f[5].state = 5;
1395 j->cadence_f[5].state = 7;
1400 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1401 if(ixjdebug & 0x0004) {
1402 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1405 if (j->cadence_f[5].off3) {
1406 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1407 j->cadence_f[5].state = 6;
1409 j->cadence_f[5].state = 7;
1414 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1415 if(ixjdebug & 0x0004) {
1416 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1418 j->cadence_f[5].state = 7;
1422 if(ixjdebug & 0x0004) {
1423 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1425 j->flags.cidring = 1;
1426 j->cadence_f[5].state = 0;
1429 if (j->flags.cidring && !j->flags.cidsent) {
1430 j->flags.cidsent = 1;
1432 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1435 j->flags.cidring = 0;
1437 clear_bit(board, &j->busyflags);
1441 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1442 if (j->flags.cidring && !j->flags.cidsent) {
1443 j->flags.cidsent = 1;
1445 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1448 j->flags.cidring = 0;
1450 j->ring_cadence_t--;
1451 if (j->ring_cadence_t == -1)
1452 j->ring_cadence_t = 15;
1453 j->ring_cadence_jif = jiffies;
1455 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1456 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1457 j->flags.firstring = 1;
1462 if(!j->flags.cidsent)
1463 j->flags.cidring = 1;
1466 clear_bit(board, &j->busyflags);
1471 if (!j->flags.ringing) {
1472 if (j->hookstate) { /* & 1) { */
1473 if (j->dsp.low != 0x20 &&
1474 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1475 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1479 ixj_WriteDSPCommand(0x511B, j);
1480 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1481 if (!j->m_hook && (j->hookstate & 1)) {
1482 j->m_hook = j->ex.bits.hookstate = 1;
1483 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1486 if (j->ex.bits.dtmf_ready) {
1487 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1491 j->ex.bits.hookstate = 1;
1492 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1496 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1500 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1502 clear_bit(board, &j->busyflags);
1507 static int ixj_status_wait(IXJ *j)
1511 jif = jiffies + ((60 * hertz) / 100);
1512 while (!IsStatusReady(j)) {
1513 ixj_perfmon(j->statuswait);
1514 if (time_after(jiffies, jif)) {
1515 ixj_perfmon(j->statuswaitfail);
1522 static int ixj_PCcontrol_wait(IXJ *j)
1526 jif = jiffies + ((60 * hertz) / 100);
1527 while (!IsPCControlReady(j)) {
1528 ixj_perfmon(j->pcontrolwait);
1529 if (time_after(jiffies, jif)) {
1530 ixj_perfmon(j->pcontrolwaitfail);
1537 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1542 atomic_inc(&j->DSPWrite);
1543 if(atomic_read(&j->DSPWrite) > 1) {
1544 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1547 bytes.high = (cmd & 0xFF00) >> 8;
1548 bytes.low = cmd & 0x00FF;
1549 jif = jiffies + ((60 * hertz) / 100);
1550 while (!IsControlReady(j)) {
1551 ixj_perfmon(j->iscontrolready);
1552 if (time_after(jiffies, jif)) {
1553 ixj_perfmon(j->iscontrolreadyfail);
1554 atomic_dec(&j->DSPWrite);
1555 if(atomic_read(&j->DSPWrite) > 0) {
1556 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1557 while(atomic_read(&j->DSPWrite) > 0) {
1558 atomic_dec(&j->DSPWrite);
1564 outb(bytes.low, j->DSPbase + 6);
1565 outb(bytes.high, j->DSPbase + 7);
1567 if (ixj_status_wait(j)) {
1570 atomic_dec(&j->DSPWrite);
1571 if(atomic_read(&j->DSPWrite) > 0) {
1572 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1573 while(atomic_read(&j->DSPWrite) > 0) {
1574 atomic_dec(&j->DSPWrite);
1579 /* Read Software Status Register */
1580 j->ssr.low = inb_p(j->DSPbase + 2);
1581 j->ssr.high = inb_p(j->DSPbase + 3);
1582 atomic_dec(&j->DSPWrite);
1583 if(atomic_read(&j->DSPWrite) > 0) {
1584 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1585 while(atomic_read(&j->DSPWrite) > 0) {
1586 atomic_dec(&j->DSPWrite);
1592 /***************************************************************************
1594 * General Purpose IO Register read routine
1596 ***************************************************************************/
1597 static inline int ixj_gpio_read(IXJ *j)
1599 if (ixj_WriteDSPCommand(0x5143, j))
1602 j->gpio.bytes.low = j->ssr.low;
1603 j->gpio.bytes.high = j->ssr.high;
1608 static inline void LED_SetState(int state, IXJ *j)
1610 if (j->cardtype == QTI_LINEJACK) {
1611 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1612 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1613 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1614 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1616 outb(j->pld_scrw.byte, j->XILINXbase);
1620 /*********************************************************************
1621 * GPIO Pins are configured as follows on the Quicknet Internet
1622 * PhoneJACK Telephony Cards
1624 * POTS Select GPIO_6=0 GPIO_7=0
1625 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1626 * Handset Select GPIO_6=1 GPIO_7=0
1628 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1629 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1630 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1632 * Hook Switch changes reported on GPIO_3
1633 *********************************************************************/
1634 static int ixj_set_port(IXJ *j, int arg)
1636 if (j->cardtype == QTI_PHONEJACK_LITE) {
1637 if (arg != PORT_POTS)
1644 j->port = PORT_POTS;
1645 switch (j->cardtype) {
1647 if (j->flags.pcmciasct == 1)
1648 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1652 case QTI_PHONEJACK_PCI:
1653 j->pld_slicw.pcib.mic = 0;
1654 j->pld_slicw.pcib.spk = 0;
1655 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1658 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1659 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1660 Software Control Register */
1662 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1664 outb(j->pld_scrw.byte, j->XILINXbase);
1665 j->pld_clock.byte = 0;
1666 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1667 j->pld_slicw.bits.rly1 = 1;
1668 j->pld_slicw.bits.spken = 0;
1669 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1670 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1671 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1672 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1673 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1674 ixj_mixer(0x0E80, j); /*Mic mute */
1675 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1676 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1677 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1678 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1679 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1682 j->gpio.bytes.high = 0x0B;
1683 j->gpio.bits.gpio6 = 0;
1684 j->gpio.bits.gpio7 = 0;
1685 ixj_WriteDSPCommand(j->gpio.word, j);
1690 if (j->cardtype == QTI_LINEJACK) {
1691 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1693 j->pld_slicw.bits.rly3 = 0;
1694 j->pld_slicw.bits.rly1 = 1;
1695 j->pld_slicw.bits.spken = 0;
1696 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1697 j->port = PORT_PSTN;
1703 j->port = PORT_SPEAKER;
1704 switch (j->cardtype) {
1706 if (j->flags.pcmciasct) {
1707 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1710 case QTI_PHONEJACK_PCI:
1711 j->pld_slicw.pcib.mic = 1;
1712 j->pld_slicw.pcib.spk = 1;
1713 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1716 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1717 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1718 Software Control Register */
1720 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1722 outb(j->pld_scrw.byte, j->XILINXbase);
1723 j->pld_clock.byte = 0;
1724 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1725 j->pld_slicw.bits.rly1 = 1;
1726 j->pld_slicw.bits.spken = 1;
1727 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1728 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1729 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1730 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1731 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1732 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1733 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1734 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1735 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1738 j->gpio.bytes.high = 0x0B;
1739 j->gpio.bits.gpio6 = 0;
1740 j->gpio.bits.gpio7 = 1;
1741 ixj_WriteDSPCommand(j->gpio.word, j);
1746 if (j->cardtype != QTI_PHONEJACK) {
1749 j->gpio.bytes.high = 0x0B;
1750 j->gpio.bits.gpio6 = 1;
1751 j->gpio.bits.gpio7 = 0;
1752 ixj_WriteDSPCommand(j->gpio.word, j);
1753 j->port = PORT_HANDSET;
1763 static int ixj_set_pots(IXJ *j, int arg)
1765 if (j->cardtype == QTI_LINEJACK) {
1767 if (j->port == PORT_PSTN) {
1768 j->pld_slicw.bits.rly1 = 0;
1769 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1770 j->flags.pots_pstn = 1;
1773 j->flags.pots_pstn = 0;
1777 j->pld_slicw.bits.rly1 = 1;
1778 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1779 j->flags.pots_pstn = 0;
1787 static void ixj_ring_on(IXJ *j)
1789 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1791 if (ixjdebug & 0x0004)
1792 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1794 j->gpio.bytes.high = 0x0B;
1795 j->gpio.bytes.low = 0x00;
1796 j->gpio.bits.gpio1 = 1;
1797 j->gpio.bits.gpio2 = 1;
1798 j->gpio.bits.gpio5 = 0;
1799 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1800 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1802 if (ixjdebug & 0x0004)
1803 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1805 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1809 static int ixj_siadc(IXJ *j, int val)
1811 if(j->cardtype == QTI_PHONECARD){
1812 if(j->flags.pcmciascp){
1814 return j->siadc.bits.rxg;
1816 if(val < 0 || val > 0x1F)
1819 j->siadc.bits.hom = 0; /* Handset Out Mute */
1820 j->siadc.bits.lom = 0; /* Line Out Mute */
1821 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1822 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1823 j->psccr.bits.rw = 0; /* Read / Write flag */
1824 j->psccr.bits.dev = 0;
1825 outb(j->siadc.byte, j->XILINXbase + 0x00);
1826 outb(j->psccr.byte, j->XILINXbase + 0x01);
1827 ixj_PCcontrol_wait(j);
1828 return j->siadc.bits.rxg;
1834 static int ixj_sidac(IXJ *j, int val)
1836 if(j->cardtype == QTI_PHONECARD){
1837 if(j->flags.pcmciascp){
1839 return j->sidac.bits.txg;
1841 if(val < 0 || val > 0x1F)
1844 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1845 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1846 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1847 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1848 j->psccr.bits.rw = 0; /* Read / Write flag */
1849 j->psccr.bits.dev = 0;
1850 outb(j->sidac.byte, j->XILINXbase + 0x00);
1851 outb(j->psccr.byte, j->XILINXbase + 0x01);
1852 ixj_PCcontrol_wait(j);
1853 return j->sidac.bits.txg;
1859 static int ixj_pcmcia_cable_check(IXJ *j)
1861 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1862 if (!j->flags.pcmciastate) {
1863 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1864 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1865 j->flags.pcmciastate = 4;
1868 if (j->pccr1.bits.ed) {
1869 j->pccr1.bits.ed = 0;
1870 j->psccr.bits.dev = 3;
1871 j->psccr.bits.rw = 1;
1872 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1873 ixj_PCcontrol_wait(j);
1874 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1875 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1876 j->psccr.bits.dev = 3;
1877 j->psccr.bits.rw = 0;
1878 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1879 ixj_PCcontrol_wait(j);
1880 return j->pslic.bits.led2 ? 1 : 0;
1881 } else if (j->flags.pcmciasct) {
1886 } else if (j->flags.pcmciastate == 4) {
1887 if (!j->pccr1.bits.drf) {
1888 j->flags.pcmciastate = 3;
1891 } else if (j->flags.pcmciastate == 3) {
1892 j->pccr2.bits.pwr = 0;
1893 j->pccr2.bits.rstc = 1;
1894 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1895 j->checkwait = jiffies + (hertz * 2);
1896 j->flags.incheck = 1;
1897 j->flags.pcmciastate = 2;
1899 } else if (j->flags.pcmciastate == 2) {
1900 if (j->flags.incheck) {
1901 if (time_before(jiffies, j->checkwait)) {
1904 j->flags.incheck = 0;
1907 j->pccr2.bits.pwr = 0;
1908 j->pccr2.bits.rstc = 0;
1909 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1910 j->flags.pcmciastate = 1;
1912 } else if (j->flags.pcmciastate == 1) {
1913 j->flags.pcmciastate = 0;
1914 if (!j->pccr1.bits.drf) {
1915 j->psccr.bits.dev = 3;
1916 j->psccr.bits.rw = 1;
1917 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1918 ixj_PCcontrol_wait(j);
1919 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1921 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1923 if (j->flags.pcmciasct == 3) {
1924 j->flags.pcmciastate = 4;
1926 } else if (j->flags.pcmciasct == 0) {
1927 j->pccr2.bits.pwr = 1;
1928 j->pccr2.bits.rstc = 0;
1929 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1930 j->port = PORT_SPEAKER;
1932 j->port = PORT_POTS;
1934 j->sic1.bits.cpd = 0; /* Chip Power Down */
1935 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1936 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1937 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1938 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1939 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1940 j->psccr.bits.rw = 0; /* Read / Write flag */
1941 j->psccr.bits.dev = 0;
1942 outb(j->sic1.byte, j->XILINXbase + 0x00);
1943 outb(j->psccr.byte, j->XILINXbase + 0x01);
1944 ixj_PCcontrol_wait(j);
1946 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1947 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1948 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1949 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1950 j->sic2.bits.hpd = 0; /* HPF disable */
1951 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1952 j->psccr.bits.rw = 0; /* Read / Write flag */
1953 j->psccr.bits.dev = 0;
1954 outb(j->sic2.byte, j->XILINXbase + 0x00);
1955 outb(j->psccr.byte, j->XILINXbase + 0x01);
1956 ixj_PCcontrol_wait(j);
1958 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1959 j->psccr.bits.rw = 0; /* Read / Write flag */
1960 j->psccr.bits.dev = 0;
1961 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1962 outb(j->psccr.byte, j->XILINXbase + 0x01);
1963 ixj_PCcontrol_wait(j);
1965 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1966 j->psccr.bits.rw = 0; /* Read / Write flag */
1967 j->psccr.bits.dev = 0;
1968 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1969 outb(j->psccr.byte, j->XILINXbase + 0x01);
1970 ixj_PCcontrol_wait(j);
1972 j->sirxg.bits.lig = 1; /* Line In Gain */
1973 j->sirxg.bits.lim = 1; /* Line In Mute */
1974 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1975 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1976 j->sirxg.bits.him = 0; /* Handset In Mute */
1977 j->sirxg.bits.iir = 1; /* IIR */
1978 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1979 j->psccr.bits.rw = 0; /* Read / Write flag */
1980 j->psccr.bits.dev = 0;
1981 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1982 outb(j->psccr.byte, j->XILINXbase + 0x01);
1983 ixj_PCcontrol_wait(j);
1988 j->siaatt.bits.sot = 0;
1989 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1990 j->psccr.bits.rw = 0; /* Read / Write flag */
1991 j->psccr.bits.dev = 0;
1992 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1993 outb(j->psccr.byte, j->XILINXbase + 0x01);
1994 ixj_PCcontrol_wait(j);
1996 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1997 j->psccr.byte = j->pslic.byte = 0;
1998 j->pslic.bits.powerdown = 1;
1999 j->psccr.bits.dev = 3;
2000 j->psccr.bits.rw = 0;
2001 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2002 ixj_PCcontrol_wait(j);
2007 j->flags.pcmciascp = 0;
2013 static int ixj_hookstate(IXJ *j)
2018 switch (j->cardtype) {
2021 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
2024 case QTI_PHONEJACK_LITE:
2025 case QTI_PHONEJACK_PCI:
2027 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
2028 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
2029 if(fOffHook != j->p_hook) {
2031 j->checkwait = jiffies;
2033 if(time_before(jiffies, j->checkwait + 2)) {
2038 j->p_hook = fOffHook;
2039 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
2042 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
2043 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
2044 if (j->flags.ringing || j->flags.cringing) {
2045 if (!in_interrupt()) {
2046 det = jiffies + (hertz / 50);
2047 while (time_before(jiffies, det)) {
2048 set_current_state(TASK_INTERRUPTIBLE);
2049 schedule_timeout(1);
2053 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
2057 if (j->cardtype == QTI_PHONEJACK_PCI) {
2058 j->pld_scrr.byte = inb_p(j->XILINXbase);
2059 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
2061 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
2066 fOffHook = ixj_pcmcia_cable_check(j);
2069 if (j->r_hook != fOffHook) {
2070 j->r_hook = fOffHook;
2071 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
2072 j->ex.bits.hookstate = 1;
2073 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
2074 } else if (!fOffHook) {
2075 j->flash_end = jiffies + ((60 * hertz) / 100);
2079 if(time_before(jiffies, j->flash_end)) {
2080 j->ex.bits.flash = 1;
2082 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
2085 if(time_before(jiffies, j->flash_end)) {
2090 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
2093 if (j->port == PORT_SPEAKER) {
2094 if(j->cardtype == QTI_PHONECARD) {
2095 if(j->flags.pcmciascp && j->flags.pcmciasct) {
2103 if (j->port == PORT_HANDSET)
2109 static void ixj_ring_off(IXJ *j)
2111 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2113 if (ixjdebug & 0x0004)
2114 printk(KERN_INFO "IXJ Ring Off\n");
2115 j->gpio.bytes.high = 0x0B;
2116 j->gpio.bytes.low = 0x00;
2117 j->gpio.bits.gpio1 = 0;
2118 j->gpio.bits.gpio2 = 1;
2119 j->gpio.bits.gpio5 = 0;
2120 ixj_WriteDSPCommand(j->gpio.word, j);
2121 } else /* Internet LineJACK */
2123 if (ixjdebug & 0x0004)
2124 printk(KERN_INFO "IXJ Ring Off\n");
2126 if(!j->flags.cidplay)
2127 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2133 static void ixj_ring_start(IXJ *j)
2135 j->flags.cringing = 1;
2136 if (ixjdebug & 0x0004)
2137 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2138 if (ixj_hookstate(j) & 1) {
2139 if (j->port == PORT_POTS)
2141 j->flags.cringing = 0;
2142 if (ixjdebug & 0x0004)
2143 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2144 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2145 j->ring_cadence_jif = jiffies;
2146 j->flags.cidsent = j->flags.cidring = 0;
2147 j->cadence_f[5].state = 0;
2148 if(j->cadence_f[5].on1)
2151 j->ring_cadence_jif = jiffies;
2152 j->ring_cadence_t = 15;
2153 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2158 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2162 static int ixj_ring(IXJ *j)
2165 unsigned long jif, det;
2167 j->flags.ringing = 1;
2168 if (ixj_hookstate(j) & 1) {
2170 j->flags.ringing = 0;
2174 for (cntr = 0; cntr < j->maxrings; cntr++) {
2175 jif = jiffies + (1 * hertz);
2177 while (time_before(jiffies, jif)) {
2178 if (ixj_hookstate(j) & 1) {
2180 j->flags.ringing = 0;
2183 set_current_state(TASK_INTERRUPTIBLE);
2184 schedule_timeout(1);
2185 if (signal_pending(current))
2188 jif = jiffies + (3 * hertz);
2190 while (time_before(jiffies, jif)) {
2191 if (ixj_hookstate(j) & 1) {
2192 det = jiffies + (hertz / 100);
2193 while (time_before(jiffies, det)) {
2194 set_current_state(TASK_INTERRUPTIBLE);
2195 schedule_timeout(1);
2196 if (signal_pending(current))
2199 if (ixj_hookstate(j) & 1) {
2200 j->flags.ringing = 0;
2204 set_current_state(TASK_INTERRUPTIBLE);
2205 schedule_timeout(1);
2206 if (signal_pending(current))
2211 j->flags.ringing = 0;
2215 static int ixj_open(struct phone_device *p, struct file *file_p)
2217 IXJ *j = get_ixj(p->board);
2218 file_p->private_data = j;
2223 if (file_p->f_mode & FMODE_READ) {
2231 if (file_p->f_mode & FMODE_WRITE) {
2235 if (file_p->f_mode & FMODE_READ){
2242 if (j->cardtype == QTI_PHONECARD) {
2243 j->pslic.bits.powerdown = 0;
2244 j->psccr.bits.dev = 3;
2245 j->psccr.bits.rw = 0;
2246 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2247 ixj_PCcontrol_wait(j);
2250 j->flags.cidplay = 0;
2251 j->flags.cidcw_ack = 0;
2253 if (ixjdebug & 0x0002)
2254 printk(KERN_INFO "Opening board %d\n", p->board);
2256 j->framesread = j->frameswritten = 0;
2260 int ixj_release(struct inode *inode, struct file *file_p)
2264 IXJ *j = file_p->private_data;
2265 int board = j->p.board;
2268 * Set up locks to ensure that only one process is talking to the DSP at a time.
2269 * This is necessary to keep the DSP from locking up.
2271 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
2272 set_current_state(TASK_INTERRUPTIBLE);
2273 schedule_timeout(1);
2275 if (ixjdebug & 0x0002)
2276 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2278 if (j->cardtype == QTI_PHONECARD)
2279 ixj_set_port(j, PORT_SPEAKER);
2281 ixj_set_port(j, PORT_POTS);
2286 set_play_volume(j, 0x100);
2287 set_rec_volume(j, 0x100);
2290 /* Restore the tone table to default settings. */
2296 ixj_init_tone(j, &ti);
2302 ixj_init_tone(j, &ti);
2308 ixj_init_tone(j, &ti);
2314 ixj_init_tone(j, &ti);
2320 ixj_init_tone(j, &ti);
2326 ixj_init_tone(j, &ti);
2332 ixj_init_tone(j, &ti);
2338 ixj_init_tone(j, &ti);
2344 ixj_init_tone(j, &ti);
2350 ixj_init_tone(j, &ti);
2356 ixj_init_tone(j, &ti);
2362 ixj_init_tone(j, &ti);
2368 ixj_init_tone(j, &ti);
2374 ixj_init_tone(j, &ti);
2380 ixj_init_tone(j, &ti);
2386 ixj_init_tone(j, &ti);
2392 ixj_init_tone(j, &ti);
2398 ixj_init_tone(j, &ti);
2400 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2402 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2404 j->ex.bits.dtmf_ready = 0;
2406 j->dtmf_wp = j->dtmf_rp = 0;
2407 j->rec_mode = j->play_mode = -1;
2408 j->flags.ringing = 0;
2409 j->maxrings = MAXRINGS;
2410 j->ring_cadence = USA_RING_CADENCE;
2411 if(j->cadence_f[5].enable) {
2412 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2416 j->flags.dtmf_oob = 0;
2417 for (cnt = 0; cnt < 4; cnt++)
2418 j->cadence_f[cnt].enable = 0;
2422 if(j->cardtype == QTI_PHONECARD) {
2423 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2426 if (file_p->f_mode & FMODE_READ)
2428 if (file_p->f_mode & FMODE_WRITE)
2431 if (j->read_buffer && !j->readers) {
2432 kfree(j->read_buffer);
2433 j->read_buffer = NULL;
2434 j->read_buffer_size = 0;
2436 if (j->write_buffer && !j->writers) {
2437 kfree(j->write_buffer);
2438 j->write_buffer = NULL;
2439 j->write_buffer_size = 0;
2441 j->rec_codec = j->play_codec = 0;
2442 j->rec_frame_size = j->play_frame_size = 0;
2443 j->flags.cidsent = j->flags.cidring = 0;
2444 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2446 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2447 ixj_set_port(j, PORT_PSTN);
2448 daa_set_mode(j, SOP_PU_SLEEP);
2451 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2453 /* Set up the default signals for events */
2454 for (cnt = 0; cnt < 35; cnt++)
2455 j->ixj_signals[cnt] = SIGIO;
2457 /* Set the excetion signal enable flags */
2458 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2459 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 =
2460 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;
2462 file_p->private_data = NULL;
2463 clear_bit(board, &j->busyflags);
2467 static int read_filters(IXJ *j)
2469 unsigned short fc, cnt, trg;
2473 if (ixj_WriteDSPCommand(0x5144, j)) {
2474 if(ixjdebug & 0x0001) {
2475 printk(KERN_INFO "Read Frame Counter failed!\n");
2479 fc = j->ssr.high << 8 | j->ssr.low;
2480 if (fc == j->frame_count)
2483 j->frame_count = fc;
2490 for (cnt = 0; cnt < 4; cnt++) {
2491 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2492 if(ixjdebug & 0x0001) {
2493 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2497 if (ixj_WriteDSPCommand(0x515C, j)) {
2498 if(ixjdebug & 0x0001) {
2499 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2503 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2505 if (j->cadence_f[cnt].enable) {
2506 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2507 if (j->cadence_f[cnt].state == 0) {
2508 j->cadence_f[cnt].state = 1;
2509 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2510 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2511 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2512 } else if (j->cadence_f[cnt].state == 2 &&
2513 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2514 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2515 if (j->cadence_f[cnt].on2) {
2516 j->cadence_f[cnt].state = 3;
2517 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2518 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2519 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2521 j->cadence_f[cnt].state = 7;
2523 } else if (j->cadence_f[cnt].state == 4 &&
2524 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2525 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2526 if (j->cadence_f[cnt].on3) {
2527 j->cadence_f[cnt].state = 5;
2528 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2529 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2530 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2532 j->cadence_f[cnt].state = 7;
2535 j->cadence_f[cnt].state = 0;
2537 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2538 if (j->cadence_f[cnt].state == 1) {
2539 if(!j->cadence_f[cnt].on1) {
2540 j->cadence_f[cnt].state = 7;
2541 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2542 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2543 if(j->cadence_f[cnt].off1) {
2544 j->cadence_f[cnt].state = 2;
2545 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2546 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2547 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2549 j->cadence_f[cnt].state = 7;
2552 j->cadence_f[cnt].state = 0;
2554 } else if (j->cadence_f[cnt].state == 3) {
2555 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2556 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2557 if(j->cadence_f[cnt].off2) {
2558 j->cadence_f[cnt].state = 4;
2559 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2560 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2561 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2563 j->cadence_f[cnt].state = 7;
2566 j->cadence_f[cnt].state = 0;
2568 } else if (j->cadence_f[cnt].state == 5) {
2569 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2570 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2571 if(j->cadence_f[cnt].off3) {
2572 j->cadence_f[cnt].state = 6;
2573 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2574 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2575 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2577 j->cadence_f[cnt].state = 7;
2580 j->cadence_f[cnt].state = 0;
2583 j->cadence_f[cnt].state = 0;
2586 switch(j->cadence_f[cnt].state) {
2588 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2589 !j->cadence_f[cnt].off1 &&
2590 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2591 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2592 j->cadence_f[cnt].state = 7;
2596 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2597 !j->cadence_f[cnt].off2 &&
2598 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2599 j->cadence_f[cnt].state = 7;
2603 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2604 !j->cadence_f[cnt].off3) {
2605 j->cadence_f[cnt].state = 7;
2611 if (ixjdebug & 0x0040) {
2612 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2613 switch(j->cadence_f[cnt].state) {
2615 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2618 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2619 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2622 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2623 j->cadence_f[cnt].off1max);
2626 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2627 j->cadence_f[cnt].on2max);
2630 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2631 j->cadence_f[cnt].off2max);
2634 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2635 j->cadence_f[cnt].on3max);
2638 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2639 j->cadence_f[cnt].off3max);
2644 if (j->cadence_f[cnt].state == 7) {
2645 j->cadence_f[cnt].state = 0;
2646 if (j->cadence_f[cnt].enable == 1)
2647 j->cadence_f[cnt].enable = 0;
2650 if(ixjdebug & 0x0020) {
2651 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2654 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2657 if(ixjdebug & 0x0020) {
2658 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2661 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2664 if(ixjdebug & 0x0020) {
2665 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2668 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2671 if(ixjdebug & 0x0020) {
2672 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2675 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2679 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2680 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2681 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2683 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2688 if(ixjdebug & 0x0020) {
2689 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2692 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2695 if(ixjdebug & 0x0020) {
2696 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2699 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2702 if(ixjdebug & 0x0020) {
2703 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2706 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2709 if(ixjdebug & 0x0020) {
2710 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2713 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2721 static int LineMonitor(IXJ *j)
2728 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2731 j->dtmf.bytes.high = j->ssr.high;
2732 j->dtmf.bytes.low = j->ssr.low;
2733 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2735 j->dtmf_current = j->dtmf.bits.digit;
2737 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2739 if(!j->cidcw_wait) {
2740 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2742 if (j->dtmf_wp == 79)
2744 j->ex.bits.dtmf_ready = 1;
2745 if(j->ex_sig.bits.dtmf_ready) {
2746 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2749 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2750 if(ixjdebug & 0x0020) {
2751 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2753 j->flags.cidcw_ack = 1;
2762 /************************************************************************
2764 * Functions to allow alaw <-> ulaw conversions.
2766 ************************************************************************/
2768 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2770 static unsigned char table_ulaw2alaw[] =
2772 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2773 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2774 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2775 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2776 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2777 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2778 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2779 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2780 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2781 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2782 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2783 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2784 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2785 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2786 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2787 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2788 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2789 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2790 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2791 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2792 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2793 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2794 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2795 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2796 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2797 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2798 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2799 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2800 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2801 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2802 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2803 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2808 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2813 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2815 static unsigned char table_alaw2ulaw[] =
2817 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2818 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2819 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2820 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2821 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2822 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2823 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2824 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2825 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2826 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2827 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2828 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2829 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2830 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2831 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2832 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2833 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2834 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2835 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2836 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2837 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2838 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2839 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2840 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2841 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2842 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2843 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2844 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2845 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2846 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2847 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2848 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2853 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2858 static ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
2860 unsigned long i = *ppos;
2861 IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode));
2863 DECLARE_WAITQUEUE(wait, current);
2865 if (j->flags.inread)
2868 j->flags.inread = 1;
2870 add_wait_queue(&j->read_q, &wait);
2871 set_current_state(TASK_INTERRUPTIBLE);
2874 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2876 if (file_p->f_flags & O_NONBLOCK) {
2877 set_current_state(TASK_RUNNING);
2878 remove_wait_queue(&j->read_q, &wait);
2879 j->flags.inread = 0;
2882 if (!ixj_hookstate(j)) {
2883 set_current_state(TASK_RUNNING);
2884 remove_wait_queue(&j->read_q, &wait);
2885 j->flags.inread = 0;
2888 interruptible_sleep_on(&j->read_q);
2889 if (signal_pending(current)) {
2890 set_current_state(TASK_RUNNING);
2891 remove_wait_queue(&j->read_q, &wait);
2892 j->flags.inread = 0;
2897 remove_wait_queue(&j->read_q, &wait);
2898 set_current_state(TASK_RUNNING);
2899 /* Don't ever copy more than the user asks */
2900 if(j->rec_codec == ALAW)
2901 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2902 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2903 j->read_buffer_ready = 0;
2905 j->flags.inread = 0;
2908 j->flags.inread = 0;
2909 return min(length, j->read_buffer_size);
2913 static ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
2917 ssize_t read_retval = 0;
2918 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2920 pre_retval = ixj_PreRead(j, 0L);
2921 switch (pre_retval) {
2923 read_retval = ixj_read(file_p, buf, length, ppos);
2924 ixj_PostRead(j, 0L);
2927 read_retval = ixj_read(file_p, buf, length, ppos);
2930 ixj_PostRead(j, 0L);
2933 read_retval = pre_retval;
2938 static ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
2940 unsigned long i = *ppos;
2941 IXJ *j = file_p->private_data;
2943 DECLARE_WAITQUEUE(wait, current);
2945 if (j->flags.inwrite)
2948 j->flags.inwrite = 1;
2950 add_wait_queue(&j->write_q, &wait);
2951 set_current_state(TASK_INTERRUPTIBLE);
2955 while (!j->write_buffers_empty) {
2957 if (file_p->f_flags & O_NONBLOCK) {
2958 set_current_state(TASK_RUNNING);
2959 remove_wait_queue(&j->write_q, &wait);
2960 j->flags.inwrite = 0;
2963 if (!ixj_hookstate(j)) {
2964 set_current_state(TASK_RUNNING);
2965 remove_wait_queue(&j->write_q, &wait);
2966 j->flags.inwrite = 0;
2969 interruptible_sleep_on(&j->write_q);
2970 if (signal_pending(current)) {
2971 set_current_state(TASK_RUNNING);
2972 remove_wait_queue(&j->write_q, &wait);
2973 j->flags.inwrite = 0;
2977 set_current_state(TASK_RUNNING);
2978 remove_wait_queue(&j->write_q, &wait);
2979 if (j->write_buffer_wp + count >= j->write_buffer_end)
2980 j->write_buffer_wp = j->write_buffer;
2981 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2983 j->flags.inwrite = 0;
2986 if(j->play_codec == ALAW)
2987 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2988 j->flags.inwrite = 0;
2989 return min(count, j->write_buffer_size);
2992 static ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
2995 ssize_t write_retval = 0;
2997 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2999 pre_retval = ixj_PreWrite(j, 0L);
3000 switch (pre_retval) {
3002 write_retval = ixj_write(file_p, buf, count, ppos);
3003 if (write_retval > 0) {
3004 ixj_PostWrite(j, 0L);
3005 j->write_buffer_wp += write_retval;
3006 j->write_buffers_empty--;
3010 write_retval = ixj_write(file_p, buf, count, ppos);
3011 if (write_retval > 0) {
3012 j->write_buffer_wp += write_retval;
3013 j->write_buffers_empty--;
3017 ixj_PostWrite(j, 0L);
3020 write_retval = pre_retval;
3022 return write_retval;
3025 static void ixj_read_frame(IXJ *j)
3029 if (j->read_buffer) {
3030 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
3031 if (!(cnt % 16) && !IsRxReady(j)) {
3033 while (!IsRxReady(j)) {
3041 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
3042 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3043 inb_p(j->DSPbase + 0x0E);
3044 inb_p(j->DSPbase + 0x0F);
3046 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
3047 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
3050 if (j->intercom != -1) {
3051 if (IsTxReady(get_ixj(j->intercom))) {
3052 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
3053 if (!(cnt % 16) && !IsTxReady(j)) {
3055 while (!IsTxReady(j)) {
3063 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
3064 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
3066 get_ixj(j->intercom)->frameswritten++;
3069 j->read_buffer_ready = 1;
3070 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
3072 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3074 if(j->ixj_signals[SIG_READ_READY])
3075 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
3080 static short fsk[][6][20] =
3084 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
3085 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
3088 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
3089 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
3092 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
3093 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
3096 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
3097 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
3100 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
3101 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
3104 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
3105 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
3110 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3111 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3114 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3115 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3118 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3119 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3122 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3123 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3126 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3127 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3130 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3131 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3137 static void ixj_write_cid_bit(IXJ *j, int bit)
3139 while (j->fskcnt < 20) {
3140 if(j->fskdcnt < (j->fsksize - 1))
3141 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3154 static void ixj_write_cid_byte(IXJ *j, char byte)
3159 ixj_write_cid_bit(j, 0);
3160 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3161 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3162 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3163 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3164 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3165 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3166 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3167 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3168 ixj_write_cid_bit(j, 1);
3171 static void ixj_write_cid_seize(IXJ *j)
3175 for (cnt = 0; cnt < 150; cnt++) {
3176 ixj_write_cid_bit(j, 0);
3177 ixj_write_cid_bit(j, 1);
3179 for (cnt = 0; cnt < 180; cnt++) {
3180 ixj_write_cid_bit(j, 1);
3184 static void ixj_write_cidcw_seize(IXJ *j)
3188 for (cnt = 0; cnt < 80; cnt++) {
3189 ixj_write_cid_bit(j, 1);
3193 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3197 for (cnt = 0; cnt < strlen(s); cnt++) {
3198 ixj_write_cid_byte(j, s[cnt]);
3199 checksum = (checksum + s[cnt]);
3204 static void ixj_pad_fsk(IXJ *j, int pad)
3208 for (cnt = 0; cnt < pad; cnt++) {
3209 if(j->fskdcnt < (j->fsksize - 1))
3210 j->fskdata[j->fskdcnt++] = 0x0000;
3212 for (cnt = 0; cnt < 720; cnt++) {
3213 if(j->fskdcnt < (j->fsksize - 1))
3214 j->fskdata[j->fskdcnt++] = 0x0000;
3218 static void ixj_pre_cid(IXJ *j)
3220 j->cid_play_codec = j->play_codec;
3221 j->cid_play_frame_size = j->play_frame_size;
3222 j->cid_play_volume = get_play_volume(j);
3223 j->cid_play_flag = j->flags.playing;
3225 j->cid_rec_codec = j->rec_codec;
3226 j->cid_rec_volume = get_rec_volume(j);
3227 j->cid_rec_flag = j->flags.recording;
3229 j->cid_play_aec_level = j->aec_level;
3231 switch(j->baseframe.low) {
3233 j->cid_base_frame_size = 20;
3236 j->cid_base_frame_size = 10;
3239 j->cid_base_frame_size = 30;
3246 j->flags.cidplay = 1;
3248 set_base_frame(j, 30);
3249 set_play_codec(j, LINEAR16);
3250 set_play_volume(j, 0x1B);
3254 static void ixj_post_cid(IXJ *j)
3258 if(j->cidsize > 5000) {
3259 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3261 j->flags.cidplay = 0;
3262 if(ixjdebug & 0x0200) {
3263 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3269 set_base_frame(j, j->cid_base_frame_size);
3270 set_play_codec(j, j->cid_play_codec);
3271 ixj_aec_start(j, j->cid_play_aec_level);
3272 set_play_volume(j, j->cid_play_volume);
3274 set_rec_codec(j, j->cid_rec_codec);
3275 set_rec_volume(j, j->cid_rec_volume);
3278 ixj_record_start(j);
3280 if(j->cid_play_flag)
3283 if(j->cid_play_flag) {
3284 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3288 static void ixj_write_cid(IXJ *j)
3293 char mdmflen, len1, len2, len3;
3298 if (j->dsp.low == 0x20 || j->flags.cidplay)
3301 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3302 j->cidsize = j->cidcnt = 0;
3306 strcpy(sdmf1, j->cid_send.month);
3307 strcat(sdmf1, j->cid_send.day);
3308 strcat(sdmf1, j->cid_send.hour);
3309 strcat(sdmf1, j->cid_send.min);
3310 strcpy(sdmf2, j->cid_send.number);
3311 strcpy(sdmf3, j->cid_send.name);
3313 len1 = strlen(sdmf1);
3314 len2 = strlen(sdmf2);
3315 len3 = strlen(sdmf3);
3316 mdmflen = len1 + len2 + len3 + 6;
3319 ixj_write_cid_seize(j);
3321 ixj_write_cid_byte(j, 0x80);
3323 ixj_write_cid_byte(j, mdmflen);
3324 checksum = checksum + mdmflen;
3326 ixj_write_cid_byte(j, 0x01);
3327 checksum = checksum + 0x01;
3328 ixj_write_cid_byte(j, len1);
3329 checksum = checksum + len1;
3330 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3331 if(ixj_hookstate(j) & 1)
3334 ixj_write_cid_byte(j, 0x02);
3335 checksum = checksum + 0x02;
3336 ixj_write_cid_byte(j, len2);
3337 checksum = checksum + len2;
3338 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3339 if(ixj_hookstate(j) & 1)
3342 ixj_write_cid_byte(j, 0x07);
3343 checksum = checksum + 0x07;
3344 ixj_write_cid_byte(j, len3);
3345 checksum = checksum + len3;
3346 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3347 if(ixj_hookstate(j) & 1)
3354 ixj_write_cid_byte(j, (char) checksum);
3356 pad = j->fskdcnt % 240;
3360 ixj_pad_fsk(j, pad);
3367 static void ixj_write_cidcw(IXJ *j)
3374 char mdmflen, len1, len2, len3;
3379 if (j->dsp.low == 0x20 || j->flags.cidplay)
3382 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3383 j->cidsize = j->cidcnt = 0;
3387 j->flags.cidcw_ack = 0;
3394 ixj_init_tone(j, &ti);
3396 ixj_set_tone_on(1500, j);
3397 ixj_set_tone_off(32, j);
3398 if(ixjdebug & 0x0200) {
3399 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3401 ixj_play_tone(j, 23);
3403 clear_bit(j->board, &j->busyflags);
3404 while(j->tone_state) {
3405 set_current_state(TASK_INTERRUPTIBLE);
3406 schedule_timeout(1);
3408 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3409 set_current_state(TASK_INTERRUPTIBLE);
3410 schedule_timeout(1);
3412 if(ixjdebug & 0x0200) {
3413 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3421 ixj_init_tone(j, &ti);
3423 ixj_set_tone_off(10, j);
3424 ixj_set_tone_on(600, j);
3425 if(ixjdebug & 0x0200) {
3426 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3428 ixj_play_tone(j, 24);
3430 clear_bit(j->board, &j->busyflags);
3431 while(j->tone_state) {
3432 set_current_state(TASK_INTERRUPTIBLE);
3433 schedule_timeout(1);
3435 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3436 set_current_state(TASK_INTERRUPTIBLE);
3437 schedule_timeout(1);
3439 if(ixjdebug & 0x0200) {
3440 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3443 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3445 clear_bit(j->board, &j->busyflags);
3446 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
3447 set_current_state(TASK_INTERRUPTIBLE);
3448 schedule_timeout(1);
3450 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3451 set_current_state(TASK_INTERRUPTIBLE);
3452 schedule_timeout(1);
3455 if(!j->flags.cidcw_ack) {
3456 if(ixjdebug & 0x0200) {
3457 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3460 if(j->cid_play_flag) {
3461 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3467 j->flags.cidcw_ack = 0;
3468 strcpy(sdmf1, j->cid_send.month);
3469 strcat(sdmf1, j->cid_send.day);
3470 strcat(sdmf1, j->cid_send.hour);
3471 strcat(sdmf1, j->cid_send.min);
3472 strcpy(sdmf2, j->cid_send.number);
3473 strcpy(sdmf3, j->cid_send.name);
3475 len1 = strlen(sdmf1);
3476 len2 = strlen(sdmf2);
3477 len3 = strlen(sdmf3);
3478 mdmflen = len1 + len2 + len3 + 6;
3480 ixj_write_cidcw_seize(j);
3482 ixj_write_cid_byte(j, 0x80);
3484 ixj_write_cid_byte(j, mdmflen);
3485 checksum = checksum + mdmflen;
3487 ixj_write_cid_byte(j, 0x01);
3488 checksum = checksum + 0x01;
3489 ixj_write_cid_byte(j, len1);
3490 checksum = checksum + len1;
3491 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3493 ixj_write_cid_byte(j, 0x02);
3494 checksum = checksum + 0x02;
3495 ixj_write_cid_byte(j, len2);
3496 checksum = checksum + len2;
3497 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3499 ixj_write_cid_byte(j, 0x07);
3500 checksum = checksum + 0x07;
3501 ixj_write_cid_byte(j, len3);
3502 checksum = checksum + len3;
3503 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3509 ixj_write_cid_byte(j, (char) checksum);
3511 pad = j->fskdcnt % 240;
3515 ixj_pad_fsk(j, pad);
3516 if(ixjdebug & 0x0200) {
3517 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3521 static void ixj_write_vmwi(IXJ *j, int msg)
3528 if (j->dsp.low == 0x20 || j->flags.cidplay)
3531 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3532 j->cidsize = j->cidcnt = 0;
3538 if (j->port == PORT_POTS)
3539 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3541 ixj_write_cid_seize(j);
3543 ixj_write_cid_byte(j, 0x82);
3545 ixj_write_cid_byte(j, mdmflen);
3546 checksum = checksum + mdmflen;
3548 ixj_write_cid_byte(j, 0x0B);
3549 checksum = checksum + 0x0B;
3550 ixj_write_cid_byte(j, 1);
3551 checksum = checksum + 1;
3554 ixj_write_cid_byte(j, 0xFF);
3555 checksum = checksum + 0xFF;
3558 ixj_write_cid_byte(j, 0x00);
3559 checksum = checksum + 0x00;
3566 ixj_write_cid_byte(j, (char) checksum);
3568 pad = j->fskdcnt % 240;
3572 ixj_pad_fsk(j, pad);
3575 static void ixj_write_frame(IXJ *j)
3577 int cnt, frame_count, dly;
3582 if(j->flags.cidplay) {
3583 for(cnt = 0; cnt < 480; cnt++) {
3584 if (!(cnt % 16) && !IsTxReady(j)) {
3586 while (!IsTxReady(j)) {
3594 dat.word = j->fskdata[j->cidcnt++];
3595 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3596 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3599 if(j->cidcnt >= j->fskdcnt) {
3602 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3603 and there is real audio data in the buffer, we need to throw it away because
3604 we just used it's time slot */
3605 if (j->write_buffer_rp > j->write_buffer_wp) {
3606 j->write_buffer_rp += j->cid_play_frame_size * 2;
3607 if (j->write_buffer_rp >= j->write_buffer_end) {
3608 j->write_buffer_rp = j->write_buffer;
3610 j->write_buffers_empty++;
3611 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3613 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3615 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3616 if (j->write_buffer_wp > j->write_buffer_rp) {
3618 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3620 if (j->write_buffer_rp > j->write_buffer_wp) {
3622 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3623 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3625 if (frame_count >= 1) {
3626 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3627 switch (j->play_mode) {
3628 case PLAYBACK_MODE_ULAW:
3629 case PLAYBACK_MODE_ALAW:
3630 blankword.low = blankword.high = 0xFF;
3632 case PLAYBACK_MODE_8LINEAR:
3633 case PLAYBACK_MODE_16LINEAR:
3634 blankword.low = blankword.high = 0x00;
3636 case PLAYBACK_MODE_8LINEAR_WSS:
3637 blankword.low = blankword.high = 0x80;
3640 for (cnt = 0; cnt < 16; cnt++) {
3641 if (!(cnt % 16) && !IsTxReady(j)) {
3643 while (!IsTxReady(j)) {
3651 outb_p((blankword.low), j->DSPbase + 0x0C);
3652 outb_p((blankword.high), j->DSPbase + 0x0D);
3654 j->flags.play_first_frame = 0;
3655 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3656 for (cnt = 0; cnt < 24; cnt++) {
3658 blankword.low = 0x02;
3659 blankword.high = 0x00;
3662 blankword.low = blankword.high = 0x00;
3664 if (!(cnt % 16) && !IsTxReady(j)) {
3666 while (!IsTxReady(j)) {
3674 outb_p((blankword.low), j->DSPbase + 0x0C);
3675 outb_p((blankword.high), j->DSPbase + 0x0D);
3677 j->flags.play_first_frame = 0;
3679 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3680 if (!(cnt % 16) && !IsTxReady(j)) {
3682 while (!IsTxReady(j)) {
3690 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3691 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3692 if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
3693 j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
3694 j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
3695 j->write_buffer_rp + cnt + 9 == 0) {
3696 /* someone is trying to write silence lets make this a type 0 frame. */
3697 outb_p(0x00, j->DSPbase + 0x0C);
3698 outb_p(0x00, j->DSPbase + 0x0D);
3700 /* so all other frames are type 1. */
3701 outb_p(0x01, j->DSPbase + 0x0C);
3702 outb_p(0x00, j->DSPbase + 0x0D);
3705 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3706 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3707 *(j->write_buffer_rp + cnt) = 0;
3708 *(j->write_buffer_rp + cnt + 1) = 0;
3710 j->write_buffer_rp += j->play_frame_size * 2;
3711 if (j->write_buffer_rp >= j->write_buffer_end) {
3712 j->write_buffer_rp = j->write_buffer;
3714 j->write_buffers_empty++;
3715 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3717 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3724 if(j->ixj_signals[SIG_WRITE_READY]) {
3725 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3729 static int idle(IXJ *j)
3731 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3735 if (j->ssr.high || j->ssr.low) {
3739 j->flags.playing = 0;
3741 j->flags.recording = 0;
3746 static int set_base_frame(IXJ *j, int size)
3752 j->cid_play_aec_level = j->aec_level;
3754 for (cnt = 0; cnt < 10; cnt++) {
3758 if (j->ssr.high || j->ssr.low)
3760 if (j->dsp.low != 0x20) {
3764 /* Set Base Frame Size to 240 pg9-10 8021 */
3768 /* Set Base Frame Size to 160 pg9-10 8021 */
3772 /* Set Base Frame Size to 80 pg9-10 8021 */
3783 if (ixj_WriteDSPCommand(cmd, j)) {
3784 j->baseframe.high = j->baseframe.low = 0xFF;
3787 j->baseframe.high = j->ssr.high;
3788 j->baseframe.low = j->ssr.low;
3789 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3790 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3794 ixj_aec_start(j, j->cid_play_aec_level);
3798 static int set_rec_codec(IXJ *j, int rate)
3802 j->rec_codec = rate;
3806 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3807 j->rec_frame_size = 12;
3814 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3815 j->rec_frame_size = 10;
3822 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3823 j->rec_frame_size = 16;
3830 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3831 j->rec_frame_size = 9;
3838 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3839 j->rec_frame_size = 8;
3846 if (j->dsp.low != 0x20) {
3847 j->rec_frame_size = 48;
3854 if (j->dsp.low != 0x20) {
3855 if (!j->flags.g729_loaded) {
3859 switch (j->baseframe.low) {
3861 j->rec_frame_size = 10;
3864 j->rec_frame_size = 5;
3867 j->rec_frame_size = 15;
3876 if (j->dsp.low != 0x20) {
3877 if (!j->flags.g729_loaded) {
3881 switch (j->baseframe.low) {
3883 j->rec_frame_size = 12;
3886 j->rec_frame_size = 6;
3889 j->rec_frame_size = 18;
3898 switch (j->baseframe.low) {
3900 j->rec_frame_size = 80;
3903 j->rec_frame_size = 40;
3906 j->rec_frame_size = 120;
3912 switch (j->baseframe.low) {
3914 j->rec_frame_size = 80;
3917 j->rec_frame_size = 40;
3920 j->rec_frame_size = 120;
3926 switch (j->baseframe.low) {
3928 j->rec_frame_size = 160;
3931 j->rec_frame_size = 80;
3934 j->rec_frame_size = 240;
3940 switch (j->baseframe.low) {
3942 j->rec_frame_size = 80;
3945 j->rec_frame_size = 40;
3948 j->rec_frame_size = 120;
3954 switch (j->baseframe.low) {
3956 j->rec_frame_size = 80;
3959 j->rec_frame_size = 40;
3962 j->rec_frame_size = 120;
3968 j->rec_frame_size = 0;
3970 if (j->read_buffer) {
3971 kfree(j->read_buffer);
3972 j->read_buffer = NULL;
3973 j->read_buffer_size = 0;
3981 static int ixj_record_start(IXJ *j)
3983 unsigned short cmd = 0x0000;
3985 if (j->read_buffer) {
3988 j->flags.recording = 1;
3989 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3991 if(ixjdebug & 0x0002)
3992 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3995 switch (j->rec_codec) {
4003 cmd = 0x5130; /* TrueSpeech 8.5 */
4007 cmd = 0x5133; /* TrueSpeech 4.8 */
4011 cmd = 0x5134; /* TrueSpeech 4.1 */
4024 if (ixj_WriteDSPCommand(cmd, j))
4027 if (!j->read_buffer) {
4028 if (!j->read_buffer)
4029 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
4030 if (!j->read_buffer) {
4031 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
4035 j->read_buffer_size = j->rec_frame_size * 2;
4037 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
4041 switch (j->rec_mode) {
4043 cmd = 0x1C03; /* Record C1 */
4047 if (j->ver.low == 0x12) {
4048 cmd = 0x1E03; /* Record C1 */
4051 cmd = 0x1E01; /* Record C1 */
4056 if (j->ver.low == 0x12) {
4057 cmd = 0x1E83; /* Record C1 */
4060 cmd = 0x1E81; /* Record C1 */
4065 if (j->ver.low == 0x12) {
4066 cmd = 0x1F03; /* Record C1 */
4069 cmd = 0x1F01; /* Record C1 */
4074 if (j->ver.low == 0x12) {
4075 cmd = 0x1F83; /* Record C1 */
4077 cmd = 0x1F81; /* Record C1 */
4081 if (ixj_WriteDSPCommand(cmd, j))
4084 if (j->flags.playing) {
4085 ixj_aec_start(j, j->aec_level);
4090 static void ixj_record_stop(IXJ *j)
4092 if(ixjdebug & 0x0002)
4093 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
4095 if (j->read_buffer) {
4096 kfree(j->read_buffer);
4097 j->read_buffer = NULL;
4098 j->read_buffer_size = 0;
4100 if (j->rec_mode > -1) {
4101 ixj_WriteDSPCommand(0x5120, j);
4104 j->flags.recording = 0;
4106 static void ixj_vad(IXJ *j, int arg)
4109 ixj_WriteDSPCommand(0x513F, j);
4111 ixj_WriteDSPCommand(0x513E, j);
4114 static void set_rec_depth(IXJ *j, int depth)
4120 ixj_WriteDSPCommand(0x5180 + depth, j);
4123 static void set_dtmf_prescale(IXJ *j, int volume)
4125 ixj_WriteDSPCommand(0xCF07, j);
4126 ixj_WriteDSPCommand(volume, j);
4129 static int get_dtmf_prescale(IXJ *j)
4131 ixj_WriteDSPCommand(0xCF05, j);
4132 return j->ssr.high << 8 | j->ssr.low;
4135 static void set_rec_volume(IXJ *j, int volume)
4137 if(j->aec_level == AEC_AGC) {
4138 if (ixjdebug & 0x0002)
4139 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4140 ixj_WriteDSPCommand(0xCF96, j);
4141 ixj_WriteDSPCommand(volume, j);
4143 if (ixjdebug & 0x0002)
4144 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4145 ixj_WriteDSPCommand(0xCF03, j);
4146 ixj_WriteDSPCommand(volume, j);
4150 static int set_rec_volume_linear(IXJ *j, int volume)
4152 int newvolume, dsprecmax;
4154 if (ixjdebug & 0x0002)
4155 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4156 if(volume > 100 || volume < 0) {
4160 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4161 switch (j->cardtype) {
4167 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4168 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4169 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4171 case QTI_PHONEJACK_LITE:
4174 case QTI_PHONEJACK_PCI:
4183 newvolume = (dsprecmax * volume) / 100;
4184 set_rec_volume(j, newvolume);
4188 static int get_rec_volume(IXJ *j)
4190 if(j->aec_level == AEC_AGC) {
4191 if (ixjdebug & 0x0002)
4192 printk(KERN_INFO "Getting AGC Threshold\n");
4193 ixj_WriteDSPCommand(0xCF86, j);
4194 if (ixjdebug & 0x0002)
4195 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4196 return j->ssr.high << 8 | j->ssr.low;
4198 if (ixjdebug & 0x0002)
4199 printk(KERN_INFO "Getting Record Volume\n");
4200 ixj_WriteDSPCommand(0xCF01, j);
4201 return j->ssr.high << 8 | j->ssr.low;
4205 static int get_rec_volume_linear(IXJ *j)
4207 int volume, newvolume, dsprecmax;
4209 switch (j->cardtype) {
4216 case QTI_PHONEJACK_LITE:
4219 case QTI_PHONEJACK_PCI:
4228 volume = get_rec_volume(j);
4229 newvolume = (volume * 100) / dsprecmax;
4235 static int get_rec_level(IXJ *j)
4239 ixj_WriteDSPCommand(0xCF88, j);
4241 retval = j->ssr.high << 8 | j->ssr.low;
4242 retval = (retval * 256) / 240;
4246 static void ixj_aec_start(IXJ *j, int level)
4248 j->aec_level = level;
4249 if (ixjdebug & 0x0002)
4250 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4254 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4255 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4257 ixj_WriteDSPCommand(0x0300, j);
4259 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4261 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4265 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4267 ixj_WriteDSPCommand(0xE011, j);
4268 ixj_WriteDSPCommand(0xFFFF, j);
4270 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4271 ixj_WriteDSPCommand(0x0000, j); /* to off */
4276 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4278 ixj_WriteDSPCommand(0xE011, j);
4279 ixj_WriteDSPCommand(0x0080, j);
4281 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4282 ixj_WriteDSPCommand(0x0000, j); /* to off */
4287 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4289 ixj_WriteDSPCommand(0xE011, j);
4290 ixj_WriteDSPCommand(0x0080, j);
4292 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4293 ixj_WriteDSPCommand(0x0000, j); /* to off */
4298 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4299 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4301 ixj_WriteDSPCommand(0xE011, j);
4302 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4304 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4306 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4307 ixj_WriteDSPCommand(0x0224, j);
4309 ixj_WriteDSPCommand(0x1224, j);
4311 ixj_WriteDSPCommand(0xE014, j);
4312 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4314 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4316 /* Now we can set the AGC initial parameters and turn it on */
4317 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4318 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4320 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4321 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4323 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4324 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4326 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4327 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4329 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4330 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4332 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4333 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4335 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4336 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4338 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4339 ixj_WriteDSPCommand(0x0001, j); /* to on */
4344 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4346 ixj_WriteDSPCommand(0xE011, j);
4347 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4349 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4351 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4352 ixj_WriteDSPCommand(0x0224, j);
4354 ixj_WriteDSPCommand(0x1224, j);
4356 ixj_WriteDSPCommand(0xE014, j);
4357 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4359 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4366 static void aec_stop(IXJ *j)
4368 j->aec_level = AEC_OFF;
4369 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4370 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4372 ixj_WriteDSPCommand(0x0700, j);
4374 if (j->play_mode != -1 && j->rec_mode != -1)
4376 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4380 static int set_play_codec(IXJ *j, int rate)
4384 j->play_codec = rate;
4388 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4389 j->play_frame_size = 12;
4396 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4397 j->play_frame_size = 10;
4404 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4405 j->play_frame_size = 16;
4412 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4413 j->play_frame_size = 9;
4420 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4421 j->play_frame_size = 8;
4428 if (j->dsp.low != 0x20) {
4429 j->play_frame_size = 48;
4436 if (j->dsp.low != 0x20) {
4437 if (!j->flags.g729_loaded) {
4441 switch (j->baseframe.low) {
4443 j->play_frame_size = 10;
4446 j->play_frame_size = 5;
4449 j->play_frame_size = 15;
4458 if (j->dsp.low != 0x20) {
4459 if (!j->flags.g729_loaded) {
4463 switch (j->baseframe.low) {
4465 j->play_frame_size = 12;
4468 j->play_frame_size = 6;
4471 j->play_frame_size = 18;
4480 switch (j->baseframe.low) {
4482 j->play_frame_size = 80;
4485 j->play_frame_size = 40;
4488 j->play_frame_size = 120;
4494 switch (j->baseframe.low) {
4496 j->play_frame_size = 80;
4499 j->play_frame_size = 40;
4502 j->play_frame_size = 120;
4508 switch (j->baseframe.low) {
4510 j->play_frame_size = 160;
4513 j->play_frame_size = 80;
4516 j->play_frame_size = 240;
4522 switch (j->baseframe.low) {
4524 j->play_frame_size = 80;
4527 j->play_frame_size = 40;
4530 j->play_frame_size = 120;
4536 switch (j->baseframe.low) {
4538 j->play_frame_size = 80;
4541 j->play_frame_size = 40;
4544 j->play_frame_size = 120;
4550 j->play_frame_size = 0;
4552 if (j->write_buffer) {
4553 kfree(j->write_buffer);
4554 j->write_buffer = NULL;
4555 j->write_buffer_size = 0;
4563 static int ixj_play_start(IXJ *j)
4565 unsigned short cmd = 0x0000;
4567 if (j->write_buffer) {
4571 if(ixjdebug & 0x0002)
4572 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4574 j->flags.playing = 1;
4575 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4577 j->flags.play_first_frame = 1;
4580 if (!j->play_mode) {
4581 switch (j->play_codec) {
4589 cmd = 0x5230; /* TrueSpeech 8.5 */
4593 cmd = 0x5233; /* TrueSpeech 4.8 */
4597 cmd = 0x5234; /* TrueSpeech 4.1 */
4610 if (ixj_WriteDSPCommand(cmd, j))
4613 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4614 if (!j->write_buffer) {
4615 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4618 /* j->write_buffers_empty = 2; */
4619 j->write_buffers_empty = 1;
4620 j->write_buffer_size = j->play_frame_size * 2;
4621 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4622 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4624 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4628 switch (j->play_mode) {
4633 if (j->ver.low == 0x12) {
4640 if (j->ver.low == 0x12) {
4647 if (j->ver.low == 0x12) {
4654 if (j->ver.low == 0x12) {
4661 if (ixj_WriteDSPCommand(cmd, j))
4664 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4667 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4670 if (j->flags.recording) {
4671 ixj_aec_start(j, j->aec_level);
4677 static void ixj_play_stop(IXJ *j)
4679 if(ixjdebug & 0x0002)
4680 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4682 if (j->write_buffer) {
4683 kfree(j->write_buffer);
4684 j->write_buffer = NULL;
4685 j->write_buffer_size = 0;
4687 if (j->play_mode > -1) {
4688 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4692 j->flags.playing = 0;
4695 static inline int get_play_level(IXJ *j)
4699 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4700 return j->ssr.high << 8 | j->ssr.low;
4701 retval = j->ssr.high << 8 | j->ssr.low;
4702 retval = (retval * 256) / 240;
4706 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4708 unsigned int mask = 0;
4710 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
4712 poll_wait(file_p, &(j->poll_q), wait);
4713 if (j->read_buffer_ready > 0)
4714 mask |= POLLIN | POLLRDNORM; /* readable */
4715 if (j->write_buffers_empty > 0)
4716 mask |= POLLOUT | POLLWRNORM; /* writable */
4722 static int ixj_play_tone(IXJ *j, char tone)
4724 if (!j->tone_state) {
4725 if(ixjdebug & 0x0002) {
4726 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4728 if (j->dsp.low == 0x20) {
4731 j->tone_start_jif = jiffies;
4736 j->tone_index = tone;
4737 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4743 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4745 j->tone_on_time = arg;
4747 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4751 if (ixj_WriteDSPCommand(arg, j))
4757 static int SCI_WaitHighSCI(IXJ *j)
4761 j->pld_scrr.byte = inb_p(j->XILINXbase);
4762 if (!j->pld_scrr.bits.sci) {
4763 for (cnt = 0; cnt < 10; cnt++) {
4765 j->pld_scrr.byte = inb_p(j->XILINXbase);
4767 if ((j->pld_scrr.bits.sci))
4770 if (ixjdebug & 0x0001)
4771 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4777 static int SCI_WaitLowSCI(IXJ *j)
4781 j->pld_scrr.byte = inb_p(j->XILINXbase);
4782 if (j->pld_scrr.bits.sci) {
4783 for (cnt = 0; cnt < 10; cnt++) {
4785 j->pld_scrr.byte = inb_p(j->XILINXbase);
4787 if (!(j->pld_scrr.bits.sci))
4790 if (ixjdebug & 0x0001)
4791 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4797 static int SCI_Control(IXJ *j, int control)
4801 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4803 j->pld_scrw.bits.c1 = 0; /* to no selection */
4806 case SCI_Enable_DAA:
4807 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4809 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4812 case SCI_Enable_Mixer:
4813 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4815 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4818 case SCI_Enable_EEPROM:
4819 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4821 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4828 outb_p(j->pld_scrw.byte, j->XILINXbase);
4834 case SCI_Enable_DAA:
4835 case SCI_Enable_Mixer:
4836 case SCI_Enable_EEPROM:
4837 if (!SCI_WaitHighSCI(j))
4847 static int SCI_Prepare(IXJ *j)
4849 if (!SCI_Control(j, SCI_End))
4852 if (!SCI_WaitLowSCI(j))
4858 static int ixj_get_mixer(long val, IXJ *j)
4860 int reg = (val & 0x1F00) >> 8;
4861 return j->mix.vol[reg];
4864 static int ixj_mixer(long val, IXJ *j)
4868 bytes.high = (val & 0x1F00) >> 8;
4869 bytes.low = val & 0x00FF;
4871 /* save mixer value so we can get back later on */
4872 j->mix.vol[bytes.high] = bytes.low;
4874 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4876 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4878 SCI_Control(j, SCI_Enable_Mixer);
4880 SCI_Control(j, SCI_End);
4885 static int daa_load(BYTES * p_bytes, IXJ *j)
4887 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4888 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4889 if (!SCI_Control(j, SCI_Enable_DAA))
4895 static int ixj_daa_cr4(IXJ *j, char reg)
4899 switch (j->daa_mode) {
4903 case SOP_PU_RINGING:
4906 case SOP_PU_CONVERSATION:
4909 case SOP_PU_PULSEDIALING:
4914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4916 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4918 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4921 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4924 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4927 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4931 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4933 if (!daa_load(&bytes, j))
4936 if (!SCI_Prepare(j))
4942 static char daa_int_read(IXJ *j)
4946 if (!SCI_Prepare(j))
4951 outb_p(bytes.high, j->XILINXbase + 0x03);
4952 outb_p(bytes.low, j->XILINXbase + 0x02);
4954 if (!SCI_Control(j, SCI_Enable_DAA))
4957 bytes.high = inb_p(j->XILINXbase + 0x03);
4958 bytes.low = inb_p(j->XILINXbase + 0x02);
4959 if (bytes.low != ALISDAA_ID_BYTE) {
4960 if (ixjdebug & 0x0001)
4961 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4964 if (!SCI_Control(j, SCI_Enable_DAA))
4966 if (!SCI_Control(j, SCI_End))
4969 bytes.high = inb_p(j->XILINXbase + 0x03);
4970 bytes.low = inb_p(j->XILINXbase + 0x02);
4972 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4977 static char daa_CR_read(IXJ *j, int cr)
4982 if (!SCI_Prepare(j))
4985 switch (j->daa_mode) {
4987 bytes.high = 0x30 + cr;
4989 case SOP_PU_RINGING:
4990 bytes.high = 0x70 + cr;
4992 case SOP_PU_CONVERSATION:
4993 bytes.high = 0xB0 + cr;
4995 case SOP_PU_PULSEDIALING:
4996 bytes.high = 0xF0 + cr;
5002 outb_p(bytes.high, j->XILINXbase + 0x03);
5003 outb_p(bytes.low, j->XILINXbase + 0x02);
5005 if (!SCI_Control(j, SCI_Enable_DAA))
5008 bytes.high = inb_p(j->XILINXbase + 0x03);
5009 bytes.low = inb_p(j->XILINXbase + 0x02);
5010 if (bytes.low != ALISDAA_ID_BYTE) {
5011 if (ixjdebug & 0x0001)
5012 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5015 if (!SCI_Control(j, SCI_Enable_DAA))
5017 if (!SCI_Control(j, SCI_End))
5020 wdata.word = inw_p(j->XILINXbase + 0x02);
5024 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
5027 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
5030 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
5033 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
5036 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
5039 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
5047 static int ixj_daa_cid_reset(IXJ *j)
5052 if (ixjdebug & 0x0002)
5053 printk("DAA Clearing CID ram\n");
5055 if (!SCI_Prepare(j))
5060 outb_p(bytes.high, j->XILINXbase + 0x03);
5061 outb_p(bytes.low, j->XILINXbase + 0x02);
5063 if (!SCI_Control(j, SCI_Enable_DAA))
5066 if (!SCI_WaitHighSCI(j))
5069 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
5070 bytes.high = bytes.low = 0x00;
5071 outb_p(bytes.high, j->XILINXbase + 0x03);
5073 if (i < ALISDAA_CALLERID_SIZE - 1)
5074 outb_p(bytes.low, j->XILINXbase + 0x02);
5076 if (!SCI_Control(j, SCI_Enable_DAA))
5079 if (!SCI_WaitHighSCI(j))
5084 if (!SCI_Control(j, SCI_End))
5087 if (ixjdebug & 0x0002)
5088 printk("DAA CID ram cleared\n");
5093 static int ixj_daa_cid_read(IXJ *j)
5097 char CID[ALISDAA_CALLERID_SIZE], mContinue;
5100 if (!SCI_Prepare(j))
5105 outb_p(bytes.high, j->XILINXbase + 0x03);
5106 outb_p(bytes.low, j->XILINXbase + 0x02);
5108 if (!SCI_Control(j, SCI_Enable_DAA))
5111 if (!SCI_WaitHighSCI(j))
5114 bytes.high = inb_p(j->XILINXbase + 0x03);
5115 bytes.low = inb_p(j->XILINXbase + 0x02);
5116 if (bytes.low != ALISDAA_ID_BYTE) {
5117 if (ixjdebug & 0x0001)
5118 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5121 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5122 bytes.high = bytes.low = 0x00;
5123 outb_p(bytes.high, j->XILINXbase + 0x03);
5124 outb_p(bytes.low, j->XILINXbase + 0x02);
5126 if (!SCI_Control(j, SCI_Enable_DAA))
5129 if (!SCI_WaitHighSCI(j))
5132 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5133 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5136 if (!SCI_Control(j, SCI_End))
5140 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5143 if ((pIn[1] & 0x03) == 0x01) {
5146 if ((pIn[2] & 0x0c) == 0x04) {
5147 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5149 if ((pIn[3] & 0x30) == 0x10) {
5150 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5152 if ((pIn[4] & 0xc0) == 0x40) {
5153 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5157 pIn += 5, pOut += 4;
5159 memset(&j->cid, 0, sizeof(PHONE_CID));
5160 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5162 strncpy(j->cid.month, pOut, 2);
5164 strncpy(j->cid.day, pOut, 2);
5166 strncpy(j->cid.hour, pOut, 2);
5168 strncpy(j->cid.min, pOut, 2);
5170 j->cid.numlen = *pOut;
5172 strncpy(j->cid.number, pOut, j->cid.numlen);
5173 pOut += j->cid.numlen + 1;
5174 j->cid.namelen = *pOut;
5176 strncpy(j->cid.name, pOut, j->cid.namelen);
5178 ixj_daa_cid_reset(j);
5182 static char daa_get_version(IXJ *j)
5186 if (!SCI_Prepare(j))
5191 outb_p(bytes.high, j->XILINXbase + 0x03);
5192 outb_p(bytes.low, j->XILINXbase + 0x02);
5194 if (!SCI_Control(j, SCI_Enable_DAA))
5197 bytes.high = inb_p(j->XILINXbase + 0x03);
5198 bytes.low = inb_p(j->XILINXbase + 0x02);
5199 if (bytes.low != ALISDAA_ID_BYTE) {
5200 if (ixjdebug & 0x0001)
5201 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5204 if (!SCI_Control(j, SCI_Enable_DAA))
5207 if (!SCI_Control(j, SCI_End))
5210 bytes.high = inb_p(j->XILINXbase + 0x03);
5211 bytes.low = inb_p(j->XILINXbase + 0x02);
5212 if (ixjdebug & 0x0002)
5213 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5214 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5218 static int daa_set_mode(IXJ *j, int mode)
5221 The DAA *MUST* be in the conversation mode if the
5222 PSTN line is to be seized (PSTN line off-hook).
5223 Taking the PSTN line off-hook while the DAA is in
5224 a mode other than conversation mode will cause a
5225 hardware failure of the ALIS-A part.
5228 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5229 if the PSTN line is on-hook. Failure to have the PSTN line
5230 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5236 j->flags.pstn_rmr = 0;
5238 if (!SCI_Prepare(j))
5243 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5245 outb_p(j->pld_scrw.byte, j->XILINXbase);
5246 j->pld_slicw.bits.rly2 = 0;
5247 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5249 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5250 daa_load(&bytes, j);
5251 if (!SCI_Prepare(j))
5254 j->daa_mode = SOP_PU_SLEEP;
5257 if(j->daa_mode == SOP_PU_SLEEP)
5261 if (ixjdebug & 0x0008)
5262 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5263 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5265 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5267 outb_p(j->pld_scrw.byte, j->XILINXbase);
5268 j->pld_slicw.bits.rly2 = 0;
5269 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5271 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5272 daa_load(&bytes, j);
5273 if (!SCI_Prepare(j))
5276 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5278 outb_p(j->pld_scrw.byte, j->XILINXbase);
5279 j->pld_slicw.bits.rly2 = 0;
5280 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5282 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5283 daa_load(&bytes, j);
5284 if (!SCI_Prepare(j))
5287 j->daa_mode = SOP_PU_SLEEP;
5288 j->flags.pstn_ringing = 0;
5289 j->ex.bits.pstn_ring = 0;
5290 j->pstn_sleeptil = jiffies + (hertz / 4);
5291 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5292 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5293 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5295 case SOP_PU_RINGING:
5296 if (ixjdebug & 0x0008)
5297 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5298 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5300 outb_p(j->pld_scrw.byte, j->XILINXbase);
5301 j->pld_slicw.bits.rly2 = 0;
5302 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5304 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5305 daa_load(&bytes, j);
5306 if (!SCI_Prepare(j))
5308 j->daa_mode = SOP_PU_RINGING;
5310 case SOP_PU_CONVERSATION:
5311 if (ixjdebug & 0x0008)
5312 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5314 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5315 daa_load(&bytes, j);
5316 if (!SCI_Prepare(j))
5318 j->pld_slicw.bits.rly2 = 1;
5319 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5320 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5322 outb_p(j->pld_scrw.byte, j->XILINXbase);
5323 j->daa_mode = SOP_PU_CONVERSATION;
5324 j->flags.pstn_ringing = 0;
5325 j->ex.bits.pstn_ring = 0;
5326 j->pstn_sleeptil = jiffies;
5327 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5329 case SOP_PU_PULSEDIALING:
5330 if (ixjdebug & 0x0008)
5331 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5332 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5334 outb_p(j->pld_scrw.byte, j->XILINXbase);
5335 j->pld_slicw.bits.rly2 = 0;
5336 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5338 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5339 daa_load(&bytes, j);
5340 if (!SCI_Prepare(j))
5342 j->daa_mode = SOP_PU_PULSEDIALING;
5350 static int ixj_daa_write(IXJ *j)
5354 j->flags.pstncheck = 1;
5356 daa_set_mode(j, SOP_PU_SLEEP);
5358 if (!SCI_Prepare(j))
5361 outb_p(j->pld_scrw.byte, j->XILINXbase);
5364 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5365 if (!daa_load(&bytes, j))
5368 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5369 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5370 if (!daa_load(&bytes, j))
5373 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5374 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5375 if (!daa_load(&bytes, j))
5378 if (!SCI_Prepare(j))
5382 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5383 if (!daa_load(&bytes, j))
5386 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5387 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5388 if (!daa_load(&bytes, j))
5391 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5392 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5393 if (!daa_load(&bytes, j))
5396 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5397 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5398 if (!daa_load(&bytes, j))
5401 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5403 if (!daa_load(&bytes, j))
5406 if (!SCI_Prepare(j))
5410 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5411 if (!daa_load(&bytes, j))
5414 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5415 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5416 if (!daa_load(&bytes, j))
5419 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5420 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5421 if (!daa_load(&bytes, j))
5424 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5425 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5426 if (!daa_load(&bytes, j))
5429 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5431 if (!daa_load(&bytes, j))
5434 if (!SCI_Control(j, SCI_End))
5436 if (!SCI_WaitLowSCI(j))
5440 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5441 if (!daa_load(&bytes, j))
5444 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5445 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5446 if (!daa_load(&bytes, j))
5449 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5450 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5451 if (!daa_load(&bytes, j))
5454 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5455 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5456 if (!daa_load(&bytes, j))
5459 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5461 if (!daa_load(&bytes, j))
5464 if (!SCI_Control(j, SCI_End))
5466 if (!SCI_WaitLowSCI(j))
5470 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5471 if (!daa_load(&bytes, j))
5474 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5475 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5476 if (!daa_load(&bytes, j))
5479 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5480 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5481 if (!daa_load(&bytes, j))
5484 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5485 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5486 if (!daa_load(&bytes, j))
5489 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5491 if (!daa_load(&bytes, j))
5494 if (!SCI_Control(j, SCI_End))
5496 if (!SCI_WaitLowSCI(j))
5500 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5501 if (!daa_load(&bytes, j))
5504 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5505 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5506 if (!daa_load(&bytes, j))
5509 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5510 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5511 if (!daa_load(&bytes, j))
5514 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5515 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5516 if (!daa_load(&bytes, j))
5519 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5521 if (!daa_load(&bytes, j))
5524 if (!SCI_Control(j, SCI_End))
5526 if (!SCI_WaitLowSCI(j))
5530 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5531 if (!daa_load(&bytes, j))
5534 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5535 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5536 if (!daa_load(&bytes, j))
5539 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5540 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5541 if (!daa_load(&bytes, j))
5544 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5545 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5546 if (!daa_load(&bytes, j))
5549 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5551 if (!daa_load(&bytes, j))
5554 if (!SCI_Control(j, SCI_End))
5556 if (!SCI_WaitLowSCI(j))
5560 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5561 if (!daa_load(&bytes, j))
5564 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5565 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5566 if (!daa_load(&bytes, j))
5569 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5570 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5571 if (!daa_load(&bytes, j))
5574 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5575 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5576 if (!daa_load(&bytes, j))
5579 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5581 if (!daa_load(&bytes, j))
5584 if (!SCI_Control(j, SCI_End))
5586 if (!SCI_WaitLowSCI(j))
5590 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5591 if (!daa_load(&bytes, j))
5594 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5595 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5596 if (!daa_load(&bytes, j))
5599 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5600 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5601 if (!daa_load(&bytes, j))
5604 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5605 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5606 if (!daa_load(&bytes, j))
5609 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5611 if (!daa_load(&bytes, j))
5614 if (!SCI_Control(j, SCI_End))
5616 if (!SCI_WaitLowSCI(j))
5620 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5621 if (!daa_load(&bytes, j))
5624 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5625 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5626 if (!daa_load(&bytes, j))
5629 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5630 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5631 if (!daa_load(&bytes, j))
5634 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5635 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5636 if (!daa_load(&bytes, j))
5639 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5641 if (!daa_load(&bytes, j))
5644 if (!SCI_Control(j, SCI_End))
5646 if (!SCI_WaitLowSCI(j))
5650 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5651 if (!daa_load(&bytes, j))
5654 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5655 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5656 if (!daa_load(&bytes, j))
5659 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5660 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5661 if (!daa_load(&bytes, j))
5664 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5665 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5666 if (!daa_load(&bytes, j))
5669 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5671 if (!daa_load(&bytes, j))
5674 if (!SCI_Control(j, SCI_End))
5676 if (!SCI_WaitLowSCI(j))
5680 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5681 if (!daa_load(&bytes, j))
5684 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5685 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5686 if (!daa_load(&bytes, j))
5689 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5691 if (!daa_load(&bytes, j))
5694 if (!SCI_Control(j, SCI_End))
5696 if (!SCI_WaitLowSCI(j))
5700 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5701 if (!daa_load(&bytes, j))
5704 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5705 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5706 if (!daa_load(&bytes, j))
5709 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5711 if (!daa_load(&bytes, j))
5714 if (!SCI_Control(j, SCI_End))
5716 if (!SCI_WaitLowSCI(j))
5720 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5721 if (!daa_load(&bytes, j))
5724 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5725 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5726 if (!daa_load(&bytes, j))
5729 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5731 if (!daa_load(&bytes, j))
5734 if (!SCI_Control(j, SCI_End))
5736 if (!SCI_WaitLowSCI(j))
5740 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5741 if (!daa_load(&bytes, j))
5744 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5745 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5746 if (!daa_load(&bytes, j))
5749 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5751 if (!daa_load(&bytes, j))
5754 if (!SCI_Control(j, SCI_End))
5756 if (!SCI_WaitLowSCI(j))
5760 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5761 if (!daa_load(&bytes, j))
5764 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5765 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5766 if (!daa_load(&bytes, j))
5769 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5771 if (!daa_load(&bytes, j))
5774 if (!SCI_Control(j, SCI_End))
5776 if (!SCI_WaitLowSCI(j))
5780 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5781 if (!daa_load(&bytes, j))
5784 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5785 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5786 if (!daa_load(&bytes, j))
5789 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5790 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5791 if (!daa_load(&bytes, j))
5794 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5795 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5796 if (!daa_load(&bytes, j))
5799 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5801 if (!daa_load(&bytes, j))
5804 if (!SCI_Control(j, SCI_End))
5806 if (!SCI_WaitLowSCI(j))
5810 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5811 if (!daa_load(&bytes, j))
5814 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5815 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5816 if (!daa_load(&bytes, j))
5819 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5820 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5821 if (!daa_load(&bytes, j))
5824 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5825 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5826 if (!daa_load(&bytes, j))
5829 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5831 if (!daa_load(&bytes, j))
5835 j->pld_scrr.byte = inb_p(j->XILINXbase);
5836 if (!SCI_Control(j, SCI_End))
5839 outb_p(j->pld_scrw.byte, j->XILINXbase);
5841 if (ixjdebug & 0x0002)
5842 printk("DAA Coefficients Loaded\n");
5844 j->flags.pstncheck = 0;
5848 int ixj_set_tone_off(unsigned short arg, IXJ *j)
5850 j->tone_off_time = arg;
5851 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5854 if (ixj_WriteDSPCommand(arg, j))
5859 static int ixj_get_tone_on(IXJ *j)
5861 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5867 static int ixj_get_tone_off(IXJ *j)
5869 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5875 static void ixj_busytone(IXJ *j)
5877 j->flags.ringback = 0;
5878 j->flags.dialtone = 0;
5879 j->flags.busytone = 1;
5880 ixj_set_tone_on(0x07D0, j);
5881 ixj_set_tone_off(0x07D0, j);
5882 ixj_play_tone(j, 27);
5885 static void ixj_dialtone(IXJ *j)
5887 j->flags.ringback = 0;
5888 j->flags.dialtone = 1;
5889 j->flags.busytone = 0;
5890 if (j->dsp.low == 0x20) {
5893 ixj_set_tone_on(0xFFFF, j);
5894 ixj_set_tone_off(0x0000, j);
5895 ixj_play_tone(j, 25);
5899 static void ixj_cpt_stop(IXJ *j)
5901 if(j->tone_state || j->tone_cadence_state)
5903 j->flags.dialtone = 0;
5904 j->flags.busytone = 0;
5905 j->flags.ringback = 0;
5906 ixj_set_tone_on(0x0001, j);
5907 ixj_set_tone_off(0x0000, j);
5908 ixj_play_tone(j, 0);
5909 j->tone_state = j->tone_cadence_state = 0;
5911 if (j->cadence_t->ce) {
5912 kfree(j->cadence_t->ce);
5914 kfree(j->cadence_t);
5915 j->cadence_t = NULL;
5918 if (j->play_mode == -1 && j->rec_mode == -1)
5920 if (j->play_mode != -1 && j->dsp.low == 0x20)
5922 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5923 ixj_record_start(j);
5926 static void ixj_ringback(IXJ *j)
5928 j->flags.busytone = 0;
5929 j->flags.dialtone = 0;
5930 j->flags.ringback = 1;
5931 ixj_set_tone_on(0x0FA0, j);
5932 ixj_set_tone_off(0x2EE0, j);
5933 ixj_play_tone(j, 26);
5936 static void ixj_testram(IXJ *j)
5938 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5941 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp)
5944 IXJ_CADENCE_ELEMENT *lcep;
5947 lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
5950 if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) || (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT) )
5955 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5960 if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5967 kfree(j->cadence_t->ce);
5968 kfree(j->cadence_t);
5970 lcp->ce = (void *) lcep;
5972 j->tone_cadence_state = 0;
5973 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5974 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5975 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5976 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5977 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5978 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5979 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5980 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5981 ixj_init_tone(j, &ti);
5983 ixj_play_tone(j, lcp->ce[0].index);
5987 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp)
5989 IXJ_FILTER_CADENCE *lcp;
5990 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5992 if(ixjdebug & 0x0001) {
5993 printk(KERN_INFO "Could not allocate memory for cadence\n");
5997 if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE))) {
5998 if(ixjdebug & 0x0001) {
5999 printk(KERN_INFO "Could not copy cadence to kernel\n");
6004 if (lcp->filter > 5) {
6005 if(ixjdebug & 0x0001) {
6006 printk(KERN_INFO "Cadence out of range\n");
6011 j->cadence_f[lcp->filter].state = 0;
6012 j->cadence_f[lcp->filter].enable = lcp->enable;
6013 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
6014 j->cadence_f[lcp->filter].on1 = lcp->on1;
6015 j->cadence_f[lcp->filter].on1min = 0;
6016 j->cadence_f[lcp->filter].on1max = 0;
6017 j->cadence_f[lcp->filter].off1 = lcp->off1;
6018 j->cadence_f[lcp->filter].off1min = 0;
6019 j->cadence_f[lcp->filter].off1max = 0;
6020 j->cadence_f[lcp->filter].on2 = lcp->on2;
6021 j->cadence_f[lcp->filter].on2min = 0;
6022 j->cadence_f[lcp->filter].on2max = 0;
6023 j->cadence_f[lcp->filter].off2 = lcp->off2;
6024 j->cadence_f[lcp->filter].off2min = 0;
6025 j->cadence_f[lcp->filter].off2max = 0;
6026 j->cadence_f[lcp->filter].on3 = lcp->on3;
6027 j->cadence_f[lcp->filter].on3min = 0;
6028 j->cadence_f[lcp->filter].on3max = 0;
6029 j->cadence_f[lcp->filter].off3 = lcp->off3;
6030 j->cadence_f[lcp->filter].off3min = 0;
6031 j->cadence_f[lcp->filter].off3max = 0;
6033 if(ixjdebug & 0x0002) {
6034 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
6039 static void add_caps(IXJ *j)
6042 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
6043 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
6044 j->caplist[j->caps].captype = vendor;
6045 j->caplist[j->caps].handle = j->caps++;
6046 j->caplist[j->caps].captype = device;
6047 switch (j->cardtype) {
6049 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
6052 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
6054 case QTI_PHONEJACK_LITE:
6055 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
6057 case QTI_PHONEJACK_PCI:
6058 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
6061 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
6064 j->caplist[j->caps].cap = j->cardtype;
6065 j->caplist[j->caps].handle = j->caps++;
6066 strcpy(j->caplist[j->caps].desc, "POTS");
6067 j->caplist[j->caps].captype = port;
6068 j->caplist[j->caps].cap = pots;
6069 j->caplist[j->caps].handle = j->caps++;
6071 /* add devices that can do speaker/mic */
6072 switch (j->cardtype) {
6075 case QTI_PHONEJACK_PCI:
6077 strcpy(j->caplist[j->caps].desc, "SPEAKER");
6078 j->caplist[j->caps].captype = port;
6079 j->caplist[j->caps].cap = speaker;
6080 j->caplist[j->caps].handle = j->caps++;
6085 /* add devices that can do handset */
6086 switch (j->cardtype) {
6088 strcpy(j->caplist[j->caps].desc, "HANDSET");
6089 j->caplist[j->caps].captype = port;
6090 j->caplist[j->caps].cap = handset;
6091 j->caplist[j->caps].handle = j->caps++;
6097 /* add devices that can do PSTN */
6098 switch (j->cardtype) {
6100 strcpy(j->caplist[j->caps].desc, "PSTN");
6101 j->caplist[j->caps].captype = port;
6102 j->caplist[j->caps].cap = pstn;
6103 j->caplist[j->caps].handle = j->caps++;
6109 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6110 strcpy(j->caplist[j->caps].desc, "ULAW");
6111 j->caplist[j->caps].captype = codec;
6112 j->caplist[j->caps].cap = ULAW;
6113 j->caplist[j->caps].handle = j->caps++;
6115 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6116 j->caplist[j->caps].captype = codec;
6117 j->caplist[j->caps].cap = LINEAR16;
6118 j->caplist[j->caps].handle = j->caps++;
6120 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6121 j->caplist[j->caps].captype = codec;
6122 j->caplist[j->caps].cap = LINEAR8;
6123 j->caplist[j->caps].handle = j->caps++;
6125 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6126 j->caplist[j->caps].captype = codec;
6127 j->caplist[j->caps].cap = WSS;
6128 j->caplist[j->caps].handle = j->caps++;
6130 /* software ALAW codec, made from ULAW */
6131 strcpy(j->caplist[j->caps].desc, "ALAW");
6132 j->caplist[j->caps].captype = codec;
6133 j->caplist[j->caps].cap = ALAW;
6134 j->caplist[j->caps].handle = j->caps++;
6136 /* version 12 of the 8020 does the following codecs in a broken way */
6137 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6138 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6139 j->caplist[j->caps].captype = codec;
6140 j->caplist[j->caps].cap = G723_63;
6141 j->caplist[j->caps].handle = j->caps++;
6143 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6144 j->caplist[j->caps].captype = codec;
6145 j->caplist[j->caps].cap = G723_53;
6146 j->caplist[j->caps].handle = j->caps++;
6148 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6149 j->caplist[j->caps].captype = codec;
6150 j->caplist[j->caps].cap = TS48;
6151 j->caplist[j->caps].handle = j->caps++;
6153 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6154 j->caplist[j->caps].captype = codec;
6155 j->caplist[j->caps].cap = TS41;
6156 j->caplist[j->caps].handle = j->caps++;
6159 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6160 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6161 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6162 j->caplist[j->caps].captype = codec;
6163 j->caplist[j->caps].cap = TS85;
6164 j->caplist[j->caps].handle = j->caps++;
6167 /* 8021 chips can do G728 */
6168 if (j->dsp.low == 0x21) {
6169 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6170 j->caplist[j->caps].captype = codec;
6171 j->caplist[j->caps].cap = G728;
6172 j->caplist[j->caps].handle = j->caps++;
6175 /* 8021/8022 chips can do G729 if loaded */
6176 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6177 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6178 j->caplist[j->caps].captype = codec;
6179 j->caplist[j->caps].cap = G729;
6180 j->caplist[j->caps].handle = j->caps++;
6182 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6183 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6184 j->caplist[j->caps].captype = codec;
6185 j->caplist[j->caps].cap = G729B;
6186 j->caplist[j->caps].handle = j->caps++;
6190 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6194 for (cnt = 0; cnt < j->caps; cnt++) {
6195 if (pcreq->captype == j->caplist[cnt].captype
6196 && pcreq->cap == j->caplist[cnt].cap) {
6204 static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6210 unsigned int raise, mant;
6211 unsigned int minor = iminor(inode);
6212 int board = NUM(inode);
6214 IXJ *j = get_ixj(NUM(inode));
6219 * Set up locks to ensure that only one process is talking to the DSP at a time.
6220 * This is necessary to keep the DSP from locking up.
6222 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
6223 set_current_state(TASK_INTERRUPTIBLE);
6224 schedule_timeout(1);
6226 if (ixjdebug & 0x0040)
6227 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6228 if (minor >= IXJMAX) {
6229 clear_bit(board, &j->busyflags);
6233 * Check ioctls only root can use.
6235 if (!capable(CAP_SYS_ADMIN)) {
6237 case IXJCTL_TESTRAM:
6243 case IXJCTL_TESTRAM:
6245 retval = (j->ssr.high << 8) + j->ssr.low;
6247 case IXJCTL_CARDTYPE:
6248 retval = j->cardtype;
6253 case IXJCTL_VERSION:
6254 if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision)))
6257 case PHONE_RING_CADENCE:
6258 j->ring_cadence = arg;
6262 if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
6267 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6271 /* Binary compatbility */
6272 case OLD_PHONE_RING_START:
6275 case PHONE_RING_START:
6277 if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
6283 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6287 case PHONE_RING_STOP:
6288 j->flags.cringing = 0;
6289 if(j->cadence_f[5].enable) {
6290 j->cadence_f[5].state = 0;
6295 retval = ixj_ring(j);
6297 case PHONE_EXCEPTION:
6298 retval = j->ex.bytes;
6299 if(j->ex.bits.flash) {
6301 j->ex.bits.flash = 0;
6303 j->ex.bits.pstn_ring = 0;
6304 j->ex.bits.caller_id = 0;
6305 j->ex.bits.pstn_wink = 0;
6314 j->ex.bits.reserved = 0;
6316 case PHONE_HOOKSTATE:
6317 j->ex.bits.hookstate = 0;
6318 retval = j->hookstate; //j->r_hook;
6320 case IXJCTL_SET_LED:
6321 LED_SetState(arg, j);
6324 retval = set_base_frame(j, arg);
6326 case PHONE_REC_CODEC:
6327 retval = set_rec_codec(j, arg);
6332 case PHONE_REC_START:
6333 ixj_record_start(j);
6335 case PHONE_REC_STOP:
6338 case PHONE_REC_DEPTH:
6339 set_rec_depth(j, arg);
6341 case PHONE_REC_VOLUME:
6343 retval = get_rec_volume(j);
6346 set_rec_volume(j, arg);
6350 case PHONE_REC_VOLUME_LINEAR:
6352 retval = get_rec_volume_linear(j);
6355 set_rec_volume_linear(j, arg);
6359 case IXJCTL_DTMF_PRESCALE:
6361 retval = get_dtmf_prescale(j);
6364 set_dtmf_prescale(j, arg);
6368 case PHONE_REC_LEVEL:
6369 retval = get_rec_level(j);
6372 retval = ixj_siadc(j, arg);
6375 retval = ixj_sidac(j, arg);
6377 case IXJCTL_AEC_START:
6378 ixj_aec_start(j, arg);
6380 case IXJCTL_AEC_STOP:
6383 case IXJCTL_AEC_GET_LEVEL:
6384 retval = j->aec_level;
6386 case PHONE_PLAY_CODEC:
6387 retval = set_play_codec(j, arg);
6389 case PHONE_PLAY_START:
6390 retval = ixj_play_start(j);
6392 case PHONE_PLAY_STOP:
6395 case PHONE_PLAY_DEPTH:
6396 set_play_depth(j, arg);
6398 case PHONE_PLAY_VOLUME:
6400 retval = get_play_volume(j);
6403 set_play_volume(j, arg);
6407 case PHONE_PLAY_VOLUME_LINEAR:
6409 retval = get_play_volume_linear(j);
6412 set_play_volume_linear(j, arg);
6416 case PHONE_PLAY_LEVEL:
6417 retval = get_play_level(j);
6419 case IXJCTL_DSP_TYPE:
6420 retval = (j->dsp.high << 8) + j->dsp.low;
6422 case IXJCTL_DSP_VERSION:
6423 retval = (j->ver.high << 8) + j->ver.low;
6434 case IXJCTL_DRYBUFFER_READ:
6435 put_user(j->drybuffer, (unsigned long *) arg);
6437 case IXJCTL_DRYBUFFER_CLEAR:
6440 case IXJCTL_FRAMES_READ:
6441 put_user(j->framesread, (unsigned long *) arg);
6443 case IXJCTL_FRAMES_WRITTEN:
6444 put_user(j->frameswritten, (unsigned long *) arg);
6446 case IXJCTL_READ_WAIT:
6447 put_user(j->read_wait, (unsigned long *) arg);
6449 case IXJCTL_WRITE_WAIT:
6450 put_user(j->write_wait, (unsigned long *) arg);
6452 case PHONE_MAXRINGS:
6455 case PHONE_SET_TONE_ON_TIME:
6456 ixj_set_tone_on(arg, j);
6458 case PHONE_SET_TONE_OFF_TIME:
6459 ixj_set_tone_off(arg, j);
6461 case PHONE_GET_TONE_ON_TIME:
6462 if (ixj_get_tone_on(j)) {
6465 retval = (j->ssr.high << 8) + j->ssr.low;
6468 case PHONE_GET_TONE_OFF_TIME:
6469 if (ixj_get_tone_off(j)) {
6472 retval = (j->ssr.high << 8) + j->ssr.low;
6475 case PHONE_PLAY_TONE:
6477 retval = ixj_play_tone(j, arg);
6481 case PHONE_GET_TONE_STATE:
6482 retval = j->tone_state;
6484 case PHONE_DTMF_READY:
6485 retval = j->ex.bits.dtmf_ready;
6487 case PHONE_GET_DTMF:
6488 if (ixj_hookstate(j)) {
6489 if (j->dtmf_rp != j->dtmf_wp) {
6490 retval = j->dtmfbuffer[j->dtmf_rp];
6492 if (j->dtmf_rp == 79)
6494 if (j->dtmf_rp == j->dtmf_wp) {
6495 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6500 case PHONE_GET_DTMF_ASCII:
6501 if (ixj_hookstate(j)) {
6502 if (j->dtmf_rp != j->dtmf_wp) {
6503 switch (j->dtmfbuffer[j->dtmf_rp]) {
6505 retval = 42; /* '*'; */
6509 retval = 48; /*'0'; */
6513 retval = 35; /*'#'; */
6517 retval = 65; /*'A'; */
6521 retval = 66; /*'B'; */
6525 retval = 67; /*'C'; */
6529 retval = 68; /*'D'; */
6533 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6537 if (j->dtmf_rp == 79)
6539 if(j->dtmf_rp == j->dtmf_wp)
6541 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6546 case PHONE_DTMF_OOB:
6547 j->flags.dtmf_oob = arg;
6549 case PHONE_DIALTONE:
6555 case PHONE_RINGBACK:
6559 if(j->cardtype == QTI_PHONEJACK)
6562 retval = ixj_wink(j);
6564 case PHONE_CPT_STOP:
6567 case PHONE_QUERY_CODEC:
6569 struct phone_codec_data pd;
6571 int proto_size[] = {
6573 12, 10, 16, 9, 8, 48, 5,
6574 40, 40, 80, 40, 40, 6
6576 if(copy_from_user(&pd, (void *)arg, sizeof(pd))) {
6580 if(pd.type<1 || pd.type>13) {
6581 retval = -EPROTONOSUPPORT;
6585 val=proto_size[pd.type];
6586 else switch(j->baseframe.low)
6588 case 0xA0:val=2*proto_size[pd.type];break;
6589 case 0x50:val=proto_size[pd.type];break;
6590 default:val=proto_size[pd.type]*3;break;
6592 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6593 if(copy_to_user((void *)arg, &pd, sizeof(pd)))
6597 case IXJCTL_DSP_IDLE:
6601 if ((arg & 0xff) == 0xff)
6602 retval = ixj_get_mixer(arg, j);
6606 case IXJCTL_DAA_COEFF_SET:
6610 retval = ixj_daa_write(j);
6614 retval = ixj_daa_write(j);
6617 DAA_Coeff_France(j);
6618 retval = ixj_daa_write(j);
6621 DAA_Coeff_Germany(j);
6622 retval = ixj_daa_write(j);
6625 DAA_Coeff_Australia(j);
6626 retval = ixj_daa_write(j);
6630 retval = ixj_daa_write(j);
6637 case IXJCTL_DAA_AGAIN:
6638 ixj_daa_cr4(j, arg | 0x02);
6640 case IXJCTL_PSTN_LINETEST:
6641 retval = ixj_linetest(j);
6644 ixj_write_vmwi(j, arg);
6647 if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID)))
6649 j->ex.bits.caller_id = 0;
6651 case IXJCTL_WINK_DURATION:
6656 retval = ixj_set_port(j, arg);
6660 case IXJCTL_POTS_PSTN:
6661 retval = ixj_set_pots(j, arg);
6663 case PHONE_CAPABILITIES:
6667 case PHONE_CAPABILITIES_LIST:
6669 if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
6672 case PHONE_CAPABILITIES_CHECK:
6674 struct phone_capability cap;
6675 if (copy_from_user(&cap, (char *) arg, sizeof(cap)))
6679 retval = capabilities_check(j, &cap);
6683 case PHONE_PSTN_SET_STATE:
6684 daa_set_mode(j, arg);
6686 case PHONE_PSTN_GET_STATE:
6687 retval = j->daa_mode;
6688 j->ex.bits.pstn_ring = 0;
6690 case IXJCTL_SET_FILTER:
6691 if (copy_from_user(&jf, (char *) arg, sizeof(jf)))
6693 retval = ixj_init_filter(j, &jf);
6695 case IXJCTL_SET_FILTER_RAW:
6696 if (copy_from_user(&jfr, (char *) arg, sizeof(jfr)))
6699 retval = ixj_init_filter_raw(j, &jfr);
6701 case IXJCTL_GET_FILTER_HIST:
6705 retval = j->filter_hist[arg];
6707 case IXJCTL_INIT_TONE:
6708 if (copy_from_user(&ti, (char *) arg, sizeof(ti)))
6711 retval = ixj_init_tone(j, &ti);
6713 case IXJCTL_TONE_CADENCE:
6714 retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
6716 case IXJCTL_FILTER_CADENCE:
6717 retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
6720 if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF))) {
6724 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6725 if(j->sigdef.event < 33) {
6727 for(mant = 0; mant < j->sigdef.event; mant++){
6730 if(j->sigdef.signal)
6731 j->ex_sig.bytes |= raise;
6733 j->ex_sig.bytes &= (raise^0xffff);
6736 case IXJCTL_INTERCOM_STOP:
6737 if(arg < 0 || arg >= IXJMAX)
6743 get_ixj(arg)->intercom = -1;
6744 ixj_record_stop(get_ixj(arg));
6745 ixj_play_stop(get_ixj(arg));
6748 case IXJCTL_INTERCOM_START:
6749 if(arg < 0 || arg >= IXJMAX)
6752 ixj_record_start(j);
6754 get_ixj(arg)->intercom = board;
6755 ixj_play_start(get_ixj(arg));
6756 ixj_record_start(get_ixj(arg));
6759 if (ixjdebug & 0x0040)
6760 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6761 clear_bit(board, &j->busyflags);
6765 static int ixj_fasync(int fd, struct file *file_p, int mode)
6767 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
6769 return fasync_helper(fd, file_p, mode, &j->async_queue);
6772 struct file_operations ixj_fops =
6774 .owner = THIS_MODULE,
6775 .read = ixj_enhanced_read,
6776 .write = ixj_enhanced_write,
6779 .release = ixj_release,
6780 .fasync = ixj_fasync
6783 static int ixj_linetest(IXJ *j)
6785 unsigned long jifwait;
6787 j->flags.pstncheck = 1; /* Testing */
6788 j->flags.pstn_present = 0; /* Assume the line is not there */
6790 daa_int_read(j); /*Clear DAA Interrupt flags */
6792 /* Hold all relays in the normally de-energized position. */
6795 j->pld_slicw.bits.rly1 = 0;
6796 j->pld_slicw.bits.rly2 = 0;
6797 j->pld_slicw.bits.rly3 = 0;
6798 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6799 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6801 outb_p(j->pld_scrw.byte, j->XILINXbase);
6802 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6803 if (j->pld_slicr.bits.potspstn) {
6804 j->flags.pots_pstn = 1;
6805 j->flags.pots_correct = 0;
6806 LED_SetState(0x4, j);
6808 j->flags.pots_pstn = 0;
6809 j->pld_slicw.bits.rly1 = 0;
6810 j->pld_slicw.bits.rly2 = 0;
6811 j->pld_slicw.bits.rly3 = 1;
6812 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6813 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6815 outb_p(j->pld_scrw.byte, j->XILINXbase);
6816 daa_set_mode(j, SOP_PU_CONVERSATION);
6817 jifwait = jiffies + hertz;
6818 while (time_before(jiffies, jifwait)) {
6819 set_current_state(TASK_INTERRUPTIBLE);
6820 schedule_timeout(1);
6823 daa_set_mode(j, SOP_PU_RESET);
6824 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6825 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6826 LED_SetState(0x4, j);
6827 j->pld_slicw.bits.rly3 = 0;
6828 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6830 j->flags.pots_correct = 1;
6831 LED_SetState(0x8, j);
6832 j->pld_slicw.bits.rly1 = 1;
6833 j->pld_slicw.bits.rly2 = 0;
6834 j->pld_slicw.bits.rly3 = 0;
6835 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6838 j->pld_slicw.bits.rly3 = 0;
6839 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6840 daa_set_mode(j, SOP_PU_CONVERSATION);
6841 jifwait = jiffies + hertz;
6842 while (time_before(jiffies, jifwait)) {
6843 set_current_state(TASK_INTERRUPTIBLE);
6844 schedule_timeout(1);
6847 daa_set_mode(j, SOP_PU_RESET);
6848 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6849 j->pstn_sleeptil = jiffies + (hertz / 4);
6850 j->flags.pstn_present = 1;
6852 j->flags.pstn_present = 0;
6854 if (j->flags.pstn_present) {
6855 if (j->flags.pots_correct) {
6856 LED_SetState(0xA, j);
6858 LED_SetState(0x6, j);
6861 if (j->flags.pots_correct) {
6862 LED_SetState(0x9, j);
6864 LED_SetState(0x5, j);
6867 j->flags.pstncheck = 0; /* Testing */
6868 return j->flags.pstn_present;
6871 static int ixj_selfprobe(IXJ *j)
6878 init_waitqueue_head(&j->poll_q);
6879 init_waitqueue_head(&j->read_q);
6880 init_waitqueue_head(&j->write_q);
6882 while(atomic_read(&j->DSPWrite) > 0)
6883 atomic_dec(&j->DSPWrite);
6884 if (ixjdebug & 0x0002)
6885 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6886 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6888 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6890 /* The read values of the SSR should be 0x00 for the IDLE command */
6891 if (j->ssr.low || j->ssr.high)
6893 if (ixjdebug & 0x0002)
6894 printk(KERN_INFO "Get Device ID Code\n");
6895 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6897 j->dsp.low = j->ssr.low;
6898 j->dsp.high = j->ssr.high;
6899 if (ixjdebug & 0x0002)
6900 printk(KERN_INFO "Get Device Version Code\n");
6901 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6903 j->ver.low = j->ssr.low;
6904 j->ver.high = j->ssr.high;
6906 if (j->dsp.low == 0x21) {
6907 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6908 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6909 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6910 bytes.low = inb_p(j->XILINXbase + 0x02);
6911 if (bytes.low == bytes.high) /* Register is read only on */
6912 /* Internet PhoneJack Lite */
6914 j->cardtype = QTI_PHONEJACK_LITE;
6915 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6916 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6919 j->pld_slicw.pcib.e1 = 1;
6920 outb_p(j->pld_slicw.byte, j->XILINXbase);
6922 j->cardtype = QTI_LINEJACK;
6924 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6925 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6929 } else if (j->dsp.low == 0x22) {
6930 j->cardtype = QTI_PHONEJACK_PCI;
6931 request_region(j->XILINXbase, 4, "ixj control");
6932 j->pld_slicw.pcib.e1 = 1;
6933 outb_p(j->pld_slicw.byte, j->XILINXbase);
6935 j->cardtype = QTI_PHONEJACK;
6937 switch (j->cardtype) {
6939 if (!j->dsp.low != 0x20) {
6942 ixj_WriteDSPCommand(0x3800, j);
6943 j->ver.low = j->ssr.low;
6944 j->ver.high = j->ssr.high;
6948 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6949 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6953 case QTI_PHONEJACK_LITE:
6954 case QTI_PHONEJACK_PCI:
6955 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6956 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6959 j->pld_slicw.pcib.e1 = 1;
6960 outb_p(j->pld_slicw.byte, j->XILINXbase);
6966 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6967 if (ixjdebug & 0x0002)
6968 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6969 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6971 if (ixjdebug & 0x0002)
6972 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6973 if (j->cardtype == QTI_PHONEJACK) {
6978 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6981 if (set_base_frame(j, 30) != 30)
6983 if (ixjdebug & 0x0002)
6984 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6985 if (j->cardtype == QTI_PHONECARD) {
6986 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6989 if (j->cardtype == QTI_LINEJACK) {
6990 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6992 if (ixjdebug & 0x0002)
6993 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6994 j->pld_clock.byte = 0;
6995 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6999 if (j->dsp.low == 0x20) {
7000 if (ixjdebug & 0x0002)
7001 printk(KERN_INFO "Configure GPIO pins\n");
7002 j->gpio.bytes.high = 0x09;
7003 /* bytes.low = 0xEF; 0xF7 */
7004 j->gpio.bits.gpio1 = 1;
7005 j->gpio.bits.gpio2 = 1;
7006 j->gpio.bits.gpio3 = 0;
7007 j->gpio.bits.gpio4 = 1;
7008 j->gpio.bits.gpio5 = 1;
7009 j->gpio.bits.gpio6 = 1;
7010 j->gpio.bits.gpio7 = 1;
7011 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
7012 if (ixjdebug & 0x0002)
7013 printk(KERN_INFO "Enable SLIC\n");
7014 j->gpio.bytes.high = 0x0B;
7015 j->gpio.bytes.low = 0x00;
7016 j->gpio.bits.gpio1 = 0;
7017 j->gpio.bits.gpio2 = 1;
7018 j->gpio.bits.gpio5 = 0;
7019 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
7020 j->port = PORT_POTS;
7022 if (j->cardtype == QTI_LINEJACK) {
7023 LED_SetState(0x1, j);
7024 jif = jiffies + (hertz / 10);
7025 while (time_before(jiffies, jif)) {
7026 set_current_state(TASK_INTERRUPTIBLE);
7027 schedule_timeout(1);
7029 LED_SetState(0x2, j);
7030 jif = jiffies + (hertz / 10);
7031 while (time_before(jiffies, jif)) {
7032 set_current_state(TASK_INTERRUPTIBLE);
7033 schedule_timeout(1);
7035 LED_SetState(0x4, j);
7036 jif = jiffies + (hertz / 10);
7037 while (time_before(jiffies, jif)) {
7038 set_current_state(TASK_INTERRUPTIBLE);
7039 schedule_timeout(1);
7041 LED_SetState(0x8, j);
7042 jif = jiffies + (hertz / 10);
7043 while (time_before(jiffies, jif)) {
7044 set_current_state(TASK_INTERRUPTIBLE);
7045 schedule_timeout(1);
7047 LED_SetState(0x0, j);
7049 if (ixjdebug & 0x0002)
7050 printk("Loading DAA Coefficients\n");
7052 if (!ixj_daa_write(j)) {
7053 printk("DAA write failed on board %d\n", j->board);
7056 if(!ixj_daa_cid_reset(j)) {
7057 printk("DAA CID reset failed on board %d\n", j->board);
7060 j->flags.pots_correct = 0;
7061 j->flags.pstn_present = 0;
7063 if (j->flags.pots_correct) {
7064 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7066 outb_p(j->pld_scrw.byte, j->XILINXbase);
7067 j->pld_slicw.bits.rly1 = 1;
7068 j->pld_slicw.bits.spken = 1;
7069 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7070 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7071 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7072 j->port = PORT_POTS;
7074 ixj_set_port(j, PORT_PSTN);
7076 if (ixjdebug & 0x0002)
7077 printk(KERN_INFO "Enable Mixer\n");
7078 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
7079 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
7081 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
7082 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
7084 ixj_mixer(0x0480, j); /*FM Left mute */
7085 ixj_mixer(0x0580, j); /*FM Right mute */
7087 ixj_mixer(0x0680, j); /*CD Left mute */
7088 ixj_mixer(0x0780, j); /*CD Right mute */
7090 ixj_mixer(0x0880, j); /*Line Left mute */
7091 ixj_mixer(0x0980, j); /*Line Right mute */
7093 ixj_mixer(0x0A80, j); /*Aux left mute */
7094 ixj_mixer(0x0B80, j); /*Aux right mute */
7096 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
7097 ixj_mixer(0x0D80, j); /*Mono2 mute */
7099 ixj_mixer(0x0E80, j); /*Mic mute */
7101 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
7103 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
7104 ixj_mixer(0x110C, j);
7107 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
7108 ixj_mixer(0x1401, j);
7110 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
7111 ixj_mixer(0x1501, j);
7113 ixj_mixer(0x1700, j); /*Clock select */
7115 ixj_mixer(0x1800, j); /*ADC input from mixer */
7117 ixj_mixer(0x1901, j); /*Mic gain 30db */
7119 if (ixjdebug & 0x0002)
7120 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
7121 j->cadence_f[4].state = 0;
7122 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7123 j->cadence_f[4].off1 = 0;
7124 j->cadence_f[4].on2 = 0;
7125 j->cadence_f[4].off2 = 0;
7126 j->cadence_f[4].on3 = 0;
7127 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7128 j->pstn_last_rmr = jiffies;
7131 if (j->cardtype == QTI_PHONECARD) {
7132 ixj_WriteDSPCommand(0xCF07, j);
7133 ixj_WriteDSPCommand(0x00B0, j);
7134 ixj_set_port(j, PORT_SPEAKER);
7136 ixj_set_port(j, PORT_POTS);
7137 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7138 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7144 j->framesread = j->frameswritten = 0;
7145 j->read_wait = j->write_wait = 0;
7146 j->rxreadycheck = j->txreadycheck = 0;
7148 /* initialise the DTMF prescale to a sensible value */
7149 if (j->cardtype == QTI_LINEJACK) {
7150 set_dtmf_prescale(j, 0x10);
7152 set_dtmf_prescale(j, 0x40);
7154 set_play_volume(j, 0x100);
7155 set_rec_volume(j, 0x100);
7157 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7159 /* The read values of the SSR should be 0x00 for the IDLE command */
7160 if (j->ssr.low || j->ssr.high)
7163 if (ixjdebug & 0x0002)
7164 printk(KERN_INFO "Enable Line Monitor\n");
7166 if (ixjdebug & 0x0002)
7167 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7169 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7172 if (ixjdebug & 0x002)
7173 printk(KERN_INFO "Enable DTMF Detectors\n");
7175 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7178 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7181 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7183 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7185 j->ex.bits.dtmf_ready = 0;
7187 j->dtmf_wp = j->dtmf_rp = 0;
7188 j->rec_mode = j->play_mode = -1;
7189 j->flags.ringing = 0;
7190 j->maxrings = MAXRINGS;
7191 j->ring_cadence = USA_RING_CADENCE;
7194 j->flags.dtmf_oob = 0;
7195 for (cnt = 0; cnt < 4; cnt++)
7196 j->cadence_f[cnt].enable = 0;
7197 /* must be a device on the specified address */
7198 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7200 /* Set up the default signals for events */
7201 for (cnt = 0; cnt < 35; cnt++)
7202 j->ixj_signals[cnt] = SIGIO;
7204 /* Set the excetion signal enable flags */
7205 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7206 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 =
7207 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;
7208 #ifdef IXJ_DYN_ALLOC
7214 /* Register with the Telephony for Linux subsystem */
7215 j->p.f_op = &ixj_fops;
7216 j->p.open = ixj_open;
7217 j->p.board = j->board;
7218 phone_register_device(&j->p, PHONE_UNIT_ANY);
7226 * Exported service for pcmcia card handling
7229 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7231 IXJ *j = ixj_alloc();
7236 j->XILINXbase = xilinx;
7237 j->cardtype = QTI_PHONECARD;
7242 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7244 static int ixj_get_status_proc(char *buf)
7250 len += sprintf(buf + len, "%s", ixj_c_rcsid);
7251 len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
7252 len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
7253 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7254 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7255 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7256 len += sprintf(buf + len, "\nUsing old telephony API");
7257 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7259 for (cnt = 0; cnt < IXJMAX; cnt++) {
7264 len += sprintf(buf + len, "\nCard Num %d", cnt);
7265 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7266 if (j->cardtype != QTI_PHONEJACK)
7267 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7268 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7269 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7270 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7271 switch (j->cardtype) {
7272 case (QTI_PHONEJACK):
7273 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7275 case (QTI_LINEJACK):
7276 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7277 if (j->flags.g729_loaded)
7278 len += sprintf(buf + len, " w/G.729 A/B");
7279 len += sprintf(buf + len, " Country = %d", j->daa_country);
7281 case (QTI_PHONEJACK_LITE):
7282 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7283 if (j->flags.g729_loaded)
7284 len += sprintf(buf + len, " w/G.729 A/B");
7286 case (QTI_PHONEJACK_PCI):
7287 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7288 if (j->flags.g729_loaded)
7289 len += sprintf(buf + len, " w/G.729 A/B");
7291 case (QTI_PHONECARD):
7292 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7293 if (j->flags.g729_loaded)
7294 len += sprintf(buf + len, " w/G.729 A/B");
7295 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7296 if (!j->pccr1.bits.drf)
7297 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7298 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7301 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7304 len += sprintf(buf + len, "\nReaders %d", j->readers);
7305 len += sprintf(buf + len, "\nWriters %d", j->writers);
7307 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7308 if (j->dsp.low != 0x20)
7309 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7310 if (j->flags.cidsent)
7311 len += sprintf(buf + len, "\nCaller ID data sent");
7313 len += sprintf(buf + len, "\nCaller ID data not sent");
7315 len += sprintf(buf + len, "\nPlay CODEC ");
7316 switch (j->play_codec) {
7318 len += sprintf(buf + len, "G.723.1 6.3");
7321 len += sprintf(buf + len, "G.723.1 5.3");
7324 len += sprintf(buf + len, "TrueSpeech 8.5");
7327 len += sprintf(buf + len, "TrueSpeech 4.8");
7330 len += sprintf(buf + len, "TrueSpeech 4.1");
7333 len += sprintf(buf + len, "G.728");
7336 len += sprintf(buf + len, "G.729");
7339 len += sprintf(buf + len, "G.729B");
7342 len += sprintf(buf + len, "uLaw");
7345 len += sprintf(buf + len, "aLaw");
7348 len += sprintf(buf + len, "16 bit Linear");
7351 len += sprintf(buf + len, "8 bit Linear");
7354 len += sprintf(buf + len, "Windows Sound System");
7357 len += sprintf(buf + len, "NO CODEC CHOSEN");
7360 len += sprintf(buf + len, "\nRecord CODEC ");
7361 switch (j->rec_codec) {
7363 len += sprintf(buf + len, "G.723.1 6.3");
7366 len += sprintf(buf + len, "G.723.1 5.3");
7369 len += sprintf(buf + len, "TrueSpeech 8.5");
7372 len += sprintf(buf + len, "TrueSpeech 4.8");
7375 len += sprintf(buf + len, "TrueSpeech 4.1");
7378 len += sprintf(buf + len, "G.728");
7381 len += sprintf(buf + len, "G.729");
7384 len += sprintf(buf + len, "G.729B");
7387 len += sprintf(buf + len, "uLaw");
7390 len += sprintf(buf + len, "aLaw");
7393 len += sprintf(buf + len, "16 bit Linear");
7396 len += sprintf(buf + len, "8 bit Linear");
7399 len += sprintf(buf + len, "Windows Sound System");
7402 len += sprintf(buf + len, "NO CODEC CHOSEN");
7405 len += sprintf(buf + len, "\nAEC ");
7406 switch (j->aec_level) {
7408 len += sprintf(buf + len, "Off");
7411 len += sprintf(buf + len, "Low");
7414 len += sprintf(buf + len, "Med");
7417 len += sprintf(buf + len, "High");
7420 len += sprintf(buf + len, "Auto");
7423 len += sprintf(buf + len, "AEC/AGC");
7426 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7430 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7431 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7432 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7434 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7436 if (j->cardtype == QTI_LINEJACK) {
7437 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7438 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7439 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7440 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7441 switch (j->daa_mode) {
7443 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7445 case SOP_PU_RINGING:
7446 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7447 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7449 case SOP_PU_CONVERSATION:
7450 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7452 case SOP_PU_PULSEDIALING:
7453 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7456 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7457 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7458 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7459 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7460 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7461 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7462 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7463 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7464 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7465 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7469 len += sprintf(buf + len, "\nPort POTS");
7472 len += sprintf(buf + len, "\nPort PSTN");
7475 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7478 len += sprintf(buf + len, "\nPort HANDSET");
7481 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7482 len += sprintf(buf + len, "\nSLIC state ");
7483 switch (SLIC_GetState(j)) {
7484 case PLD_SLIC_STATE_OC:
7485 len += sprintf(buf + len, "OC");
7487 case PLD_SLIC_STATE_RINGING:
7488 len += sprintf(buf + len, "RINGING");
7490 case PLD_SLIC_STATE_ACTIVE:
7491 len += sprintf(buf + len, "ACTIVE");
7493 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7494 len += sprintf(buf + len, "OHT");
7496 case PLD_SLIC_STATE_TIPOPEN:
7497 len += sprintf(buf + len, "TIPOPEN");
7499 case PLD_SLIC_STATE_STANDBY:
7500 len += sprintf(buf + len, "STANDBY");
7502 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7503 len += sprintf(buf + len, "APR");
7505 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7506 len += sprintf(buf + len, "OHTPR");
7509 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7513 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7514 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7515 #ifdef PERFMON_STATS
7516 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7517 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7518 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7519 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7520 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7521 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7522 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7523 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7524 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7525 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7526 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7527 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7528 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7529 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7532 len += sprintf(buf + len, "\n");
7538 static int ixj_read_proc(char *page, char **start, off_t off,
7539 int count, int *eof, void *data)
7541 int len = ixj_get_status_proc(page);
7542 if (len <= off+count) *eof = 1;
7543 *start = page + off;
7545 if (len>count) len = count;
7551 static void cleanup(void)
7556 for (cnt = 0; cnt < IXJMAX; cnt++) {
7558 if(j != NULL && j->DSPbase) {
7559 if (ixjdebug & 0x0002)
7560 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7561 del_timer(&j->timer);
7562 if (j->cardtype == QTI_LINEJACK) {
7563 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7565 outb_p(j->pld_scrw.byte, j->XILINXbase);
7566 j->pld_slicw.bits.rly1 = 0;
7567 j->pld_slicw.bits.rly2 = 0;
7568 j->pld_slicw.bits.rly3 = 0;
7569 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7570 LED_SetState(0x0, j);
7571 if (ixjdebug & 0x0002)
7572 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7573 release_region(j->XILINXbase, 8);
7574 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7575 if (ixjdebug & 0x0002)
7576 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7577 release_region(j->XILINXbase, 4);
7580 kfree(j->read_buffer);
7581 if (j->write_buffer)
7582 kfree(j->write_buffer);
7584 pnp_device_detach(j->dev);
7585 if (ixjdebug & 0x0002)
7586 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7587 phone_unregister_device(&j->p);
7588 if (ixjdebug & 0x0002)
7589 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7590 release_region(j->DSPbase, 16);
7591 #ifdef IXJ_DYN_ALLOC
7592 if (ixjdebug & 0x0002)
7593 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7599 if (ixjdebug & 0x0002)
7600 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7601 remove_proc_entry ("ixj", NULL);
7610 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7612 lastLCC = lastLCC & 0xfb;
7613 lastLCC = lastLCC | (byData ? 4 : 0);
7614 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7617 lastLCC = lastLCC | 0x01;
7618 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7620 byData = byData << 1;
7621 lastLCC = lastLCC & 0xfe;
7623 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7627 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7630 lastLCC = lastLCC | 0x01;
7631 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7633 lastLCC = lastLCC & 0xfe;
7635 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7637 return ((inb(wEEPROMAddress) >> 3) & 1);
7640 static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7643 WORD wEEPROMAddress = wAddress + 3;
7647 lastLCC = inb(wEEPROMAddress);
7648 lastLCC = lastLCC | 0x02;
7649 lastLCC = lastLCC & 0xfe;
7650 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7652 mdelay(1); /* delay */
7654 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7655 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7656 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7657 for (i = 0; i < 8; i++) {
7658 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7662 for (i = 0; i < 16; i++) {
7663 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7664 *pwResult = (*pwResult << 1) | byResult;
7667 mdelay(1); /* another delay */
7669 lastLCC = lastLCC & 0xfd;
7670 outb(lastLCC, wEEPROMAddress); /* negate CS */
7675 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7678 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7680 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7682 return (((DWORD) wHi << 16) | wLo);
7685 static int dspio[IXJMAX + 1] =
7689 static int xio[IXJMAX + 1] =
7694 MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
7695 MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
7696 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7697 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7698 MODULE_LICENSE("GPL");
7700 static void __exit ixj_exit(void)
7705 int __init ixj_probe_isapnp(int *cnt)
7709 struct pnp_dev *dev = NULL, *old_dev = NULL;
7717 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7718 ISAPNP_FUNCTION(func), old_dev);
7719 if (!dev || !dev->card)
7721 result = pnp_device_attach(dev);
7723 printk("pnp attach failed %d \n", result);
7726 if (pnp_activate_dev(dev) < 0) {
7727 printk("pnp activate failed (out of resources?)\n");
7728 pnp_device_detach(dev);
7732 if (!pnp_port_valid(dev, 0)) {
7733 pnp_device_detach(dev);
7737 result = check_region(pnp_port_start(dev, 0), 16);
7739 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", pnp_port_start(dev, 0));
7744 request_region(j->DSPbase, 16, "ixj DSP");
7747 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7751 j->cardtype = QTI_PHONEJACK;
7754 j->cardtype = QTI_LINEJACK;
7757 j->cardtype = QTI_PHONEJACK_LITE;
7761 probe = ixj_selfprobe(j);
7763 j->serial = dev->card->serial;
7767 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7770 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7773 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7790 int __init ixj_probe_isa(int *cnt)
7792 int i, result, probe;
7794 /* Use passed parameters for older kernels without PnP */
7795 for (i = 0; i < IXJMAX; i++) {
7799 if ((result = check_region(ixj[*cnt].DSPbase, 16)) < 0) {
7800 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[*cnt].DSPbase);
7806 j->DSPbase = dspio[i];
7807 request_region(j->DSPbase, 16, "ixj DSP");
7809 j->XILINXbase = xio[i];
7813 probe = ixj_selfprobe(j);
7821 int __init ixj_probe_pci(int *cnt)
7823 struct pci_dev *pci = NULL;
7828 for (i = 0; i < IXJMAX - *cnt; i++) {
7829 pci = pci_find_device(0x15E2, 0x0500, pci);
7833 if (pci_enable_device(pci))
7835 if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
7836 printk(KERN_INFO "ixj: can't get I/O address\n");
7840 /* Grab a device slot */
7845 j->DSPbase = pci_resource_start(pci, 0);
7846 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7847 j->XILINXbase = j->DSPbase + 0x10;
7848 request_region(j->DSPbase, 16, "ixj DSP");
7849 j->cardtype = QTI_PHONEJACK_PCI;
7851 probe = ixj_selfprobe(j);
7853 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7859 static int __init ixj_init(void)
7866 /* These might be no-ops, see above. */
7867 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7870 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7873 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7876 printk("%s\n", ixj_c_rcsid);
7877 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7881 module_init(ixj_init);
7882 module_exit(ixj_exit);
7884 static void DAA_Coeff_US(IXJ *j)
7888 j->daa_country = DAA_US;
7889 /*----------------------------------------------- */
7891 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7892 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7895 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7896 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7897 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7898 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7899 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7900 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7901 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7902 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7903 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7904 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7905 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7906 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7907 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7908 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7909 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7910 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7911 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7912 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7913 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7914 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7915 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7916 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7917 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7918 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7919 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7920 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7921 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7922 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7923 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7924 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7925 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7926 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7927 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7928 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7929 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7930 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7931 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7932 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7933 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7934 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7935 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7936 /* Bytes for AR-filter (09): 52,D3,11,42 */
7937 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7938 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7939 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7940 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7941 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7942 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7943 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7944 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7945 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7946 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7947 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7948 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7949 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7950 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7951 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7952 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7953 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7954 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7955 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7956 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7957 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7958 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7959 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7960 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7961 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7962 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7963 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7964 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7965 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7966 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7967 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7968 /* ; (10K, 0.68uF) */
7970 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7971 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7972 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7973 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7974 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7975 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7976 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7977 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7978 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7979 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7980 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7981 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7982 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7983 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7984 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7985 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7986 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7987 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7989 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7990 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7991 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7992 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7993 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7995 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7996 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7997 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7998 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7999 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
8000 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
8001 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
8002 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
8003 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
8004 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8005 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
8006 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
8007 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
8008 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
8009 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
8010 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
8011 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
8012 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
8014 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8015 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
8016 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
8017 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
8018 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
8020 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8021 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8022 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8023 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8024 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8025 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8026 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8027 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8028 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8029 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8030 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8031 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8032 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8033 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8034 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8035 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8036 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8037 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8040 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
8041 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8042 /* Config. Reg. 1 (dialing) (cr1):05 */
8043 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8044 /* Config. Reg. 2 (caller ID) (cr2):04 */
8045 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8046 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
8047 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8048 /* Config. Reg. 4 (analog gain) (cr4):02 */
8049 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8050 /* Config. Reg. 5 (Version) (cr5):02 */
8051 /* Config. Reg. 6 (Reserved) (cr6):00 */
8052 /* Config. Reg. 7 (Reserved) (cr7):00 */
8055 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8057 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8058 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
8060 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
8061 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8062 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8063 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
8064 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
8065 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8067 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8068 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8069 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8070 /* Ext. Reg. 6 (Power State) (xr6):00 */
8071 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8072 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8073 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8075 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8076 /* 12,33,5A,C3 ; 770 Hz */
8077 /* 13,3C,5B,32 ; 852 Hz */
8078 /* 1D,1B,5C,CC ; 941 Hz */
8080 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8081 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8082 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8083 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8084 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8085 /* EC,1D,52,22 ; 1336 Hz */
8086 /* AA,AC,51,D2 ; 1477 Hz */
8087 /* 9B,3B,51,25 ; 1633 Hz */
8088 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8089 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8090 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8091 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8094 static void DAA_Coeff_UK(IXJ *j)
8098 j->daa_country = DAA_UK;
8099 /*----------------------------------------------- */
8101 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8102 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8105 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
8106 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8107 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
8108 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8109 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
8110 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
8111 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8112 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8113 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8114 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
8115 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
8116 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
8117 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8118 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
8119 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
8120 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8121 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8122 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8123 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
8124 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8125 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
8126 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
8127 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
8128 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8129 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8130 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8131 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8132 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8133 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8134 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8135 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8136 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8137 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8138 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8139 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8140 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8141 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8142 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8143 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8144 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8145 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8146 /* Bytes for AR-filter (09): E2,27,10,D6 */
8147 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8148 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8149 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8150 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8151 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8152 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8153 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8154 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8155 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8156 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8157 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8158 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8159 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8160 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8161 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8162 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8163 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8164 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8165 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8166 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8167 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8168 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8169 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8170 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8171 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8172 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8173 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8174 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8175 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8176 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8177 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8179 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8180 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8181 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8182 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8183 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8184 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8185 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8186 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8187 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8188 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8189 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8190 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8191 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8192 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8193 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8194 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8195 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8196 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8197 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8198 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8199 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8200 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8201 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8202 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8203 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8204 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8205 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8206 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8207 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8208 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8209 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8210 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8211 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8212 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8213 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8214 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8215 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8216 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8217 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8218 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8219 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8221 /* Config. Reg. 0 (filters) (cr0):FF */
8222 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8223 /* Config. Reg. 1 (dialing) (cr1):05 */
8224 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8225 /* Config. Reg. 2 (caller ID) (cr2):04 */
8226 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8227 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8228 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8229 /* Config. Reg. 4 (analog gain) (cr4):02 */
8230 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8231 /* Config. Reg. 5 (Version) (cr5):02 */
8232 /* Config. Reg. 6 (Reserved) (cr6):00 */
8233 /* Config. Reg. 7 (Reserved) (cr7):00 */
8235 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8237 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8238 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8240 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8241 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8243 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8244 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8245 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8246 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8247 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8248 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8249 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8250 /* Ext. Reg. 6 (Power State) (xr6):00 */
8251 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8252 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8253 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8254 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8255 /* 12,33,5A,C3 ; 770 Hz */
8256 /* 13,3C,5B,32 ; 852 Hz */
8257 /* 1D,1B,5C,CC ; 941 Hz */
8259 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8260 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8261 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8262 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8263 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8264 /* EC,1D,52,22 ; 1336 Hz */
8265 /* AA,AC,51,D2 ; 1477 Hz */
8266 /* 9B,3B,51,25 ; 1633 Hz */
8267 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8268 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8269 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8270 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8274 static void DAA_Coeff_France(IXJ *j)
8278 j->daa_country = DAA_FRANCE;
8279 /*----------------------------------------------- */
8281 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8282 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8285 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8286 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8287 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8288 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8289 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8290 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8291 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8292 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8293 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8294 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8295 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8296 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8297 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8298 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8299 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8300 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8301 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8302 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8303 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8304 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8305 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8306 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8307 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8308 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8309 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8310 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8311 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8312 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8313 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8314 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8315 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8316 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8317 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8318 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8319 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8320 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8321 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8322 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8323 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8324 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8325 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8326 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8327 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8328 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8329 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8330 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8331 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8332 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8333 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8334 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8335 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8336 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8337 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8338 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8339 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8340 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8341 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8342 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8343 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8344 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8345 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8346 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8347 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8348 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8349 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8350 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8351 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8352 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8353 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8354 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8355 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8356 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8357 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8359 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8360 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8361 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8362 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8363 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8364 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8365 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8366 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8367 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8368 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8369 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8370 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8371 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8372 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8373 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8374 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8375 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8376 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8377 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8378 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8379 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8380 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8381 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8382 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8383 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8384 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8385 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8386 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8387 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8388 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8389 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8390 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8391 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8392 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8393 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8394 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8395 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8396 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8397 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8398 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8399 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8401 /* Config. Reg. 0 (filters) (cr0):FF */
8402 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8403 /* Config. Reg. 1 (dialing) (cr1):05 */
8404 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8405 /* Config. Reg. 2 (caller ID) (cr2):04 */
8406 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8407 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8408 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8409 /* Config. Reg. 4 (analog gain) (cr4):02 */
8410 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8411 /* Config. Reg. 5 (Version) (cr5):02 */
8412 /* Config. Reg. 6 (Reserved) (cr6):00 */
8413 /* Config. Reg. 7 (Reserved) (cr7):00 */
8415 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8417 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8418 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8420 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8421 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8423 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8424 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8425 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8426 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8427 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8428 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8429 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8430 /* Ext. Reg. 6 (Power State) (xr6):00 */
8431 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8432 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8433 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8434 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8435 /* 12,33,5A,C3 ; 770 Hz */
8436 /* 13,3C,5B,32 ; 852 Hz */
8437 /* 1D,1B,5C,CC ; 941 Hz */
8439 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8440 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8441 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8442 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8443 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8444 /* EC,1D,52,22 ; 1336 Hz */
8445 /* AA,AC,51,D2 ; 1477 Hz */
8446 /* 9B,3B,51,25 ; 1633 Hz */
8447 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8448 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8449 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8450 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8454 static void DAA_Coeff_Germany(IXJ *j)
8458 j->daa_country = DAA_GERMANY;
8459 /*----------------------------------------------- */
8461 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8462 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8465 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8466 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8467 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8468 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8469 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8470 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8471 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8472 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8473 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8474 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8475 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8476 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8477 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8478 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8479 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8480 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8481 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8482 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8483 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8484 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8485 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8486 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8487 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8488 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8489 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8490 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8491 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8492 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8493 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8494 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8495 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8496 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8497 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8498 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8499 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8500 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8501 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8502 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8503 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8504 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8505 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8506 /* Bytes for AR-filter (09): 72,42,13,4B */
8507 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8508 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8509 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8510 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8511 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8512 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8513 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8514 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8515 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8516 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8517 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8518 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8519 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8520 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8521 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8522 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8523 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8524 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8525 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8526 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8527 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8528 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8529 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8530 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8531 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8532 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8533 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8534 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8535 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8536 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8537 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8538 /* ; (10K, 0.68uF) */
8539 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8540 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8541 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8542 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8543 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8544 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8545 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8546 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8547 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8548 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8549 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8550 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8551 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8552 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8553 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8554 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8555 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8556 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8557 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8558 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8559 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8560 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8561 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8562 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8563 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8564 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8565 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8566 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8567 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8568 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8569 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8570 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8571 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8572 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8573 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8574 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8575 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8576 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8577 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8578 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8579 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8581 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8582 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8583 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8584 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8585 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8586 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8587 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8588 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8589 /* Config. Reg. 4 (analog gain) (cr4):02 */
8590 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8591 /* Config. Reg. 5 (Version) (cr5):02 */
8592 /* Config. Reg. 6 (Reserved) (cr6):00 */
8593 /* Config. Reg. 7 (Reserved) (cr7):00 */
8595 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8597 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8598 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8600 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8601 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8603 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8604 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8605 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8606 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8607 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8608 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8609 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8610 /* Ext. Reg. 6 (Power State) (xr6):00 */
8611 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8612 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8613 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8614 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8615 /* 12,33,5A,C3 ; 770 Hz */
8616 /* 13,3C,5B,32 ; 852 Hz */
8617 /* 1D,1B,5C,CC ; 941 Hz */
8619 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8620 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8621 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8622 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8623 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8624 /* EC,1D,52,22 ; 1336 Hz */
8625 /* AA,AC,51,D2 ; 1477 Hz */
8626 /* 9B,3B,51,25 ; 1633 Hz */
8627 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8628 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8629 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8630 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8634 static void DAA_Coeff_Australia(IXJ *j)
8638 j->daa_country = DAA_AUSTRALIA;
8639 /*----------------------------------------------- */
8641 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8642 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8645 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8646 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8647 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8648 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8649 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8650 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8651 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8652 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8653 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8654 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8655 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8656 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8657 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8658 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8659 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8660 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8661 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8662 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8663 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8664 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8665 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8666 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8667 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8668 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8669 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8670 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8671 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8672 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8673 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8674 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8675 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8676 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8677 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8678 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8679 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8680 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8681 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8682 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8683 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8684 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8685 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8686 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8687 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8688 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8689 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8690 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8691 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8692 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8693 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8694 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8695 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8696 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8697 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8698 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8699 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8700 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8701 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8702 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8703 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8704 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8705 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8706 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8707 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8708 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8709 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8710 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8711 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8712 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8713 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8714 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8715 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8716 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8717 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8719 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8720 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8721 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8722 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8723 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8724 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8725 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8726 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8727 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8728 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8729 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8730 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8731 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8732 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8733 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8734 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8735 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8736 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8737 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8738 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8739 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8740 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8741 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8742 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8743 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8744 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8745 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8746 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8747 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8748 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8749 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8750 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8751 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8752 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8753 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8754 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8755 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8756 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8757 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8758 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8759 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8761 /* Config. Reg. 0 (filters) (cr0):FF */
8762 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8763 /* Config. Reg. 1 (dialing) (cr1):05 */
8764 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8765 /* Config. Reg. 2 (caller ID) (cr2):04 */
8766 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8767 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8768 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8769 /* Config. Reg. 4 (analog gain) (cr4):02 */
8770 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8771 /* Config. Reg. 5 (Version) (cr5):02 */
8772 /* Config. Reg. 6 (Reserved) (cr6):00 */
8773 /* Config. Reg. 7 (Reserved) (cr7):00 */
8775 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8777 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8778 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8780 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8781 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8783 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8784 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8785 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8786 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8787 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8788 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8789 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8790 /* Ext. Reg. 6 (Power State) (xr6):00 */
8791 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8792 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8793 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8795 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8796 /* 12,33,5A,C3 ; 770 Hz */
8797 /* 13,3C,5B,32 ; 852 Hz */
8798 /* 1D,1B,5C,CC ; 941 Hz */
8799 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8800 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8801 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8802 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8804 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8805 /* EC,1D,52,22 ; 1336 Hz */
8806 /* AA,AC,51,D2 ; 1477 Hz */
8807 /* 9B,3B,51,25 ; 1633 Hz */
8808 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8809 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8810 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8811 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8814 static void DAA_Coeff_Japan(IXJ *j)
8818 j->daa_country = DAA_JAPAN;
8819 /*----------------------------------------------- */
8821 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8822 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8825 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8826 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8827 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8828 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8829 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8830 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8831 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8832 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8833 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8834 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8835 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8836 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8837 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8838 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8839 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8840 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8841 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8842 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8843 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8844 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8845 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8846 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8847 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8848 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8849 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8850 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8851 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8852 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8853 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8854 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8855 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8856 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8857 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8858 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8859 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8860 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8861 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8862 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8863 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8864 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8865 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8866 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8867 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8868 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8869 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8870 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8871 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8872 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8873 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8874 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8875 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8876 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8877 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8878 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8879 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8880 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8881 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8882 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8883 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8884 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8885 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8886 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8887 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8888 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8889 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8890 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8891 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8892 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8893 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8894 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8895 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8896 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8897 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8899 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8900 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8901 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8902 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8903 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8904 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8905 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8906 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8907 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8908 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8909 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8910 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8911 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8912 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8913 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8914 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8915 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8916 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8917 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8918 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8919 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8920 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8921 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8922 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8923 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8924 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8925 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8926 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8927 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8928 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8929 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8930 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8931 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8932 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8933 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8934 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8935 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8936 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8937 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8938 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8939 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8941 /* Config. Reg. 0 (filters) (cr0):FF */
8942 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8943 /* Config. Reg. 1 (dialing) (cr1):05 */
8944 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8945 /* Config. Reg. 2 (caller ID) (cr2):04 */
8946 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8947 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8948 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8949 /* Config. Reg. 4 (analog gain) (cr4):02 */
8950 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8951 /* Config. Reg. 5 (Version) (cr5):02 */
8952 /* Config. Reg. 6 (Reserved) (cr6):00 */
8953 /* Config. Reg. 7 (Reserved) (cr7):00 */
8955 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8957 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8958 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8960 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8961 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8963 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8964 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8965 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8966 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8967 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8968 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8969 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8970 /* Ext. Reg. 6 (Power State) (xr6):00 */
8971 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8972 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8973 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8974 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8975 /* 12,33,5A,C3 ; 770 Hz */
8976 /* 13,3C,5B,32 ; 852 Hz */
8977 /* 1D,1B,5C,CC ; 941 Hz */
8979 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8980 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8981 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8982 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8983 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8984 /* EC,1D,52,22 ; 1336 Hz */
8985 /* AA,AC,51,D2 ; 1477 Hz */
8986 /* 9B,3B,51,25 ; 1633 Hz */
8987 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8988 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8989 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8990 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8993 static s16 tone_table[][19] =
8996 32538, /* A1 = 1.985962 */
8997 -32325, /* A2 = -0.986511 */
8998 -343, /* B2 = -0.010493 */
9000 343, /* B0 = 0.010493 */
9001 32619, /* A1 = 1.990906 */
9002 -32520, /* A2 = -0.992462 */
9003 19179, /* B2 = 0.585327 */
9004 -19178, /* B1 = -1.170593 */
9005 19179, /* B0 = 0.585327 */
9006 32723, /* A1 = 1.997314 */
9007 -32686, /* A2 = -0.997528 */
9008 9973, /* B2 = 0.304352 */
9009 -9955, /* B1 = -0.607605 */
9010 9973, /* B0 = 0.304352 */
9011 7, /* Internal filter scaling */
9012 159, /* Minimum in-band energy threshold */
9013 21, /* 21/32 in-band to broad-band ratio */
9014 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9016 { /* f133_200[] 12 */
9017 32072, /* A1 = 1.95752 */
9018 -31896, /* A2 = -0.973419 */
9019 -435, /* B2 = -0.013294 */
9021 435, /* B0 = 0.013294 */
9022 32188, /* A1 = 1.9646 */
9023 -32400, /* A2 = -0.98877 */
9024 15139, /* B2 = 0.462036 */
9025 -14882, /* B1 = -0.908356 */
9026 15139, /* B0 = 0.462036 */
9027 32473, /* A1 = 1.981995 */
9028 -32524, /* A2 = -0.992584 */
9029 23200, /* B2 = 0.708008 */
9030 -23113, /* B1 = -1.410706 */
9031 23200, /* B0 = 0.708008 */
9032 7, /* Internal filter scaling */
9033 159, /* Minimum in-band energy threshold */
9034 21, /* 21/32 in-band to broad-band ratio */
9035 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9038 31769, /* A1 = -1.939026 */
9039 -32584, /* A2 = 0.994385 */
9040 -475, /* B2 = -0.014522 */
9041 0, /* B1 = 0.000000 */
9042 475, /* B0 = 0.014522 */
9043 31789, /* A1 = -1.940247 */
9044 -32679, /* A2 = 0.997284 */
9045 17280, /* B2 = 0.527344 */
9046 -16865, /* B1 = -1.029358 */
9047 17280, /* B0 = 0.527344 */
9048 31841, /* A1 = -1.943481 */
9049 -32681, /* A2 = 0.997345 */
9050 543, /* B2 = 0.016579 */
9051 -525, /* B1 = -0.032097 */
9052 543, /* B0 = 0.016579 */
9053 5, /* Internal filter scaling */
9054 159, /* Minimum in-band energy threshold */
9055 21, /* 21/32 in-band to broad-band ratio */
9056 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9058 { /* f300_420[] 14 */
9059 30750, /* A1 = 1.876892 */
9060 -31212, /* A2 = -0.952515 */
9061 -804, /* B2 = -0.024541 */
9063 804, /* B0 = 0.024541 */
9064 30686, /* A1 = 1.872925 */
9065 -32145, /* A2 = -0.980988 */
9066 14747, /* B2 = 0.450043 */
9067 -13703, /* B1 = -0.836395 */
9068 14747, /* B0 = 0.450043 */
9069 31651, /* A1 = 1.931824 */
9070 -32321, /* A2 = -0.986389 */
9071 24425, /* B2 = 0.745422 */
9072 -23914, /* B1 = -1.459595 */
9073 24427, /* B0 = 0.745483 */
9074 7, /* Internal filter scaling */
9075 159, /* Minimum in-band energy threshold */
9076 21, /* 21/32 in-band to broad-band ratio */
9077 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9080 31613, /* A1 = -1.929565 */
9081 -32646, /* A2 = 0.996277 */
9082 -185, /* B2 = -0.005657 */
9083 0, /* B1 = 0.000000 */
9084 185, /* B0 = 0.005657 */
9085 31620, /* A1 = -1.929932 */
9086 -32713, /* A2 = 0.998352 */
9087 19253, /* B2 = 0.587585 */
9088 -18566, /* B1 = -1.133179 */
9089 19253, /* B0 = 0.587585 */
9090 31674, /* A1 = -1.933228 */
9091 -32715, /* A2 = 0.998413 */
9092 2575, /* B2 = 0.078590 */
9093 -2495, /* B1 = -0.152283 */
9094 2575, /* B0 = 0.078590 */
9095 5, /* Internal filter scaling */
9096 159, /* Minimum in-band energy threshold */
9097 21, /* 21/32 in-band to broad-band ratio */
9098 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9100 { /* f300_425[] 16 */
9101 30741, /* A1 = 1.876282 */
9102 -31475, /* A2 = -0.960541 */
9103 -703, /* B2 = -0.021484 */
9105 703, /* B0 = 0.021484 */
9106 30688, /* A1 = 1.873047 */
9107 -32248, /* A2 = -0.984161 */
9108 14542, /* B2 = 0.443787 */
9109 -13523, /* B1 = -0.825439 */
9110 14542, /* B0 = 0.443817 */
9111 31494, /* A1 = 1.922302 */
9112 -32366, /* A2 = -0.987762 */
9113 21577, /* B2 = 0.658508 */
9114 -21013, /* B1 = -1.282532 */
9115 21577, /* B0 = 0.658508 */
9116 7, /* Internal filter scaling */
9117 159, /* Minimum in-band energy threshold */
9118 21, /* 21/32 in-band to broad-band ratio */
9119 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9121 { /* f330_440[] 17 */
9122 30627, /* A1 = 1.869324 */
9123 -31338, /* A2 = -0.95636 */
9124 -843, /* B2 = -0.025749 */
9126 843, /* B0 = 0.025749 */
9127 30550, /* A1 = 1.864685 */
9128 -32221, /* A2 = -0.983337 */
9129 13594, /* B2 = 0.414886 */
9130 -12589, /* B1 = -0.768402 */
9131 13594, /* B0 = 0.414886 */
9132 31488, /* A1 = 1.921936 */
9133 -32358, /* A2 = -0.987518 */
9134 24684, /* B2 = 0.753296 */
9135 -24029, /* B1 = -1.466614 */
9136 24684, /* B0 = 0.753296 */
9137 7, /* Internal filter scaling */
9138 159, /* Minimum in-band energy threshold */
9139 21, /* 21/32 in-band to broad-band ratio */
9140 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9143 31546, /* A1 = -1.925476 */
9144 -32646, /* A2 = 0.996277 */
9145 -445, /* B2 = -0.013588 */
9146 0, /* B1 = 0.000000 */
9147 445, /* B0 = 0.013588 */
9148 31551, /* A1 = -1.925781 */
9149 -32713, /* A2 = 0.998352 */
9150 23884, /* B2 = 0.728882 */
9151 -22979, /* B1 = -1.402527 */
9152 23884, /* B0 = 0.728882 */
9153 31606, /* A1 = -1.929138 */
9154 -32715, /* A2 = 0.998413 */
9155 863, /* B2 = 0.026367 */
9156 -835, /* B1 = -0.050985 */
9157 863, /* B0 = 0.026367 */
9158 5, /* Internal filter scaling */
9159 159, /* Minimum in-band energy threshold */
9160 21, /* 21/32 in-band to broad-band ratio */
9161 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9163 { /* f350_400[] 19 */
9164 31006, /* A1 = 1.892517 */
9165 -32029, /* A2 = -0.977448 */
9166 -461, /* B2 = -0.014096 */
9168 461, /* B0 = 0.014096 */
9169 30999, /* A1 = 1.892029 */
9170 -32487, /* A2 = -0.991455 */
9171 11325, /* B2 = 0.345612 */
9172 -10682, /* B1 = -0.651978 */
9173 11325, /* B0 = 0.345612 */
9174 31441, /* A1 = 1.919067 */
9175 -32526, /* A2 = -0.992615 */
9176 24324, /* B2 = 0.74231 */
9177 -23535, /* B1 = -1.436523 */
9178 24324, /* B0 = 0.74231 */
9179 7, /* Internal filter scaling */
9180 159, /* Minimum in-band energy threshold */
9181 21, /* 21/32 in-band to broad-band ratio */
9182 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9185 30634, /* A1 = 1.869751 */
9186 -31533, /* A2 = -0.962341 */
9187 -680, /* B2 = -0.020782 */
9189 680, /* B0 = 0.020782 */
9190 30571, /* A1 = 1.865906 */
9191 -32277, /* A2 = -0.985016 */
9192 12894, /* B2 = 0.393524 */
9193 -11945, /* B1 = -0.729065 */
9194 12894, /* B0 = 0.393524 */
9195 31367, /* A1 = 1.91449 */
9196 -32379, /* A2 = -0.988129 */
9197 23820, /* B2 = 0.726929 */
9198 -23104, /* B1 = -1.410217 */
9199 23820, /* B0 = 0.726929 */
9200 7, /* Internal filter scaling */
9201 159, /* Minimum in-band energy threshold */
9202 21, /* 21/32 in-band to broad-band ratio */
9203 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9206 30552, /* A1 = 1.864807 */
9207 -31434, /* A2 = -0.95929 */
9208 -690, /* B2 = -0.021066 */
9210 690, /* B0 = 0.021066 */
9211 30472, /* A1 = 1.859924 */
9212 -32248, /* A2 = -0.984161 */
9213 13385, /* B2 = 0.408478 */
9214 -12357, /* B1 = -0.754242 */
9215 13385, /* B0 = 0.408478 */
9216 31358, /* A1 = 1.914001 */
9217 -32366, /* A2 = -0.987732 */
9218 26488, /* B2 = 0.80835 */
9219 -25692, /* B1 = -1.568176 */
9220 26490, /* B0 = 0.808411 */
9221 7, /* Internal filter scaling */
9222 159, /* Minimum in-band energy threshold */
9223 21, /* 21/32 in-band to broad-band ratio */
9224 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9227 31397, /* A1 = -1.916321 */
9228 -32623, /* A2 = 0.995605 */
9229 -117, /* B2 = -0.003598 */
9230 0, /* B1 = 0.000000 */
9231 117, /* B0 = 0.003598 */
9232 31403, /* A1 = -1.916687 */
9233 -32700, /* A2 = 0.997925 */
9234 3388, /* B2 = 0.103401 */
9235 -3240, /* B1 = -0.197784 */
9236 3388, /* B0 = 0.103401 */
9237 31463, /* A1 = -1.920410 */
9238 -32702, /* A2 = 0.997986 */
9239 13346, /* B2 = 0.407288 */
9240 -12863, /* B1 = -0.785126 */
9241 13346, /* B0 = 0.407288 */
9242 5, /* Internal filter scaling */
9243 159, /* Minimum in-band energy threshold */
9244 21, /* 21/32 in-band to broad-band ratio */
9245 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9248 30831, /* A1 = 1.881775 */
9249 -32064, /* A2 = -0.978546 */
9250 -367, /* B2 = -0.01122 */
9252 367, /* B0 = 0.01122 */
9253 30813, /* A1 = 1.880737 */
9254 -32456, /* A2 = -0.990509 */
9255 11068, /* B2 = 0.337769 */
9256 -10338, /* B1 = -0.631042 */
9257 11068, /* B0 = 0.337769 */
9258 31214, /* A1 = 1.905212 */
9259 -32491, /* A2 = -0.991577 */
9260 16374, /* B2 = 0.499695 */
9261 -15781, /* B1 = -0.963196 */
9262 16374, /* B0 = 0.499695 */
9263 7, /* Internal filter scaling */
9264 159, /* Minimum in-band energy threshold */
9265 21, /* 21/32 in-band to broad-band ratio */
9266 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9269 31152, /* A1 = -1.901428 */
9270 -32613, /* A2 = 0.995300 */
9271 -314, /* B2 = -0.009605 */
9272 0, /* B1 = 0.000000 */
9273 314, /* B0 = 0.009605 */
9274 31156, /* A1 = -1.901672 */
9275 -32694, /* A2 = 0.997742 */
9276 28847, /* B2 = 0.880371 */
9277 -2734, /* B1 = -0.166901 */
9278 28847, /* B0 = 0.880371 */
9279 31225, /* A1 = -1.905823 */
9280 -32696, /* A2 = 0.997803 */
9281 462, /* B2 = 0.014108 */
9282 -442, /* B1 = -0.027019 */
9283 462, /* B0 = 0.014108 */
9284 5, /* Internal filter scaling */
9285 159, /* Minimum in-band energy threshold */
9286 21, /* 21/32 in-band to broad-band ratio */
9287 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9290 30836, /* A1 = 1.882141 */
9291 -32296, /* A2 = -0.985596 */
9292 -324, /* B2 = -0.009903 */
9294 324, /* B0 = 0.009903 */
9295 30825, /* A1 = 1.881409 */
9296 -32570, /* A2 = -0.993958 */
9297 16847, /* B2 = 0.51416 */
9298 -15792, /* B1 = -0.963898 */
9299 16847, /* B0 = 0.51416 */
9300 31106, /* A1 = 1.89856 */
9301 -32584, /* A2 = -0.994415 */
9302 9579, /* B2 = 0.292328 */
9303 -9164, /* B1 = -0.559357 */
9304 9579, /* B0 = 0.292328 */
9305 7, /* Internal filter scaling */
9306 159, /* Minimum in-band energy threshold */
9307 21, /* 21/32 in-band to broad-band ratio */
9308 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9311 30702, /* A1 = 1.873962 */
9312 -32134, /* A2 = -0.980682 */
9313 -517, /* B2 = -0.015793 */
9315 517, /* B0 = 0.015793 */
9316 30676, /* A1 = 1.872375 */
9317 -32520, /* A2 = -0.992462 */
9318 8144, /* B2 = 0.24855 */
9319 -7596, /* B1 = -0.463684 */
9320 8144, /* B0 = 0.24855 */
9321 31084, /* A1 = 1.897217 */
9322 -32547, /* A2 = -0.993256 */
9323 22713, /* B2 = 0.693176 */
9324 -21734, /* B1 = -1.326599 */
9325 22713, /* B0 = 0.693176 */
9326 7, /* Internal filter scaling */
9327 159, /* Minimum in-band energy threshold */
9328 21, /* 21/32 in-band to broad-band ratio */
9329 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9332 30613, /* A1 = 1.86853 */
9333 -32031, /* A2 = -0.977509 */
9334 -618, /* B2 = -0.018866 */
9336 618, /* B0 = 0.018866 */
9337 30577, /* A1 = 1.866272 */
9338 -32491, /* A2 = -0.991577 */
9339 9612, /* B2 = 0.293335 */
9340 -8935, /* B1 = -0.54541 */
9341 9612, /* B0 = 0.293335 */
9342 31071, /* A1 = 1.896484 */
9343 -32524, /* A2 = -0.992584 */
9344 21596, /* B2 = 0.659058 */
9345 -20667, /* B1 = -1.261414 */
9346 21596, /* B0 = 0.659058 */
9347 7, /* Internal filter scaling */
9348 159, /* Minimum in-band energy threshold */
9349 21, /* 21/32 in-band to broad-band ratio */
9350 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9353 30914, /* A1 = -1.886841 */
9354 -32584, /* A2 = 0.994385 */
9355 -426, /* B2 = -0.013020 */
9356 0, /* B1 = 0.000000 */
9357 426, /* B0 = 0.013020 */
9358 30914, /* A1 = -1.886841 */
9359 -32679, /* A2 = 0.997314 */
9360 17520, /* B2 = 0.534668 */
9361 -16471, /* B1 = -1.005310 */
9362 17520, /* B0 = 0.534668 */
9363 31004, /* A1 = -1.892334 */
9364 -32683, /* A2 = 0.997406 */
9365 819, /* B2 = 0.025023 */
9366 -780, /* B1 = -0.047619 */
9367 819, /* B0 = 0.025023 */
9368 5, /* Internal filter scaling */
9369 159, /* Minimum in-band energy threshold */
9370 21, /* 21/32 in-band to broad-band ratio */
9371 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9375 30881, /* A1 = -1.884827 */
9376 -32603, /* A2 = 0.994965 */
9377 -496, /* B2 = -0.015144 */
9378 0, /* B1 = 0.000000 */
9379 496, /* B0 = 0.015144 */
9380 30880, /* A1 = -1.884766 */
9381 -32692, /* A2 = 0.997711 */
9382 24767, /* B2 = 0.755859 */
9383 -23290, /* B1 = -1.421509 */
9384 24767, /* B0 = 0.755859 */
9385 30967, /* A1 = -1.890076 */
9386 -32694, /* A2 = 0.997772 */
9387 728, /* B2 = 0.022232 */
9388 -691, /* B1 = -0.042194 */
9389 728, /* B0 = 0.022232 */
9390 5, /* Internal filter scaling */
9391 159, /* Minimum in-band energy threshold */
9392 21, /* 21/32 in-band to broad-band ratio */
9393 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9419 30646, /* A1 = 1.870544 */
9420 -32327, /* A2 = -0.986572 */
9421 -287, /* B2 = -0.008769 */
9423 287, /* B0 = 0.008769 */
9424 30627, /* A1 = 1.869324 */
9425 -32607, /* A2 = -0.995087 */
9426 13269, /* B2 = 0.404968 */
9427 -12376, /* B1 = -0.755432 */
9428 13269, /* B0 = 0.404968 */
9429 30924, /* A1 = 1.887512 */
9430 -32619, /* A2 = -0.995453 */
9431 19950, /* B2 = 0.608826 */
9432 -18940, /* B1 = -1.156006 */
9433 19950, /* B0 = 0.608826 */
9434 7, /* Internal filter scaling */
9435 159, /* Minimum in-band energy threshold */
9436 21, /* 21/32 in-band to broad-band ratio */
9437 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9440 30396, /* A1 = 1.855225 */
9441 -32014, /* A2 = -0.97699 */
9442 -395, /* B2 = -0.012055 */
9444 395, /* B0 = 0.012055 */
9445 30343, /* A1 = 1.85199 */
9446 -32482, /* A2 = -0.991302 */
9447 17823, /* B2 = 0.543945 */
9448 -16431, /* B1 = -1.002869 */
9449 17823, /* B0 = 0.543945 */
9450 30872, /* A1 = 1.884338 */
9451 -32516, /* A2 = -0.99231 */
9452 18124, /* B2 = 0.553101 */
9453 -17246, /* B1 = -1.052673 */
9454 18124, /* B0 = 0.553101 */
9455 7, /* Internal filter scaling */
9456 159, /* Minimum in-band energy threshold */
9457 21, /* 21/32 in-band to broad-band ratio */
9458 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9461 30796, /* A1 = -1.879639 */
9462 -32603, /* A2 = 0.994965 */
9463 -254, /* B2 = -0.007762 */
9464 0, /* B1 = 0.000000 */
9465 254, /* B0 = 0.007762 */
9466 30793, /* A1 = -1.879456 */
9467 -32692, /* A2 = 0.997711 */
9468 18934, /* B2 = 0.577820 */
9469 -17751, /* B1 = -1.083496 */
9470 18934, /* B0 = 0.577820 */
9471 30882, /* A1 = -1.884888 */
9472 -32694, /* A2 = 0.997772 */
9473 1858, /* B2 = 0.056713 */
9474 -1758, /* B1 = -0.107357 */
9475 1858, /* B0 = 0.056713 */
9476 5, /* Internal filter scaling */
9477 159, /* Minimum in-band energy threshold */
9478 21, /* 21/32 in-band to broad-band ratio */
9479 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9482 30641, /* A1 = 1.870239 */
9483 -32458, /* A2 = -0.99057 */
9484 -155, /* B2 = -0.004735 */
9486 155, /* B0 = 0.004735 */
9487 30631, /* A1 = 1.869568 */
9488 -32630, /* A2 = -0.995789 */
9489 11453, /* B2 = 0.349548 */
9490 -10666, /* B1 = -0.651001 */
9491 11453, /* B0 = 0.349548 */
9492 30810, /* A1 = 1.880554 */
9493 -32634, /* A2 = -0.995941 */
9494 12237, /* B2 = 0.373474 */
9495 -11588, /* B1 = -0.707336 */
9496 12237, /* B0 = 0.373474 */
9497 7, /* Internal filter scaling */
9498 159, /* Minimum in-band energy threshold */
9499 21, /* 21/32 in-band to broad-band ratio */
9500 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9503 30367, /* A1 = 1.853455 */
9504 -32147, /* A2 = -0.981079 */
9505 -495, /* B2 = -0.015113 */
9507 495, /* B0 = 0.015113 */
9508 30322, /* A1 = 1.850769 */
9509 -32543, /* A2 = -0.993134 */
9510 10031, /* B2 = 0.306152 */
9511 -9252, /* B1 = -0.564728 */
9512 10031, /* B0 = 0.306152 */
9513 30770, /* A1 = 1.878052 */
9514 -32563, /* A2 = -0.993774 */
9515 22674, /* B2 = 0.691956 */
9516 -21465, /* B1 = -1.31012 */
9517 22674, /* B0 = 0.691956 */
9518 7, /* Internal filter scaling */
9519 159, /* Minimum in-band energy threshold */
9520 21, /* 21/32 in-band to broad-band ratio */
9521 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9524 30709, /* A1 = -1.874329 */
9525 -32603, /* A2 = 0.994965 */
9526 -83, /* B2 = -0.002545 */
9527 0, /* B1 = 0.000000 */
9528 83, /* B0 = 0.002545 */
9529 30704, /* A1 = -1.874084 */
9530 -32692, /* A2 = 0.997711 */
9531 10641, /* B2 = 0.324738 */
9532 -9947, /* B1 = -0.607147 */
9533 10641, /* B0 = 0.324738 */
9534 30796, /* A1 = -1.879639 */
9535 -32694, /* A2 = 0.997772 */
9536 10079, /* B2 = 0.307587 */
9537 9513, /* B1 = 0.580688 */
9538 10079, /* B0 = 0.307587 */
9539 5, /* Internal filter scaling */
9540 159, /* Minimum in-band energy threshold */
9541 21, /* 21/32 in-band to broad-band ratio */
9542 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9545 30664, /* A1 = -1.871643 */
9546 -32603, /* A2 = 0.994965 */
9547 -164, /* B2 = -0.005029 */
9548 0, /* B1 = 0.000000 */
9549 164, /* B0 = 0.005029 */
9550 30661, /* A1 = -1.871399 */
9551 -32692, /* A2 = 0.997711 */
9552 15294, /* B2 = 0.466736 */
9553 -14275, /* B1 = -0.871307 */
9554 15294, /* B0 = 0.466736 */
9555 30751, /* A1 = -1.876953 */
9556 -32694, /* A2 = 0.997772 */
9557 3548, /* B2 = 0.108284 */
9558 -3344, /* B1 = -0.204155 */
9559 3548, /* B0 = 0.108284 */
9560 5, /* Internal filter scaling */
9561 159, /* Minimum in-band energy threshold */
9562 21, /* 21/32 in-band to broad-band ratio */
9563 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9566 30653, /* A1 = -1.870911 */
9567 -32615, /* A2 = 0.995361 */
9568 -209, /* B2 = -0.006382 */
9569 0, /* B1 = 0.000000 */
9570 209, /* B0 = 0.006382 */
9571 30647, /* A1 = -1.870605 */
9572 -32702, /* A2 = 0.997986 */
9573 18971, /* B2 = 0.578979 */
9574 -17716, /* B1 = -1.081299 */
9575 18971, /* B0 = 0.578979 */
9576 30738, /* A1 = -1.876099 */
9577 -32702, /* A2 = 0.998016 */
9578 2967, /* B2 = 0.090561 */
9579 -2793, /* B1 = -0.170502 */
9580 2967, /* B0 = 0.090561 */
9581 5, /* Internal filter scaling */
9582 159, /* Minimum in-band energy threshold */
9583 21, /* 21/32 in-band to broad-band ratio */
9584 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9587 30437, /* A1 = -1.857727 */
9588 -32603, /* A2 = 0.994965 */
9589 -264, /* B2 = -0.008062 */
9590 0, /* B1 = 0.000000 */
9591 264, /* B0 = 0.008062 */
9592 30430, /* A1 = -1.857300 */
9593 -32692, /* A2 = 0.997711 */
9594 21681, /* B2 = 0.661682 */
9595 -20082, /* B1 = -1.225708 */
9596 21681, /* B0 = 0.661682 */
9597 30526, /* A1 = -1.863220 */
9598 -32694, /* A2 = 0.997742 */
9599 1559, /* B2 = 0.047600 */
9600 -1459, /* B1 = -0.089096 */
9601 1559, /* B0 = 0.047600 */
9602 5, /* Internal filter scaling */
9603 159, /* Minimum in-band energy threshold */
9604 21, /* 21/32 in-band to broad-band ratio */
9605 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9608 28975, /* A1 = 1.768494 */
9609 -30955, /* A2 = -0.944672 */
9610 -1026, /* B2 = -0.03133 */
9612 1026, /* B0 = 0.03133 */
9613 28613, /* A1 = 1.746399 */
9614 -32089, /* A2 = -0.979309 */
9615 14214, /* B2 = 0.433807 */
9616 -12202, /* B1 = -0.744812 */
9617 14214, /* B0 = 0.433807 */
9618 30243, /* A1 = 1.845947 */
9619 -32238, /* A2 = -0.983856 */
9620 24825, /* B2 = 0.757629 */
9621 -23402, /* B1 = -1.428345 */
9622 24825, /* B0 = 0.757629 */
9623 7, /* Internal filter scaling */
9624 159, /* Minimum in-band energy threshold */
9625 21, /* 21/32 in-band to broad-band ratio */
9626 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9629 30257, /* A1 = -1.846741 */
9630 -32605, /* A2 = 0.995056 */
9631 -249, /* B2 = -0.007625 */
9632 0, /* B1 = 0.000000 */
9633 249, /* B0 = 0.007625 */
9634 30247, /* A1 = -1.846191 */
9635 -32694, /* A2 = 0.997772 */
9636 18088, /* B2 = 0.552002 */
9637 -16652, /* B1 = -1.016418 */
9638 18088, /* B0 = 0.552002 */
9639 30348, /* A1 = -1.852295 */
9640 -32696, /* A2 = 0.997803 */
9641 2099, /* B2 = 0.064064 */
9642 -1953, /* B1 = -0.119202 */
9643 2099, /* B0 = 0.064064 */
9644 5, /* Internal filter scaling */
9645 159, /* Minimum in-band energy threshold */
9646 21, /* 21/32 in-band to broad-band ratio */
9647 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9650 30202, /* A1 = -1.843431 */
9651 -32624, /* A2 = 0.995622 */
9652 -413, /* B2 = -0.012622 */
9653 0, /* B1 = 0.000000 */
9654 413, /* B0 = 0.012622 */
9655 30191, /* A1 = -1.842721 */
9656 -32714, /* A2 = 0.998364 */
9657 25954, /* B2 = 0.792057 */
9658 -23890, /* B1 = -1.458131 */
9659 25954, /* B0 = 0.792057 */
9660 30296, /* A1 = -1.849172 */
9661 -32715, /* A2 = 0.998397 */
9662 2007, /* B2 = 0.061264 */
9663 -1860, /* B1 = -0.113568 */
9664 2007, /* B0 = 0.061264 */
9665 5, /* Internal filter scaling */
9666 159, /* Minimum in-band energy threshold */
9667 21, /* 21/32 in-band to broad-band ratio */
9668 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9671 30001, /* A1 = -1.831116 */
9672 -32613, /* A2 = 0.995270 */
9673 -155, /* B2 = -0.004750 */
9674 0, /* B1 = 0.000000 */
9675 155, /* B0 = 0.004750 */
9676 29985, /* A1 = -1.830200 */
9677 -32710, /* A2 = 0.998260 */
9678 6584, /* B2 = 0.200928 */
9679 -6018, /* B1 = -0.367355 */
9680 6584, /* B0 = 0.200928 */
9681 30105, /* A1 = -1.837524 */
9682 -32712, /* A2 = 0.998291 */
9683 23812, /* B2 = 0.726685 */
9684 -21936, /* B1 = -1.338928 */
9685 23812, /* B0 = 0.726685 */
9686 5, /* Internal filter scaling */
9687 159, /* Minimum in-band energy threshold */
9688 21, /* 21/32 in-band to broad-band ratio */
9689 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9692 29964, /* A1 = -1.828918 */
9693 -32601, /* A2 = 0.994904 */
9694 -101, /* B2 = -0.003110 */
9695 0, /* B1 = 0.000000 */
9696 101, /* B0 = 0.003110 */
9697 29949, /* A1 = -1.827942 */
9698 -32700, /* A2 = 0.997925 */
9699 11041, /* B2 = 0.336975 */
9700 -10075, /* B1 = -0.614960 */
9701 11041, /* B0 = 0.336975 */
9702 30070, /* A1 = -1.835388 */
9703 -32702, /* A2 = 0.997986 */
9704 16762, /* B2 = 0.511536 */
9705 -15437, /* B1 = -0.942230 */
9706 16762, /* B0 = 0.511536 */
9707 5, /* Internal filter scaling */
9708 159, /* Minimum in-band energy threshold */
9709 21, /* 21/32 in-band to broad-band ratio */
9710 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9713 29936, /* A1 = -1.827209 */
9714 -32584, /* A2 = 0.994415 */
9715 -91, /* B2 = -0.002806 */
9716 0, /* B1 = 0.000000 */
9717 91, /* B0 = 0.002806 */
9718 29921, /* A1 = -1.826233 */
9719 -32688, /* A2 = 0.997559 */
9720 11449, /* B2 = 0.349396 */
9721 -10426, /* B1 = -0.636383 */
9722 11449, /* B0 = 0.349396 */
9723 30045, /* A1 = -1.833862 */
9724 -32688, /* A2 = 0.997589 */
9725 13055, /* B2 = 0.398407 */
9726 -12028, /* B1 = -0.734161 */
9727 13055, /* B0 = 0.398407 */
9728 5, /* Internal filter scaling */
9729 159, /* Minimum in-band energy threshold */
9730 21, /* 21/32 in-band to broad-band ratio */
9731 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9734 28499, /* A1 = 1.739441 */
9735 -31129, /* A2 = -0.949982 */
9736 -849, /* B2 = -0.025922 */
9738 849, /* B0 = 0.025922 */
9739 28128, /* A1 = 1.716797 */
9740 -32130, /* A2 = -0.98056 */
9741 14556, /* B2 = 0.444214 */
9742 -12251, /* B1 = -0.747772 */
9743 14556, /* B0 = 0.444244 */
9744 29667, /* A1 = 1.81073 */
9745 -32244, /* A2 = -0.984039 */
9746 23038, /* B2 = 0.703064 */
9747 -21358, /* B1 = -1.303589 */
9748 23040, /* B0 = 0.703125 */
9749 7, /* Internal filter scaling */
9750 159, /* Minimum in-band energy threshold */
9751 21, /* 21/32 in-band to broad-band ratio */
9752 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9755 29271, /* A1 = -1.786560 */
9756 -32599, /* A2 = 0.994873 */
9757 -490, /* B2 = -0.014957 */
9758 0, /* B1 = 0.000000 */
9759 490, /* B0 = 0.014957 */
9760 29246, /* A1 = -1.785095 */
9761 -32700, /* A2 = 0.997925 */
9762 28961, /* B2 = 0.883850 */
9763 -25796, /* B1 = -1.574463 */
9764 28961, /* B0 = 0.883850 */
9765 29383, /* A1 = -1.793396 */
9766 -32700, /* A2 = 0.997955 */
9767 1299, /* B2 = 0.039650 */
9768 -1169, /* B1 = -0.071396 */
9769 1299, /* B0 = 0.039650 */
9770 5, /* Internal filter scaling */
9771 159, /* Minimum in-band energy threshold */
9772 21, /* 21/32 in-band to broad-band ratio */
9773 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9776 29230, /* A1 = -1.784058 */
9777 -32584, /* A2 = 0.994415 */
9778 -418, /* B2 = -0.012757 */
9779 0, /* B1 = 0.000000 */
9780 418, /* B0 = 0.012757 */
9781 29206, /* A1 = -1.782593 */
9782 -32688, /* A2 = 0.997559 */
9783 36556, /* B2 = 1.115601 */
9784 -32478, /* B1 = -1.982300 */
9785 36556, /* B0 = 1.115601 */
9786 29345, /* A1 = -1.791077 */
9787 -32688, /* A2 = 0.997589 */
9788 897, /* B2 = 0.027397 */
9789 -808, /* B1 = -0.049334 */
9790 897, /* B0 = 0.027397 */
9791 5, /* Internal filter scaling */
9792 159, /* Minimum in-band energy threshold */
9793 21, /* 21/32 in-band to broad-band ratio */
9794 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9797 29116, /* A1 = -1.777100 */
9798 -32603, /* A2 = 0.994965 */
9799 -165, /* B2 = -0.005039 */
9800 0, /* B1 = 0.000000 */
9801 165, /* B0 = 0.005039 */
9802 29089, /* A1 = -1.775452 */
9803 -32708, /* A2 = 0.998199 */
9804 6963, /* B2 = 0.212494 */
9805 -6172, /* B1 = -0.376770 */
9806 6963, /* B0 = 0.212494 */
9807 29237, /* A1 = -1.784485 */
9808 -32710, /* A2 = 0.998230 */
9809 24197, /* B2 = 0.738464 */
9810 -21657, /* B1 = -1.321899 */
9811 24197, /* B0 = 0.738464 */
9812 5, /* Internal filter scaling */
9813 159, /* Minimum in-band energy threshold */
9814 21, /* 21/32 in-band to broad-band ratio */
9815 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9818 28376, /* A1 = -1.731934 */
9819 -32567, /* A2 = 0.993896 */
9820 -363, /* B2 = -0.011102 */
9821 0, /* B1 = 0.000000 */
9822 363, /* B0 = 0.011102 */
9823 28337, /* A1 = -1.729614 */
9824 -32683, /* A2 = 0.997434 */
9825 21766, /* B2 = 0.664246 */
9826 -18761, /* B1 = -1.145081 */
9827 21766, /* B0 = 0.664246 */
9828 28513, /* A1 = -1.740356 */
9829 -32686, /* A2 = 0.997498 */
9830 2509, /* B2 = 0.076584 */
9831 -2196, /* B1 = -0.134041 */
9832 2509, /* B0 = 0.076584 */
9833 5, /* Internal filter scaling */
9834 159, /* Minimum in-band energy threshold */
9835 21, /* 21/32 in-band to broad-band ratio */
9836 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9839 27844, /* A1 = -1.699463 */
9840 -32563, /* A2 = 0.993744 */
9841 -366, /* B2 = -0.011187 */
9842 0, /* B1 = 0.000000 */
9843 366, /* B0 = 0.011187 */
9844 27797, /* A1 = -1.696655 */
9845 -32686, /* A2 = 0.997498 */
9846 22748, /* B2 = 0.694214 */
9847 -19235, /* B1 = -1.174072 */
9848 22748, /* B0 = 0.694214 */
9849 27995, /* A1 = -1.708740 */
9850 -32688, /* A2 = 0.997559 */
9851 2964, /* B2 = 0.090477 */
9852 -2546, /* B1 = -0.155449 */
9853 2964, /* B0 = 0.090477 */
9854 5, /* Internal filter scaling */
9855 159, /* Minimum in-band energy threshold */
9856 21, /* 21/32 in-band to broad-band ratio */
9857 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9860 27297, /* A1 = -1.666077 */
9861 -32551, /* A2 = 0.993408 */
9862 -345, /* B2 = -0.010540 */
9863 0, /* B1 = 0.000000 */
9864 345, /* B0 = 0.010540 */
9865 27240, /* A1 = -1.662598 */
9866 -32683, /* A2 = 0.997406 */
9867 22560, /* B2 = 0.688477 */
9868 -18688, /* B1 = -1.140625 */
9869 22560, /* B0 = 0.688477 */
9870 27461, /* A1 = -1.676147 */
9871 -32684, /* A2 = 0.997467 */
9872 3541, /* B2 = 0.108086 */
9873 -2985, /* B1 = -0.182220 */
9874 3541, /* B0 = 0.108086 */
9875 5, /* Internal filter scaling */
9876 159, /* Minimum in-band energy threshold */
9877 21, /* 21/32 in-band to broad-band ratio */
9878 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9881 27155, /* A1 = -1.657410 */
9882 -32551, /* A2 = 0.993408 */
9883 -462, /* B2 = -0.014117 */
9884 0, /* B1 = 0.000000 */
9885 462, /* B0 = 0.014117 */
9886 27097, /* A1 = -1.653870 */
9887 -32683, /* A2 = 0.997406 */
9888 32495, /* B2 = 0.991699 */
9889 -26776, /* B1 = -1.634338 */
9890 32495, /* B0 = 0.991699 */
9891 27321, /* A1 = -1.667542 */
9892 -32684, /* A2 = 0.997467 */
9893 1835, /* B2 = 0.056007 */
9894 -1539, /* B1 = -0.093948 */
9895 1835, /* B0 = 0.056007 */
9896 5, /* Internal filter scaling */
9897 159, /* Minimum in-band energy threshold */
9898 21, /* 21/32 in-band to broad-band ratio */
9899 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9902 19298, /* A1 = 1.177917 */
9903 -24471, /* A2 = -0.746796 */
9904 -4152, /* B2 = -0.126709 */
9906 4152, /* B0 = 0.126709 */
9907 12902, /* A1 = 0.787476 */
9908 -29091, /* A2 = -0.887817 */
9909 12491, /* B2 = 0.38121 */
9910 -1794, /* B1 = -0.109528 */
9911 12494, /* B0 = 0.381317 */
9912 26291, /* A1 = 1.604736 */
9913 -30470, /* A2 = -0.929901 */
9914 28859, /* B2 = 0.880737 */
9915 -26084, /* B1 = -1.592102 */
9916 28861, /* B0 = 0.880798 */
9917 7, /* Internal filter scaling */
9918 159, /* Minimum in-band energy threshold */
9919 21, /* 21/32 in-band to broad-band ratio */
9920 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9923 26867, /* A1 = -1.639832 */
9924 -32551, /* A2 = 0.993408 */
9925 -123, /* B2 = -0.003755 */
9926 0, /* B1 = 0.000000 */
9927 123, /* B0 = 0.003755 */
9928 26805, /* A1 = -1.636108 */
9929 -32683, /* A2 = 0.997406 */
9930 17297, /* B2 = 0.527863 */
9931 -14096, /* B1 = -0.860382 */
9932 17297, /* B0 = 0.527863 */
9933 27034, /* A1 = -1.650085 */
9934 -32684, /* A2 = 0.997467 */
9935 12958, /* B2 = 0.395477 */
9936 -10756, /* B1 = -0.656525 */
9937 12958, /* B0 = 0.395477 */
9938 5, /* Internal filter scaling */
9939 159, /* Minimum in-band energy threshold */
9940 21, /* 21/32 in-band to broad-band ratio */
9941 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9944 26413, /* A1 = -1.612122 */
9945 -32547, /* A2 = 0.993286 */
9946 -223, /* B2 = -0.006825 */
9947 0, /* B1 = 0.000000 */
9948 223, /* B0 = 0.006825 */
9949 26342, /* A1 = -1.607849 */
9950 -32686, /* A2 = 0.997498 */
9951 6391, /* B2 = 0.195053 */
9952 -5120, /* B1 = -0.312531 */
9953 6391, /* B0 = 0.195053 */
9954 26593, /* A1 = -1.623108 */
9955 -32688, /* A2 = 0.997559 */
9956 23681, /* B2 = 0.722717 */
9957 -19328, /* B1 = -1.179688 */
9958 23681, /* B0 = 0.722717 */
9959 5, /* Internal filter scaling */
9960 159, /* Minimum in-band energy threshold */
9961 21, /* 21/32 in-band to broad-band ratio */
9962 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9965 26168, /* A1 = -1.597209 */
9966 -32528, /* A2 = 0.992706 */
9967 -235, /* B2 = -0.007182 */
9968 0, /* B1 = 0.000000 */
9969 235, /* B0 = 0.007182 */
9970 26092, /* A1 = -1.592590 */
9971 -32675, /* A2 = 0.997192 */
9972 20823, /* B2 = 0.635498 */
9973 -16510, /* B1 = -1.007751 */
9974 20823, /* B0 = 0.635498 */
9975 26363, /* A1 = -1.609070 */
9976 -32677, /* A2 = 0.997253 */
9977 6739, /* B2 = 0.205688 */
9978 -5459, /* B1 = -0.333206 */
9979 6739, /* B0 = 0.205688 */
9980 5, /* Internal filter scaling */
9981 159, /* Minimum in-band energy threshold */
9982 21, /* 21/32 in-band to broad-band ratio */
9983 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9986 25641, /* A1 = -1.565063 */
9987 -32536, /* A2 = 0.992950 */
9988 -121, /* B2 = -0.003707 */
9989 0, /* B1 = 0.000000 */
9990 121, /* B0 = 0.003707 */
9991 25560, /* A1 = -1.560059 */
9992 -32684, /* A2 = 0.997437 */
9993 18341, /* B2 = 0.559753 */
9994 -14252, /* B1 = -0.869904 */
9995 18341, /* B0 = 0.559753 */
9996 25837, /* A1 = -1.577026 */
9997 -32684, /* A2 = 0.997467 */
9998 16679, /* B2 = 0.509003 */
9999 -13232, /* B1 = -0.807648 */
10000 16679, /* B0 = 0.509003 */
10001 5, /* Internal filter scaling */
10002 159, /* Minimum in-band energy threshold */
10003 21, /* 21/32 in-band to broad-band ratio */
10004 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10006 { /* f857_1645[] */
10007 16415, /* A1 = 1.001953 */
10008 -23669, /* A2 = -0.722321 */
10009 -4549, /* B2 = -0.138847 */
10011 4549, /* B0 = 0.138847 */
10012 8456, /* A1 = 0.516174 */
10013 -28996, /* A2 = -0.884918 */
10014 13753, /* B2 = 0.419724 */
10015 -12, /* B1 = -0.000763 */
10016 13757, /* B0 = 0.419846 */
10017 24632, /* A1 = 1.503418 */
10018 -30271, /* A2 = -0.923828 */
10019 29070, /* B2 = 0.887146 */
10020 -25265, /* B1 = -1.542114 */
10021 29073, /* B0 = 0.887268 */
10022 7, /* Internal filter scaling */
10023 159, /* Minimum in-band energy threshold */
10024 21, /* 21/32 in-band to broad-band ratio */
10025 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10028 24806, /* A1 = -1.514099 */
10029 -32501, /* A2 = 0.991852 */
10030 -326, /* B2 = -0.009969 */
10031 0, /* B1 = 0.000000 */
10032 326, /* B0 = 0.009969 */
10033 24709, /* A1 = -1.508118 */
10034 -32659, /* A2 = 0.996674 */
10035 20277, /* B2 = 0.618835 */
10036 -15182, /* B1 = -0.926636 */
10037 20277, /* B0 = 0.618835 */
10038 25022, /* A1 = -1.527222 */
10039 -32661, /* A2 = 0.996735 */
10040 4320, /* B2 = 0.131836 */
10041 -3331, /* B1 = -0.203339 */
10042 4320, /* B0 = 0.131836 */
10043 5, /* Internal filter scaling */
10044 159, /* Minimum in-band energy threshold */
10045 21, /* 21/32 in-band to broad-band ratio */
10046 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10048 { /* f900_1300[] */
10049 19776, /* A1 = 1.207092 */
10050 -27437, /* A2 = -0.837341 */
10051 -2666, /* B2 = -0.081371 */
10053 2666, /* B0 = 0.081371 */
10054 16302, /* A1 = 0.995026 */
10055 -30354, /* A2 = -0.926361 */
10056 10389, /* B2 = 0.317062 */
10057 -3327, /* B1 = -0.203064 */
10058 10389, /* B0 = 0.317062 */
10059 24299, /* A1 = 1.483154 */
10060 -30930, /* A2 = -0.943909 */
10061 25016, /* B2 = 0.763428 */
10062 -21171, /* B1 = -1.292236 */
10063 25016, /* B0 = 0.763428 */
10064 7, /* Internal filter scaling */
10065 159, /* Minimum in-band energy threshold */
10066 21, /* 21/32 in-band to broad-band ratio */
10067 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10069 { /* f935_1215[] */
10070 20554, /* A1 = 1.254517 */
10071 -28764, /* A2 = -0.877838 */
10072 -2048, /* B2 = -0.062515 */
10074 2048, /* B0 = 0.062515 */
10075 18209, /* A1 = 1.11145 */
10076 -30951, /* A2 = -0.94458 */
10077 9390, /* B2 = 0.286575 */
10078 -3955, /* B1 = -0.241455 */
10079 9390, /* B0 = 0.286575 */
10080 23902, /* A1 = 1.458923 */
10081 -31286, /* A2 = -0.954803 */
10082 23252, /* B2 = 0.709595 */
10083 -19132, /* B1 = -1.167725 */
10084 23252, /* B0 = 0.709595 */
10085 7, /* Internal filter scaling */
10086 159, /* Minimum in-band energy threshold */
10087 21, /* 21/32 in-band to broad-band ratio */
10088 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10090 { /* f941_1477[] */
10091 17543, /* A1 = 1.07074 */
10092 -26220, /* A2 = -0.800201 */
10093 -3298, /* B2 = -0.100647 */
10095 3298, /* B0 = 0.100647 */
10096 12423, /* A1 = 0.75827 */
10097 -30036, /* A2 = -0.916626 */
10098 12651, /* B2 = 0.386078 */
10099 -2444, /* B1 = -0.14917 */
10100 12653, /* B0 = 0.386154 */
10101 23518, /* A1 = 1.435425 */
10102 -30745, /* A2 = -0.938293 */
10103 27282, /* B2 = 0.832581 */
10104 -22529, /* B1 = -1.375122 */
10105 27286, /* B0 = 0.832703 */
10106 7, /* Internal filter scaling */
10107 159, /* Minimum in-band energy threshold */
10108 21, /* 21/32 in-band to broad-band ratio */
10109 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10112 24104, /* A1 = -1.471252 */
10113 -32507, /* A2 = 0.992065 */
10114 -351, /* B2 = -0.010722 */
10115 0, /* B1 = 0.000000 */
10116 351, /* B0 = 0.010722 */
10117 23996, /* A1 = -1.464600 */
10118 -32671, /* A2 = 0.997040 */
10119 22848, /* B2 = 0.697266 */
10120 -16639, /* B1 = -1.015564 */
10121 22848, /* B0 = 0.697266 */
10122 24332, /* A1 = -1.485168 */
10123 -32673, /* A2 = 0.997101 */
10124 4906, /* B2 = 0.149727 */
10125 -3672, /* B1 = -0.224174 */
10126 4906, /* B0 = 0.149727 */
10127 5, /* Internal filter scaling */
10128 159, /* Minimum in-band energy threshold */
10129 21, /* 21/32 in-band to broad-band ratio */
10130 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10133 23967, /* A1 = -1.462830 */
10134 -32507, /* A2 = 0.992065 */
10135 -518, /* B2 = -0.015821 */
10136 0, /* B1 = 0.000000 */
10137 518, /* B0 = 0.015821 */
10138 23856, /* A1 = -1.456055 */
10139 -32671, /* A2 = 0.997040 */
10140 26287, /* B2 = 0.802246 */
10141 -19031, /* B1 = -1.161560 */
10142 26287, /* B0 = 0.802246 */
10143 24195, /* A1 = -1.476746 */
10144 -32673, /* A2 = 0.997101 */
10145 2890, /* B2 = 0.088196 */
10146 -2151, /* B1 = -0.131317 */
10147 2890, /* B0 = 0.088196 */
10148 5, /* Internal filter scaling */
10149 159, /* Minimum in-band energy threshold */
10150 21, /* 21/32 in-band to broad-band ratio */
10151 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10153 { /* f950_1400[] */
10154 18294, /* A1 = 1.116638 */
10155 -26962, /* A2 = -0.822845 */
10156 -2914, /* B2 = -0.088936 */
10158 2914, /* B0 = 0.088936 */
10159 14119, /* A1 = 0.861786 */
10160 -30227, /* A2 = -0.922455 */
10161 11466, /* B2 = 0.349945 */
10162 -2833, /* B1 = -0.172943 */
10163 11466, /* B0 = 0.349945 */
10164 23431, /* A1 = 1.430115 */
10165 -30828, /* A2 = -0.940796 */
10166 25331, /* B2 = 0.773071 */
10167 -20911, /* B1 = -1.276367 */
10168 25331, /* B0 = 0.773071 */
10169 7, /* Internal filter scaling */
10170 159, /* Minimum in-band energy threshold */
10171 21, /* 21/32 in-band to broad-band ratio */
10172 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10175 23521, /* A1 = -1.435608 */
10176 -32489, /* A2 = 0.991516 */
10177 -193, /* B2 = -0.005915 */
10178 0, /* B1 = 0.000000 */
10179 193, /* B0 = 0.005915 */
10180 23404, /* A1 = -1.428467 */
10181 -32655, /* A2 = 0.996582 */
10182 17740, /* B2 = 0.541412 */
10183 -12567, /* B1 = -0.767029 */
10184 17740, /* B0 = 0.541412 */
10185 23753, /* A1 = -1.449829 */
10186 -32657, /* A2 = 0.996613 */
10187 9090, /* B2 = 0.277405 */
10188 -6662, /* B1 = -0.406647 */
10189 9090, /* B0 = 0.277405 */
10190 5, /* Internal filter scaling */
10191 159, /* Minimum in-band energy threshold */
10192 21, /* 21/32 in-band to broad-band ratio */
10193 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10196 23071, /* A1 = -1.408203 */
10197 -32489, /* A2 = 0.991516 */
10198 -293, /* B2 = -0.008965 */
10199 0, /* B1 = 0.000000 */
10200 293, /* B0 = 0.008965 */
10201 22951, /* A1 = -1.400818 */
10202 -32655, /* A2 = 0.996582 */
10203 5689, /* B2 = 0.173645 */
10204 -3951, /* B1 = -0.241150 */
10205 5689, /* B0 = 0.173645 */
10206 23307, /* A1 = -1.422607 */
10207 -32657, /* A2 = 0.996613 */
10208 18692, /* B2 = 0.570435 */
10209 -13447, /* B1 = -0.820770 */
10210 18692, /* B0 = 0.570435 */
10211 5, /* Internal filter scaling */
10212 159, /* Minimum in-band energy threshold */
10213 21, /* 21/32 in-band to broad-band ratio */
10214 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10217 22701, /* A1 = -1.385620 */
10218 -32474, /* A2 = 0.991058 */
10219 -292, /* B2 = -0.008933 */
10220 0, /*163840 , B1 = 10.000000 */
10221 292, /* B0 = 0.008933 */
10222 22564, /* A1 = -1.377258 */
10223 -32655, /* A2 = 0.996552 */
10224 20756, /* B2 = 0.633423 */
10225 -14176, /* B1 = -0.865295 */
10226 20756, /* B0 = 0.633423 */
10227 22960, /* A1 = -1.401428 */
10228 -32657, /* A2 = 0.996613 */
10229 6520, /* B2 = 0.198990 */
10230 -4619, /* B1 = -0.281937 */
10231 6520, /* B0 = 0.198990 */
10232 5, /* Internal filter scaling */
10233 159, /* Minimum in-band energy threshold */
10234 21, /* 21/32 in-band to broad-band ratio */
10235 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10238 22142, /* A1 = -1.351501 */
10239 -32474, /* A2 = 0.991058 */
10240 -147, /* B2 = -0.004493 */
10241 0, /* B1 = 0.000000 */
10242 147, /* B0 = 0.004493 */
10243 22000, /* A1 = -1.342834 */
10244 -32655, /* A2 = 0.996552 */
10245 15379, /* B2 = 0.469360 */
10246 -10237, /* B1 = -0.624847 */
10247 15379, /* B0 = 0.469360 */
10248 22406, /* A1 = -1.367554 */
10249 -32657, /* A2 = 0.996613 */
10250 17491, /* B2 = 0.533783 */
10251 -12096, /* B1 = -0.738312 */
10252 17491, /* B0 = 0.533783 */
10253 5, /* Internal filter scaling */
10254 159, /* Minimum in-band energy threshold */
10255 21, /* 21/32 in-band to broad-band ratio */
10256 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10258 { /* f1100_1750[] */
10259 12973, /* A1 = 0.79184 */
10260 -24916, /* A2 = -0.760376 */
10261 6655, /* B2 = 0.203102 */
10262 367, /* B1 = 0.0224 */
10263 6657, /* B0 = 0.203171 */
10264 5915, /* A1 = 0.361053 */
10265 -29560, /* A2 = -0.90213 */
10266 -7777, /* B2 = -0.23735 */
10268 7777, /* B0 = 0.23735 */
10269 20510, /* A1 = 1.251892 */
10270 -30260, /* A2 = -0.923462 */
10271 26662, /* B2 = 0.81366 */
10272 -20573, /* B1 = -1.255737 */
10273 26668, /* B0 = 0.813843 */
10274 7, /* Internal filter scaling */
10275 159, /* Minimum in-band energy threshold */
10276 21, /* 21/32 in-band to broad-band ratio */
10277 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10280 20392, /* A1 = -1.244629 */
10281 -32460, /* A2 = 0.990601 */
10282 -270, /* B2 = -0.008240 */
10283 0, /* B1 = 0.000000 */
10284 270, /* B0 = 0.008240 */
10285 20218, /* A1 = -1.234009 */
10286 -32655, /* A2 = 0.996582 */
10287 21337, /* B2 = 0.651154 */
10288 -13044, /* B1 = -0.796143 */
10289 21337, /* B0 = 0.651154 */
10290 20684, /* A1 = -1.262512 */
10291 -32657, /* A2 = 0.996643 */
10292 8572, /* B2 = 0.261612 */
10293 -5476, /* B1 = -0.334244 */
10294 8572, /* B0 = 0.261612 */
10295 5, /* Internal filter scaling */
10296 159, /* Minimum in-band energy threshold */
10297 21, /* 21/32 in-band to broad-band ratio */
10298 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10301 19159, /* A1 = -1.169373 */
10302 -32456, /* A2 = 0.990509 */
10303 -335, /* B2 = -0.010252 */
10304 0, /* B1 = 0.000000 */
10305 335, /* B0 = 0.010252 */
10306 18966, /* A1 = -1.157593 */
10307 -32661, /* A2 = 0.996735 */
10308 6802, /* B2 = 0.207588 */
10309 -3900, /* B1 = -0.238098 */
10310 6802, /* B0 = 0.207588 */
10311 19467, /* A1 = -1.188232 */
10312 -32661, /* A2 = 0.996765 */
10313 25035, /* B2 = 0.764008 */
10314 -15049, /* B1 = -0.918579 */
10315 25035, /* B0 = 0.764008 */
10316 5, /* Internal filter scaling */
10317 159, /* Minimum in-band energy threshold */
10318 21, /* 21/32 in-band to broad-band ratio */
10319 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10322 18976, /* A1 = -1.158264 */
10323 -32439, /* A2 = 0.989990 */
10324 -183, /* B2 = -0.005588 */
10325 0, /* B1 = 0.000000 */
10326 183, /* B0 = 0.005588 */
10327 18774, /* A1 = -1.145874 */
10328 -32650, /* A2 = 0.996429 */
10329 15468, /* B2 = 0.472076 */
10330 -8768, /* B1 = -0.535217 */
10331 15468, /* B0 = 0.472076 */
10332 19300, /* A1 = -1.177979 */
10333 -32652, /* A2 = 0.996490 */
10334 19840, /* B2 = 0.605499 */
10335 -11842, /* B1 = -0.722809 */
10336 19840, /* B0 = 0.605499 */
10337 5, /* Internal filter scaling */
10338 159, /* Minimum in-band energy threshold */
10339 21, /* 21/32 in-band to broad-band ratio */
10340 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10343 16357, /* A1 = -0.998413 */
10344 -32368, /* A2 = 0.987793 */
10345 -217, /* B2 = -0.006652 */
10346 0, /* B1 = 0.000000 */
10347 217, /* B0 = 0.006652 */
10348 16107, /* A1 = -0.983126 */
10349 -32601, /* A2 = 0.994904 */
10350 11602, /* B2 = 0.354065 */
10351 -5555, /* B1 = -0.339111 */
10352 11602, /* B0 = 0.354065 */
10353 16722, /* A1 = -1.020630 */
10354 -32603, /* A2 = 0.994965 */
10355 15574, /* B2 = 0.475311 */
10356 -8176, /* B1 = -0.499069 */
10357 15574, /* B0 = 0.475311 */
10358 5, /* Internal filter scaling */
10359 159, /* Minimum in-band energy threshold */
10360 21, /* 21/32 in-band to broad-band ratio */
10361 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10364 16234, /* A1 = -0.990875 */
10365 32404, /* A2 = -0.988922 */
10366 -193, /* B2 = -0.005908 */
10367 0, /* B1 = 0.000000 */
10368 193, /* B0 = 0.005908 */
10369 15986, /* A1 = -0.975769 */
10370 -32632, /* A2 = 0.995880 */
10371 18051, /* B2 = 0.550903 */
10372 -8658, /* B1 = -0.528473 */
10373 18051, /* B0 = 0.550903 */
10374 16591, /* A1 = -1.012695 */
10375 -32634, /* A2 = 0.995941 */
10376 15736, /* B2 = 0.480240 */
10377 -8125, /* B1 = -0.495926 */
10378 15736, /* B0 = 0.480240 */
10379 5, /* Internal filter scaling */
10380 159, /* Minimum in-band energy threshold */
10381 21, /* 21/32 in-band to broad-band ratio */
10382 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10385 15564, /* A1 = -0.949982 */
10386 -32404, /* A2 = 0.988922 */
10387 -269, /* B2 = -0.008216 */
10388 0, /* B1 = 0.000000 */
10389 269, /* B0 = 0.008216 */
10390 15310, /* A1 = -0.934479 */
10391 -32632, /* A2 = 0.995880 */
10392 10815, /* B2 = 0.330063 */
10393 -4962, /* B1 = -0.302887 */
10394 10815, /* B0 = 0.330063 */
10395 15924, /* A1 = -0.971924 */
10396 -32634, /* A2 = 0.995941 */
10397 18880, /* B2 = 0.576172 */
10398 -9364, /* B1 = -0.571594 */
10399 18880, /* B0 = 0.576172 */
10400 5, /* Internal filter scaling */
10401 159, /* Minimum in-band energy threshold */
10402 21, /* 21/32 in-band to broad-band ratio */
10403 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10406 15247, /* A1 = -0.930603 */
10407 -32397, /* A2 = 0.988708 */
10408 -244, /* B2 = -0.007451 */
10409 0, /* B1 = 0.000000 */
10410 244, /* B0 = 0.007451 */
10411 14989, /* A1 = -0.914886 */
10412 -32627, /* A2 = 0.995697 */
10413 18961, /* B2 = 0.578644 */
10414 -8498, /* B1 = -0.518707 */
10415 18961, /* B0 = 0.578644 */
10416 15608, /* A1 = -0.952667 */
10417 -32628, /* A2 = 0.995758 */
10418 11145, /* B2 = 0.340134 */
10419 -5430, /* B1 = -0.331467 */
10420 11145, /* B0 = 0.340134 */
10421 5, /* Internal filter scaling */
10422 159, /* Minimum in-band energy threshold */
10423 21, /* 21/32 in-band to broad-band ratio */
10424 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10427 14780, /* A1 = -0.902130 */
10428 -32393, /* A2 = 0.988586 */
10429 -396, /* B2 = -0.012086 */
10430 0, /* B1 = 0.000000 */
10431 396, /* B0 = 0.012086 */
10432 14510, /* A1 = -0.885651 */
10433 -32630, /* A2 = 0.995819 */
10434 6326, /* B2 = 0.193069 */
10435 -2747, /* B1 = -0.167671 */
10436 6326, /* B0 = 0.193069 */
10437 15154, /* A1 = -0.924957 */
10438 -32632, /* A2 = 0.995850 */
10439 23235, /* B2 = 0.709076 */
10440 -10983, /* B1 = -0.670380 */
10441 23235, /* B0 = 0.709076 */
10442 5, /* Internal filter scaling */
10443 159, /* Minimum in-band energy threshold */
10444 21, /* 21/32 in-band to broad-band ratio */
10445 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10448 13005, /* A1 = -0.793793 */
10449 -32368, /* A2 = 0.987823 */
10450 -500, /* B2 = -0.015265 */
10451 0, /* B1 = 0.000000 */
10452 500, /* B0 = 0.015265 */
10453 12708, /* A1 = -0.775665 */
10454 -32615, /* A2 = 0.995331 */
10455 11420, /* B2 = 0.348526 */
10456 -4306, /* B1 = -0.262833 */
10457 11420, /* B0 = 0.348526 */
10458 13397, /* A1 = -0.817688 */
10459 -32615, /* A2 = 0.995361 */
10460 9454, /* B2 = 0.288528 */
10461 -3981, /* B1 = -0.243027 */
10462 9454, /* B0 = 0.288528 */
10463 5, /* Internal filter scaling */
10464 159, /* Minimum in-band energy threshold */
10465 21, /* 21/32 in-band to broad-band ratio */
10466 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10469 10046, /* A1 = -0.613190 */
10470 -32331, /* A2 = 0.986694 */
10471 -455, /* B2 = -0.013915 */
10472 0, /* B1 = 0.000000 */
10473 455, /* B0 = 0.013915 */
10474 9694, /* A1 = -0.591705 */
10475 -32601, /* A2 = 0.994934 */
10476 6023, /* B2 = 0.183815 */
10477 -1708, /* B1 = -0.104279 */
10478 6023, /* B0 = 0.183815 */
10479 10478, /* A1 = -0.639587 */
10480 -32603, /* A2 = 0.994965 */
10481 22031, /* B2 = 0.672333 */
10482 -7342, /* B1 = -0.448151 */
10483 22031, /* B0 = 0.672333 */
10484 5, /* Internal filter scaling */
10485 159, /* Minimum in-band energy threshold */
10486 21, /* 21/32 in-band to broad-band ratio */
10487 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10489 { /* f1633_1638[] */
10490 9181, /* A1 = 0.560394 */
10491 -32256, /* A2 = -0.984375 */
10492 -556, /* B2 = -0.016975 */
10494 556, /* B0 = 0.016975 */
10495 8757, /* A1 = 0.534515 */
10496 -32574, /* A2 = -0.99408 */
10497 8443, /* B2 = 0.25769 */
10498 -2135, /* B1 = -0.130341 */
10499 8443, /* B0 = 0.25769 */
10500 9691, /* A1 = 0.591522 */
10501 -32574, /* A2 = -0.99411 */
10502 15446, /* B2 = 0.471375 */
10503 -4809, /* B1 = -0.293579 */
10504 15446, /* B0 = 0.471375 */
10505 7, /* Internal filter scaling */
10506 159, /* Minimum in-band energy threshold */
10507 21, /* 21/32 in-band to broad-band ratio */
10508 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10511 5076, /* A1 = -0.309875 */
10512 -32304, /* A2 = 0.985840 */
10513 -508, /* B2 = -0.015503 */
10514 0, /* B1 = 0.000000 */
10515 508, /* B0 = 0.015503 */
10516 4646, /* A1 = -0.283600 */
10517 -32605, /* A2 = 0.995026 */
10518 6742, /* B2 = 0.205780 */
10519 -878, /* B1 = -0.053635 */
10520 6742, /* B0 = 0.205780 */
10521 5552, /* A1 = -0.338928 */
10522 -32605, /* A2 = 0.995056 */
10523 23667, /* B2 = 0.722260 */
10524 -4297, /* B1 = -0.262329 */
10525 23667, /* B0 = 0.722260 */
10526 5, /* Internal filter scaling */
10527 159, /* Minimum in-band energy threshold */
10528 21, /* 21/32 in-band to broad-band ratio */
10529 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10532 3569, /* A1 = -0.217865 */
10533 -32292, /* A2 = 0.985504 */
10534 -239, /* B2 = -0.007322 */
10535 0, /* B1 = 0.000000 */
10536 239, /* B0 = 0.007322 */
10537 3117, /* A1 = -0.190277 */
10538 -32603, /* A2 = 0.994965 */
10539 18658, /* B2 = 0.569427 */
10540 -1557, /* B1 = -0.095032 */
10541 18658, /* B0 = 0.569427 */
10542 4054, /* A1 = -0.247437 */
10543 -32603, /* A2 = 0.994965 */
10544 18886, /* B2 = 0.576385 */
10545 -2566, /* B1 = -0.156647 */
10546 18886, /* B0 = 0.576385 */
10547 5, /* Internal filter scaling */
10548 159, /* Minimum in-band energy threshold */
10549 21, /* 21/32 in-band to broad-band ratio */
10550 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10553 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10555 unsigned short cmd;
10558 if (jf->filter > 3) {
10561 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10565 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10571 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10574 /* Select the filter (f0 - f3) to use. */
10575 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10578 if (jf->freq < 12 && jf->freq > 3) {
10579 /* Select the frequency for the selected filter. */
10580 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10582 } else if (jf->freq > 11) {
10583 /* We need to load a programmable filter set for undefined */
10584 /* frequencies. So we will point the filter to a programmable set. */
10585 /* Since there are only 4 filters and 4 programmable sets, we will */
10586 /* just point the filter to the same number set and program it for the */
10587 /* frequency we want. */
10588 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10590 if (j->ver.low != 0x12) {
10597 if (ixj_WriteDSPCommand(cmd, j))
10599 for (cnt = 0; cnt < max; cnt++) {
10600 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10604 j->filter_en[jf->filter] = jf->enable;
10608 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10610 unsigned short cmd;
10612 if (jfr->filter > 3) {
10615 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10618 if (!jfr->enable) {
10619 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10624 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10626 /* Select the filter (f0 - f3) to use. */
10627 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10630 /* We need to load a programmable filter set for undefined */
10631 /* frequencies. So we will point the filter to a programmable set. */
10632 /* Since there are only 4 filters and 4 programmable sets, we will */
10633 /* just point the filter to the same number set and program it for the */
10634 /* frequency we want. */
10635 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10637 if (j->ver.low != 0x12) {
10644 if (ixj_WriteDSPCommand(cmd, j))
10646 for (cnt = 0; cnt < max; cnt++) {
10647 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10650 j->filter_en[jfr->filter] = jfr->enable;
10654 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10657 unsigned short data;
10670 if(ti->tone_index > 12 && ti->tone_index < 28)
10672 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10674 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10677 if (ixj_WriteDSPCommand(data, j))
10680 if (ixj_WriteDSPCommand(data, j))