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 ***************************************************************************/
47 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
48 * Audit some copy_*_user and minor cleanup.
50 * Revision 4.7 2001/08/13 06:19:33 craigs
51 * Added additional changes from Alan Cox and John Anderson for
52 * 2.2 to 2.4 cleanup and bounds checking
54 * Revision 4.6 2001/08/13 01:05:05 craigs
55 * Really fixed PHONE_QUERY_CODEC problem this time
57 * Revision 4.5 2001/08/13 00:11:03 craigs
58 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
60 * Revision 4.4 2001/08/07 07:58:12 craigs
61 * Changed back to three digit version numbers
62 * Added tagbuild target to allow automatic and easy tagging of versions
64 * Revision 4.3 2001/08/07 07:24:47 craigs
65 * Added ixj-ver.h to allow easy configuration management of driver
66 * Added display of version number in /prox/ixj
68 * Revision 4.2 2001/08/06 07:07:19 craigs
69 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
70 * behaviour of returning int rather than short *
72 * Revision 4.1 2001/08/05 00:17:37 craigs
73 * More changes for correct PCMCIA installation
74 * Start of changes for backward Linux compatibility
76 * Revision 4.0 2001/08/04 12:33:12 craigs
77 * New version using GNU autoconf
79 * Revision 3.105 2001/07/20 23:14:32 eokerson
80 * More work on CallerID generation when using ring cadences.
82 * Revision 3.104 2001/07/06 01:33:55 eokerson
83 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
85 * Revision 3.103 2001/07/05 19:20:16 eokerson
87 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
89 * Revision 3.102 2001/07/03 23:51:21 eokerson
90 * Un-mute mic on Internet LineJACK when in speakerphone mode.
92 * Revision 3.101 2001/07/02 19:26:56 eokerson
93 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
95 * Revision 3.100 2001/07/02 19:18:27 eokerson
96 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
97 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
98 * Fixed speaker mode on Internet LineJACK.
100 * Revision 3.99 2001/05/09 14:11:16 eokerson
101 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
103 * Revision 3.98 2001/05/08 19:55:33 eokerson
104 * Fixed POTS hookstate detection while it is connected to PSTN port.
106 * Revision 3.97 2001/05/08 00:01:04 eokerson
107 * Fixed kernel oops when sending caller ID data.
109 * Revision 3.96 2001/05/04 23:09:30 eokerson
110 * Now uses one kernel timer for each card, instead of one for the entire driver.
112 * Revision 3.95 2001/04/25 22:06:47 eokerson
113 * Fixed squawking at beginning of some G.723.1 calls.
115 * Revision 3.94 2001/04/03 23:42:00 eokerson
116 * Added linear volume ioctls
117 * Added raw filter load ioctl
119 * Revision 3.93 2001/02/27 01:00:06 eokerson
120 * Fixed blocking in CallerID.
121 * Reduced size of ixj structure for smaller driver footprint.
123 * Revision 3.92 2001/02/20 22:02:59 eokerson
124 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
125 * Improved PSTN ring detection.
126 * Fixed wink generation on POTS ports.
128 * Revision 3.91 2001/02/13 00:55:44 eokerson
129 * Turn AEC back on after changing frame sizes.
131 * Revision 3.90 2001/02/12 16:42:00 eokerson
132 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
134 * Revision 3.89 2001/02/12 15:41:16 eokerson
135 * Fix from Artis Kugevics - Tone gains were not being set correctly.
137 * Revision 3.88 2001/02/05 23:25:42 eokerson
138 * Fixed lockup bugs with deregister.
140 * Revision 3.87 2001/01/29 21:00:39 eokerson
141 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
142 * Updated copyright date.
144 * Revision 3.86 2001/01/23 23:53:46 eokerson
145 * Fixes to G.729 compatibility.
147 * Revision 3.85 2001/01/23 21:30:36 eokerson
148 * Added verbage about cards supported.
149 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
151 * Revision 3.84 2001/01/22 23:32:10 eokerson
152 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
154 * Revision 3.83 2001/01/19 14:51:41 eokerson
155 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
157 * Revision 3.82 2001/01/19 00:34:49 eokerson
158 * Added verbosity to write overlap errors.
160 * Revision 3.81 2001/01/18 23:56:54 eokerson
161 * Fixed PSTN line test functions.
163 * Revision 3.80 2001/01/18 22:29:27 eokerson
164 * Updated AEC/AGC values for different cards.
166 * Revision 3.79 2001/01/17 02:58:54 eokerson
167 * Fixed AEC reset after Caller ID.
168 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
170 * Revision 3.78 2001/01/16 19:43:09 eokerson
171 * Added support for Linux 2.4.x kernels.
173 * Revision 3.77 2001/01/09 04:00:52 eokerson
174 * Linetest will now test the line, even if it has previously succeded.
176 * Revision 3.76 2001/01/08 19:27:00 eokerson
177 * Fixed problem with standard cable on Internet PhoneCARD.
179 * Revision 3.75 2000/12/22 16:52:14 eokerson
180 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
182 * Revision 3.74 2000/12/08 22:41:50 eokerson
183 * Added capability for G729B.
185 * Revision 3.73 2000/12/07 23:35:16 eokerson
186 * Added capability to have different ring pattern before CallerID data.
187 * Added hookstate checks in CallerID routines to stop FSK.
189 * Revision 3.72 2000/12/06 19:31:31 eokerson
190 * Modified signal behavior to only send one signal per event.
192 * Revision 3.71 2000/12/06 03:23:08 eokerson
193 * Fixed CallerID on Call Waiting.
195 * Revision 3.70 2000/12/04 21:29:37 eokerson
196 * Added checking to Smart Cable gain functions.
198 * Revision 3.69 2000/12/04 21:05:20 eokerson
199 * Changed ixjdebug levels.
200 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
202 * Revision 3.68 2000/12/04 00:17:21 craigs
203 * Changed mixer voice gain to +6dB rather than 0dB
205 * Revision 3.67 2000/11/30 21:25:51 eokerson
206 * Fixed write signal errors.
208 * Revision 3.66 2000/11/29 22:42:44 eokerson
209 * Fixed PSTN ring detect problems.
211 * Revision 3.65 2000/11/29 07:31:55 craigs
212 * Added new 425Hz filter co-efficients
213 * Added card-specific DTMF prescaler initialisation
215 * Revision 3.64 2000/11/28 14:03:32 craigs
216 * Changed certain mixer initialisations to be 0dB rather than 12dB
217 * Added additional information to /proc/ixj
219 * Revision 3.63 2000/11/28 11:38:41 craigs
220 * Added display of AEC modes in AUTO and AGC mode
222 * Revision 3.62 2000/11/28 04:05:44 eokerson
223 * Improved PSTN ring detection routine.
225 * Revision 3.61 2000/11/27 21:53:12 eokerson
226 * Fixed flash detection.
228 * Revision 3.60 2000/11/27 15:57:29 eokerson
229 * More work on G.729 load routines.
231 * Revision 3.59 2000/11/25 21:55:12 eokerson
232 * Fixed errors in G.729 load routine.
234 * Revision 3.58 2000/11/25 04:08:29 eokerson
235 * Added board locks around G.729 and TS85 load routines.
237 * Revision 3.57 2000/11/24 05:35:17 craigs
238 * Added ability to retrieve mixer values on LineJACK
239 * Added complete initialisation of all mixer values at startup
240 * Fixed spelling mistake
242 * Revision 3.56 2000/11/23 02:52:11 robertj
243 * Added cvs change log keyword.
244 * Fixed bug in capabilities list when using G.729 module.
250 #define PERFMON_STATS
254 #include <linux/module.h>
256 #include <linux/init.h>
257 #include <linux/sched.h>
258 #include <linux/kernel.h> /* printk() */
259 #include <linux/fs.h> /* everything... */
260 #include <linux/errno.h> /* error codes */
261 #include <linux/slab.h>
262 #include <linux/mm.h>
263 #include <linux/ioport.h>
264 #include <linux/interrupt.h>
265 #include <linux/proc_fs.h>
266 #include <linux/poll.h>
267 #include <linux/timer.h>
268 #include <linux/delay.h>
269 #include <linux/pci.h>
272 #include <asm/uaccess.h>
274 #include <linux/isapnp.h>
278 #define TYPE(inode) (iminor(inode) >> 4)
279 #define NUM(inode) (iminor(inode) & 0xf)
282 static int hertz = HZ;
283 static int samplerate = 100;
285 module_param(ixjdebug, int, 0);
287 static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
288 { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
289 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
293 MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
295 /************************************************************************
297 * ixjdebug meanings are now bit mapped instead of level based
298 * Values can be or'ed together to turn on multiple messages
300 * bit 0 (0x0001) = any failure
301 * bit 1 (0x0002) = general messages
302 * bit 2 (0x0004) = POTS ringing related
303 * bit 3 (0x0008) = PSTN events
304 * bit 4 (0x0010) = PSTN Cadence state details
305 * bit 5 (0x0020) = Tone detection triggers
306 * bit 6 (0x0040) = Tone detection cadence details
307 * bit 7 (0x0080) = ioctl tracking
308 * bit 8 (0x0100) = signal tracking
309 * bit 9 (0x0200) = CallerID generation details
311 ************************************************************************/
315 static IXJ *ixj[IXJMAX];
316 #define get_ixj(b) ixj[(b)]
319 * Allocate a free IXJ device
322 static IXJ *ixj_alloc()
324 for(cnt=0; cnt<IXJMAX; cnt++)
326 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
328 j = kmalloc(sizeof(IXJ), GFP_KERNEL);
338 static void ixj_fsk_free(IXJ *j)
344 static void ixj_fsk_alloc(IXJ *j)
347 j->fskdata = kmalloc(8000, GFP_KERNEL);
349 if(ixjdebug & 0x0200) {
350 printk("IXJ phone%d - allocate failed\n", j->board);
355 if(ixjdebug & 0x0200) {
356 printk("IXJ phone%d - allocate succeded\n", j->board);
364 static IXJ ixj[IXJMAX];
365 #define get_ixj(b) (&ixj[(b)])
368 * Allocate a free IXJ device
371 static IXJ *ixj_alloc(void)
374 for(cnt=0; cnt<IXJMAX; cnt++) {
375 if(!ixj[cnt].DSPbase)
381 static inline void ixj_fsk_free(IXJ *j) {;}
383 static inline void ixj_fsk_alloc(IXJ *j)
391 #define ixj_perfmon(x) ((x)++)
393 #define ixj_perfmon(x) do { } while(0)
396 static int ixj_convert_loaded;
398 static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
400 /************************************************************************
402 * These are function definitions to allow external modules to register
403 * enhanced functionality call backs.
405 ************************************************************************/
407 static int Stub(IXJ * J, unsigned long arg)
412 static IXJ_REGFUNC ixj_PreRead = &Stub;
413 static IXJ_REGFUNC ixj_PostRead = &Stub;
414 static IXJ_REGFUNC ixj_PreWrite = &Stub;
415 static IXJ_REGFUNC ixj_PostWrite = &Stub;
417 static void ixj_read_frame(IXJ *j);
418 static void ixj_write_frame(IXJ *j);
419 static void ixj_init_timer(IXJ *j);
420 static void ixj_add_timer(IXJ * j);
421 static void ixj_timeout(unsigned long ptr);
422 static int read_filters(IXJ *j);
423 static int LineMonitor(IXJ *j);
424 static int ixj_fasync(int fd, struct file *, int mode);
425 static int ixj_set_port(IXJ *j, int arg);
426 static int ixj_set_pots(IXJ *j, int arg);
427 static int ixj_hookstate(IXJ *j);
428 static int ixj_record_start(IXJ *j);
429 static void ixj_record_stop(IXJ *j);
430 static void set_rec_volume(IXJ *j, int volume);
431 static int get_rec_volume(IXJ *j);
432 static int set_rec_codec(IXJ *j, int rate);
433 static void ixj_vad(IXJ *j, int arg);
434 static int ixj_play_start(IXJ *j);
435 static void ixj_play_stop(IXJ *j);
436 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
437 static int ixj_set_tone_off(unsigned short, IXJ *j);
438 static int ixj_play_tone(IXJ *j, char tone);
439 static void ixj_aec_start(IXJ *j, int level);
440 static int idle(IXJ *j);
441 static void ixj_ring_on(IXJ *j);
442 static void ixj_ring_off(IXJ *j);
443 static void aec_stop(IXJ *j);
444 static void ixj_ringback(IXJ *j);
445 static void ixj_busytone(IXJ *j);
446 static void ixj_dialtone(IXJ *j);
447 static void ixj_cpt_stop(IXJ *j);
448 static char daa_int_read(IXJ *j);
449 static char daa_CR_read(IXJ *j, int cr);
450 static int daa_set_mode(IXJ *j, int mode);
451 static int ixj_linetest(IXJ *j);
452 static int ixj_daa_write(IXJ *j);
453 static int ixj_daa_cid_read(IXJ *j);
454 static void DAA_Coeff_US(IXJ *j);
455 static void DAA_Coeff_UK(IXJ *j);
456 static void DAA_Coeff_France(IXJ *j);
457 static void DAA_Coeff_Germany(IXJ *j);
458 static void DAA_Coeff_Australia(IXJ *j);
459 static void DAA_Coeff_Japan(IXJ *j);
460 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
461 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
462 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
463 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
464 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
465 /* Serial Control Interface funtions */
466 static int SCI_Control(IXJ *j, int control);
467 static int SCI_Prepare(IXJ *j);
468 static int SCI_WaitHighSCI(IXJ *j);
469 static int SCI_WaitLowSCI(IXJ *j);
470 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
471 static int ixj_PCcontrol_wait(IXJ *j);
472 static void ixj_pre_cid(IXJ *j);
473 static void ixj_write_cid(IXJ *j);
474 static void ixj_write_cid_bit(IXJ *j, int bit);
475 static int set_base_frame(IXJ *j, int size);
476 static int set_play_codec(IXJ *j, int rate);
477 static void set_rec_depth(IXJ *j, int depth);
478 static int ixj_mixer(long val, IXJ *j);
480 /************************************************************************
481 CT8020/CT8021 Host Programmers Model
482 Host address Function Access
484 0-1 Aux Software Status Register (reserved) Read Only
485 2-3 Software Status Register Read Only
486 4-5 Aux Software Control Register (reserved) Read Write
487 6-7 Software Control Register Read Write
488 8-9 Hardware Status Register Read Only
489 A-B Hardware Control Register Read Write
490 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
491 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
492 ************************************************************************/
494 static inline void ixj_read_HSR(IXJ *j)
496 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
497 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
500 static inline int IsControlReady(IXJ *j)
503 return j->hsr.bits.controlrdy ? 1 : 0;
506 static inline int IsPCControlReady(IXJ *j)
508 j->pccr1.byte = inb_p(j->XILINXbase + 3);
509 return j->pccr1.bits.crr ? 1 : 0;
512 static inline int IsStatusReady(IXJ *j)
515 return j->hsr.bits.statusrdy ? 1 : 0;
518 static inline int IsRxReady(IXJ *j)
521 ixj_perfmon(j->rxreadycheck);
522 return j->hsr.bits.rxrdy ? 1 : 0;
525 static inline int IsTxReady(IXJ *j)
528 ixj_perfmon(j->txreadycheck);
529 return j->hsr.bits.txrdy ? 1 : 0;
532 static inline void set_play_volume(IXJ *j, int volume)
534 if (ixjdebug & 0x0002)
535 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
536 ixj_WriteDSPCommand(0xCF02, j);
537 ixj_WriteDSPCommand(volume, j);
540 static int set_play_volume_linear(IXJ *j, int volume)
542 int newvolume, dspplaymax;
544 if (ixjdebug & 0x0002)
545 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
546 if(volume > 100 || volume < 0) {
550 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
551 switch (j->cardtype) {
556 if(j->port == PORT_PSTN) {
562 case QTI_PHONEJACK_LITE:
565 case QTI_PHONEJACK_PCI:
574 newvolume = (dspplaymax * volume) / 100;
575 set_play_volume(j, newvolume);
579 static inline void set_play_depth(IXJ *j, int depth)
585 ixj_WriteDSPCommand(0x5280 + depth, j);
588 static inline int get_play_volume(IXJ *j)
590 ixj_WriteDSPCommand(0xCF00, j);
591 return j->ssr.high << 8 | j->ssr.low;
594 static int get_play_volume_linear(IXJ *j)
596 int volume, newvolume, dspplaymax;
598 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
599 switch (j->cardtype) {
604 if(j->port == PORT_PSTN) {
610 case QTI_PHONEJACK_LITE:
613 case QTI_PHONEJACK_PCI:
622 volume = get_play_volume(j);
623 newvolume = (volume * 100) / dspplaymax;
629 static inline BYTE SLIC_GetState(IXJ *j)
631 if (j->cardtype == QTI_PHONECARD) {
633 j->psccr.bits.dev = 3;
634 j->psccr.bits.rw = 1;
635 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
636 ixj_PCcontrol_wait(j);
637 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
638 ixj_PCcontrol_wait(j);
639 if (j->pslic.bits.powerdown)
640 return PLD_SLIC_STATE_OC;
641 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
642 return PLD_SLIC_STATE_ACTIVE;
644 return PLD_SLIC_STATE_RINGING;
646 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
648 return j->pld_slicr.bits.state;
651 static bool SLIC_SetState(BYTE byState, IXJ *j)
653 bool fRetVal = false;
655 if (j->cardtype == QTI_PHONECARD) {
656 if (j->flags.pcmciasct) {
658 case PLD_SLIC_STATE_TIPOPEN:
659 case PLD_SLIC_STATE_OC:
660 j->pslic.bits.powerdown = 1;
661 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
664 case PLD_SLIC_STATE_RINGING:
665 if (j->readers || j->writers) {
666 j->pslic.bits.powerdown = 0;
667 j->pslic.bits.ring0 = 1;
668 j->pslic.bits.ring1 = 0;
672 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
674 case PLD_SLIC_STATE_STANDBY:
675 case PLD_SLIC_STATE_ACTIVE:
676 if (j->readers || j->writers) {
677 j->pslic.bits.powerdown = 0;
679 j->pslic.bits.powerdown = 1;
681 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
684 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
686 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
692 j->psccr.bits.dev = 3;
693 j->psccr.bits.rw = 0;
694 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
695 ixj_PCcontrol_wait(j);
698 /* Set the C1, C2, C3 & B2EN signals. */
700 case PLD_SLIC_STATE_OC:
701 j->pld_slicw.bits.c1 = 0;
702 j->pld_slicw.bits.c2 = 0;
703 j->pld_slicw.bits.c3 = 0;
704 j->pld_slicw.bits.b2en = 0;
705 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
708 case PLD_SLIC_STATE_RINGING:
709 j->pld_slicw.bits.c1 = 1;
710 j->pld_slicw.bits.c2 = 0;
711 j->pld_slicw.bits.c3 = 0;
712 j->pld_slicw.bits.b2en = 1;
713 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
716 case PLD_SLIC_STATE_ACTIVE:
717 j->pld_slicw.bits.c1 = 0;
718 j->pld_slicw.bits.c2 = 1;
719 j->pld_slicw.bits.c3 = 0;
720 j->pld_slicw.bits.b2en = 0;
721 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
724 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
726 j->pld_slicw.bits.c1 = 1;
727 j->pld_slicw.bits.c2 = 1;
728 j->pld_slicw.bits.c3 = 0;
729 j->pld_slicw.bits.b2en = 0;
730 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
733 case PLD_SLIC_STATE_TIPOPEN:
734 j->pld_slicw.bits.c1 = 0;
735 j->pld_slicw.bits.c2 = 0;
736 j->pld_slicw.bits.c3 = 1;
737 j->pld_slicw.bits.b2en = 0;
738 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
741 case PLD_SLIC_STATE_STANDBY:
742 j->pld_slicw.bits.c1 = 1;
743 j->pld_slicw.bits.c2 = 0;
744 j->pld_slicw.bits.c3 = 1;
745 j->pld_slicw.bits.b2en = 1;
746 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
749 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
751 j->pld_slicw.bits.c1 = 0;
752 j->pld_slicw.bits.c2 = 1;
753 j->pld_slicw.bits.c3 = 1;
754 j->pld_slicw.bits.b2en = 0;
755 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
758 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
760 j->pld_slicw.bits.c1 = 1;
761 j->pld_slicw.bits.c2 = 1;
762 j->pld_slicw.bits.c3 = 1;
763 j->pld_slicw.bits.b2en = 0;
764 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
776 static int ixj_wink(IXJ *j)
780 slicnow = SLIC_GetState(j);
782 j->pots_winkstart = jiffies;
783 SLIC_SetState(PLD_SLIC_STATE_OC, j);
785 msleep(jiffies_to_msecs(j->winktime));
787 SLIC_SetState(slicnow, j);
791 static void ixj_init_timer(IXJ *j)
793 init_timer(&j->timer);
794 j->timer.function = ixj_timeout;
795 j->timer.data = (unsigned long)j;
798 static void ixj_add_timer(IXJ *j)
800 j->timer.expires = jiffies + (hertz / samplerate);
801 add_timer(&j->timer);
804 static void ixj_tone_timeout(IXJ *j)
809 if (j->tone_state == 3) {
812 j->tone_cadence_state++;
813 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
814 switch (j->cadence_t->termination) {
818 case REPEAT_LAST_ELEMENT:
819 j->tone_cadence_state--;
820 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
823 j->tone_cadence_state = 0;
824 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
825 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
826 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
827 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
828 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
829 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
830 ixj_init_tone(j, &ti);
832 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
833 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
834 ixj_play_tone(j, j->cadence_t->ce[0].index);
838 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
839 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
840 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
841 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
842 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
843 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
844 ixj_init_tone(j, &ti);
846 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
847 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
848 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
854 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
856 if(j->ixj_signals[event]) {
857 if(ixjdebug & 0x0100)
858 printk("Sending signal for event %d\n", event);
859 /* Send apps notice of change */
860 /* see config.h for macro definition */
861 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
865 static void ixj_pstn_state(IXJ *j)
868 union XOPXR0 XR0, daaint;
872 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
874 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
876 j->pld_scrr.byte = inb_p(j->XILINXbase);
877 if (j->pld_scrr.bits.daaflag) {
879 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
880 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
881 daaint.bitreg.RING = 1;
882 if(ixjdebug & 0x0008) {
883 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
886 daa_set_mode(j, SOP_PU_RESET);
889 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
890 daaint.bitreg.Caller_ID = 1;
891 j->pstn_cid_intr = 1;
892 j->pstn_cid_received = jiffies;
893 if(ixjdebug & 0x0008) {
894 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
897 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
898 daaint.bitreg.Cadence = 1;
899 if(ixjdebug & 0x0008) {
900 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
903 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
904 daaint.bitreg.VDD_OK = 1;
905 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
909 if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
910 daaint.bitreg.RMR = 1;
911 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
912 if(ixjdebug & 0x0008) {
913 printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
915 j->pstn_prev_rmr = j->pstn_last_rmr;
916 j->pstn_last_rmr = jiffies;
918 switch(j->daa_mode) {
920 if (daaint.bitreg.RING) {
921 if (!j->flags.pstn_ringing) {
922 if (j->daa_mode != SOP_PU_RINGING) {
923 j->pstn_ring_int = jiffies;
924 daa_set_mode(j, SOP_PU_RINGING);
930 if (daaint.bitreg.RMR) {
931 if (ixjdebug & 0x0008) {
932 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
934 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
935 j->flags.pstn_rmr = 1;
936 j->pstn_ring_start = jiffies;
937 j->pstn_ring_stop = 0;
938 j->ex.bits.pstn_ring = 0;
939 if (j->cadence_f[4].state == 0) {
940 j->cadence_f[4].state = 1;
941 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
942 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
943 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
944 } else if (j->cadence_f[4].state == 2) {
945 if((time_after(jiffies, j->cadence_f[4].off1min) &&
946 time_before(jiffies, j->cadence_f[4].off1max))) {
947 if (j->cadence_f[4].on2) {
948 j->cadence_f[4].state = 3;
949 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
950 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
951 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
953 j->cadence_f[4].state = 7;
956 if (ixjdebug & 0x0008) {
957 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
958 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
959 j->cadence_f[4].off1);
961 j->cadence_f[4].state = 0;
963 } else if (j->cadence_f[4].state == 4) {
964 if((time_after(jiffies, j->cadence_f[4].off2min) &&
965 time_before(jiffies, j->cadence_f[4].off2max))) {
966 if (j->cadence_f[4].on3) {
967 j->cadence_f[4].state = 5;
968 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
969 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
970 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
972 j->cadence_f[4].state = 7;
975 if (ixjdebug & 0x0008) {
976 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
977 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
978 j->cadence_f[4].off2);
980 j->cadence_f[4].state = 0;
982 } else if (j->cadence_f[4].state == 6) {
983 if((time_after(jiffies, j->cadence_f[4].off3min) &&
984 time_before(jiffies, j->cadence_f[4].off3max))) {
985 j->cadence_f[4].state = 7;
987 if (ixjdebug & 0x0008) {
988 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
989 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
990 j->cadence_f[4].off3);
992 j->cadence_f[4].state = 0;
995 j->cadence_f[4].state = 0;
997 } else { /* Falling edge of RMR */
998 j->pstn_ring_start = 0;
999 j->pstn_ring_stop = jiffies;
1000 if (j->cadence_f[4].state == 1) {
1001 if(!j->cadence_f[4].on1) {
1002 j->cadence_f[4].state = 7;
1003 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1004 time_before(jiffies, j->cadence_f[4].on1max))) {
1005 if (j->cadence_f[4].off1) {
1006 j->cadence_f[4].state = 2;
1007 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1008 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1009 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1011 j->cadence_f[4].state = 7;
1014 if (ixjdebug & 0x0008) {
1015 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1016 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1017 j->cadence_f[4].on1);
1019 j->cadence_f[4].state = 0;
1021 } else if (j->cadence_f[4].state == 3) {
1022 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1023 time_before(jiffies, j->cadence_f[4].on2max))) {
1024 if (j->cadence_f[4].off2) {
1025 j->cadence_f[4].state = 4;
1026 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1027 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1028 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1030 j->cadence_f[4].state = 7;
1033 if (ixjdebug & 0x0008) {
1034 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1035 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1036 j->cadence_f[4].on2);
1038 j->cadence_f[4].state = 0;
1040 } else if (j->cadence_f[4].state == 5) {
1041 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1042 time_before(jiffies, j->cadence_f[4].on3max))) {
1043 if (j->cadence_f[4].off3) {
1044 j->cadence_f[4].state = 6;
1045 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1046 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1047 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1049 j->cadence_f[4].state = 7;
1052 j->cadence_f[4].state = 0;
1055 if (ixjdebug & 0x0008) {
1056 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1057 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1058 j->cadence_f[4].on3);
1060 j->cadence_f[4].state = 0;
1063 if (ixjdebug & 0x0010) {
1064 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1066 if (ixjdebug & 0x0010) {
1067 switch(j->cadence_f[4].state) {
1069 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1070 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1073 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1074 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1077 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1078 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1081 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1082 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1085 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1086 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1089 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1090 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1095 if (j->cadence_f[4].state == 7) {
1096 j->cadence_f[4].state = 0;
1097 j->pstn_ring_stop = jiffies;
1098 j->ex.bits.pstn_ring = 1;
1099 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1100 if(ixjdebug & 0x0008) {
1101 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1104 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1105 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1106 if(ixjdebug & 0x0008) {
1107 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1108 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1109 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1111 j->pstn_ring_stop = j->pstn_ring_int = 0;
1112 daa_set_mode(j, SOP_PU_SLEEP);
1114 outb_p(j->pld_scrw.byte, j->XILINXbase);
1115 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1116 ixj_daa_cid_read(j);
1117 j->ex.bits.caller_id = 1;
1118 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1119 j->pstn_cid_intr = 0;
1121 if (daaint.bitreg.Cadence) {
1122 if(ixjdebug & 0x0008) {
1123 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1125 daa_set_mode(j, SOP_PU_SLEEP);
1126 j->ex.bits.pstn_ring = 0;
1129 case SOP_PU_CONVERSATION:
1130 if (daaint.bitreg.VDD_OK) {
1131 if(!daaint.bitreg.SI_0) {
1132 if (!j->pstn_winkstart) {
1133 if(ixjdebug & 0x0008) {
1134 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1136 j->pstn_winkstart = jiffies;
1139 if (j->pstn_winkstart) {
1140 if(ixjdebug & 0x0008) {
1141 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1143 j->pstn_winkstart = 0;
1147 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1148 if(ixjdebug & 0x0008) {
1149 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1151 daa_set_mode(j, SOP_PU_SLEEP);
1152 j->pstn_winkstart = 0;
1153 j->ex.bits.pstn_wink = 1;
1154 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1160 static void ixj_timeout(unsigned long ptr)
1163 unsigned long jifon;
1164 IXJ *j = (IXJ *)ptr;
1167 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1168 ixj_perfmon(j->timerchecks);
1169 j->hookstate = ixj_hookstate(j);
1170 if (j->tone_state) {
1171 if (!(j->hookstate)) {
1175 j->ex.bits.hookstate = 1;
1176 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1178 clear_bit(board, &j->busyflags);
1182 if (j->tone_state == 1)
1183 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1185 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1186 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1187 if (j->tone_state == 1) {
1188 ixj_play_tone(j, j->tone_index);
1189 if (j->dsp.low == 0x20) {
1190 clear_bit(board, &j->busyflags);
1195 ixj_play_tone(j, 0);
1196 if (j->dsp.low == 0x20) {
1197 clear_bit(board, &j->busyflags);
1203 ixj_tone_timeout(j);
1204 if (j->flags.dialtone) {
1207 if (j->flags.busytone) {
1209 if (j->dsp.low == 0x20) {
1210 clear_bit(board, &j->busyflags);
1215 if (j->flags.ringback) {
1217 if (j->dsp.low == 0x20) {
1218 clear_bit(board, &j->busyflags);
1223 if (!j->tone_state) {
1228 if (!(j->tone_state && j->dsp.low == 0x20)) {
1236 if (j->flags.cringing) {
1237 if (j->hookstate & 1) {
1238 j->flags.cringing = 0;
1240 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1241 switch(j->cadence_f[5].state) {
1243 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1244 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1245 if(ixjdebug & 0x0004) {
1246 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1250 j->cadence_f[5].state = 1;
1253 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1254 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1255 if(ixjdebug & 0x0004) {
1256 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1259 j->cadence_f[5].state = 2;
1263 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1264 if(ixjdebug & 0x0004) {
1265 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1268 if (j->cadence_f[5].on2) {
1269 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1270 j->cadence_f[5].state = 3;
1272 j->cadence_f[5].state = 7;
1277 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1278 if(ixjdebug & 0x0004) {
1279 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1282 if (j->cadence_f[5].off2) {
1283 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1284 j->cadence_f[5].state = 4;
1286 j->cadence_f[5].state = 7;
1291 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1292 if(ixjdebug & 0x0004) {
1293 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1296 if (j->cadence_f[5].on3) {
1297 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1298 j->cadence_f[5].state = 5;
1300 j->cadence_f[5].state = 7;
1305 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1306 if(ixjdebug & 0x0004) {
1307 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1310 if (j->cadence_f[5].off3) {
1311 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1312 j->cadence_f[5].state = 6;
1314 j->cadence_f[5].state = 7;
1319 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1320 if(ixjdebug & 0x0004) {
1321 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1323 j->cadence_f[5].state = 7;
1327 if(ixjdebug & 0x0004) {
1328 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1330 j->flags.cidring = 1;
1331 j->cadence_f[5].state = 0;
1334 if (j->flags.cidring && !j->flags.cidsent) {
1335 j->flags.cidsent = 1;
1337 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1340 j->flags.cidring = 0;
1342 clear_bit(board, &j->busyflags);
1346 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1347 if (j->flags.cidring && !j->flags.cidsent) {
1348 j->flags.cidsent = 1;
1350 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1353 j->flags.cidring = 0;
1355 j->ring_cadence_t--;
1356 if (j->ring_cadence_t == -1)
1357 j->ring_cadence_t = 15;
1358 j->ring_cadence_jif = jiffies;
1360 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1361 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1362 j->flags.firstring = 1;
1367 if(!j->flags.cidsent)
1368 j->flags.cidring = 1;
1371 clear_bit(board, &j->busyflags);
1376 if (!j->flags.ringing) {
1377 if (j->hookstate) { /* & 1) { */
1378 if (j->dsp.low != 0x20 &&
1379 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1380 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1384 ixj_WriteDSPCommand(0x511B, j);
1385 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1386 if (!j->m_hook && (j->hookstate & 1)) {
1387 j->m_hook = j->ex.bits.hookstate = 1;
1388 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1391 if (j->ex.bits.dtmf_ready) {
1392 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1396 j->ex.bits.hookstate = 1;
1397 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1401 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1405 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1407 clear_bit(board, &j->busyflags);
1412 static int ixj_status_wait(IXJ *j)
1416 jif = jiffies + ((60 * hertz) / 100);
1417 while (!IsStatusReady(j)) {
1418 ixj_perfmon(j->statuswait);
1419 if (time_after(jiffies, jif)) {
1420 ixj_perfmon(j->statuswaitfail);
1427 static int ixj_PCcontrol_wait(IXJ *j)
1431 jif = jiffies + ((60 * hertz) / 100);
1432 while (!IsPCControlReady(j)) {
1433 ixj_perfmon(j->pcontrolwait);
1434 if (time_after(jiffies, jif)) {
1435 ixj_perfmon(j->pcontrolwaitfail);
1442 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1447 atomic_inc(&j->DSPWrite);
1448 if(atomic_read(&j->DSPWrite) > 1) {
1449 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1452 bytes.high = (cmd & 0xFF00) >> 8;
1453 bytes.low = cmd & 0x00FF;
1454 jif = jiffies + ((60 * hertz) / 100);
1455 while (!IsControlReady(j)) {
1456 ixj_perfmon(j->iscontrolready);
1457 if (time_after(jiffies, jif)) {
1458 ixj_perfmon(j->iscontrolreadyfail);
1459 atomic_dec(&j->DSPWrite);
1460 if(atomic_read(&j->DSPWrite) > 0) {
1461 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1462 while(atomic_read(&j->DSPWrite) > 0) {
1463 atomic_dec(&j->DSPWrite);
1469 outb(bytes.low, j->DSPbase + 6);
1470 outb(bytes.high, j->DSPbase + 7);
1472 if (ixj_status_wait(j)) {
1475 atomic_dec(&j->DSPWrite);
1476 if(atomic_read(&j->DSPWrite) > 0) {
1477 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1478 while(atomic_read(&j->DSPWrite) > 0) {
1479 atomic_dec(&j->DSPWrite);
1484 /* Read Software Status Register */
1485 j->ssr.low = inb_p(j->DSPbase + 2);
1486 j->ssr.high = inb_p(j->DSPbase + 3);
1487 atomic_dec(&j->DSPWrite);
1488 if(atomic_read(&j->DSPWrite) > 0) {
1489 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1490 while(atomic_read(&j->DSPWrite) > 0) {
1491 atomic_dec(&j->DSPWrite);
1497 /***************************************************************************
1499 * General Purpose IO Register read routine
1501 ***************************************************************************/
1502 static inline int ixj_gpio_read(IXJ *j)
1504 if (ixj_WriteDSPCommand(0x5143, j))
1507 j->gpio.bytes.low = j->ssr.low;
1508 j->gpio.bytes.high = j->ssr.high;
1513 static inline void LED_SetState(int state, IXJ *j)
1515 if (j->cardtype == QTI_LINEJACK) {
1516 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1517 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1518 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1519 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1521 outb(j->pld_scrw.byte, j->XILINXbase);
1525 /*********************************************************************
1526 * GPIO Pins are configured as follows on the Quicknet Internet
1527 * PhoneJACK Telephony Cards
1529 * POTS Select GPIO_6=0 GPIO_7=0
1530 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1531 * Handset Select GPIO_6=1 GPIO_7=0
1533 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1534 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1535 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1537 * Hook Switch changes reported on GPIO_3
1538 *********************************************************************/
1539 static int ixj_set_port(IXJ *j, int arg)
1541 if (j->cardtype == QTI_PHONEJACK_LITE) {
1542 if (arg != PORT_POTS)
1549 j->port = PORT_POTS;
1550 switch (j->cardtype) {
1552 if (j->flags.pcmciasct == 1)
1553 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1557 case QTI_PHONEJACK_PCI:
1558 j->pld_slicw.pcib.mic = 0;
1559 j->pld_slicw.pcib.spk = 0;
1560 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1563 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1564 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1565 Software Control Register */
1567 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1569 outb(j->pld_scrw.byte, j->XILINXbase);
1570 j->pld_clock.byte = 0;
1571 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1572 j->pld_slicw.bits.rly1 = 1;
1573 j->pld_slicw.bits.spken = 0;
1574 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1575 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1576 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1577 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1578 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1579 ixj_mixer(0x0E80, j); /*Mic mute */
1580 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1581 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1582 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1583 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1584 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1587 j->gpio.bytes.high = 0x0B;
1588 j->gpio.bits.gpio6 = 0;
1589 j->gpio.bits.gpio7 = 0;
1590 ixj_WriteDSPCommand(j->gpio.word, j);
1595 if (j->cardtype == QTI_LINEJACK) {
1596 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1598 j->pld_slicw.bits.rly3 = 0;
1599 j->pld_slicw.bits.rly1 = 1;
1600 j->pld_slicw.bits.spken = 0;
1601 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1602 j->port = PORT_PSTN;
1608 j->port = PORT_SPEAKER;
1609 switch (j->cardtype) {
1611 if (j->flags.pcmciasct) {
1612 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1615 case QTI_PHONEJACK_PCI:
1616 j->pld_slicw.pcib.mic = 1;
1617 j->pld_slicw.pcib.spk = 1;
1618 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1621 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1622 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1623 Software Control Register */
1625 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1627 outb(j->pld_scrw.byte, j->XILINXbase);
1628 j->pld_clock.byte = 0;
1629 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1630 j->pld_slicw.bits.rly1 = 1;
1631 j->pld_slicw.bits.spken = 1;
1632 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1633 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1634 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1635 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1636 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1637 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1638 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1639 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1640 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1643 j->gpio.bytes.high = 0x0B;
1644 j->gpio.bits.gpio6 = 0;
1645 j->gpio.bits.gpio7 = 1;
1646 ixj_WriteDSPCommand(j->gpio.word, j);
1651 if (j->cardtype != QTI_PHONEJACK) {
1654 j->gpio.bytes.high = 0x0B;
1655 j->gpio.bits.gpio6 = 1;
1656 j->gpio.bits.gpio7 = 0;
1657 ixj_WriteDSPCommand(j->gpio.word, j);
1658 j->port = PORT_HANDSET;
1668 static int ixj_set_pots(IXJ *j, int arg)
1670 if (j->cardtype == QTI_LINEJACK) {
1672 if (j->port == PORT_PSTN) {
1673 j->pld_slicw.bits.rly1 = 0;
1674 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1675 j->flags.pots_pstn = 1;
1678 j->flags.pots_pstn = 0;
1682 j->pld_slicw.bits.rly1 = 1;
1683 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1684 j->flags.pots_pstn = 0;
1692 static void ixj_ring_on(IXJ *j)
1694 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1696 if (ixjdebug & 0x0004)
1697 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1699 j->gpio.bytes.high = 0x0B;
1700 j->gpio.bytes.low = 0x00;
1701 j->gpio.bits.gpio1 = 1;
1702 j->gpio.bits.gpio2 = 1;
1703 j->gpio.bits.gpio5 = 0;
1704 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1705 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1707 if (ixjdebug & 0x0004)
1708 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1710 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1714 static int ixj_siadc(IXJ *j, int val)
1716 if(j->cardtype == QTI_PHONECARD){
1717 if(j->flags.pcmciascp){
1719 return j->siadc.bits.rxg;
1721 if(val < 0 || val > 0x1F)
1724 j->siadc.bits.hom = 0; /* Handset Out Mute */
1725 j->siadc.bits.lom = 0; /* Line Out Mute */
1726 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1727 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1728 j->psccr.bits.rw = 0; /* Read / Write flag */
1729 j->psccr.bits.dev = 0;
1730 outb(j->siadc.byte, j->XILINXbase + 0x00);
1731 outb(j->psccr.byte, j->XILINXbase + 0x01);
1732 ixj_PCcontrol_wait(j);
1733 return j->siadc.bits.rxg;
1739 static int ixj_sidac(IXJ *j, int val)
1741 if(j->cardtype == QTI_PHONECARD){
1742 if(j->flags.pcmciascp){
1744 return j->sidac.bits.txg;
1746 if(val < 0 || val > 0x1F)
1749 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1750 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1751 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1752 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1753 j->psccr.bits.rw = 0; /* Read / Write flag */
1754 j->psccr.bits.dev = 0;
1755 outb(j->sidac.byte, j->XILINXbase + 0x00);
1756 outb(j->psccr.byte, j->XILINXbase + 0x01);
1757 ixj_PCcontrol_wait(j);
1758 return j->sidac.bits.txg;
1764 static int ixj_pcmcia_cable_check(IXJ *j)
1766 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1767 if (!j->flags.pcmciastate) {
1768 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1769 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1770 j->flags.pcmciastate = 4;
1773 if (j->pccr1.bits.ed) {
1774 j->pccr1.bits.ed = 0;
1775 j->psccr.bits.dev = 3;
1776 j->psccr.bits.rw = 1;
1777 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1778 ixj_PCcontrol_wait(j);
1779 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1780 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1781 j->psccr.bits.dev = 3;
1782 j->psccr.bits.rw = 0;
1783 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1784 ixj_PCcontrol_wait(j);
1785 return j->pslic.bits.led2 ? 1 : 0;
1786 } else if (j->flags.pcmciasct) {
1791 } else if (j->flags.pcmciastate == 4) {
1792 if (!j->pccr1.bits.drf) {
1793 j->flags.pcmciastate = 3;
1796 } else if (j->flags.pcmciastate == 3) {
1797 j->pccr2.bits.pwr = 0;
1798 j->pccr2.bits.rstc = 1;
1799 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1800 j->checkwait = jiffies + (hertz * 2);
1801 j->flags.incheck = 1;
1802 j->flags.pcmciastate = 2;
1804 } else if (j->flags.pcmciastate == 2) {
1805 if (j->flags.incheck) {
1806 if (time_before(jiffies, j->checkwait)) {
1809 j->flags.incheck = 0;
1812 j->pccr2.bits.pwr = 0;
1813 j->pccr2.bits.rstc = 0;
1814 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1815 j->flags.pcmciastate = 1;
1817 } else if (j->flags.pcmciastate == 1) {
1818 j->flags.pcmciastate = 0;
1819 if (!j->pccr1.bits.drf) {
1820 j->psccr.bits.dev = 3;
1821 j->psccr.bits.rw = 1;
1822 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1823 ixj_PCcontrol_wait(j);
1824 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1826 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1828 if (j->flags.pcmciasct == 3) {
1829 j->flags.pcmciastate = 4;
1831 } else if (j->flags.pcmciasct == 0) {
1832 j->pccr2.bits.pwr = 1;
1833 j->pccr2.bits.rstc = 0;
1834 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1835 j->port = PORT_SPEAKER;
1837 j->port = PORT_POTS;
1839 j->sic1.bits.cpd = 0; /* Chip Power Down */
1840 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1841 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1842 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1843 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1844 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1845 j->psccr.bits.rw = 0; /* Read / Write flag */
1846 j->psccr.bits.dev = 0;
1847 outb(j->sic1.byte, j->XILINXbase + 0x00);
1848 outb(j->psccr.byte, j->XILINXbase + 0x01);
1849 ixj_PCcontrol_wait(j);
1851 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1852 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1853 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1854 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1855 j->sic2.bits.hpd = 0; /* HPF disable */
1856 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1857 j->psccr.bits.rw = 0; /* Read / Write flag */
1858 j->psccr.bits.dev = 0;
1859 outb(j->sic2.byte, j->XILINXbase + 0x00);
1860 outb(j->psccr.byte, j->XILINXbase + 0x01);
1861 ixj_PCcontrol_wait(j);
1863 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1864 j->psccr.bits.rw = 0; /* Read / Write flag */
1865 j->psccr.bits.dev = 0;
1866 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1867 outb(j->psccr.byte, j->XILINXbase + 0x01);
1868 ixj_PCcontrol_wait(j);
1870 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1871 j->psccr.bits.rw = 0; /* Read / Write flag */
1872 j->psccr.bits.dev = 0;
1873 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1874 outb(j->psccr.byte, j->XILINXbase + 0x01);
1875 ixj_PCcontrol_wait(j);
1877 j->sirxg.bits.lig = 1; /* Line In Gain */
1878 j->sirxg.bits.lim = 1; /* Line In Mute */
1879 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1880 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1881 j->sirxg.bits.him = 0; /* Handset In Mute */
1882 j->sirxg.bits.iir = 1; /* IIR */
1883 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1884 j->psccr.bits.rw = 0; /* Read / Write flag */
1885 j->psccr.bits.dev = 0;
1886 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1887 outb(j->psccr.byte, j->XILINXbase + 0x01);
1888 ixj_PCcontrol_wait(j);
1893 j->siaatt.bits.sot = 0;
1894 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1895 j->psccr.bits.rw = 0; /* Read / Write flag */
1896 j->psccr.bits.dev = 0;
1897 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1898 outb(j->psccr.byte, j->XILINXbase + 0x01);
1899 ixj_PCcontrol_wait(j);
1901 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1902 j->psccr.byte = j->pslic.byte = 0;
1903 j->pslic.bits.powerdown = 1;
1904 j->psccr.bits.dev = 3;
1905 j->psccr.bits.rw = 0;
1906 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1907 ixj_PCcontrol_wait(j);
1912 j->flags.pcmciascp = 0;
1918 static int ixj_hookstate(IXJ *j)
1922 switch (j->cardtype) {
1925 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1928 case QTI_PHONEJACK_LITE:
1929 case QTI_PHONEJACK_PCI:
1931 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1932 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1933 if(fOffHook != j->p_hook) {
1935 j->checkwait = jiffies;
1937 if(time_before(jiffies, j->checkwait + 2)) {
1942 j->p_hook = fOffHook;
1943 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1946 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1947 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1948 if (j->flags.ringing || j->flags.cringing) {
1949 if (!in_interrupt()) {
1953 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1957 if (j->cardtype == QTI_PHONEJACK_PCI) {
1958 j->pld_scrr.byte = inb_p(j->XILINXbase);
1959 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1961 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1966 fOffHook = ixj_pcmcia_cable_check(j);
1969 if (j->r_hook != fOffHook) {
1970 j->r_hook = fOffHook;
1971 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1972 j->ex.bits.hookstate = 1;
1973 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1974 } else if (!fOffHook) {
1975 j->flash_end = jiffies + ((60 * hertz) / 100);
1979 if(time_before(jiffies, j->flash_end)) {
1980 j->ex.bits.flash = 1;
1982 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1985 if(time_before(jiffies, j->flash_end)) {
1990 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1993 if (j->port == PORT_SPEAKER) {
1994 if(j->cardtype == QTI_PHONECARD) {
1995 if(j->flags.pcmciascp && j->flags.pcmciasct) {
2003 if (j->port == PORT_HANDSET)
2009 static void ixj_ring_off(IXJ *j)
2011 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2013 if (ixjdebug & 0x0004)
2014 printk(KERN_INFO "IXJ Ring Off\n");
2015 j->gpio.bytes.high = 0x0B;
2016 j->gpio.bytes.low = 0x00;
2017 j->gpio.bits.gpio1 = 0;
2018 j->gpio.bits.gpio2 = 1;
2019 j->gpio.bits.gpio5 = 0;
2020 ixj_WriteDSPCommand(j->gpio.word, j);
2021 } else /* Internet LineJACK */
2023 if (ixjdebug & 0x0004)
2024 printk(KERN_INFO "IXJ Ring Off\n");
2026 if(!j->flags.cidplay)
2027 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2033 static void ixj_ring_start(IXJ *j)
2035 j->flags.cringing = 1;
2036 if (ixjdebug & 0x0004)
2037 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2038 if (ixj_hookstate(j) & 1) {
2039 if (j->port == PORT_POTS)
2041 j->flags.cringing = 0;
2042 if (ixjdebug & 0x0004)
2043 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2044 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2045 j->ring_cadence_jif = jiffies;
2046 j->flags.cidsent = j->flags.cidring = 0;
2047 j->cadence_f[5].state = 0;
2048 if(j->cadence_f[5].on1)
2051 j->ring_cadence_jif = jiffies;
2052 j->ring_cadence_t = 15;
2053 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2058 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2062 static int ixj_ring(IXJ *j)
2067 j->flags.ringing = 1;
2068 if (ixj_hookstate(j) & 1) {
2070 j->flags.ringing = 0;
2073 for (cntr = 0; cntr < j->maxrings; cntr++) {
2074 jif = jiffies + (1 * hertz);
2076 while (time_before(jiffies, jif)) {
2077 if (ixj_hookstate(j) & 1) {
2079 j->flags.ringing = 0;
2082 schedule_timeout_interruptible(1);
2083 if (signal_pending(current))
2086 jif = jiffies + (3 * hertz);
2088 while (time_before(jiffies, jif)) {
2089 if (ixj_hookstate(j) & 1) {
2091 if (ixj_hookstate(j) & 1) {
2092 j->flags.ringing = 0;
2096 schedule_timeout_interruptible(1);
2097 if (signal_pending(current))
2102 j->flags.ringing = 0;
2106 static int ixj_open(struct phone_device *p, struct file *file_p)
2108 IXJ *j = get_ixj(p->board);
2109 file_p->private_data = j;
2114 if (file_p->f_mode & FMODE_READ) {
2122 if (file_p->f_mode & FMODE_WRITE) {
2126 if (file_p->f_mode & FMODE_READ){
2133 if (j->cardtype == QTI_PHONECARD) {
2134 j->pslic.bits.powerdown = 0;
2135 j->psccr.bits.dev = 3;
2136 j->psccr.bits.rw = 0;
2137 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2138 ixj_PCcontrol_wait(j);
2141 j->flags.cidplay = 0;
2142 j->flags.cidcw_ack = 0;
2144 if (ixjdebug & 0x0002)
2145 printk(KERN_INFO "Opening board %d\n", p->board);
2147 j->framesread = j->frameswritten = 0;
2151 static int ixj_release(struct inode *inode, struct file *file_p)
2155 IXJ *j = file_p->private_data;
2156 int board = j->p.board;
2159 * Set up locks to ensure that only one process is talking to the DSP at a time.
2160 * This is necessary to keep the DSP from locking up.
2162 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2163 schedule_timeout_interruptible(1);
2164 if (ixjdebug & 0x0002)
2165 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2167 if (j->cardtype == QTI_PHONECARD)
2168 ixj_set_port(j, PORT_SPEAKER);
2170 ixj_set_port(j, PORT_POTS);
2175 set_play_volume(j, 0x100);
2176 set_rec_volume(j, 0x100);
2179 /* Restore the tone table to default settings. */
2185 ixj_init_tone(j, &ti);
2191 ixj_init_tone(j, &ti);
2197 ixj_init_tone(j, &ti);
2203 ixj_init_tone(j, &ti);
2209 ixj_init_tone(j, &ti);
2215 ixj_init_tone(j, &ti);
2221 ixj_init_tone(j, &ti);
2227 ixj_init_tone(j, &ti);
2233 ixj_init_tone(j, &ti);
2239 ixj_init_tone(j, &ti);
2245 ixj_init_tone(j, &ti);
2251 ixj_init_tone(j, &ti);
2257 ixj_init_tone(j, &ti);
2263 ixj_init_tone(j, &ti);
2269 ixj_init_tone(j, &ti);
2275 ixj_init_tone(j, &ti);
2281 ixj_init_tone(j, &ti);
2287 ixj_init_tone(j, &ti);
2289 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2291 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2293 j->ex.bits.dtmf_ready = 0;
2295 j->dtmf_wp = j->dtmf_rp = 0;
2296 j->rec_mode = j->play_mode = -1;
2297 j->flags.ringing = 0;
2298 j->maxrings = MAXRINGS;
2299 j->ring_cadence = USA_RING_CADENCE;
2300 if(j->cadence_f[5].enable) {
2301 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2305 j->flags.dtmf_oob = 0;
2306 for (cnt = 0; cnt < 4; cnt++)
2307 j->cadence_f[cnt].enable = 0;
2311 if(j->cardtype == QTI_PHONECARD) {
2312 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2315 if (file_p->f_mode & FMODE_READ)
2317 if (file_p->f_mode & FMODE_WRITE)
2320 if (j->read_buffer && !j->readers) {
2321 kfree(j->read_buffer);
2322 j->read_buffer = NULL;
2323 j->read_buffer_size = 0;
2325 if (j->write_buffer && !j->writers) {
2326 kfree(j->write_buffer);
2327 j->write_buffer = NULL;
2328 j->write_buffer_size = 0;
2330 j->rec_codec = j->play_codec = 0;
2331 j->rec_frame_size = j->play_frame_size = 0;
2332 j->flags.cidsent = j->flags.cidring = 0;
2333 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2335 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2336 ixj_set_port(j, PORT_PSTN);
2337 daa_set_mode(j, SOP_PU_SLEEP);
2340 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2342 /* Set up the default signals for events */
2343 for (cnt = 0; cnt < 35; cnt++)
2344 j->ixj_signals[cnt] = SIGIO;
2346 /* Set the excetion signal enable flags */
2347 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2348 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 =
2349 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;
2351 file_p->private_data = NULL;
2352 clear_bit(board, &j->busyflags);
2356 static int read_filters(IXJ *j)
2358 unsigned short fc, cnt, trg;
2362 if (ixj_WriteDSPCommand(0x5144, j)) {
2363 if(ixjdebug & 0x0001) {
2364 printk(KERN_INFO "Read Frame Counter failed!\n");
2368 fc = j->ssr.high << 8 | j->ssr.low;
2369 if (fc == j->frame_count)
2372 j->frame_count = fc;
2379 for (cnt = 0; cnt < 4; cnt++) {
2380 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2381 if(ixjdebug & 0x0001) {
2382 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2386 if (ixj_WriteDSPCommand(0x515C, j)) {
2387 if(ixjdebug & 0x0001) {
2388 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2392 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2394 if (j->cadence_f[cnt].enable) {
2395 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2396 if (j->cadence_f[cnt].state == 0) {
2397 j->cadence_f[cnt].state = 1;
2398 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2399 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2400 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2401 } else if (j->cadence_f[cnt].state == 2 &&
2402 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2403 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2404 if (j->cadence_f[cnt].on2) {
2405 j->cadence_f[cnt].state = 3;
2406 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2407 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2408 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2410 j->cadence_f[cnt].state = 7;
2412 } else if (j->cadence_f[cnt].state == 4 &&
2413 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2414 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2415 if (j->cadence_f[cnt].on3) {
2416 j->cadence_f[cnt].state = 5;
2417 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2418 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2419 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2421 j->cadence_f[cnt].state = 7;
2424 j->cadence_f[cnt].state = 0;
2426 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2427 if (j->cadence_f[cnt].state == 1) {
2428 if(!j->cadence_f[cnt].on1) {
2429 j->cadence_f[cnt].state = 7;
2430 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2431 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2432 if(j->cadence_f[cnt].off1) {
2433 j->cadence_f[cnt].state = 2;
2434 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2435 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2436 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2438 j->cadence_f[cnt].state = 7;
2441 j->cadence_f[cnt].state = 0;
2443 } else if (j->cadence_f[cnt].state == 3) {
2444 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2445 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2446 if(j->cadence_f[cnt].off2) {
2447 j->cadence_f[cnt].state = 4;
2448 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2449 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2450 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2452 j->cadence_f[cnt].state = 7;
2455 j->cadence_f[cnt].state = 0;
2457 } else if (j->cadence_f[cnt].state == 5) {
2458 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2459 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2460 if(j->cadence_f[cnt].off3) {
2461 j->cadence_f[cnt].state = 6;
2462 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2463 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2464 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2466 j->cadence_f[cnt].state = 7;
2469 j->cadence_f[cnt].state = 0;
2472 j->cadence_f[cnt].state = 0;
2475 switch(j->cadence_f[cnt].state) {
2477 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2478 !j->cadence_f[cnt].off1 &&
2479 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2480 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2481 j->cadence_f[cnt].state = 7;
2485 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2486 !j->cadence_f[cnt].off2 &&
2487 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2488 j->cadence_f[cnt].state = 7;
2492 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2493 !j->cadence_f[cnt].off3) {
2494 j->cadence_f[cnt].state = 7;
2500 if (ixjdebug & 0x0040) {
2501 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2502 switch(j->cadence_f[cnt].state) {
2504 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2507 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2508 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2511 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2512 j->cadence_f[cnt].off1max);
2515 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2516 j->cadence_f[cnt].on2max);
2519 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2520 j->cadence_f[cnt].off2max);
2523 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2524 j->cadence_f[cnt].on3max);
2527 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2528 j->cadence_f[cnt].off3max);
2533 if (j->cadence_f[cnt].state == 7) {
2534 j->cadence_f[cnt].state = 0;
2535 if (j->cadence_f[cnt].enable == 1)
2536 j->cadence_f[cnt].enable = 0;
2539 if(ixjdebug & 0x0020) {
2540 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2543 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2546 if(ixjdebug & 0x0020) {
2547 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2550 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2553 if(ixjdebug & 0x0020) {
2554 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2557 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2560 if(ixjdebug & 0x0020) {
2561 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2564 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2568 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2569 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2570 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2572 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2577 if(ixjdebug & 0x0020) {
2578 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2581 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2584 if(ixjdebug & 0x0020) {
2585 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2588 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2591 if(ixjdebug & 0x0020) {
2592 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2595 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2598 if(ixjdebug & 0x0020) {
2599 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2602 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2610 static int LineMonitor(IXJ *j)
2617 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2620 j->dtmf.bytes.high = j->ssr.high;
2621 j->dtmf.bytes.low = j->ssr.low;
2622 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2624 j->dtmf_current = j->dtmf.bits.digit;
2626 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2628 if(!j->cidcw_wait) {
2629 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2631 if (j->dtmf_wp == 79)
2633 j->ex.bits.dtmf_ready = 1;
2634 if(j->ex_sig.bits.dtmf_ready) {
2635 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2638 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2639 if(ixjdebug & 0x0020) {
2640 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2642 j->flags.cidcw_ack = 1;
2651 /************************************************************************
2653 * Functions to allow alaw <-> ulaw conversions.
2655 ************************************************************************/
2657 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2659 static unsigned char table_ulaw2alaw[] =
2661 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2662 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2663 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2664 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2665 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2666 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2667 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2668 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2669 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2670 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2671 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2672 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2673 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2674 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2675 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2676 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2677 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2678 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2679 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2680 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2681 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2682 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2683 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2684 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2685 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2686 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2687 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2688 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2689 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2690 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2691 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2692 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2697 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2702 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2704 static unsigned char table_alaw2ulaw[] =
2706 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2707 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2708 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2709 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2710 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2711 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2712 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2713 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2714 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2715 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2716 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2717 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2718 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2719 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2720 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2721 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2722 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2723 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2724 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2725 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2726 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2727 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2728 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2729 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2730 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2731 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2732 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2733 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2734 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2735 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2736 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2737 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2742 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2747 static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2749 unsigned long i = *ppos;
2750 IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2752 DECLARE_WAITQUEUE(wait, current);
2754 if (j->flags.inread)
2757 j->flags.inread = 1;
2759 add_wait_queue(&j->read_q, &wait);
2760 set_current_state(TASK_INTERRUPTIBLE);
2763 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2765 if (file_p->f_flags & O_NONBLOCK) {
2766 set_current_state(TASK_RUNNING);
2767 remove_wait_queue(&j->read_q, &wait);
2768 j->flags.inread = 0;
2771 if (!ixj_hookstate(j)) {
2772 set_current_state(TASK_RUNNING);
2773 remove_wait_queue(&j->read_q, &wait);
2774 j->flags.inread = 0;
2777 interruptible_sleep_on(&j->read_q);
2778 if (signal_pending(current)) {
2779 set_current_state(TASK_RUNNING);
2780 remove_wait_queue(&j->read_q, &wait);
2781 j->flags.inread = 0;
2786 remove_wait_queue(&j->read_q, &wait);
2787 set_current_state(TASK_RUNNING);
2788 /* Don't ever copy more than the user asks */
2789 if(j->rec_codec == ALAW)
2790 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2791 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2792 j->read_buffer_ready = 0;
2794 j->flags.inread = 0;
2797 j->flags.inread = 0;
2798 return min(length, j->read_buffer_size);
2802 static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2806 ssize_t read_retval = 0;
2807 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2809 pre_retval = ixj_PreRead(j, 0L);
2810 switch (pre_retval) {
2812 read_retval = ixj_read(file_p, buf, length, ppos);
2813 ixj_PostRead(j, 0L);
2816 read_retval = ixj_read(file_p, buf, length, ppos);
2819 ixj_PostRead(j, 0L);
2822 read_retval = pre_retval;
2827 static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2829 unsigned long i = *ppos;
2830 IXJ *j = file_p->private_data;
2832 DECLARE_WAITQUEUE(wait, current);
2834 if (j->flags.inwrite)
2837 j->flags.inwrite = 1;
2839 add_wait_queue(&j->write_q, &wait);
2840 set_current_state(TASK_INTERRUPTIBLE);
2844 while (!j->write_buffers_empty) {
2846 if (file_p->f_flags & O_NONBLOCK) {
2847 set_current_state(TASK_RUNNING);
2848 remove_wait_queue(&j->write_q, &wait);
2849 j->flags.inwrite = 0;
2852 if (!ixj_hookstate(j)) {
2853 set_current_state(TASK_RUNNING);
2854 remove_wait_queue(&j->write_q, &wait);
2855 j->flags.inwrite = 0;
2858 interruptible_sleep_on(&j->write_q);
2859 if (signal_pending(current)) {
2860 set_current_state(TASK_RUNNING);
2861 remove_wait_queue(&j->write_q, &wait);
2862 j->flags.inwrite = 0;
2866 set_current_state(TASK_RUNNING);
2867 remove_wait_queue(&j->write_q, &wait);
2868 if (j->write_buffer_wp + count >= j->write_buffer_end)
2869 j->write_buffer_wp = j->write_buffer;
2870 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2872 j->flags.inwrite = 0;
2875 if(j->play_codec == ALAW)
2876 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2877 j->flags.inwrite = 0;
2878 return min(count, j->write_buffer_size);
2881 static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2884 ssize_t write_retval = 0;
2886 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2888 pre_retval = ixj_PreWrite(j, 0L);
2889 switch (pre_retval) {
2891 write_retval = ixj_write(file_p, buf, count, ppos);
2892 if (write_retval > 0) {
2893 ixj_PostWrite(j, 0L);
2894 j->write_buffer_wp += write_retval;
2895 j->write_buffers_empty--;
2899 write_retval = ixj_write(file_p, buf, count, ppos);
2900 if (write_retval > 0) {
2901 j->write_buffer_wp += write_retval;
2902 j->write_buffers_empty--;
2906 ixj_PostWrite(j, 0L);
2909 write_retval = pre_retval;
2911 return write_retval;
2914 static void ixj_read_frame(IXJ *j)
2918 if (j->read_buffer) {
2919 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2920 if (!(cnt % 16) && !IsRxReady(j)) {
2922 while (!IsRxReady(j)) {
2930 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2931 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2932 inb_p(j->DSPbase + 0x0E);
2933 inb_p(j->DSPbase + 0x0F);
2935 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2936 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2939 if (j->intercom != -1) {
2940 if (IsTxReady(get_ixj(j->intercom))) {
2941 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2942 if (!(cnt % 16) && !IsTxReady(j)) {
2944 while (!IsTxReady(j)) {
2952 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2953 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2955 get_ixj(j->intercom)->frameswritten++;
2958 j->read_buffer_ready = 1;
2959 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2961 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2963 if(j->ixj_signals[SIG_READ_READY])
2964 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2969 static short fsk[][6][20] =
2973 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2974 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2977 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2978 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2981 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2982 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2985 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2986 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2989 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2990 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2993 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2994 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2999 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3000 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3003 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3004 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3007 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3008 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3011 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3012 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3015 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3016 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3019 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3020 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3026 static void ixj_write_cid_bit(IXJ *j, int bit)
3028 while (j->fskcnt < 20) {
3029 if(j->fskdcnt < (j->fsksize - 1))
3030 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3043 static void ixj_write_cid_byte(IXJ *j, char byte)
3048 ixj_write_cid_bit(j, 0);
3049 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3050 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3051 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3052 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3053 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3054 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3055 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3056 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3057 ixj_write_cid_bit(j, 1);
3060 static void ixj_write_cid_seize(IXJ *j)
3064 for (cnt = 0; cnt < 150; cnt++) {
3065 ixj_write_cid_bit(j, 0);
3066 ixj_write_cid_bit(j, 1);
3068 for (cnt = 0; cnt < 180; cnt++) {
3069 ixj_write_cid_bit(j, 1);
3073 static void ixj_write_cidcw_seize(IXJ *j)
3077 for (cnt = 0; cnt < 80; cnt++) {
3078 ixj_write_cid_bit(j, 1);
3082 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3086 for (cnt = 0; cnt < strlen(s); cnt++) {
3087 ixj_write_cid_byte(j, s[cnt]);
3088 checksum = (checksum + s[cnt]);
3093 static void ixj_pad_fsk(IXJ *j, int pad)
3097 for (cnt = 0; cnt < pad; cnt++) {
3098 if(j->fskdcnt < (j->fsksize - 1))
3099 j->fskdata[j->fskdcnt++] = 0x0000;
3101 for (cnt = 0; cnt < 720; cnt++) {
3102 if(j->fskdcnt < (j->fsksize - 1))
3103 j->fskdata[j->fskdcnt++] = 0x0000;
3107 static void ixj_pre_cid(IXJ *j)
3109 j->cid_play_codec = j->play_codec;
3110 j->cid_play_frame_size = j->play_frame_size;
3111 j->cid_play_volume = get_play_volume(j);
3112 j->cid_play_flag = j->flags.playing;
3114 j->cid_rec_codec = j->rec_codec;
3115 j->cid_rec_volume = get_rec_volume(j);
3116 j->cid_rec_flag = j->flags.recording;
3118 j->cid_play_aec_level = j->aec_level;
3120 switch(j->baseframe.low) {
3122 j->cid_base_frame_size = 20;
3125 j->cid_base_frame_size = 10;
3128 j->cid_base_frame_size = 30;
3135 j->flags.cidplay = 1;
3137 set_base_frame(j, 30);
3138 set_play_codec(j, LINEAR16);
3139 set_play_volume(j, 0x1B);
3143 static void ixj_post_cid(IXJ *j)
3147 if(j->cidsize > 5000) {
3148 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3150 j->flags.cidplay = 0;
3151 if(ixjdebug & 0x0200) {
3152 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3158 set_base_frame(j, j->cid_base_frame_size);
3159 set_play_codec(j, j->cid_play_codec);
3160 ixj_aec_start(j, j->cid_play_aec_level);
3161 set_play_volume(j, j->cid_play_volume);
3163 set_rec_codec(j, j->cid_rec_codec);
3164 set_rec_volume(j, j->cid_rec_volume);
3167 ixj_record_start(j);
3169 if(j->cid_play_flag)
3172 if(j->cid_play_flag) {
3173 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3177 static void ixj_write_cid(IXJ *j)
3182 char mdmflen, len1, len2, len3;
3187 if (j->dsp.low == 0x20 || j->flags.cidplay)
3190 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3191 j->cidsize = j->cidcnt = 0;
3195 strcpy(sdmf1, j->cid_send.month);
3196 strcat(sdmf1, j->cid_send.day);
3197 strcat(sdmf1, j->cid_send.hour);
3198 strcat(sdmf1, j->cid_send.min);
3199 strcpy(sdmf2, j->cid_send.number);
3200 strcpy(sdmf3, j->cid_send.name);
3202 len1 = strlen(sdmf1);
3203 len2 = strlen(sdmf2);
3204 len3 = strlen(sdmf3);
3205 mdmflen = len1 + len2 + len3 + 6;
3208 ixj_write_cid_seize(j);
3210 ixj_write_cid_byte(j, 0x80);
3212 ixj_write_cid_byte(j, mdmflen);
3213 checksum = checksum + mdmflen;
3215 ixj_write_cid_byte(j, 0x01);
3216 checksum = checksum + 0x01;
3217 ixj_write_cid_byte(j, len1);
3218 checksum = checksum + len1;
3219 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3220 if(ixj_hookstate(j) & 1)
3223 ixj_write_cid_byte(j, 0x02);
3224 checksum = checksum + 0x02;
3225 ixj_write_cid_byte(j, len2);
3226 checksum = checksum + len2;
3227 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3228 if(ixj_hookstate(j) & 1)
3231 ixj_write_cid_byte(j, 0x07);
3232 checksum = checksum + 0x07;
3233 ixj_write_cid_byte(j, len3);
3234 checksum = checksum + len3;
3235 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3236 if(ixj_hookstate(j) & 1)
3243 ixj_write_cid_byte(j, (char) checksum);
3245 pad = j->fskdcnt % 240;
3249 ixj_pad_fsk(j, pad);
3256 static void ixj_write_cidcw(IXJ *j)
3263 char mdmflen, len1, len2, len3;
3268 if (j->dsp.low == 0x20 || j->flags.cidplay)
3271 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3272 j->cidsize = j->cidcnt = 0;
3276 j->flags.cidcw_ack = 0;
3283 ixj_init_tone(j, &ti);
3285 ixj_set_tone_on(1500, j);
3286 ixj_set_tone_off(32, j);
3287 if(ixjdebug & 0x0200) {
3288 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3290 ixj_play_tone(j, 23);
3292 clear_bit(j->board, &j->busyflags);
3293 while(j->tone_state)
3294 schedule_timeout_interruptible(1);
3295 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3296 schedule_timeout_interruptible(1);
3297 if(ixjdebug & 0x0200) {
3298 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3306 ixj_init_tone(j, &ti);
3308 ixj_set_tone_off(10, j);
3309 ixj_set_tone_on(600, j);
3310 if(ixjdebug & 0x0200) {
3311 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3313 ixj_play_tone(j, 24);
3315 clear_bit(j->board, &j->busyflags);
3316 while(j->tone_state)
3317 schedule_timeout_interruptible(1);
3318 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3319 schedule_timeout_interruptible(1);
3320 if(ixjdebug & 0x0200) {
3321 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3324 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3326 clear_bit(j->board, &j->busyflags);
3327 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3328 schedule_timeout_interruptible(1);
3329 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3330 schedule_timeout_interruptible(1);
3332 if(!j->flags.cidcw_ack) {
3333 if(ixjdebug & 0x0200) {
3334 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3337 if(j->cid_play_flag) {
3338 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3344 j->flags.cidcw_ack = 0;
3345 strcpy(sdmf1, j->cid_send.month);
3346 strcat(sdmf1, j->cid_send.day);
3347 strcat(sdmf1, j->cid_send.hour);
3348 strcat(sdmf1, j->cid_send.min);
3349 strcpy(sdmf2, j->cid_send.number);
3350 strcpy(sdmf3, j->cid_send.name);
3352 len1 = strlen(sdmf1);
3353 len2 = strlen(sdmf2);
3354 len3 = strlen(sdmf3);
3355 mdmflen = len1 + len2 + len3 + 6;
3357 ixj_write_cidcw_seize(j);
3359 ixj_write_cid_byte(j, 0x80);
3361 ixj_write_cid_byte(j, mdmflen);
3362 checksum = checksum + mdmflen;
3364 ixj_write_cid_byte(j, 0x01);
3365 checksum = checksum + 0x01;
3366 ixj_write_cid_byte(j, len1);
3367 checksum = checksum + len1;
3368 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3370 ixj_write_cid_byte(j, 0x02);
3371 checksum = checksum + 0x02;
3372 ixj_write_cid_byte(j, len2);
3373 checksum = checksum + len2;
3374 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3376 ixj_write_cid_byte(j, 0x07);
3377 checksum = checksum + 0x07;
3378 ixj_write_cid_byte(j, len3);
3379 checksum = checksum + len3;
3380 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3386 ixj_write_cid_byte(j, (char) checksum);
3388 pad = j->fskdcnt % 240;
3392 ixj_pad_fsk(j, pad);
3393 if(ixjdebug & 0x0200) {
3394 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3398 static void ixj_write_vmwi(IXJ *j, int msg)
3405 if (j->dsp.low == 0x20 || j->flags.cidplay)
3408 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3409 j->cidsize = j->cidcnt = 0;
3415 if (j->port == PORT_POTS)
3416 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3418 ixj_write_cid_seize(j);
3420 ixj_write_cid_byte(j, 0x82);
3422 ixj_write_cid_byte(j, mdmflen);
3423 checksum = checksum + mdmflen;
3425 ixj_write_cid_byte(j, 0x0B);
3426 checksum = checksum + 0x0B;
3427 ixj_write_cid_byte(j, 1);
3428 checksum = checksum + 1;
3431 ixj_write_cid_byte(j, 0xFF);
3432 checksum = checksum + 0xFF;
3435 ixj_write_cid_byte(j, 0x00);
3436 checksum = checksum + 0x00;
3443 ixj_write_cid_byte(j, (char) checksum);
3445 pad = j->fskdcnt % 240;
3449 ixj_pad_fsk(j, pad);
3452 static void ixj_write_frame(IXJ *j)
3454 int cnt, frame_count, dly;
3459 if(j->flags.cidplay) {
3460 for(cnt = 0; cnt < 480; cnt++) {
3461 if (!(cnt % 16) && !IsTxReady(j)) {
3463 while (!IsTxReady(j)) {
3471 dat.word = j->fskdata[j->cidcnt++];
3472 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3473 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3476 if(j->cidcnt >= j->fskdcnt) {
3479 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3480 and there is real audio data in the buffer, we need to throw it away because
3481 we just used it's time slot */
3482 if (j->write_buffer_rp > j->write_buffer_wp) {
3483 j->write_buffer_rp += j->cid_play_frame_size * 2;
3484 if (j->write_buffer_rp >= j->write_buffer_end) {
3485 j->write_buffer_rp = j->write_buffer;
3487 j->write_buffers_empty++;
3488 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3490 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3492 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3493 if (j->write_buffer_wp > j->write_buffer_rp) {
3495 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3497 if (j->write_buffer_rp > j->write_buffer_wp) {
3499 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3500 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3502 if (frame_count >= 1) {
3503 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3504 switch (j->play_mode) {
3505 case PLAYBACK_MODE_ULAW:
3506 case PLAYBACK_MODE_ALAW:
3507 blankword.low = blankword.high = 0xFF;
3509 case PLAYBACK_MODE_8LINEAR:
3510 case PLAYBACK_MODE_16LINEAR:
3511 blankword.low = blankword.high = 0x00;
3513 case PLAYBACK_MODE_8LINEAR_WSS:
3514 blankword.low = blankword.high = 0x80;
3517 for (cnt = 0; cnt < 16; cnt++) {
3518 if (!(cnt % 16) && !IsTxReady(j)) {
3520 while (!IsTxReady(j)) {
3528 outb_p((blankword.low), j->DSPbase + 0x0C);
3529 outb_p((blankword.high), j->DSPbase + 0x0D);
3531 j->flags.play_first_frame = 0;
3532 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3533 for (cnt = 0; cnt < 24; cnt++) {
3535 blankword.low = 0x02;
3536 blankword.high = 0x00;
3539 blankword.low = blankword.high = 0x00;
3541 if (!(cnt % 16) && !IsTxReady(j)) {
3543 while (!IsTxReady(j)) {
3551 outb_p((blankword.low), j->DSPbase + 0x0C);
3552 outb_p((blankword.high), j->DSPbase + 0x0D);
3554 j->flags.play_first_frame = 0;
3556 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3557 if (!(cnt % 16) && !IsTxReady(j)) {
3559 while (!IsTxReady(j)) {
3567 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3568 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3569 if (j->write_buffer_rp[cnt] == 0 &&
3570 j->write_buffer_rp[cnt + 1] == 0 &&
3571 j->write_buffer_rp[cnt + 2] == 0 &&
3572 j->write_buffer_rp[cnt + 3] == 0 &&
3573 j->write_buffer_rp[cnt + 4] == 0 &&
3574 j->write_buffer_rp[cnt + 5] == 0 &&
3575 j->write_buffer_rp[cnt + 6] == 0 &&
3576 j->write_buffer_rp[cnt + 7] == 0 &&
3577 j->write_buffer_rp[cnt + 8] == 0 &&
3578 j->write_buffer_rp[cnt + 9] == 0) {
3579 /* someone is trying to write silence lets make this a type 0 frame. */
3580 outb_p(0x00, j->DSPbase + 0x0C);
3581 outb_p(0x00, j->DSPbase + 0x0D);
3583 /* so all other frames are type 1. */
3584 outb_p(0x01, j->DSPbase + 0x0C);
3585 outb_p(0x00, j->DSPbase + 0x0D);
3588 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3589 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3590 *(j->write_buffer_rp + cnt) = 0;
3591 *(j->write_buffer_rp + cnt + 1) = 0;
3593 j->write_buffer_rp += j->play_frame_size * 2;
3594 if (j->write_buffer_rp >= j->write_buffer_end) {
3595 j->write_buffer_rp = j->write_buffer;
3597 j->write_buffers_empty++;
3598 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3600 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3607 if(j->ixj_signals[SIG_WRITE_READY]) {
3608 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3612 static int idle(IXJ *j)
3614 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3618 if (j->ssr.high || j->ssr.low) {
3622 j->flags.playing = 0;
3624 j->flags.recording = 0;
3629 static int set_base_frame(IXJ *j, int size)
3635 j->cid_play_aec_level = j->aec_level;
3637 for (cnt = 0; cnt < 10; cnt++) {
3641 if (j->ssr.high || j->ssr.low)
3643 if (j->dsp.low != 0x20) {
3647 /* Set Base Frame Size to 240 pg9-10 8021 */
3651 /* Set Base Frame Size to 160 pg9-10 8021 */
3655 /* Set Base Frame Size to 80 pg9-10 8021 */
3666 if (ixj_WriteDSPCommand(cmd, j)) {
3667 j->baseframe.high = j->baseframe.low = 0xFF;
3670 j->baseframe.high = j->ssr.high;
3671 j->baseframe.low = j->ssr.low;
3672 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3673 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3677 ixj_aec_start(j, j->cid_play_aec_level);
3681 static int set_rec_codec(IXJ *j, int rate)
3685 j->rec_codec = rate;
3689 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3690 j->rec_frame_size = 12;
3697 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3698 j->rec_frame_size = 10;
3705 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3706 j->rec_frame_size = 16;
3713 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3714 j->rec_frame_size = 9;
3721 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3722 j->rec_frame_size = 8;
3729 if (j->dsp.low != 0x20) {
3730 j->rec_frame_size = 48;
3737 if (j->dsp.low != 0x20) {
3738 if (!j->flags.g729_loaded) {
3742 switch (j->baseframe.low) {
3744 j->rec_frame_size = 10;
3747 j->rec_frame_size = 5;
3750 j->rec_frame_size = 15;
3759 if (j->dsp.low != 0x20) {
3760 if (!j->flags.g729_loaded) {
3764 switch (j->baseframe.low) {
3766 j->rec_frame_size = 12;
3769 j->rec_frame_size = 6;
3772 j->rec_frame_size = 18;
3781 switch (j->baseframe.low) {
3783 j->rec_frame_size = 80;
3786 j->rec_frame_size = 40;
3789 j->rec_frame_size = 120;
3795 switch (j->baseframe.low) {
3797 j->rec_frame_size = 80;
3800 j->rec_frame_size = 40;
3803 j->rec_frame_size = 120;
3809 switch (j->baseframe.low) {
3811 j->rec_frame_size = 160;
3814 j->rec_frame_size = 80;
3817 j->rec_frame_size = 240;
3823 switch (j->baseframe.low) {
3825 j->rec_frame_size = 80;
3828 j->rec_frame_size = 40;
3831 j->rec_frame_size = 120;
3837 switch (j->baseframe.low) {
3839 j->rec_frame_size = 80;
3842 j->rec_frame_size = 40;
3845 j->rec_frame_size = 120;
3851 kfree(j->read_buffer);
3852 j->rec_frame_size = 0;
3854 j->read_buffer = NULL;
3855 j->read_buffer_size = 0;
3862 static int ixj_record_start(IXJ *j)
3864 unsigned short cmd = 0x0000;
3866 if (j->read_buffer) {
3869 j->flags.recording = 1;
3870 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3872 if(ixjdebug & 0x0002)
3873 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3876 switch (j->rec_codec) {
3884 cmd = 0x5130; /* TrueSpeech 8.5 */
3888 cmd = 0x5133; /* TrueSpeech 4.8 */
3892 cmd = 0x5134; /* TrueSpeech 4.1 */
3905 if (ixj_WriteDSPCommand(cmd, j))
3908 if (!j->read_buffer) {
3909 if (!j->read_buffer)
3910 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3911 if (!j->read_buffer) {
3912 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3916 j->read_buffer_size = j->rec_frame_size * 2;
3918 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3922 switch (j->rec_mode) {
3924 cmd = 0x1C03; /* Record C1 */
3928 if (j->ver.low == 0x12) {
3929 cmd = 0x1E03; /* Record C1 */
3932 cmd = 0x1E01; /* Record C1 */
3937 if (j->ver.low == 0x12) {
3938 cmd = 0x1E83; /* Record C1 */
3941 cmd = 0x1E81; /* Record C1 */
3946 if (j->ver.low == 0x12) {
3947 cmd = 0x1F03; /* Record C1 */
3950 cmd = 0x1F01; /* Record C1 */
3955 if (j->ver.low == 0x12) {
3956 cmd = 0x1F83; /* Record C1 */
3958 cmd = 0x1F81; /* Record C1 */
3962 if (ixj_WriteDSPCommand(cmd, j))
3965 if (j->flags.playing) {
3966 ixj_aec_start(j, j->aec_level);
3971 static void ixj_record_stop(IXJ *j)
3973 if (ixjdebug & 0x0002)
3974 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3976 kfree(j->read_buffer);
3977 j->read_buffer = NULL;
3978 j->read_buffer_size = 0;
3979 if (j->rec_mode > -1) {
3980 ixj_WriteDSPCommand(0x5120, j);
3983 j->flags.recording = 0;
3985 static void ixj_vad(IXJ *j, int arg)
3988 ixj_WriteDSPCommand(0x513F, j);
3990 ixj_WriteDSPCommand(0x513E, j);
3993 static void set_rec_depth(IXJ *j, int depth)
3999 ixj_WriteDSPCommand(0x5180 + depth, j);
4002 static void set_dtmf_prescale(IXJ *j, int volume)
4004 ixj_WriteDSPCommand(0xCF07, j);
4005 ixj_WriteDSPCommand(volume, j);
4008 static int get_dtmf_prescale(IXJ *j)
4010 ixj_WriteDSPCommand(0xCF05, j);
4011 return j->ssr.high << 8 | j->ssr.low;
4014 static void set_rec_volume(IXJ *j, int volume)
4016 if(j->aec_level == AEC_AGC) {
4017 if (ixjdebug & 0x0002)
4018 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4019 ixj_WriteDSPCommand(0xCF96, j);
4020 ixj_WriteDSPCommand(volume, j);
4022 if (ixjdebug & 0x0002)
4023 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4024 ixj_WriteDSPCommand(0xCF03, j);
4025 ixj_WriteDSPCommand(volume, j);
4029 static int set_rec_volume_linear(IXJ *j, int volume)
4031 int newvolume, dsprecmax;
4033 if (ixjdebug & 0x0002)
4034 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4035 if(volume > 100 || volume < 0) {
4039 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4040 switch (j->cardtype) {
4046 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4047 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4048 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4050 case QTI_PHONEJACK_LITE:
4053 case QTI_PHONEJACK_PCI:
4062 newvolume = (dsprecmax * volume) / 100;
4063 set_rec_volume(j, newvolume);
4067 static int get_rec_volume(IXJ *j)
4069 if(j->aec_level == AEC_AGC) {
4070 if (ixjdebug & 0x0002)
4071 printk(KERN_INFO "Getting AGC Threshold\n");
4072 ixj_WriteDSPCommand(0xCF86, j);
4073 if (ixjdebug & 0x0002)
4074 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4075 return j->ssr.high << 8 | j->ssr.low;
4077 if (ixjdebug & 0x0002)
4078 printk(KERN_INFO "Getting Record Volume\n");
4079 ixj_WriteDSPCommand(0xCF01, j);
4080 return j->ssr.high << 8 | j->ssr.low;
4084 static int get_rec_volume_linear(IXJ *j)
4086 int volume, newvolume, dsprecmax;
4088 switch (j->cardtype) {
4095 case QTI_PHONEJACK_LITE:
4098 case QTI_PHONEJACK_PCI:
4107 volume = get_rec_volume(j);
4108 newvolume = (volume * 100) / dsprecmax;
4114 static int get_rec_level(IXJ *j)
4118 ixj_WriteDSPCommand(0xCF88, j);
4120 retval = j->ssr.high << 8 | j->ssr.low;
4121 retval = (retval * 256) / 240;
4125 static void ixj_aec_start(IXJ *j, int level)
4127 j->aec_level = level;
4128 if (ixjdebug & 0x0002)
4129 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4133 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4134 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4136 ixj_WriteDSPCommand(0x0300, j);
4138 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4140 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4144 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4146 ixj_WriteDSPCommand(0xE011, j);
4147 ixj_WriteDSPCommand(0xFFFF, j);
4149 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4150 ixj_WriteDSPCommand(0x0000, j); /* to off */
4155 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4157 ixj_WriteDSPCommand(0xE011, j);
4158 ixj_WriteDSPCommand(0x0080, j);
4160 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4161 ixj_WriteDSPCommand(0x0000, j); /* to off */
4166 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4168 ixj_WriteDSPCommand(0xE011, j);
4169 ixj_WriteDSPCommand(0x0080, j);
4171 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4172 ixj_WriteDSPCommand(0x0000, j); /* to off */
4177 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4178 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4180 ixj_WriteDSPCommand(0xE011, j);
4181 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4183 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4185 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4186 ixj_WriteDSPCommand(0x0224, j);
4188 ixj_WriteDSPCommand(0x1224, j);
4190 ixj_WriteDSPCommand(0xE014, j);
4191 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4193 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4195 /* Now we can set the AGC initial parameters and turn it on */
4196 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4197 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4199 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4200 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4202 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4203 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4205 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4206 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4208 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4209 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4211 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4212 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4214 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4215 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4217 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4218 ixj_WriteDSPCommand(0x0001, j); /* to on */
4223 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4225 ixj_WriteDSPCommand(0xE011, j);
4226 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4228 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4230 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4231 ixj_WriteDSPCommand(0x0224, j);
4233 ixj_WriteDSPCommand(0x1224, j);
4235 ixj_WriteDSPCommand(0xE014, j);
4236 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4238 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4245 static void aec_stop(IXJ *j)
4247 j->aec_level = AEC_OFF;
4248 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4249 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4251 ixj_WriteDSPCommand(0x0700, j);
4253 if (j->play_mode != -1 && j->rec_mode != -1)
4255 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4259 static int set_play_codec(IXJ *j, int rate)
4263 j->play_codec = rate;
4267 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4268 j->play_frame_size = 12;
4275 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4276 j->play_frame_size = 10;
4283 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4284 j->play_frame_size = 16;
4291 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4292 j->play_frame_size = 9;
4299 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4300 j->play_frame_size = 8;
4307 if (j->dsp.low != 0x20) {
4308 j->play_frame_size = 48;
4315 if (j->dsp.low != 0x20) {
4316 if (!j->flags.g729_loaded) {
4320 switch (j->baseframe.low) {
4322 j->play_frame_size = 10;
4325 j->play_frame_size = 5;
4328 j->play_frame_size = 15;
4337 if (j->dsp.low != 0x20) {
4338 if (!j->flags.g729_loaded) {
4342 switch (j->baseframe.low) {
4344 j->play_frame_size = 12;
4347 j->play_frame_size = 6;
4350 j->play_frame_size = 18;
4359 switch (j->baseframe.low) {
4361 j->play_frame_size = 80;
4364 j->play_frame_size = 40;
4367 j->play_frame_size = 120;
4373 switch (j->baseframe.low) {
4375 j->play_frame_size = 80;
4378 j->play_frame_size = 40;
4381 j->play_frame_size = 120;
4387 switch (j->baseframe.low) {
4389 j->play_frame_size = 160;
4392 j->play_frame_size = 80;
4395 j->play_frame_size = 240;
4401 switch (j->baseframe.low) {
4403 j->play_frame_size = 80;
4406 j->play_frame_size = 40;
4409 j->play_frame_size = 120;
4415 switch (j->baseframe.low) {
4417 j->play_frame_size = 80;
4420 j->play_frame_size = 40;
4423 j->play_frame_size = 120;
4429 kfree(j->write_buffer);
4430 j->play_frame_size = 0;
4432 j->write_buffer = NULL;
4433 j->write_buffer_size = 0;
4440 static int ixj_play_start(IXJ *j)
4442 unsigned short cmd = 0x0000;
4444 if (j->write_buffer) {
4448 if(ixjdebug & 0x0002)
4449 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4451 j->flags.playing = 1;
4452 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4454 j->flags.play_first_frame = 1;
4457 if (!j->play_mode) {
4458 switch (j->play_codec) {
4466 cmd = 0x5230; /* TrueSpeech 8.5 */
4470 cmd = 0x5233; /* TrueSpeech 4.8 */
4474 cmd = 0x5234; /* TrueSpeech 4.1 */
4487 if (ixj_WriteDSPCommand(cmd, j))
4490 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4491 if (!j->write_buffer) {
4492 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4495 /* j->write_buffers_empty = 2; */
4496 j->write_buffers_empty = 1;
4497 j->write_buffer_size = j->play_frame_size * 2;
4498 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4499 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4501 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4505 switch (j->play_mode) {
4510 if (j->ver.low == 0x12) {
4517 if (j->ver.low == 0x12) {
4524 if (j->ver.low == 0x12) {
4531 if (j->ver.low == 0x12) {
4538 if (ixj_WriteDSPCommand(cmd, j))
4541 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4544 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4547 if (j->flags.recording) {
4548 ixj_aec_start(j, j->aec_level);
4554 static void ixj_play_stop(IXJ *j)
4556 if (ixjdebug & 0x0002)
4557 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4559 kfree(j->write_buffer);
4560 j->write_buffer = NULL;
4561 j->write_buffer_size = 0;
4562 if (j->play_mode > -1) {
4563 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4567 j->flags.playing = 0;
4570 static inline int get_play_level(IXJ *j)
4574 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4575 return j->ssr.high << 8 | j->ssr.low;
4576 retval = j->ssr.high << 8 | j->ssr.low;
4577 retval = (retval * 256) / 240;
4581 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4583 unsigned int mask = 0;
4585 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4587 poll_wait(file_p, &(j->poll_q), wait);
4588 if (j->read_buffer_ready > 0)
4589 mask |= POLLIN | POLLRDNORM; /* readable */
4590 if (j->write_buffers_empty > 0)
4591 mask |= POLLOUT | POLLWRNORM; /* writable */
4597 static int ixj_play_tone(IXJ *j, char tone)
4599 if (!j->tone_state) {
4600 if(ixjdebug & 0x0002) {
4601 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4603 if (j->dsp.low == 0x20) {
4606 j->tone_start_jif = jiffies;
4611 j->tone_index = tone;
4612 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4618 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4620 j->tone_on_time = arg;
4622 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4626 if (ixj_WriteDSPCommand(arg, j))
4632 static int SCI_WaitHighSCI(IXJ *j)
4636 j->pld_scrr.byte = inb_p(j->XILINXbase);
4637 if (!j->pld_scrr.bits.sci) {
4638 for (cnt = 0; cnt < 10; cnt++) {
4640 j->pld_scrr.byte = inb_p(j->XILINXbase);
4642 if ((j->pld_scrr.bits.sci))
4645 if (ixjdebug & 0x0001)
4646 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4652 static int SCI_WaitLowSCI(IXJ *j)
4656 j->pld_scrr.byte = inb_p(j->XILINXbase);
4657 if (j->pld_scrr.bits.sci) {
4658 for (cnt = 0; cnt < 10; cnt++) {
4660 j->pld_scrr.byte = inb_p(j->XILINXbase);
4662 if (!(j->pld_scrr.bits.sci))
4665 if (ixjdebug & 0x0001)
4666 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4672 static int SCI_Control(IXJ *j, int control)
4676 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4678 j->pld_scrw.bits.c1 = 0; /* to no selection */
4681 case SCI_Enable_DAA:
4682 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4684 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4687 case SCI_Enable_Mixer:
4688 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4690 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4693 case SCI_Enable_EEPROM:
4694 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4696 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4703 outb_p(j->pld_scrw.byte, j->XILINXbase);
4709 case SCI_Enable_DAA:
4710 case SCI_Enable_Mixer:
4711 case SCI_Enable_EEPROM:
4712 if (!SCI_WaitHighSCI(j))
4722 static int SCI_Prepare(IXJ *j)
4724 if (!SCI_Control(j, SCI_End))
4727 if (!SCI_WaitLowSCI(j))
4733 static int ixj_get_mixer(long val, IXJ *j)
4735 int reg = (val & 0x1F00) >> 8;
4736 return j->mix.vol[reg];
4739 static int ixj_mixer(long val, IXJ *j)
4743 bytes.high = (val & 0x1F00) >> 8;
4744 bytes.low = val & 0x00FF;
4746 /* save mixer value so we can get back later on */
4747 j->mix.vol[bytes.high] = bytes.low;
4749 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4751 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4753 SCI_Control(j, SCI_Enable_Mixer);
4755 SCI_Control(j, SCI_End);
4760 static int daa_load(BYTES * p_bytes, IXJ *j)
4762 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4763 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4764 if (!SCI_Control(j, SCI_Enable_DAA))
4770 static int ixj_daa_cr4(IXJ *j, char reg)
4774 switch (j->daa_mode) {
4778 case SOP_PU_RINGING:
4781 case SOP_PU_CONVERSATION:
4784 case SOP_PU_PULSEDIALING:
4789 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4791 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4793 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4796 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4799 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4802 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4806 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4808 if (!daa_load(&bytes, j))
4811 if (!SCI_Prepare(j))
4817 static char daa_int_read(IXJ *j)
4821 if (!SCI_Prepare(j))
4826 outb_p(bytes.high, j->XILINXbase + 0x03);
4827 outb_p(bytes.low, j->XILINXbase + 0x02);
4829 if (!SCI_Control(j, SCI_Enable_DAA))
4832 bytes.high = inb_p(j->XILINXbase + 0x03);
4833 bytes.low = inb_p(j->XILINXbase + 0x02);
4834 if (bytes.low != ALISDAA_ID_BYTE) {
4835 if (ixjdebug & 0x0001)
4836 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4839 if (!SCI_Control(j, SCI_Enable_DAA))
4841 if (!SCI_Control(j, SCI_End))
4844 bytes.high = inb_p(j->XILINXbase + 0x03);
4845 bytes.low = inb_p(j->XILINXbase + 0x02);
4847 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4852 static char daa_CR_read(IXJ *j, int cr)
4857 if (!SCI_Prepare(j))
4860 switch (j->daa_mode) {
4862 bytes.high = 0x30 + cr;
4864 case SOP_PU_RINGING:
4865 bytes.high = 0x70 + cr;
4867 case SOP_PU_CONVERSATION:
4868 bytes.high = 0xB0 + cr;
4870 case SOP_PU_PULSEDIALING:
4871 bytes.high = 0xF0 + cr;
4877 outb_p(bytes.high, j->XILINXbase + 0x03);
4878 outb_p(bytes.low, j->XILINXbase + 0x02);
4880 if (!SCI_Control(j, SCI_Enable_DAA))
4883 bytes.high = inb_p(j->XILINXbase + 0x03);
4884 bytes.low = inb_p(j->XILINXbase + 0x02);
4885 if (bytes.low != ALISDAA_ID_BYTE) {
4886 if (ixjdebug & 0x0001)
4887 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4890 if (!SCI_Control(j, SCI_Enable_DAA))
4892 if (!SCI_Control(j, SCI_End))
4895 wdata.word = inw_p(j->XILINXbase + 0x02);
4899 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4902 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4905 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4911 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4922 static int ixj_daa_cid_reset(IXJ *j)
4927 if (ixjdebug & 0x0002)
4928 printk("DAA Clearing CID ram\n");
4930 if (!SCI_Prepare(j))
4935 outb_p(bytes.high, j->XILINXbase + 0x03);
4936 outb_p(bytes.low, j->XILINXbase + 0x02);
4938 if (!SCI_Control(j, SCI_Enable_DAA))
4941 if (!SCI_WaitHighSCI(j))
4944 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4945 bytes.high = bytes.low = 0x00;
4946 outb_p(bytes.high, j->XILINXbase + 0x03);
4948 if (i < ALISDAA_CALLERID_SIZE - 1)
4949 outb_p(bytes.low, j->XILINXbase + 0x02);
4951 if (!SCI_Control(j, SCI_Enable_DAA))
4954 if (!SCI_WaitHighSCI(j))
4959 if (!SCI_Control(j, SCI_End))
4962 if (ixjdebug & 0x0002)
4963 printk("DAA CID ram cleared\n");
4968 static int ixj_daa_cid_read(IXJ *j)
4972 char CID[ALISDAA_CALLERID_SIZE];
4976 if (!SCI_Prepare(j))
4981 outb_p(bytes.high, j->XILINXbase + 0x03);
4982 outb_p(bytes.low, j->XILINXbase + 0x02);
4984 if (!SCI_Control(j, SCI_Enable_DAA))
4987 if (!SCI_WaitHighSCI(j))
4990 bytes.high = inb_p(j->XILINXbase + 0x03);
4991 bytes.low = inb_p(j->XILINXbase + 0x02);
4992 if (bytes.low != ALISDAA_ID_BYTE) {
4993 if (ixjdebug & 0x0001)
4994 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4997 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
4998 bytes.high = bytes.low = 0x00;
4999 outb_p(bytes.high, j->XILINXbase + 0x03);
5000 outb_p(bytes.low, j->XILINXbase + 0x02);
5002 if (!SCI_Control(j, SCI_Enable_DAA))
5005 if (!SCI_WaitHighSCI(j))
5008 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5009 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5012 if (!SCI_Control(j, SCI_End))
5016 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5019 if ((pIn[1] & 0x03) == 0x01) {
5022 if ((pIn[2] & 0x0c) == 0x04) {
5023 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5025 if ((pIn[3] & 0x30) == 0x10) {
5026 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5028 if ((pIn[4] & 0xc0) == 0x40) {
5029 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5033 pIn += 5, pOut += 4;
5035 memset(&j->cid, 0, sizeof(PHONE_CID));
5036 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5038 strncpy(j->cid.month, pOut, 2);
5040 strncpy(j->cid.day, pOut, 2);
5042 strncpy(j->cid.hour, pOut, 2);
5044 strncpy(j->cid.min, pOut, 2);
5046 j->cid.numlen = *pOut;
5048 strncpy(j->cid.number, pOut, j->cid.numlen);
5049 pOut += j->cid.numlen + 1;
5050 j->cid.namelen = *pOut;
5052 strncpy(j->cid.name, pOut, j->cid.namelen);
5054 ixj_daa_cid_reset(j);
5058 static char daa_get_version(IXJ *j)
5062 if (!SCI_Prepare(j))
5067 outb_p(bytes.high, j->XILINXbase + 0x03);
5068 outb_p(bytes.low, j->XILINXbase + 0x02);
5070 if (!SCI_Control(j, SCI_Enable_DAA))
5073 bytes.high = inb_p(j->XILINXbase + 0x03);
5074 bytes.low = inb_p(j->XILINXbase + 0x02);
5075 if (bytes.low != ALISDAA_ID_BYTE) {
5076 if (ixjdebug & 0x0001)
5077 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5080 if (!SCI_Control(j, SCI_Enable_DAA))
5083 if (!SCI_Control(j, SCI_End))
5086 bytes.high = inb_p(j->XILINXbase + 0x03);
5087 bytes.low = inb_p(j->XILINXbase + 0x02);
5088 if (ixjdebug & 0x0002)
5089 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5090 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5094 static int daa_set_mode(IXJ *j, int mode)
5097 The DAA *MUST* be in the conversation mode if the
5098 PSTN line is to be seized (PSTN line off-hook).
5099 Taking the PSTN line off-hook while the DAA is in
5100 a mode other than conversation mode will cause a
5101 hardware failure of the ALIS-A part.
5104 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5105 if the PSTN line is on-hook. Failure to have the PSTN line
5106 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5112 j->flags.pstn_rmr = 0;
5114 if (!SCI_Prepare(j))
5119 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5121 outb_p(j->pld_scrw.byte, j->XILINXbase);
5122 j->pld_slicw.bits.rly2 = 0;
5123 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5125 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5126 daa_load(&bytes, j);
5127 if (!SCI_Prepare(j))
5130 j->daa_mode = SOP_PU_SLEEP;
5133 if(j->daa_mode == SOP_PU_SLEEP)
5137 if (ixjdebug & 0x0008)
5138 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5139 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5141 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5143 outb_p(j->pld_scrw.byte, j->XILINXbase);
5144 j->pld_slicw.bits.rly2 = 0;
5145 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5147 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5148 daa_load(&bytes, j);
5149 if (!SCI_Prepare(j))
5152 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5154 outb_p(j->pld_scrw.byte, j->XILINXbase);
5155 j->pld_slicw.bits.rly2 = 0;
5156 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5158 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5159 daa_load(&bytes, j);
5160 if (!SCI_Prepare(j))
5163 j->daa_mode = SOP_PU_SLEEP;
5164 j->flags.pstn_ringing = 0;
5165 j->ex.bits.pstn_ring = 0;
5166 j->pstn_sleeptil = jiffies + (hertz / 4);
5167 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5168 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5169 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5171 case SOP_PU_RINGING:
5172 if (ixjdebug & 0x0008)
5173 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5174 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5176 outb_p(j->pld_scrw.byte, j->XILINXbase);
5177 j->pld_slicw.bits.rly2 = 0;
5178 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5180 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5181 daa_load(&bytes, j);
5182 if (!SCI_Prepare(j))
5184 j->daa_mode = SOP_PU_RINGING;
5186 case SOP_PU_CONVERSATION:
5187 if (ixjdebug & 0x0008)
5188 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5190 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5191 daa_load(&bytes, j);
5192 if (!SCI_Prepare(j))
5194 j->pld_slicw.bits.rly2 = 1;
5195 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5196 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5198 outb_p(j->pld_scrw.byte, j->XILINXbase);
5199 j->daa_mode = SOP_PU_CONVERSATION;
5200 j->flags.pstn_ringing = 0;
5201 j->ex.bits.pstn_ring = 0;
5202 j->pstn_sleeptil = jiffies;
5203 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5205 case SOP_PU_PULSEDIALING:
5206 if (ixjdebug & 0x0008)
5207 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5208 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5210 outb_p(j->pld_scrw.byte, j->XILINXbase);
5211 j->pld_slicw.bits.rly2 = 0;
5212 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5214 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5215 daa_load(&bytes, j);
5216 if (!SCI_Prepare(j))
5218 j->daa_mode = SOP_PU_PULSEDIALING;
5226 static int ixj_daa_write(IXJ *j)
5230 j->flags.pstncheck = 1;
5232 daa_set_mode(j, SOP_PU_SLEEP);
5234 if (!SCI_Prepare(j))
5237 outb_p(j->pld_scrw.byte, j->XILINXbase);
5240 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5241 if (!daa_load(&bytes, j))
5244 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5245 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5246 if (!daa_load(&bytes, j))
5249 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5250 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5251 if (!daa_load(&bytes, j))
5254 if (!SCI_Prepare(j))
5258 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5259 if (!daa_load(&bytes, j))
5262 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5263 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5264 if (!daa_load(&bytes, j))
5267 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5268 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5269 if (!daa_load(&bytes, j))
5272 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5273 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5274 if (!daa_load(&bytes, j))
5277 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5279 if (!daa_load(&bytes, j))
5282 if (!SCI_Prepare(j))
5286 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5287 if (!daa_load(&bytes, j))
5290 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5291 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5292 if (!daa_load(&bytes, j))
5295 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5296 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5297 if (!daa_load(&bytes, j))
5300 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5301 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5302 if (!daa_load(&bytes, j))
5305 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5307 if (!daa_load(&bytes, j))
5310 if (!SCI_Control(j, SCI_End))
5312 if (!SCI_WaitLowSCI(j))
5316 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5317 if (!daa_load(&bytes, j))
5320 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5321 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5322 if (!daa_load(&bytes, j))
5325 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5326 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5327 if (!daa_load(&bytes, j))
5330 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5331 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5332 if (!daa_load(&bytes, j))
5335 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5337 if (!daa_load(&bytes, j))
5340 if (!SCI_Control(j, SCI_End))
5342 if (!SCI_WaitLowSCI(j))
5346 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5347 if (!daa_load(&bytes, j))
5350 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5351 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5352 if (!daa_load(&bytes, j))
5355 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5356 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5357 if (!daa_load(&bytes, j))
5360 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5361 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5362 if (!daa_load(&bytes, j))
5365 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5367 if (!daa_load(&bytes, j))
5370 if (!SCI_Control(j, SCI_End))
5372 if (!SCI_WaitLowSCI(j))
5376 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5377 if (!daa_load(&bytes, j))
5380 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5381 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5382 if (!daa_load(&bytes, j))
5385 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5386 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5387 if (!daa_load(&bytes, j))
5390 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5391 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5392 if (!daa_load(&bytes, j))
5395 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5397 if (!daa_load(&bytes, j))
5400 if (!SCI_Control(j, SCI_End))
5402 if (!SCI_WaitLowSCI(j))
5406 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5407 if (!daa_load(&bytes, j))
5410 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5411 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5412 if (!daa_load(&bytes, j))
5415 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5416 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5417 if (!daa_load(&bytes, j))
5420 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5421 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5422 if (!daa_load(&bytes, j))
5425 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5427 if (!daa_load(&bytes, j))
5430 if (!SCI_Control(j, SCI_End))
5432 if (!SCI_WaitLowSCI(j))
5436 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5437 if (!daa_load(&bytes, j))
5440 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5441 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5442 if (!daa_load(&bytes, j))
5445 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5446 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5447 if (!daa_load(&bytes, j))
5450 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5451 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5452 if (!daa_load(&bytes, j))
5455 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5457 if (!daa_load(&bytes, j))
5460 if (!SCI_Control(j, SCI_End))
5462 if (!SCI_WaitLowSCI(j))
5466 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5467 if (!daa_load(&bytes, j))
5470 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5471 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5472 if (!daa_load(&bytes, j))
5475 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5476 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5477 if (!daa_load(&bytes, j))
5480 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5481 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5482 if (!daa_load(&bytes, j))
5485 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5487 if (!daa_load(&bytes, j))
5490 if (!SCI_Control(j, SCI_End))
5492 if (!SCI_WaitLowSCI(j))
5496 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5497 if (!daa_load(&bytes, j))
5500 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5501 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5502 if (!daa_load(&bytes, j))
5505 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5506 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5507 if (!daa_load(&bytes, j))
5510 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5511 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5512 if (!daa_load(&bytes, j))
5515 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5517 if (!daa_load(&bytes, j))
5520 if (!SCI_Control(j, SCI_End))
5522 if (!SCI_WaitLowSCI(j))
5526 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5527 if (!daa_load(&bytes, j))
5530 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5531 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5532 if (!daa_load(&bytes, j))
5535 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5536 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5537 if (!daa_load(&bytes, j))
5540 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5541 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5542 if (!daa_load(&bytes, j))
5545 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5547 if (!daa_load(&bytes, j))
5550 if (!SCI_Control(j, SCI_End))
5552 if (!SCI_WaitLowSCI(j))
5556 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5557 if (!daa_load(&bytes, j))
5560 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5561 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5562 if (!daa_load(&bytes, j))
5565 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5567 if (!daa_load(&bytes, j))
5570 if (!SCI_Control(j, SCI_End))
5572 if (!SCI_WaitLowSCI(j))
5576 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5577 if (!daa_load(&bytes, j))
5580 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5581 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5582 if (!daa_load(&bytes, j))
5585 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5587 if (!daa_load(&bytes, j))
5590 if (!SCI_Control(j, SCI_End))
5592 if (!SCI_WaitLowSCI(j))
5596 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5597 if (!daa_load(&bytes, j))
5600 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5601 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5602 if (!daa_load(&bytes, j))
5605 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5607 if (!daa_load(&bytes, j))
5610 if (!SCI_Control(j, SCI_End))
5612 if (!SCI_WaitLowSCI(j))
5616 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5617 if (!daa_load(&bytes, j))
5620 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5621 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5622 if (!daa_load(&bytes, j))
5625 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5627 if (!daa_load(&bytes, j))
5630 if (!SCI_Control(j, SCI_End))
5632 if (!SCI_WaitLowSCI(j))
5636 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5637 if (!daa_load(&bytes, j))
5640 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5641 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5642 if (!daa_load(&bytes, j))
5645 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5647 if (!daa_load(&bytes, j))
5650 if (!SCI_Control(j, SCI_End))
5652 if (!SCI_WaitLowSCI(j))
5656 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5657 if (!daa_load(&bytes, j))
5660 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5661 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5662 if (!daa_load(&bytes, j))
5665 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5666 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5667 if (!daa_load(&bytes, j))
5670 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5671 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5672 if (!daa_load(&bytes, j))
5675 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5677 if (!daa_load(&bytes, j))
5680 if (!SCI_Control(j, SCI_End))
5682 if (!SCI_WaitLowSCI(j))
5686 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5687 if (!daa_load(&bytes, j))
5690 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5691 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5692 if (!daa_load(&bytes, j))
5695 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5696 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5697 if (!daa_load(&bytes, j))
5700 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5701 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5702 if (!daa_load(&bytes, j))
5705 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5707 if (!daa_load(&bytes, j))
5711 j->pld_scrr.byte = inb_p(j->XILINXbase);
5712 if (!SCI_Control(j, SCI_End))
5715 outb_p(j->pld_scrw.byte, j->XILINXbase);
5717 if (ixjdebug & 0x0002)
5718 printk("DAA Coefficients Loaded\n");
5720 j->flags.pstncheck = 0;
5724 static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5726 j->tone_off_time = arg;
5727 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5730 if (ixj_WriteDSPCommand(arg, j))
5735 static int ixj_get_tone_on(IXJ *j)
5737 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5743 static int ixj_get_tone_off(IXJ *j)
5745 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5751 static void ixj_busytone(IXJ *j)
5753 j->flags.ringback = 0;
5754 j->flags.dialtone = 0;
5755 j->flags.busytone = 1;
5756 ixj_set_tone_on(0x07D0, j);
5757 ixj_set_tone_off(0x07D0, j);
5758 ixj_play_tone(j, 27);
5761 static void ixj_dialtone(IXJ *j)
5763 j->flags.ringback = 0;
5764 j->flags.dialtone = 1;
5765 j->flags.busytone = 0;
5766 if (j->dsp.low == 0x20) {
5769 ixj_set_tone_on(0xFFFF, j);
5770 ixj_set_tone_off(0x0000, j);
5771 ixj_play_tone(j, 25);
5775 static void ixj_cpt_stop(IXJ *j)
5777 if(j->tone_state || j->tone_cadence_state)
5779 j->flags.dialtone = 0;
5780 j->flags.busytone = 0;
5781 j->flags.ringback = 0;
5782 ixj_set_tone_on(0x0001, j);
5783 ixj_set_tone_off(0x0000, j);
5784 ixj_play_tone(j, 0);
5785 j->tone_state = j->tone_cadence_state = 0;
5787 kfree(j->cadence_t->ce);
5788 kfree(j->cadence_t);
5789 j->cadence_t = NULL;
5792 if (j->play_mode == -1 && j->rec_mode == -1)
5794 if (j->play_mode != -1 && j->dsp.low == 0x20)
5796 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5797 ixj_record_start(j);
5800 static void ixj_ringback(IXJ *j)
5802 j->flags.busytone = 0;
5803 j->flags.dialtone = 0;
5804 j->flags.ringback = 1;
5805 ixj_set_tone_on(0x0FA0, j);
5806 ixj_set_tone_off(0x2EE0, j);
5807 ixj_play_tone(j, 26);
5810 static void ixj_testram(IXJ *j)
5812 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5815 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5818 IXJ_CADENCE_ELEMENT __user *cep;
5819 IXJ_CADENCE_ELEMENT *lcep;
5823 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5828 if (copy_from_user(&lcp->elements_used,
5829 &cp->elements_used, sizeof(int)))
5831 if (copy_from_user(&lcp->termination,
5832 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5834 if (get_user(cep, &cp->ce))
5838 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5842 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5847 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5851 kfree(j->cadence_t->ce);
5852 kfree(j->cadence_t);
5854 lcp->ce = (void *) lcep;
5856 j->tone_cadence_state = 0;
5857 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5858 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5859 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5860 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5861 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5862 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5863 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5864 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5865 ixj_init_tone(j, &ti);
5867 ixj_play_tone(j, lcp->ce[0].index);
5876 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5878 IXJ_FILTER_CADENCE *lcp;
5879 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5881 if(ixjdebug & 0x0001) {
5882 printk(KERN_INFO "Could not allocate memory for cadence\n");
5886 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5887 if(ixjdebug & 0x0001) {
5888 printk(KERN_INFO "Could not copy cadence to kernel\n");
5893 if (lcp->filter > 5) {
5894 if(ixjdebug & 0x0001) {
5895 printk(KERN_INFO "Cadence out of range\n");
5900 j->cadence_f[lcp->filter].state = 0;
5901 j->cadence_f[lcp->filter].enable = lcp->enable;
5902 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5903 j->cadence_f[lcp->filter].on1 = lcp->on1;
5904 j->cadence_f[lcp->filter].on1min = 0;
5905 j->cadence_f[lcp->filter].on1max = 0;
5906 j->cadence_f[lcp->filter].off1 = lcp->off1;
5907 j->cadence_f[lcp->filter].off1min = 0;
5908 j->cadence_f[lcp->filter].off1max = 0;
5909 j->cadence_f[lcp->filter].on2 = lcp->on2;
5910 j->cadence_f[lcp->filter].on2min = 0;
5911 j->cadence_f[lcp->filter].on2max = 0;
5912 j->cadence_f[lcp->filter].off2 = lcp->off2;
5913 j->cadence_f[lcp->filter].off2min = 0;
5914 j->cadence_f[lcp->filter].off2max = 0;
5915 j->cadence_f[lcp->filter].on3 = lcp->on3;
5916 j->cadence_f[lcp->filter].on3min = 0;
5917 j->cadence_f[lcp->filter].on3max = 0;
5918 j->cadence_f[lcp->filter].off3 = lcp->off3;
5919 j->cadence_f[lcp->filter].off3min = 0;
5920 j->cadence_f[lcp->filter].off3max = 0;
5921 if(ixjdebug & 0x0002) {
5922 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5928 static void add_caps(IXJ *j)
5931 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5932 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5933 j->caplist[j->caps].captype = vendor;
5934 j->caplist[j->caps].handle = j->caps++;
5935 j->caplist[j->caps].captype = device;
5936 switch (j->cardtype) {
5938 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5941 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5943 case QTI_PHONEJACK_LITE:
5944 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5946 case QTI_PHONEJACK_PCI:
5947 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5950 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5953 j->caplist[j->caps].cap = j->cardtype;
5954 j->caplist[j->caps].handle = j->caps++;
5955 strcpy(j->caplist[j->caps].desc, "POTS");
5956 j->caplist[j->caps].captype = port;
5957 j->caplist[j->caps].cap = pots;
5958 j->caplist[j->caps].handle = j->caps++;
5960 /* add devices that can do speaker/mic */
5961 switch (j->cardtype) {
5964 case QTI_PHONEJACK_PCI:
5966 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5967 j->caplist[j->caps].captype = port;
5968 j->caplist[j->caps].cap = speaker;
5969 j->caplist[j->caps].handle = j->caps++;
5974 /* add devices that can do handset */
5975 switch (j->cardtype) {
5977 strcpy(j->caplist[j->caps].desc, "HANDSET");
5978 j->caplist[j->caps].captype = port;
5979 j->caplist[j->caps].cap = handset;
5980 j->caplist[j->caps].handle = j->caps++;
5986 /* add devices that can do PSTN */
5987 switch (j->cardtype) {
5989 strcpy(j->caplist[j->caps].desc, "PSTN");
5990 j->caplist[j->caps].captype = port;
5991 j->caplist[j->caps].cap = pstn;
5992 j->caplist[j->caps].handle = j->caps++;
5998 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
5999 strcpy(j->caplist[j->caps].desc, "ULAW");
6000 j->caplist[j->caps].captype = codec;
6001 j->caplist[j->caps].cap = ULAW;
6002 j->caplist[j->caps].handle = j->caps++;
6004 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6005 j->caplist[j->caps].captype = codec;
6006 j->caplist[j->caps].cap = LINEAR16;
6007 j->caplist[j->caps].handle = j->caps++;
6009 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6010 j->caplist[j->caps].captype = codec;
6011 j->caplist[j->caps].cap = LINEAR8;
6012 j->caplist[j->caps].handle = j->caps++;
6014 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6015 j->caplist[j->caps].captype = codec;
6016 j->caplist[j->caps].cap = WSS;
6017 j->caplist[j->caps].handle = j->caps++;
6019 /* software ALAW codec, made from ULAW */
6020 strcpy(j->caplist[j->caps].desc, "ALAW");
6021 j->caplist[j->caps].captype = codec;
6022 j->caplist[j->caps].cap = ALAW;
6023 j->caplist[j->caps].handle = j->caps++;
6025 /* version 12 of the 8020 does the following codecs in a broken way */
6026 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6027 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6028 j->caplist[j->caps].captype = codec;
6029 j->caplist[j->caps].cap = G723_63;
6030 j->caplist[j->caps].handle = j->caps++;
6032 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6033 j->caplist[j->caps].captype = codec;
6034 j->caplist[j->caps].cap = G723_53;
6035 j->caplist[j->caps].handle = j->caps++;
6037 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6038 j->caplist[j->caps].captype = codec;
6039 j->caplist[j->caps].cap = TS48;
6040 j->caplist[j->caps].handle = j->caps++;
6042 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6043 j->caplist[j->caps].captype = codec;
6044 j->caplist[j->caps].cap = TS41;
6045 j->caplist[j->caps].handle = j->caps++;
6048 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6049 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6050 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6051 j->caplist[j->caps].captype = codec;
6052 j->caplist[j->caps].cap = TS85;
6053 j->caplist[j->caps].handle = j->caps++;
6056 /* 8021 chips can do G728 */
6057 if (j->dsp.low == 0x21) {
6058 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6059 j->caplist[j->caps].captype = codec;
6060 j->caplist[j->caps].cap = G728;
6061 j->caplist[j->caps].handle = j->caps++;
6064 /* 8021/8022 chips can do G729 if loaded */
6065 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6066 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6067 j->caplist[j->caps].captype = codec;
6068 j->caplist[j->caps].cap = G729;
6069 j->caplist[j->caps].handle = j->caps++;
6071 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6072 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6073 j->caplist[j->caps].captype = codec;
6074 j->caplist[j->caps].cap = G729B;
6075 j->caplist[j->caps].handle = j->caps++;
6079 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6083 for (cnt = 0; cnt < j->caps; cnt++) {
6084 if (pcreq->captype == j->caplist[cnt].captype
6085 && pcreq->cap == j->caplist[cnt].cap) {
6093 static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6098 void __user *argp = (void __user *)arg;
6100 unsigned int raise, mant;
6101 unsigned int minor = iminor(inode);
6102 int board = NUM(inode);
6104 IXJ *j = get_ixj(NUM(inode));
6109 * Set up locks to ensure that only one process is talking to the DSP at a time.
6110 * This is necessary to keep the DSP from locking up.
6112 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6113 schedule_timeout_interruptible(1);
6114 if (ixjdebug & 0x0040)
6115 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6116 if (minor >= IXJMAX) {
6117 clear_bit(board, &j->busyflags);
6121 * Check ioctls only root can use.
6123 if (!capable(CAP_SYS_ADMIN)) {
6125 case IXJCTL_TESTRAM:
6131 case IXJCTL_TESTRAM:
6133 retval = (j->ssr.high << 8) + j->ssr.low;
6135 case IXJCTL_CARDTYPE:
6136 retval = j->cardtype;
6141 case IXJCTL_VERSION:
6144 snprintf(arg_str, sizeof(arg_str),
6145 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6146 IXJ_VER_MINOR, IXJ_BLD_VER);
6147 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6151 case PHONE_RING_CADENCE:
6152 j->ring_cadence = arg;
6156 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6161 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6165 /* Binary compatbility */
6166 case OLD_PHONE_RING_START:
6169 case PHONE_RING_START:
6171 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6177 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6181 case PHONE_RING_STOP:
6182 j->flags.cringing = 0;
6183 if(j->cadence_f[5].enable) {
6184 j->cadence_f[5].state = 0;
6189 retval = ixj_ring(j);
6191 case PHONE_EXCEPTION:
6192 retval = j->ex.bytes;
6193 if(j->ex.bits.flash) {
6195 j->ex.bits.flash = 0;
6197 j->ex.bits.pstn_ring = 0;
6198 j->ex.bits.caller_id = 0;
6199 j->ex.bits.pstn_wink = 0;
6208 j->ex.bits.reserved = 0;
6210 case PHONE_HOOKSTATE:
6211 j->ex.bits.hookstate = 0;
6212 retval = j->hookstate; //j->r_hook;
6214 case IXJCTL_SET_LED:
6215 LED_SetState(arg, j);
6218 retval = set_base_frame(j, arg);
6220 case PHONE_REC_CODEC:
6221 retval = set_rec_codec(j, arg);
6226 case PHONE_REC_START:
6227 ixj_record_start(j);
6229 case PHONE_REC_STOP:
6232 case PHONE_REC_DEPTH:
6233 set_rec_depth(j, arg);
6235 case PHONE_REC_VOLUME:
6237 retval = get_rec_volume(j);
6240 set_rec_volume(j, arg);
6244 case PHONE_REC_VOLUME_LINEAR:
6246 retval = get_rec_volume_linear(j);
6249 set_rec_volume_linear(j, arg);
6253 case IXJCTL_DTMF_PRESCALE:
6255 retval = get_dtmf_prescale(j);
6258 set_dtmf_prescale(j, arg);
6262 case PHONE_REC_LEVEL:
6263 retval = get_rec_level(j);
6266 retval = ixj_siadc(j, arg);
6269 retval = ixj_sidac(j, arg);
6271 case IXJCTL_AEC_START:
6272 ixj_aec_start(j, arg);
6274 case IXJCTL_AEC_STOP:
6277 case IXJCTL_AEC_GET_LEVEL:
6278 retval = j->aec_level;
6280 case PHONE_PLAY_CODEC:
6281 retval = set_play_codec(j, arg);
6283 case PHONE_PLAY_START:
6284 retval = ixj_play_start(j);
6286 case PHONE_PLAY_STOP:
6289 case PHONE_PLAY_DEPTH:
6290 set_play_depth(j, arg);
6292 case PHONE_PLAY_VOLUME:
6294 retval = get_play_volume(j);
6297 set_play_volume(j, arg);
6301 case PHONE_PLAY_VOLUME_LINEAR:
6303 retval = get_play_volume_linear(j);
6306 set_play_volume_linear(j, arg);
6310 case PHONE_PLAY_LEVEL:
6311 retval = get_play_level(j);
6313 case IXJCTL_DSP_TYPE:
6314 retval = (j->dsp.high << 8) + j->dsp.low;
6316 case IXJCTL_DSP_VERSION:
6317 retval = (j->ver.high << 8) + j->ver.low;
6328 case IXJCTL_DRYBUFFER_READ:
6329 put_user(j->drybuffer, (unsigned long __user *) argp);
6331 case IXJCTL_DRYBUFFER_CLEAR:
6334 case IXJCTL_FRAMES_READ:
6335 put_user(j->framesread, (unsigned long __user *) argp);
6337 case IXJCTL_FRAMES_WRITTEN:
6338 put_user(j->frameswritten, (unsigned long __user *) argp);
6340 case IXJCTL_READ_WAIT:
6341 put_user(j->read_wait, (unsigned long __user *) argp);
6343 case IXJCTL_WRITE_WAIT:
6344 put_user(j->write_wait, (unsigned long __user *) argp);
6346 case PHONE_MAXRINGS:
6349 case PHONE_SET_TONE_ON_TIME:
6350 ixj_set_tone_on(arg, j);
6352 case PHONE_SET_TONE_OFF_TIME:
6353 ixj_set_tone_off(arg, j);
6355 case PHONE_GET_TONE_ON_TIME:
6356 if (ixj_get_tone_on(j)) {
6359 retval = (j->ssr.high << 8) + j->ssr.low;
6362 case PHONE_GET_TONE_OFF_TIME:
6363 if (ixj_get_tone_off(j)) {
6366 retval = (j->ssr.high << 8) + j->ssr.low;
6369 case PHONE_PLAY_TONE:
6371 retval = ixj_play_tone(j, arg);
6375 case PHONE_GET_TONE_STATE:
6376 retval = j->tone_state;
6378 case PHONE_DTMF_READY:
6379 retval = j->ex.bits.dtmf_ready;
6381 case PHONE_GET_DTMF:
6382 if (ixj_hookstate(j)) {
6383 if (j->dtmf_rp != j->dtmf_wp) {
6384 retval = j->dtmfbuffer[j->dtmf_rp];
6386 if (j->dtmf_rp == 79)
6388 if (j->dtmf_rp == j->dtmf_wp) {
6389 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6394 case PHONE_GET_DTMF_ASCII:
6395 if (ixj_hookstate(j)) {
6396 if (j->dtmf_rp != j->dtmf_wp) {
6397 switch (j->dtmfbuffer[j->dtmf_rp]) {
6399 retval = 42; /* '*'; */
6403 retval = 48; /*'0'; */
6407 retval = 35; /*'#'; */
6411 retval = 65; /*'A'; */
6415 retval = 66; /*'B'; */
6419 retval = 67; /*'C'; */
6423 retval = 68; /*'D'; */
6427 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6431 if (j->dtmf_rp == 79)
6433 if(j->dtmf_rp == j->dtmf_wp)
6435 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6440 case PHONE_DTMF_OOB:
6441 j->flags.dtmf_oob = arg;
6443 case PHONE_DIALTONE:
6449 case PHONE_RINGBACK:
6453 if(j->cardtype == QTI_PHONEJACK)
6456 retval = ixj_wink(j);
6458 case PHONE_CPT_STOP:
6461 case PHONE_QUERY_CODEC:
6463 struct phone_codec_data pd;
6465 int proto_size[] = {
6467 12, 10, 16, 9, 8, 48, 5,
6468 40, 40, 80, 40, 40, 6
6470 if(copy_from_user(&pd, argp, sizeof(pd))) {
6474 if(pd.type<1 || pd.type>13) {
6475 retval = -EPROTONOSUPPORT;
6479 val=proto_size[pd.type];
6480 else switch(j->baseframe.low)
6482 case 0xA0:val=2*proto_size[pd.type];break;
6483 case 0x50:val=proto_size[pd.type];break;
6484 default:val=proto_size[pd.type]*3;break;
6486 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6487 if(copy_to_user(argp, &pd, sizeof(pd)))
6491 case IXJCTL_DSP_IDLE:
6495 if ((arg & 0xff) == 0xff)
6496 retval = ixj_get_mixer(arg, j);
6500 case IXJCTL_DAA_COEFF_SET:
6504 retval = ixj_daa_write(j);
6508 retval = ixj_daa_write(j);
6511 DAA_Coeff_France(j);
6512 retval = ixj_daa_write(j);
6515 DAA_Coeff_Germany(j);
6516 retval = ixj_daa_write(j);
6519 DAA_Coeff_Australia(j);
6520 retval = ixj_daa_write(j);
6524 retval = ixj_daa_write(j);
6531 case IXJCTL_DAA_AGAIN:
6532 ixj_daa_cr4(j, arg | 0x02);
6534 case IXJCTL_PSTN_LINETEST:
6535 retval = ixj_linetest(j);
6538 ixj_write_vmwi(j, arg);
6541 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6543 j->ex.bits.caller_id = 0;
6545 case IXJCTL_WINK_DURATION:
6550 retval = ixj_set_port(j, arg);
6554 case IXJCTL_POTS_PSTN:
6555 retval = ixj_set_pots(j, arg);
6557 case PHONE_CAPABILITIES:
6561 case PHONE_CAPABILITIES_LIST:
6563 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6566 case PHONE_CAPABILITIES_CHECK:
6568 struct phone_capability cap;
6569 if (copy_from_user(&cap, argp, sizeof(cap)))
6573 retval = capabilities_check(j, &cap);
6577 case PHONE_PSTN_SET_STATE:
6578 daa_set_mode(j, arg);
6580 case PHONE_PSTN_GET_STATE:
6581 retval = j->daa_mode;
6582 j->ex.bits.pstn_ring = 0;
6584 case IXJCTL_SET_FILTER:
6585 if (copy_from_user(&jf, argp, sizeof(jf)))
6587 retval = ixj_init_filter(j, &jf);
6589 case IXJCTL_SET_FILTER_RAW:
6590 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6593 retval = ixj_init_filter_raw(j, &jfr);
6595 case IXJCTL_GET_FILTER_HIST:
6599 retval = j->filter_hist[arg];
6601 case IXJCTL_INIT_TONE:
6602 if (copy_from_user(&ti, argp, sizeof(ti)))
6605 retval = ixj_init_tone(j, &ti);
6607 case IXJCTL_TONE_CADENCE:
6608 retval = ixj_build_cadence(j, argp);
6610 case IXJCTL_FILTER_CADENCE:
6611 retval = ixj_build_filter_cadence(j, argp);
6614 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6618 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6619 if(j->sigdef.event < 33) {
6621 for(mant = 0; mant < j->sigdef.event; mant++){
6624 if(j->sigdef.signal)
6625 j->ex_sig.bytes |= raise;
6627 j->ex_sig.bytes &= (raise^0xffff);
6630 case IXJCTL_INTERCOM_STOP:
6631 if(arg < 0 || arg >= IXJMAX)
6637 get_ixj(arg)->intercom = -1;
6638 ixj_record_stop(get_ixj(arg));
6639 ixj_play_stop(get_ixj(arg));
6642 case IXJCTL_INTERCOM_START:
6643 if(arg < 0 || arg >= IXJMAX)
6646 ixj_record_start(j);
6648 get_ixj(arg)->intercom = board;
6649 ixj_play_start(get_ixj(arg));
6650 ixj_record_start(get_ixj(arg));
6653 if (ixjdebug & 0x0040)
6654 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6655 clear_bit(board, &j->busyflags);
6659 static int ixj_fasync(int fd, struct file *file_p, int mode)
6661 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6663 return fasync_helper(fd, file_p, mode, &j->async_queue);
6666 static struct file_operations ixj_fops =
6668 .owner = THIS_MODULE,
6669 .read = ixj_enhanced_read,
6670 .write = ixj_enhanced_write,
6673 .release = ixj_release,
6674 .fasync = ixj_fasync
6677 static int ixj_linetest(IXJ *j)
6679 j->flags.pstncheck = 1; /* Testing */
6680 j->flags.pstn_present = 0; /* Assume the line is not there */
6682 daa_int_read(j); /*Clear DAA Interrupt flags */
6684 /* Hold all relays in the normally de-energized position. */
6687 j->pld_slicw.bits.rly1 = 0;
6688 j->pld_slicw.bits.rly2 = 0;
6689 j->pld_slicw.bits.rly3 = 0;
6690 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6691 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6693 outb_p(j->pld_scrw.byte, j->XILINXbase);
6694 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6695 if (j->pld_slicr.bits.potspstn) {
6696 j->flags.pots_pstn = 1;
6697 j->flags.pots_correct = 0;
6698 LED_SetState(0x4, j);
6700 j->flags.pots_pstn = 0;
6701 j->pld_slicw.bits.rly1 = 0;
6702 j->pld_slicw.bits.rly2 = 0;
6703 j->pld_slicw.bits.rly3 = 1;
6704 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6705 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6707 outb_p(j->pld_scrw.byte, j->XILINXbase);
6708 daa_set_mode(j, SOP_PU_CONVERSATION);
6711 daa_set_mode(j, SOP_PU_RESET);
6712 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6713 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6714 LED_SetState(0x4, j);
6715 j->pld_slicw.bits.rly3 = 0;
6716 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6718 j->flags.pots_correct = 1;
6719 LED_SetState(0x8, j);
6720 j->pld_slicw.bits.rly1 = 1;
6721 j->pld_slicw.bits.rly2 = 0;
6722 j->pld_slicw.bits.rly3 = 0;
6723 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6726 j->pld_slicw.bits.rly3 = 0;
6727 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6728 daa_set_mode(j, SOP_PU_CONVERSATION);
6731 daa_set_mode(j, SOP_PU_RESET);
6732 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6733 j->pstn_sleeptil = jiffies + (hertz / 4);
6734 j->flags.pstn_present = 1;
6736 j->flags.pstn_present = 0;
6738 if (j->flags.pstn_present) {
6739 if (j->flags.pots_correct) {
6740 LED_SetState(0xA, j);
6742 LED_SetState(0x6, j);
6745 if (j->flags.pots_correct) {
6746 LED_SetState(0x9, j);
6748 LED_SetState(0x5, j);
6751 j->flags.pstncheck = 0; /* Testing */
6752 return j->flags.pstn_present;
6755 static int ixj_selfprobe(IXJ *j)
6761 init_waitqueue_head(&j->poll_q);
6762 init_waitqueue_head(&j->read_q);
6763 init_waitqueue_head(&j->write_q);
6765 while(atomic_read(&j->DSPWrite) > 0)
6766 atomic_dec(&j->DSPWrite);
6767 if (ixjdebug & 0x0002)
6768 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6769 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6771 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6773 /* The read values of the SSR should be 0x00 for the IDLE command */
6774 if (j->ssr.low || j->ssr.high)
6776 if (ixjdebug & 0x0002)
6777 printk(KERN_INFO "Get Device ID Code\n");
6778 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6780 j->dsp.low = j->ssr.low;
6781 j->dsp.high = j->ssr.high;
6782 if (ixjdebug & 0x0002)
6783 printk(KERN_INFO "Get Device Version Code\n");
6784 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6786 j->ver.low = j->ssr.low;
6787 j->ver.high = j->ssr.high;
6789 if (j->dsp.low == 0x21) {
6790 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6791 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6792 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6793 bytes.low = inb_p(j->XILINXbase + 0x02);
6794 if (bytes.low == bytes.high) /* Register is read only on */
6795 /* Internet PhoneJack Lite */
6797 j->cardtype = QTI_PHONEJACK_LITE;
6798 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6799 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6802 j->pld_slicw.pcib.e1 = 1;
6803 outb_p(j->pld_slicw.byte, j->XILINXbase);
6805 j->cardtype = QTI_LINEJACK;
6807 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6808 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6812 } else if (j->dsp.low == 0x22) {
6813 j->cardtype = QTI_PHONEJACK_PCI;
6814 request_region(j->XILINXbase, 4, "ixj control");
6815 j->pld_slicw.pcib.e1 = 1;
6816 outb_p(j->pld_slicw.byte, j->XILINXbase);
6818 j->cardtype = QTI_PHONEJACK;
6820 switch (j->cardtype) {
6822 if (!j->dsp.low != 0x20) {
6825 ixj_WriteDSPCommand(0x3800, j);
6826 j->ver.low = j->ssr.low;
6827 j->ver.high = j->ssr.high;
6831 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6832 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6836 case QTI_PHONEJACK_LITE:
6837 case QTI_PHONEJACK_PCI:
6838 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6839 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6842 j->pld_slicw.pcib.e1 = 1;
6843 outb_p(j->pld_slicw.byte, j->XILINXbase);
6849 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6850 if (ixjdebug & 0x0002)
6851 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6852 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6854 if (ixjdebug & 0x0002)
6855 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6856 if (j->cardtype == QTI_PHONEJACK) {
6861 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6864 if (set_base_frame(j, 30) != 30)
6866 if (ixjdebug & 0x0002)
6867 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6868 if (j->cardtype == QTI_PHONECARD) {
6869 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6872 if (j->cardtype == QTI_LINEJACK) {
6873 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6875 if (ixjdebug & 0x0002)
6876 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6877 j->pld_clock.byte = 0;
6878 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6882 if (j->dsp.low == 0x20) {
6883 if (ixjdebug & 0x0002)
6884 printk(KERN_INFO "Configure GPIO pins\n");
6885 j->gpio.bytes.high = 0x09;
6886 /* bytes.low = 0xEF; 0xF7 */
6887 j->gpio.bits.gpio1 = 1;
6888 j->gpio.bits.gpio2 = 1;
6889 j->gpio.bits.gpio3 = 0;
6890 j->gpio.bits.gpio4 = 1;
6891 j->gpio.bits.gpio5 = 1;
6892 j->gpio.bits.gpio6 = 1;
6893 j->gpio.bits.gpio7 = 1;
6894 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6895 if (ixjdebug & 0x0002)
6896 printk(KERN_INFO "Enable SLIC\n");
6897 j->gpio.bytes.high = 0x0B;
6898 j->gpio.bytes.low = 0x00;
6899 j->gpio.bits.gpio1 = 0;
6900 j->gpio.bits.gpio2 = 1;
6901 j->gpio.bits.gpio5 = 0;
6902 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6903 j->port = PORT_POTS;
6905 if (j->cardtype == QTI_LINEJACK) {
6906 LED_SetState(0x1, j);
6908 LED_SetState(0x2, j);
6910 LED_SetState(0x4, j);
6912 LED_SetState(0x8, j);
6914 LED_SetState(0x0, j);
6916 if (ixjdebug & 0x0002)
6917 printk("Loading DAA Coefficients\n");
6919 if (!ixj_daa_write(j)) {
6920 printk("DAA write failed on board %d\n", j->board);
6923 if(!ixj_daa_cid_reset(j)) {
6924 printk("DAA CID reset failed on board %d\n", j->board);
6927 j->flags.pots_correct = 0;
6928 j->flags.pstn_present = 0;
6930 if (j->flags.pots_correct) {
6931 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6933 outb_p(j->pld_scrw.byte, j->XILINXbase);
6934 j->pld_slicw.bits.rly1 = 1;
6935 j->pld_slicw.bits.spken = 1;
6936 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6937 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6938 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6939 j->port = PORT_POTS;
6941 ixj_set_port(j, PORT_PSTN);
6943 if (ixjdebug & 0x0002)
6944 printk(KERN_INFO "Enable Mixer\n");
6945 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
6946 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
6948 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
6949 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
6951 ixj_mixer(0x0480, j); /*FM Left mute */
6952 ixj_mixer(0x0580, j); /*FM Right mute */
6954 ixj_mixer(0x0680, j); /*CD Left mute */
6955 ixj_mixer(0x0780, j); /*CD Right mute */
6957 ixj_mixer(0x0880, j); /*Line Left mute */
6958 ixj_mixer(0x0980, j); /*Line Right mute */
6960 ixj_mixer(0x0A80, j); /*Aux left mute */
6961 ixj_mixer(0x0B80, j); /*Aux right mute */
6963 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
6964 ixj_mixer(0x0D80, j); /*Mono2 mute */
6966 ixj_mixer(0x0E80, j); /*Mic mute */
6968 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
6970 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
6971 ixj_mixer(0x110C, j);
6974 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
6975 ixj_mixer(0x1401, j);
6977 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
6978 ixj_mixer(0x1501, j);
6980 ixj_mixer(0x1700, j); /*Clock select */
6982 ixj_mixer(0x1800, j); /*ADC input from mixer */
6984 ixj_mixer(0x1901, j); /*Mic gain 30db */
6986 if (ixjdebug & 0x0002)
6987 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6988 j->cadence_f[4].state = 0;
6989 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
6990 j->cadence_f[4].off1 = 0;
6991 j->cadence_f[4].on2 = 0;
6992 j->cadence_f[4].off2 = 0;
6993 j->cadence_f[4].on3 = 0;
6994 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
6995 j->pstn_last_rmr = jiffies;
6998 if (j->cardtype == QTI_PHONECARD) {
6999 ixj_WriteDSPCommand(0xCF07, j);
7000 ixj_WriteDSPCommand(0x00B0, j);
7001 ixj_set_port(j, PORT_SPEAKER);
7003 ixj_set_port(j, PORT_POTS);
7004 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7005 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7011 j->framesread = j->frameswritten = 0;
7012 j->read_wait = j->write_wait = 0;
7013 j->rxreadycheck = j->txreadycheck = 0;
7015 /* initialise the DTMF prescale to a sensible value */
7016 if (j->cardtype == QTI_LINEJACK) {
7017 set_dtmf_prescale(j, 0x10);
7019 set_dtmf_prescale(j, 0x40);
7021 set_play_volume(j, 0x100);
7022 set_rec_volume(j, 0x100);
7024 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7026 /* The read values of the SSR should be 0x00 for the IDLE command */
7027 if (j->ssr.low || j->ssr.high)
7030 if (ixjdebug & 0x0002)
7031 printk(KERN_INFO "Enable Line Monitor\n");
7033 if (ixjdebug & 0x0002)
7034 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7036 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7039 if (ixjdebug & 0x002)
7040 printk(KERN_INFO "Enable DTMF Detectors\n");
7042 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7045 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7048 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7050 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7052 j->ex.bits.dtmf_ready = 0;
7054 j->dtmf_wp = j->dtmf_rp = 0;
7055 j->rec_mode = j->play_mode = -1;
7056 j->flags.ringing = 0;
7057 j->maxrings = MAXRINGS;
7058 j->ring_cadence = USA_RING_CADENCE;
7061 j->flags.dtmf_oob = 0;
7062 for (cnt = 0; cnt < 4; cnt++)
7063 j->cadence_f[cnt].enable = 0;
7064 /* must be a device on the specified address */
7065 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7067 /* Set up the default signals for events */
7068 for (cnt = 0; cnt < 35; cnt++)
7069 j->ixj_signals[cnt] = SIGIO;
7071 /* Set the excetion signal enable flags */
7072 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7073 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 =
7074 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;
7075 #ifdef IXJ_DYN_ALLOC
7081 /* Register with the Telephony for Linux subsystem */
7082 j->p.f_op = &ixj_fops;
7083 j->p.open = ixj_open;
7084 j->p.board = j->board;
7085 phone_register_device(&j->p, PHONE_UNIT_ANY);
7093 * Exported service for pcmcia card handling
7096 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7098 IXJ *j = ixj_alloc();
7103 j->XILINXbase = xilinx;
7104 j->cardtype = QTI_PHONECARD;
7109 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7111 static int ixj_get_status_proc(char *buf)
7117 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7118 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7119 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7120 len += sprintf(buf + len, "\nUsing old telephony API");
7121 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7123 for (cnt = 0; cnt < IXJMAX; cnt++) {
7128 len += sprintf(buf + len, "\nCard Num %d", cnt);
7129 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7130 if (j->cardtype != QTI_PHONEJACK)
7131 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7132 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7133 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7134 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7135 switch (j->cardtype) {
7136 case (QTI_PHONEJACK):
7137 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7139 case (QTI_LINEJACK):
7140 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7141 if (j->flags.g729_loaded)
7142 len += sprintf(buf + len, " w/G.729 A/B");
7143 len += sprintf(buf + len, " Country = %d", j->daa_country);
7145 case (QTI_PHONEJACK_LITE):
7146 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7147 if (j->flags.g729_loaded)
7148 len += sprintf(buf + len, " w/G.729 A/B");
7150 case (QTI_PHONEJACK_PCI):
7151 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7152 if (j->flags.g729_loaded)
7153 len += sprintf(buf + len, " w/G.729 A/B");
7155 case (QTI_PHONECARD):
7156 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7157 if (j->flags.g729_loaded)
7158 len += sprintf(buf + len, " w/G.729 A/B");
7159 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7160 if (!j->pccr1.bits.drf)
7161 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7162 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7165 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7168 len += sprintf(buf + len, "\nReaders %d", j->readers);
7169 len += sprintf(buf + len, "\nWriters %d", j->writers);
7171 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7172 if (j->dsp.low != 0x20)
7173 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7174 if (j->flags.cidsent)
7175 len += sprintf(buf + len, "\nCaller ID data sent");
7177 len += sprintf(buf + len, "\nCaller ID data not sent");
7179 len += sprintf(buf + len, "\nPlay CODEC ");
7180 switch (j->play_codec) {
7182 len += sprintf(buf + len, "G.723.1 6.3");
7185 len += sprintf(buf + len, "G.723.1 5.3");
7188 len += sprintf(buf + len, "TrueSpeech 8.5");
7191 len += sprintf(buf + len, "TrueSpeech 4.8");
7194 len += sprintf(buf + len, "TrueSpeech 4.1");
7197 len += sprintf(buf + len, "G.728");
7200 len += sprintf(buf + len, "G.729");
7203 len += sprintf(buf + len, "G.729B");
7206 len += sprintf(buf + len, "uLaw");
7209 len += sprintf(buf + len, "aLaw");
7212 len += sprintf(buf + len, "16 bit Linear");
7215 len += sprintf(buf + len, "8 bit Linear");
7218 len += sprintf(buf + len, "Windows Sound System");
7221 len += sprintf(buf + len, "NO CODEC CHOSEN");
7224 len += sprintf(buf + len, "\nRecord CODEC ");
7225 switch (j->rec_codec) {
7227 len += sprintf(buf + len, "G.723.1 6.3");
7230 len += sprintf(buf + len, "G.723.1 5.3");
7233 len += sprintf(buf + len, "TrueSpeech 8.5");
7236 len += sprintf(buf + len, "TrueSpeech 4.8");
7239 len += sprintf(buf + len, "TrueSpeech 4.1");
7242 len += sprintf(buf + len, "G.728");
7245 len += sprintf(buf + len, "G.729");
7248 len += sprintf(buf + len, "G.729B");
7251 len += sprintf(buf + len, "uLaw");
7254 len += sprintf(buf + len, "aLaw");
7257 len += sprintf(buf + len, "16 bit Linear");
7260 len += sprintf(buf + len, "8 bit Linear");
7263 len += sprintf(buf + len, "Windows Sound System");
7266 len += sprintf(buf + len, "NO CODEC CHOSEN");
7269 len += sprintf(buf + len, "\nAEC ");
7270 switch (j->aec_level) {
7272 len += sprintf(buf + len, "Off");
7275 len += sprintf(buf + len, "Low");
7278 len += sprintf(buf + len, "Med");
7281 len += sprintf(buf + len, "High");
7284 len += sprintf(buf + len, "Auto");
7287 len += sprintf(buf + len, "AEC/AGC");
7290 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7294 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7295 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7296 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7298 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7300 if (j->cardtype == QTI_LINEJACK) {
7301 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7302 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7303 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7304 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7305 switch (j->daa_mode) {
7307 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7309 case SOP_PU_RINGING:
7310 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7311 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7313 case SOP_PU_CONVERSATION:
7314 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7316 case SOP_PU_PULSEDIALING:
7317 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7320 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7321 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7322 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7323 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7324 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7325 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7326 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7327 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7328 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7329 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7333 len += sprintf(buf + len, "\nPort POTS");
7336 len += sprintf(buf + len, "\nPort PSTN");
7339 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7342 len += sprintf(buf + len, "\nPort HANDSET");
7345 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7346 len += sprintf(buf + len, "\nSLIC state ");
7347 switch (SLIC_GetState(j)) {
7348 case PLD_SLIC_STATE_OC:
7349 len += sprintf(buf + len, "OC");
7351 case PLD_SLIC_STATE_RINGING:
7352 len += sprintf(buf + len, "RINGING");
7354 case PLD_SLIC_STATE_ACTIVE:
7355 len += sprintf(buf + len, "ACTIVE");
7357 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7358 len += sprintf(buf + len, "OHT");
7360 case PLD_SLIC_STATE_TIPOPEN:
7361 len += sprintf(buf + len, "TIPOPEN");
7363 case PLD_SLIC_STATE_STANDBY:
7364 len += sprintf(buf + len, "STANDBY");
7366 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7367 len += sprintf(buf + len, "APR");
7369 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7370 len += sprintf(buf + len, "OHTPR");
7373 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7377 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7378 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7379 #ifdef PERFMON_STATS
7380 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7381 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7382 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7383 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7384 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7385 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7386 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7387 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7388 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7389 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7390 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7391 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7392 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7393 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7396 len += sprintf(buf + len, "\n");
7402 static int ixj_read_proc(char *page, char **start, off_t off,
7403 int count, int *eof, void *data)
7405 int len = ixj_get_status_proc(page);
7406 if (len <= off+count) *eof = 1;
7407 *start = page + off;
7409 if (len>count) len = count;
7415 static void cleanup(void)
7420 for (cnt = 0; cnt < IXJMAX; cnt++) {
7422 if(j != NULL && j->DSPbase) {
7423 if (ixjdebug & 0x0002)
7424 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7425 del_timer(&j->timer);
7426 if (j->cardtype == QTI_LINEJACK) {
7427 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7429 outb_p(j->pld_scrw.byte, j->XILINXbase);
7430 j->pld_slicw.bits.rly1 = 0;
7431 j->pld_slicw.bits.rly2 = 0;
7432 j->pld_slicw.bits.rly3 = 0;
7433 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7434 LED_SetState(0x0, j);
7435 if (ixjdebug & 0x0002)
7436 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7437 release_region(j->XILINXbase, 8);
7438 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7439 if (ixjdebug & 0x0002)
7440 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7441 release_region(j->XILINXbase, 4);
7443 kfree(j->read_buffer);
7444 kfree(j->write_buffer);
7446 pnp_device_detach(j->dev);
7447 if (ixjdebug & 0x0002)
7448 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7449 phone_unregister_device(&j->p);
7450 if (ixjdebug & 0x0002)
7451 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7452 release_region(j->DSPbase, 16);
7453 #ifdef IXJ_DYN_ALLOC
7454 if (ixjdebug & 0x0002)
7455 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7461 if (ixjdebug & 0x0002)
7462 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7463 remove_proc_entry ("ixj", NULL);
7472 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7474 lastLCC = lastLCC & 0xfb;
7475 lastLCC = lastLCC | (byData ? 4 : 0);
7476 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7479 lastLCC = lastLCC | 0x01;
7480 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7482 byData = byData << 1;
7483 lastLCC = lastLCC & 0xfe;
7485 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7489 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7492 lastLCC = lastLCC | 0x01;
7493 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7495 lastLCC = lastLCC & 0xfe;
7497 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7499 return ((inb(wEEPROMAddress) >> 3) & 1);
7502 static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7505 WORD wEEPROMAddress = wAddress + 3;
7509 lastLCC = inb(wEEPROMAddress);
7510 lastLCC = lastLCC | 0x02;
7511 lastLCC = lastLCC & 0xfe;
7512 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7514 mdelay(1); /* delay */
7516 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7517 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7518 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7519 for (i = 0; i < 8; i++) {
7520 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7524 for (i = 0; i < 16; i++) {
7525 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7526 *pwResult = (*pwResult << 1) | byResult;
7529 mdelay(1); /* another delay */
7531 lastLCC = lastLCC & 0xfd;
7532 outb(lastLCC, wEEPROMAddress); /* negate CS */
7537 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7540 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7542 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7544 return (((DWORD) wHi << 16) | wLo);
7547 static int dspio[IXJMAX + 1] =
7551 static int xio[IXJMAX + 1] =
7556 module_param_array(dspio, int, NULL, 0);
7557 module_param_array(xio, int, NULL, 0);
7558 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7559 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7560 MODULE_LICENSE("GPL");
7562 static void __exit ixj_exit(void)
7567 static IXJ *new_ixj(unsigned long port)
7570 if (!request_region(port, 16, "ixj DSP")) {
7571 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7576 release_region(port, 16);
7577 printk(KERN_INFO "ixj: out of memory\n");
7580 res->DSPbase = port;
7584 static int __init ixj_probe_isapnp(int *cnt)
7588 struct pnp_dev *dev = NULL, *old_dev = NULL;
7596 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7597 ISAPNP_FUNCTION(func), old_dev);
7598 if (!dev || !dev->card)
7600 result = pnp_device_attach(dev);
7602 printk("pnp attach failed %d \n", result);
7605 if (pnp_activate_dev(dev) < 0) {
7606 printk("pnp activate failed (out of resources?)\n");
7607 pnp_device_detach(dev);
7611 if (!pnp_port_valid(dev, 0)) {
7612 pnp_device_detach(dev);
7616 j = new_ixj(pnp_port_start(dev, 0));
7621 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7625 j->cardtype = QTI_PHONEJACK;
7628 j->cardtype = QTI_LINEJACK;
7631 j->cardtype = QTI_PHONEJACK_LITE;
7635 probe = ixj_selfprobe(j);
7637 j->serial = dev->card->serial;
7641 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7644 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7647 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7664 static int __init ixj_probe_isa(int *cnt)
7668 /* Use passed parameters for older kernels without PnP */
7669 for (i = 0; i < IXJMAX; i++) {
7671 IXJ *j = new_ixj(dspio[i]);
7676 j->XILINXbase = xio[i];
7680 probe = ixj_selfprobe(j);
7688 static int __init ixj_probe_pci(int *cnt)
7690 struct pci_dev *pci = NULL;
7694 for (i = 0; i < IXJMAX - *cnt; i++) {
7695 pci = pci_find_device(PCI_VENDOR_ID_QUICKNET,
7696 PCI_DEVICE_ID_QUICKNET_XJ, pci);
7700 if (pci_enable_device(pci))
7702 j = new_ixj(pci_resource_start(pci, 0));
7706 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7707 j->XILINXbase = j->DSPbase + 0x10;
7708 j->cardtype = QTI_PHONEJACK_PCI;
7710 probe = ixj_selfprobe(j);
7712 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7718 static int __init ixj_init(void)
7725 /* These might be no-ops, see above. */
7726 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7729 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7732 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7735 printk(KERN_INFO "ixj driver initialized.\n");
7736 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7740 module_init(ixj_init);
7741 module_exit(ixj_exit);
7743 static void DAA_Coeff_US(IXJ *j)
7747 j->daa_country = DAA_US;
7748 /*----------------------------------------------- */
7750 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7751 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7754 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7755 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7756 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7757 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7758 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7759 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7760 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7761 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7762 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7763 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7764 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7765 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7766 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7767 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7768 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7769 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7771 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7772 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7773 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7774 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7775 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7776 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7777 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7778 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7779 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7780 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7781 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7782 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7783 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7784 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7785 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7786 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7787 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7788 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7789 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7790 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7791 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7792 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7793 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7794 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7795 /* Bytes for AR-filter (09): 52,D3,11,42 */
7796 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7797 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7798 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7799 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7800 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7801 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7802 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7803 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7804 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7805 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7806 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7808 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7809 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7815 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7817 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7818 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7821 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7822 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7824 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7826 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7827 /* ; (10K, 0.68uF) */
7829 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7830 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7831 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7832 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7833 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7834 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7835 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7836 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7837 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7838 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7839 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7840 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7841 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7842 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7843 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7844 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7846 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7848 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7849 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7850 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7851 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7852 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7854 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7855 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7856 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7857 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7858 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7859 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7860 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7861 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7862 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7863 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7864 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7865 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7866 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7867 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7868 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7869 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7870 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7871 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7873 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7874 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7875 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7876 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7877 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7879 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7880 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7881 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7882 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7883 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7884 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7885 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7886 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7887 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7888 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7889 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7890 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7891 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7892 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7893 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7894 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7896 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7899 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7900 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7901 /* Config. Reg. 1 (dialing) (cr1):05 */
7902 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7903 /* Config. Reg. 2 (caller ID) (cr2):04 */
7904 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7905 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7906 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7907 /* Config. Reg. 4 (analog gain) (cr4):02 */
7908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7909 /* Config. Reg. 5 (Version) (cr5):02 */
7910 /* Config. Reg. 6 (Reserved) (cr6):00 */
7911 /* Config. Reg. 7 (Reserved) (cr7):00 */
7914 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7916 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7917 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7919 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7920 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7921 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7922 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7923 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7924 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7926 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7927 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7928 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7929 /* Ext. Reg. 6 (Power State) (xr6):00 */
7930 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7931 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7932 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7934 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7935 /* 12,33,5A,C3 ; 770 Hz */
7936 /* 13,3C,5B,32 ; 852 Hz */
7937 /* 1D,1B,5C,CC ; 941 Hz */
7939 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7940 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7941 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7942 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7943 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7944 /* EC,1D,52,22 ; 1336 Hz */
7945 /* AA,AC,51,D2 ; 1477 Hz */
7946 /* 9B,3B,51,25 ; 1633 Hz */
7947 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7948 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7949 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7950 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7953 static void DAA_Coeff_UK(IXJ *j)
7957 j->daa_country = DAA_UK;
7958 /*----------------------------------------------- */
7960 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7961 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7964 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7965 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7966 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7967 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7968 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7969 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7970 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7971 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7972 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7973 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7974 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7975 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7976 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7977 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7978 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7979 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7981 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7982 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7983 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7984 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7985 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7986 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7987 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
7988 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
7989 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
7990 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7991 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
7992 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
7993 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
7994 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
7995 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
7996 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
7997 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
7998 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
7999 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8000 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8001 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8002 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8003 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8004 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8005 /* Bytes for AR-filter (09): E2,27,10,D6 */
8006 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8007 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8008 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8009 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8010 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8011 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8012 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8013 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8014 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8015 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8016 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8017 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8018 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8019 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8020 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8021 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8022 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8023 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8024 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8025 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8027 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8028 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8031 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8032 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8034 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8036 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8038 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8039 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8040 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8041 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8042 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8043 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8044 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8045 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8046 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8047 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8048 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8049 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8050 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8051 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8052 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8053 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8055 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8056 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8057 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8058 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8059 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8060 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8061 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8062 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8063 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8064 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8065 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8066 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8067 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8068 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8069 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8070 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8071 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8072 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8073 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8074 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8075 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8076 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8078 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8080 /* Config. Reg. 0 (filters) (cr0):FF */
8081 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8082 /* Config. Reg. 1 (dialing) (cr1):05 */
8083 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8084 /* Config. Reg. 2 (caller ID) (cr2):04 */
8085 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8086 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8087 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8088 /* Config. Reg. 4 (analog gain) (cr4):02 */
8089 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8090 /* Config. Reg. 5 (Version) (cr5):02 */
8091 /* Config. Reg. 6 (Reserved) (cr6):00 */
8092 /* Config. Reg. 7 (Reserved) (cr7):00 */
8094 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8096 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8097 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8099 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8100 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8102 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8103 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8104 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8105 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8106 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8107 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8108 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8109 /* Ext. Reg. 6 (Power State) (xr6):00 */
8110 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8111 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8112 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8113 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8114 /* 12,33,5A,C3 ; 770 Hz */
8115 /* 13,3C,5B,32 ; 852 Hz */
8116 /* 1D,1B,5C,CC ; 941 Hz */
8118 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8119 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8120 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8121 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8122 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8123 /* EC,1D,52,22 ; 1336 Hz */
8124 /* AA,AC,51,D2 ; 1477 Hz */
8125 /* 9B,3B,51,25 ; 1633 Hz */
8126 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8127 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8128 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8129 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8133 static void DAA_Coeff_France(IXJ *j)
8137 j->daa_country = DAA_FRANCE;
8138 /*----------------------------------------------- */
8140 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8141 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8144 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8145 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8146 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8147 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8148 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8149 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8150 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8151 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8152 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8153 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8154 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8155 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8156 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8157 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8158 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8159 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8161 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8162 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8163 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8164 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8165 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8166 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8167 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8168 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8169 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8170 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8171 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8172 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8173 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8174 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8175 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8176 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8177 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8178 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8179 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8180 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8181 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8182 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8183 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8184 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8185 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8186 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8187 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8188 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8189 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8190 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8191 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8192 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8193 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8194 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8195 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8196 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8197 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8198 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8199 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8200 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8201 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8202 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8203 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8204 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8205 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8207 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8208 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8211 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8212 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8214 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8216 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8218 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8219 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8220 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8221 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8222 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8223 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8224 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8225 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8226 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8227 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8228 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8229 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8230 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8231 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8232 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8233 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8235 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8236 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8237 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8238 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8239 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8240 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8241 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8242 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8243 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8244 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8245 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8246 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8247 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8248 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8249 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8250 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8251 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8252 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8253 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8254 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8255 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8256 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8258 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8260 /* Config. Reg. 0 (filters) (cr0):FF */
8261 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8262 /* Config. Reg. 1 (dialing) (cr1):05 */
8263 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8264 /* Config. Reg. 2 (caller ID) (cr2):04 */
8265 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8266 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8267 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8268 /* Config. Reg. 4 (analog gain) (cr4):02 */
8269 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8270 /* Config. Reg. 5 (Version) (cr5):02 */
8271 /* Config. Reg. 6 (Reserved) (cr6):00 */
8272 /* Config. Reg. 7 (Reserved) (cr7):00 */
8274 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8276 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8277 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8279 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8280 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8282 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8283 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8284 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8285 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8286 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8287 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8288 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8289 /* Ext. Reg. 6 (Power State) (xr6):00 */
8290 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8291 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8292 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8293 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8294 /* 12,33,5A,C3 ; 770 Hz */
8295 /* 13,3C,5B,32 ; 852 Hz */
8296 /* 1D,1B,5C,CC ; 941 Hz */
8298 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8299 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8300 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8301 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8302 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8303 /* EC,1D,52,22 ; 1336 Hz */
8304 /* AA,AC,51,D2 ; 1477 Hz */
8305 /* 9B,3B,51,25 ; 1633 Hz */
8306 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8307 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8308 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8309 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8313 static void DAA_Coeff_Germany(IXJ *j)
8317 j->daa_country = DAA_GERMANY;
8318 /*----------------------------------------------- */
8320 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8321 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8324 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8325 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8326 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8327 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8328 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8329 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8330 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8331 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8332 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8333 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8334 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8335 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8336 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8337 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8338 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8339 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8341 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8342 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8343 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8344 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8345 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8346 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8347 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8348 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8349 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8350 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8351 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8352 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8353 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8354 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8355 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8356 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8357 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8358 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8359 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8360 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8361 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8362 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8363 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8364 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8365 /* Bytes for AR-filter (09): 72,42,13,4B */
8366 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8367 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8368 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8369 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8370 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8371 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8372 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8373 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8374 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8375 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8376 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8377 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8378 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8379 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8380 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8381 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8382 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8383 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8384 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8385 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8387 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8388 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8391 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8392 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8394 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8396 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8397 /* ; (10K, 0.68uF) */
8398 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8399 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8400 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8401 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8402 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8403 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8404 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8405 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8406 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8407 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8408 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8409 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8410 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8411 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8412 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8413 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8415 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8416 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8417 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8418 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8419 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8420 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8421 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8422 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8423 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8424 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8425 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8426 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8427 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8428 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8429 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8430 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8431 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8432 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8433 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8434 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8435 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8436 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8438 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8440 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8441 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8442 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8443 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8444 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8445 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8446 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8447 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8448 /* Config. Reg. 4 (analog gain) (cr4):02 */
8449 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8450 /* Config. Reg. 5 (Version) (cr5):02 */
8451 /* Config. Reg. 6 (Reserved) (cr6):00 */
8452 /* Config. Reg. 7 (Reserved) (cr7):00 */
8454 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8456 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8457 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8459 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8460 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8462 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8463 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8464 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8465 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8466 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8467 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8468 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8469 /* Ext. Reg. 6 (Power State) (xr6):00 */
8470 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8471 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8472 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8473 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8474 /* 12,33,5A,C3 ; 770 Hz */
8475 /* 13,3C,5B,32 ; 852 Hz */
8476 /* 1D,1B,5C,CC ; 941 Hz */
8478 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8479 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8480 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8481 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8482 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8483 /* EC,1D,52,22 ; 1336 Hz */
8484 /* AA,AC,51,D2 ; 1477 Hz */
8485 /* 9B,3B,51,25 ; 1633 Hz */
8486 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8487 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8488 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8489 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8493 static void DAA_Coeff_Australia(IXJ *j)
8497 j->daa_country = DAA_AUSTRALIA;
8498 /*----------------------------------------------- */
8500 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8501 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8504 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8505 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8506 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8507 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8508 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8509 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8510 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8511 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8512 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8513 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8514 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8515 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8516 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8517 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8518 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8519 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8521 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8522 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8523 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8524 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8525 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8526 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8527 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8528 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8529 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8530 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8531 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8532 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8533 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8534 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8535 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8536 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8537 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8538 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8539 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8540 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8541 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8542 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8543 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8544 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8545 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8546 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8547 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8548 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8549 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8550 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8551 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8552 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8553 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8554 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8555 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8556 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8557 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8558 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8559 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8560 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8561 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8562 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8563 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8564 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8565 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8567 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8568 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8571 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8572 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8574 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8576 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8578 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8579 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8580 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8581 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8582 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8583 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8584 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8585 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8586 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8587 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8588 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8589 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8590 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8591 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8592 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8593 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8595 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8596 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8597 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8598 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8599 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8600 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8601 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8602 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8603 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8604 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8605 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8606 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8607 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8608 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8609 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8610 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8611 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8612 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8613 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8614 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8615 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8616 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8618 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8620 /* Config. Reg. 0 (filters) (cr0):FF */
8621 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8622 /* Config. Reg. 1 (dialing) (cr1):05 */
8623 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8624 /* Config. Reg. 2 (caller ID) (cr2):04 */
8625 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8626 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8627 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8628 /* Config. Reg. 4 (analog gain) (cr4):02 */
8629 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8630 /* Config. Reg. 5 (Version) (cr5):02 */
8631 /* Config. Reg. 6 (Reserved) (cr6):00 */
8632 /* Config. Reg. 7 (Reserved) (cr7):00 */
8634 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8636 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8637 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8639 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8640 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8642 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8643 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8644 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8645 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8646 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8647 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8648 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8649 /* Ext. Reg. 6 (Power State) (xr6):00 */
8650 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8651 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8652 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8654 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8655 /* 12,33,5A,C3 ; 770 Hz */
8656 /* 13,3C,5B,32 ; 852 Hz */
8657 /* 1D,1B,5C,CC ; 941 Hz */
8658 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8659 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8660 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8661 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8663 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8664 /* EC,1D,52,22 ; 1336 Hz */
8665 /* AA,AC,51,D2 ; 1477 Hz */
8666 /* 9B,3B,51,25 ; 1633 Hz */
8667 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8668 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8669 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8670 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8673 static void DAA_Coeff_Japan(IXJ *j)
8677 j->daa_country = DAA_JAPAN;
8678 /*----------------------------------------------- */
8680 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8681 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8684 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8685 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8686 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8687 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8688 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8689 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8690 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8691 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8692 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8693 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8694 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8695 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8696 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8697 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8698 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8699 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8701 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8702 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8703 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8704 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8705 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8706 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8707 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8708 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8709 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8710 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8711 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8712 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8713 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8714 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8715 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8716 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8717 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8718 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8719 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8720 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8721 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8722 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8723 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8724 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8725 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8726 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8727 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8728 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8729 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8730 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8731 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8732 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8733 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8734 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8735 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8736 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8737 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8738 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8739 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8740 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8741 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8742 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8743 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8744 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8745 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8747 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8748 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8751 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8752 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8754 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8756 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8758 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8759 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8760 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8761 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8762 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8763 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8764 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8765 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8766 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8767 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8768 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8769 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8770 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8771 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8772 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8773 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8775 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8776 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8777 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8778 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8779 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8780 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8781 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8782 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8783 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8784 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8785 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8786 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8787 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8788 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8789 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8790 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8791 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8792 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8793 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8794 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8795 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8796 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8798 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8800 /* Config. Reg. 0 (filters) (cr0):FF */
8801 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8802 /* Config. Reg. 1 (dialing) (cr1):05 */
8803 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8804 /* Config. Reg. 2 (caller ID) (cr2):04 */
8805 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8806 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8807 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8808 /* Config. Reg. 4 (analog gain) (cr4):02 */
8809 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8810 /* Config. Reg. 5 (Version) (cr5):02 */
8811 /* Config. Reg. 6 (Reserved) (cr6):00 */
8812 /* Config. Reg. 7 (Reserved) (cr7):00 */
8814 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8816 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8817 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8819 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8820 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8822 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8823 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8824 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8825 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8826 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8827 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8828 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8829 /* Ext. Reg. 6 (Power State) (xr6):00 */
8830 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8831 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8832 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8833 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8834 /* 12,33,5A,C3 ; 770 Hz */
8835 /* 13,3C,5B,32 ; 852 Hz */
8836 /* 1D,1B,5C,CC ; 941 Hz */
8838 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8839 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8840 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8841 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8842 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8843 /* EC,1D,52,22 ; 1336 Hz */
8844 /* AA,AC,51,D2 ; 1477 Hz */
8845 /* 9B,3B,51,25 ; 1633 Hz */
8846 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8847 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8848 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8849 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8852 static s16 tone_table[][19] =
8855 32538, /* A1 = 1.985962 */
8856 -32325, /* A2 = -0.986511 */
8857 -343, /* B2 = -0.010493 */
8859 343, /* B0 = 0.010493 */
8860 32619, /* A1 = 1.990906 */
8861 -32520, /* A2 = -0.992462 */
8862 19179, /* B2 = 0.585327 */
8863 -19178, /* B1 = -1.170593 */
8864 19179, /* B0 = 0.585327 */
8865 32723, /* A1 = 1.997314 */
8866 -32686, /* A2 = -0.997528 */
8867 9973, /* B2 = 0.304352 */
8868 -9955, /* B1 = -0.607605 */
8869 9973, /* B0 = 0.304352 */
8870 7, /* Internal filter scaling */
8871 159, /* Minimum in-band energy threshold */
8872 21, /* 21/32 in-band to broad-band ratio */
8873 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8875 { /* f133_200[] 12 */
8876 32072, /* A1 = 1.95752 */
8877 -31896, /* A2 = -0.973419 */
8878 -435, /* B2 = -0.013294 */
8880 435, /* B0 = 0.013294 */
8881 32188, /* A1 = 1.9646 */
8882 -32400, /* A2 = -0.98877 */
8883 15139, /* B2 = 0.462036 */
8884 -14882, /* B1 = -0.908356 */
8885 15139, /* B0 = 0.462036 */
8886 32473, /* A1 = 1.981995 */
8887 -32524, /* A2 = -0.992584 */
8888 23200, /* B2 = 0.708008 */
8889 -23113, /* B1 = -1.410706 */
8890 23200, /* B0 = 0.708008 */
8891 7, /* Internal filter scaling */
8892 159, /* Minimum in-band energy threshold */
8893 21, /* 21/32 in-band to broad-band ratio */
8894 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8897 31769, /* A1 = -1.939026 */
8898 -32584, /* A2 = 0.994385 */
8899 -475, /* B2 = -0.014522 */
8900 0, /* B1 = 0.000000 */
8901 475, /* B0 = 0.014522 */
8902 31789, /* A1 = -1.940247 */
8903 -32679, /* A2 = 0.997284 */
8904 17280, /* B2 = 0.527344 */
8905 -16865, /* B1 = -1.029358 */
8906 17280, /* B0 = 0.527344 */
8907 31841, /* A1 = -1.943481 */
8908 -32681, /* A2 = 0.997345 */
8909 543, /* B2 = 0.016579 */
8910 -525, /* B1 = -0.032097 */
8911 543, /* B0 = 0.016579 */
8912 5, /* Internal filter scaling */
8913 159, /* Minimum in-band energy threshold */
8914 21, /* 21/32 in-band to broad-band ratio */
8915 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8917 { /* f300_420[] 14 */
8918 30750, /* A1 = 1.876892 */
8919 -31212, /* A2 = -0.952515 */
8920 -804, /* B2 = -0.024541 */
8922 804, /* B0 = 0.024541 */
8923 30686, /* A1 = 1.872925 */
8924 -32145, /* A2 = -0.980988 */
8925 14747, /* B2 = 0.450043 */
8926 -13703, /* B1 = -0.836395 */
8927 14747, /* B0 = 0.450043 */
8928 31651, /* A1 = 1.931824 */
8929 -32321, /* A2 = -0.986389 */
8930 24425, /* B2 = 0.745422 */
8931 -23914, /* B1 = -1.459595 */
8932 24427, /* B0 = 0.745483 */
8933 7, /* Internal filter scaling */
8934 159, /* Minimum in-band energy threshold */
8935 21, /* 21/32 in-band to broad-band ratio */
8936 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8939 31613, /* A1 = -1.929565 */
8940 -32646, /* A2 = 0.996277 */
8941 -185, /* B2 = -0.005657 */
8942 0, /* B1 = 0.000000 */
8943 185, /* B0 = 0.005657 */
8944 31620, /* A1 = -1.929932 */
8945 -32713, /* A2 = 0.998352 */
8946 19253, /* B2 = 0.587585 */
8947 -18566, /* B1 = -1.133179 */
8948 19253, /* B0 = 0.587585 */
8949 31674, /* A1 = -1.933228 */
8950 -32715, /* A2 = 0.998413 */
8951 2575, /* B2 = 0.078590 */
8952 -2495, /* B1 = -0.152283 */
8953 2575, /* B0 = 0.078590 */
8954 5, /* Internal filter scaling */
8955 159, /* Minimum in-band energy threshold */
8956 21, /* 21/32 in-band to broad-band ratio */
8957 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8959 { /* f300_425[] 16 */
8960 30741, /* A1 = 1.876282 */
8961 -31475, /* A2 = -0.960541 */
8962 -703, /* B2 = -0.021484 */
8964 703, /* B0 = 0.021484 */
8965 30688, /* A1 = 1.873047 */
8966 -32248, /* A2 = -0.984161 */
8967 14542, /* B2 = 0.443787 */
8968 -13523, /* B1 = -0.825439 */
8969 14542, /* B0 = 0.443817 */
8970 31494, /* A1 = 1.922302 */
8971 -32366, /* A2 = -0.987762 */
8972 21577, /* B2 = 0.658508 */
8973 -21013, /* B1 = -1.282532 */
8974 21577, /* B0 = 0.658508 */
8975 7, /* Internal filter scaling */
8976 159, /* Minimum in-band energy threshold */
8977 21, /* 21/32 in-band to broad-band ratio */
8978 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8980 { /* f330_440[] 17 */
8981 30627, /* A1 = 1.869324 */
8982 -31338, /* A2 = -0.95636 */
8983 -843, /* B2 = -0.025749 */
8985 843, /* B0 = 0.025749 */
8986 30550, /* A1 = 1.864685 */
8987 -32221, /* A2 = -0.983337 */
8988 13594, /* B2 = 0.414886 */
8989 -12589, /* B1 = -0.768402 */
8990 13594, /* B0 = 0.414886 */
8991 31488, /* A1 = 1.921936 */
8992 -32358, /* A2 = -0.987518 */
8993 24684, /* B2 = 0.753296 */
8994 -24029, /* B1 = -1.466614 */
8995 24684, /* B0 = 0.753296 */
8996 7, /* Internal filter scaling */
8997 159, /* Minimum in-band energy threshold */
8998 21, /* 21/32 in-band to broad-band ratio */
8999 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9002 31546, /* A1 = -1.925476 */
9003 -32646, /* A2 = 0.996277 */
9004 -445, /* B2 = -0.013588 */
9005 0, /* B1 = 0.000000 */
9006 445, /* B0 = 0.013588 */
9007 31551, /* A1 = -1.925781 */
9008 -32713, /* A2 = 0.998352 */
9009 23884, /* B2 = 0.728882 */
9010 -22979, /* B1 = -1.402527 */
9011 23884, /* B0 = 0.728882 */
9012 31606, /* A1 = -1.929138 */
9013 -32715, /* A2 = 0.998413 */
9014 863, /* B2 = 0.026367 */
9015 -835, /* B1 = -0.050985 */
9016 863, /* B0 = 0.026367 */
9017 5, /* Internal filter scaling */
9018 159, /* Minimum in-band energy threshold */
9019 21, /* 21/32 in-band to broad-band ratio */
9020 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9022 { /* f350_400[] 19 */
9023 31006, /* A1 = 1.892517 */
9024 -32029, /* A2 = -0.977448 */
9025 -461, /* B2 = -0.014096 */
9027 461, /* B0 = 0.014096 */
9028 30999, /* A1 = 1.892029 */
9029 -32487, /* A2 = -0.991455 */
9030 11325, /* B2 = 0.345612 */
9031 -10682, /* B1 = -0.651978 */
9032 11325, /* B0 = 0.345612 */
9033 31441, /* A1 = 1.919067 */
9034 -32526, /* A2 = -0.992615 */
9035 24324, /* B2 = 0.74231 */
9036 -23535, /* B1 = -1.436523 */
9037 24324, /* B0 = 0.74231 */
9038 7, /* Internal filter scaling */
9039 159, /* Minimum in-band energy threshold */
9040 21, /* 21/32 in-band to broad-band ratio */
9041 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9044 30634, /* A1 = 1.869751 */
9045 -31533, /* A2 = -0.962341 */
9046 -680, /* B2 = -0.020782 */
9048 680, /* B0 = 0.020782 */
9049 30571, /* A1 = 1.865906 */
9050 -32277, /* A2 = -0.985016 */
9051 12894, /* B2 = 0.393524 */
9052 -11945, /* B1 = -0.729065 */
9053 12894, /* B0 = 0.393524 */
9054 31367, /* A1 = 1.91449 */
9055 -32379, /* A2 = -0.988129 */
9056 23820, /* B2 = 0.726929 */
9057 -23104, /* B1 = -1.410217 */
9058 23820, /* B0 = 0.726929 */
9059 7, /* Internal filter scaling */
9060 159, /* Minimum in-band energy threshold */
9061 21, /* 21/32 in-band to broad-band ratio */
9062 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9065 30552, /* A1 = 1.864807 */
9066 -31434, /* A2 = -0.95929 */
9067 -690, /* B2 = -0.021066 */
9069 690, /* B0 = 0.021066 */
9070 30472, /* A1 = 1.859924 */
9071 -32248, /* A2 = -0.984161 */
9072 13385, /* B2 = 0.408478 */
9073 -12357, /* B1 = -0.754242 */
9074 13385, /* B0 = 0.408478 */
9075 31358, /* A1 = 1.914001 */
9076 -32366, /* A2 = -0.987732 */
9077 26488, /* B2 = 0.80835 */
9078 -25692, /* B1 = -1.568176 */
9079 26490, /* B0 = 0.808411 */
9080 7, /* Internal filter scaling */
9081 159, /* Minimum in-band energy threshold */
9082 21, /* 21/32 in-band to broad-band ratio */
9083 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9086 31397, /* A1 = -1.916321 */
9087 -32623, /* A2 = 0.995605 */
9088 -117, /* B2 = -0.003598 */
9089 0, /* B1 = 0.000000 */
9090 117, /* B0 = 0.003598 */
9091 31403, /* A1 = -1.916687 */
9092 -32700, /* A2 = 0.997925 */
9093 3388, /* B2 = 0.103401 */
9094 -3240, /* B1 = -0.197784 */
9095 3388, /* B0 = 0.103401 */
9096 31463, /* A1 = -1.920410 */
9097 -32702, /* A2 = 0.997986 */
9098 13346, /* B2 = 0.407288 */
9099 -12863, /* B1 = -0.785126 */
9100 13346, /* B0 = 0.407288 */
9101 5, /* Internal filter scaling */
9102 159, /* Minimum in-band energy threshold */
9103 21, /* 21/32 in-band to broad-band ratio */
9104 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9107 30831, /* A1 = 1.881775 */
9108 -32064, /* A2 = -0.978546 */
9109 -367, /* B2 = -0.01122 */
9111 367, /* B0 = 0.01122 */
9112 30813, /* A1 = 1.880737 */
9113 -32456, /* A2 = -0.990509 */
9114 11068, /* B2 = 0.337769 */
9115 -10338, /* B1 = -0.631042 */
9116 11068, /* B0 = 0.337769 */
9117 31214, /* A1 = 1.905212 */
9118 -32491, /* A2 = -0.991577 */
9119 16374, /* B2 = 0.499695 */
9120 -15781, /* B1 = -0.963196 */
9121 16374, /* B0 = 0.499695 */
9122 7, /* Internal filter scaling */
9123 159, /* Minimum in-band energy threshold */
9124 21, /* 21/32 in-band to broad-band ratio */
9125 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9128 31152, /* A1 = -1.901428 */
9129 -32613, /* A2 = 0.995300 */
9130 -314, /* B2 = -0.009605 */
9131 0, /* B1 = 0.000000 */
9132 314, /* B0 = 0.009605 */
9133 31156, /* A1 = -1.901672 */
9134 -32694, /* A2 = 0.997742 */
9135 28847, /* B2 = 0.880371 */
9136 -2734, /* B1 = -0.166901 */
9137 28847, /* B0 = 0.880371 */
9138 31225, /* A1 = -1.905823 */
9139 -32696, /* A2 = 0.997803 */
9140 462, /* B2 = 0.014108 */
9141 -442, /* B1 = -0.027019 */
9142 462, /* B0 = 0.014108 */
9143 5, /* Internal filter scaling */
9144 159, /* Minimum in-band energy threshold */
9145 21, /* 21/32 in-band to broad-band ratio */
9146 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9149 30836, /* A1 = 1.882141 */
9150 -32296, /* A2 = -0.985596 */
9151 -324, /* B2 = -0.009903 */
9153 324, /* B0 = 0.009903 */
9154 30825, /* A1 = 1.881409 */
9155 -32570, /* A2 = -0.993958 */
9156 16847, /* B2 = 0.51416 */
9157 -15792, /* B1 = -0.963898 */
9158 16847, /* B0 = 0.51416 */
9159 31106, /* A1 = 1.89856 */
9160 -32584, /* A2 = -0.994415 */
9161 9579, /* B2 = 0.292328 */
9162 -9164, /* B1 = -0.559357 */
9163 9579, /* B0 = 0.292328 */
9164 7, /* Internal filter scaling */
9165 159, /* Minimum in-band energy threshold */
9166 21, /* 21/32 in-band to broad-band ratio */
9167 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9170 30702, /* A1 = 1.873962 */
9171 -32134, /* A2 = -0.980682 */
9172 -517, /* B2 = -0.015793 */
9174 517, /* B0 = 0.015793 */
9175 30676, /* A1 = 1.872375 */
9176 -32520, /* A2 = -0.992462 */
9177 8144, /* B2 = 0.24855 */
9178 -7596, /* B1 = -0.463684 */
9179 8144, /* B0 = 0.24855 */
9180 31084, /* A1 = 1.897217 */
9181 -32547, /* A2 = -0.993256 */
9182 22713, /* B2 = 0.693176 */
9183 -21734, /* B1 = -1.326599 */
9184 22713, /* B0 = 0.693176 */
9185 7, /* Internal filter scaling */
9186 159, /* Minimum in-band energy threshold */
9187 21, /* 21/32 in-band to broad-band ratio */
9188 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9191 30613, /* A1 = 1.86853 */
9192 -32031, /* A2 = -0.977509 */
9193 -618, /* B2 = -0.018866 */
9195 618, /* B0 = 0.018866 */
9196 30577, /* A1 = 1.866272 */
9197 -32491, /* A2 = -0.991577 */
9198 9612, /* B2 = 0.293335 */
9199 -8935, /* B1 = -0.54541 */
9200 9612, /* B0 = 0.293335 */
9201 31071, /* A1 = 1.896484 */
9202 -32524, /* A2 = -0.992584 */
9203 21596, /* B2 = 0.659058 */
9204 -20667, /* B1 = -1.261414 */
9205 21596, /* B0 = 0.659058 */
9206 7, /* Internal filter scaling */
9207 159, /* Minimum in-band energy threshold */
9208 21, /* 21/32 in-band to broad-band ratio */
9209 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9212 30914, /* A1 = -1.886841 */
9213 -32584, /* A2 = 0.994385 */
9214 -426, /* B2 = -0.013020 */
9215 0, /* B1 = 0.000000 */
9216 426, /* B0 = 0.013020 */
9217 30914, /* A1 = -1.886841 */
9218 -32679, /* A2 = 0.997314 */
9219 17520, /* B2 = 0.534668 */
9220 -16471, /* B1 = -1.005310 */
9221 17520, /* B0 = 0.534668 */
9222 31004, /* A1 = -1.892334 */
9223 -32683, /* A2 = 0.997406 */
9224 819, /* B2 = 0.025023 */
9225 -780, /* B1 = -0.047619 */
9226 819, /* B0 = 0.025023 */
9227 5, /* Internal filter scaling */
9228 159, /* Minimum in-band energy threshold */
9229 21, /* 21/32 in-band to broad-band ratio */
9230 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9234 30881, /* A1 = -1.884827 */
9235 -32603, /* A2 = 0.994965 */
9236 -496, /* B2 = -0.015144 */
9237 0, /* B1 = 0.000000 */
9238 496, /* B0 = 0.015144 */
9239 30880, /* A1 = -1.884766 */
9240 -32692, /* A2 = 0.997711 */
9241 24767, /* B2 = 0.755859 */
9242 -23290, /* B1 = -1.421509 */
9243 24767, /* B0 = 0.755859 */
9244 30967, /* A1 = -1.890076 */
9245 -32694, /* A2 = 0.997772 */
9246 728, /* B2 = 0.022232 */
9247 -691, /* B1 = -0.042194 */
9248 728, /* B0 = 0.022232 */
9249 5, /* Internal filter scaling */
9250 159, /* Minimum in-band energy threshold */
9251 21, /* 21/32 in-band to broad-band ratio */
9252 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9278 30646, /* A1 = 1.870544 */
9279 -32327, /* A2 = -0.986572 */
9280 -287, /* B2 = -0.008769 */
9282 287, /* B0 = 0.008769 */
9283 30627, /* A1 = 1.869324 */
9284 -32607, /* A2 = -0.995087 */
9285 13269, /* B2 = 0.404968 */
9286 -12376, /* B1 = -0.755432 */
9287 13269, /* B0 = 0.404968 */
9288 30924, /* A1 = 1.887512 */
9289 -32619, /* A2 = -0.995453 */
9290 19950, /* B2 = 0.608826 */
9291 -18940, /* B1 = -1.156006 */
9292 19950, /* B0 = 0.608826 */
9293 7, /* Internal filter scaling */
9294 159, /* Minimum in-band energy threshold */
9295 21, /* 21/32 in-band to broad-band ratio */
9296 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9299 30396, /* A1 = 1.855225 */
9300 -32014, /* A2 = -0.97699 */
9301 -395, /* B2 = -0.012055 */
9303 395, /* B0 = 0.012055 */
9304 30343, /* A1 = 1.85199 */
9305 -32482, /* A2 = -0.991302 */
9306 17823, /* B2 = 0.543945 */
9307 -16431, /* B1 = -1.002869 */
9308 17823, /* B0 = 0.543945 */
9309 30872, /* A1 = 1.884338 */
9310 -32516, /* A2 = -0.99231 */
9311 18124, /* B2 = 0.553101 */
9312 -17246, /* B1 = -1.052673 */
9313 18124, /* B0 = 0.553101 */
9314 7, /* Internal filter scaling */
9315 159, /* Minimum in-band energy threshold */
9316 21, /* 21/32 in-band to broad-band ratio */
9317 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9320 30796, /* A1 = -1.879639 */
9321 -32603, /* A2 = 0.994965 */
9322 -254, /* B2 = -0.007762 */
9323 0, /* B1 = 0.000000 */
9324 254, /* B0 = 0.007762 */
9325 30793, /* A1 = -1.879456 */
9326 -32692, /* A2 = 0.997711 */
9327 18934, /* B2 = 0.577820 */
9328 -17751, /* B1 = -1.083496 */
9329 18934, /* B0 = 0.577820 */
9330 30882, /* A1 = -1.884888 */
9331 -32694, /* A2 = 0.997772 */
9332 1858, /* B2 = 0.056713 */
9333 -1758, /* B1 = -0.107357 */
9334 1858, /* B0 = 0.056713 */
9335 5, /* Internal filter scaling */
9336 159, /* Minimum in-band energy threshold */
9337 21, /* 21/32 in-band to broad-band ratio */
9338 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9341 30641, /* A1 = 1.870239 */
9342 -32458, /* A2 = -0.99057 */
9343 -155, /* B2 = -0.004735 */
9345 155, /* B0 = 0.004735 */
9346 30631, /* A1 = 1.869568 */
9347 -32630, /* A2 = -0.995789 */
9348 11453, /* B2 = 0.349548 */
9349 -10666, /* B1 = -0.651001 */
9350 11453, /* B0 = 0.349548 */
9351 30810, /* A1 = 1.880554 */
9352 -32634, /* A2 = -0.995941 */
9353 12237, /* B2 = 0.373474 */
9354 -11588, /* B1 = -0.707336 */
9355 12237, /* B0 = 0.373474 */
9356 7, /* Internal filter scaling */
9357 159, /* Minimum in-band energy threshold */
9358 21, /* 21/32 in-band to broad-band ratio */
9359 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9362 30367, /* A1 = 1.853455 */
9363 -32147, /* A2 = -0.981079 */
9364 -495, /* B2 = -0.015113 */
9366 495, /* B0 = 0.015113 */
9367 30322, /* A1 = 1.850769 */
9368 -32543, /* A2 = -0.993134 */
9369 10031, /* B2 = 0.306152 */
9370 -9252, /* B1 = -0.564728 */
9371 10031, /* B0 = 0.306152 */
9372 30770, /* A1 = 1.878052 */
9373 -32563, /* A2 = -0.993774 */
9374 22674, /* B2 = 0.691956 */
9375 -21465, /* B1 = -1.31012 */
9376 22674, /* B0 = 0.691956 */
9377 7, /* Internal filter scaling */
9378 159, /* Minimum in-band energy threshold */
9379 21, /* 21/32 in-band to broad-band ratio */
9380 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9383 30709, /* A1 = -1.874329 */
9384 -32603, /* A2 = 0.994965 */
9385 -83, /* B2 = -0.002545 */
9386 0, /* B1 = 0.000000 */
9387 83, /* B0 = 0.002545 */
9388 30704, /* A1 = -1.874084 */
9389 -32692, /* A2 = 0.997711 */
9390 10641, /* B2 = 0.324738 */
9391 -9947, /* B1 = -0.607147 */
9392 10641, /* B0 = 0.324738 */
9393 30796, /* A1 = -1.879639 */
9394 -32694, /* A2 = 0.997772 */
9395 10079, /* B2 = 0.307587 */
9396 9513, /* B1 = 0.580688 */
9397 10079, /* B0 = 0.307587 */
9398 5, /* Internal filter scaling */
9399 159, /* Minimum in-band energy threshold */
9400 21, /* 21/32 in-band to broad-band ratio */
9401 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9404 30664, /* A1 = -1.871643 */
9405 -32603, /* A2 = 0.994965 */
9406 -164, /* B2 = -0.005029 */
9407 0, /* B1 = 0.000000 */
9408 164, /* B0 = 0.005029 */
9409 30661, /* A1 = -1.871399 */
9410 -32692, /* A2 = 0.997711 */
9411 15294, /* B2 = 0.466736 */
9412 -14275, /* B1 = -0.871307 */
9413 15294, /* B0 = 0.466736 */
9414 30751, /* A1 = -1.876953 */
9415 -32694, /* A2 = 0.997772 */
9416 3548, /* B2 = 0.108284 */
9417 -3344, /* B1 = -0.204155 */
9418 3548, /* B0 = 0.108284 */
9419 5, /* Internal filter scaling */
9420 159, /* Minimum in-band energy threshold */
9421 21, /* 21/32 in-band to broad-band ratio */
9422 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9425 30653, /* A1 = -1.870911 */
9426 -32615, /* A2 = 0.995361 */
9427 -209, /* B2 = -0.006382 */
9428 0, /* B1 = 0.000000 */
9429 209, /* B0 = 0.006382 */
9430 30647, /* A1 = -1.870605 */
9431 -32702, /* A2 = 0.997986 */
9432 18971, /* B2 = 0.578979 */
9433 -17716, /* B1 = -1.081299 */
9434 18971, /* B0 = 0.578979 */
9435 30738, /* A1 = -1.876099 */
9436 -32702, /* A2 = 0.998016 */
9437 2967, /* B2 = 0.090561 */
9438 -2793, /* B1 = -0.170502 */
9439 2967, /* B0 = 0.090561 */
9440 5, /* Internal filter scaling */
9441 159, /* Minimum in-band energy threshold */
9442 21, /* 21/32 in-band to broad-band ratio */
9443 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9446 30437, /* A1 = -1.857727 */
9447 -32603, /* A2 = 0.994965 */
9448 -264, /* B2 = -0.008062 */
9449 0, /* B1 = 0.000000 */
9450 264, /* B0 = 0.008062 */
9451 30430, /* A1 = -1.857300 */
9452 -32692, /* A2 = 0.997711 */
9453 21681, /* B2 = 0.661682 */
9454 -20082, /* B1 = -1.225708 */
9455 21681, /* B0 = 0.661682 */
9456 30526, /* A1 = -1.863220 */
9457 -32694, /* A2 = 0.997742 */
9458 1559, /* B2 = 0.047600 */
9459 -1459, /* B1 = -0.089096 */
9460 1559, /* B0 = 0.047600 */
9461 5, /* Internal filter scaling */
9462 159, /* Minimum in-band energy threshold */
9463 21, /* 21/32 in-band to broad-band ratio */
9464 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9467 28975, /* A1 = 1.768494 */
9468 -30955, /* A2 = -0.944672 */
9469 -1026, /* B2 = -0.03133 */
9471 1026, /* B0 = 0.03133 */
9472 28613, /* A1 = 1.746399 */
9473 -32089, /* A2 = -0.979309 */
9474 14214, /* B2 = 0.433807 */
9475 -12202, /* B1 = -0.744812 */
9476 14214, /* B0 = 0.433807 */
9477 30243, /* A1 = 1.845947 */
9478 -32238, /* A2 = -0.983856 */
9479 24825, /* B2 = 0.757629 */
9480 -23402, /* B1 = -1.428345 */
9481 24825, /* B0 = 0.757629 */
9482 7, /* Internal filter scaling */
9483 159, /* Minimum in-band energy threshold */
9484 21, /* 21/32 in-band to broad-band ratio */
9485 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9488 30257, /* A1 = -1.846741 */
9489 -32605, /* A2 = 0.995056 */
9490 -249, /* B2 = -0.007625 */
9491 0, /* B1 = 0.000000 */
9492 249, /* B0 = 0.007625 */
9493 30247, /* A1 = -1.846191 */
9494 -32694, /* A2 = 0.997772 */
9495 18088, /* B2 = 0.552002 */
9496 -16652, /* B1 = -1.016418 */
9497 18088, /* B0 = 0.552002 */
9498 30348, /* A1 = -1.852295 */
9499 -32696, /* A2 = 0.997803 */
9500 2099, /* B2 = 0.064064 */
9501 -1953, /* B1 = -0.119202 */
9502 2099, /* B0 = 0.064064 */
9503 5, /* Internal filter scaling */
9504 159, /* Minimum in-band energy threshold */
9505 21, /* 21/32 in-band to broad-band ratio */
9506 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9509 30202, /* A1 = -1.843431 */
9510 -32624, /* A2 = 0.995622 */
9511 -413, /* B2 = -0.012622 */
9512 0, /* B1 = 0.000000 */
9513 413, /* B0 = 0.012622 */
9514 30191, /* A1 = -1.842721 */
9515 -32714, /* A2 = 0.998364 */
9516 25954, /* B2 = 0.792057 */
9517 -23890, /* B1 = -1.458131 */
9518 25954, /* B0 = 0.792057 */
9519 30296, /* A1 = -1.849172 */
9520 -32715, /* A2 = 0.998397 */
9521 2007, /* B2 = 0.061264 */
9522 -1860, /* B1 = -0.113568 */
9523 2007, /* B0 = 0.061264 */
9524 5, /* Internal filter scaling */
9525 159, /* Minimum in-band energy threshold */
9526 21, /* 21/32 in-band to broad-band ratio */
9527 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9530 30001, /* A1 = -1.831116 */
9531 -32613, /* A2 = 0.995270 */
9532 -155, /* B2 = -0.004750 */
9533 0, /* B1 = 0.000000 */
9534 155, /* B0 = 0.004750 */
9535 29985, /* A1 = -1.830200 */
9536 -32710, /* A2 = 0.998260 */
9537 6584, /* B2 = 0.200928 */
9538 -6018, /* B1 = -0.367355 */
9539 6584, /* B0 = 0.200928 */
9540 30105, /* A1 = -1.837524 */
9541 -32712, /* A2 = 0.998291 */
9542 23812, /* B2 = 0.726685 */
9543 -21936, /* B1 = -1.338928 */
9544 23812, /* B0 = 0.726685 */
9545 5, /* Internal filter scaling */
9546 159, /* Minimum in-band energy threshold */
9547 21, /* 21/32 in-band to broad-band ratio */
9548 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9551 29964, /* A1 = -1.828918 */
9552 -32601, /* A2 = 0.994904 */
9553 -101, /* B2 = -0.003110 */
9554 0, /* B1 = 0.000000 */
9555 101, /* B0 = 0.003110 */
9556 29949, /* A1 = -1.827942 */
9557 -32700, /* A2 = 0.997925 */
9558 11041, /* B2 = 0.336975 */
9559 -10075, /* B1 = -0.614960 */
9560 11041, /* B0 = 0.336975 */
9561 30070, /* A1 = -1.835388 */
9562 -32702, /* A2 = 0.997986 */
9563 16762, /* B2 = 0.511536 */
9564 -15437, /* B1 = -0.942230 */
9565 16762, /* B0 = 0.511536 */
9566 5, /* Internal filter scaling */
9567 159, /* Minimum in-band energy threshold */
9568 21, /* 21/32 in-band to broad-band ratio */
9569 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9572 29936, /* A1 = -1.827209 */
9573 -32584, /* A2 = 0.994415 */
9574 -91, /* B2 = -0.002806 */
9575 0, /* B1 = 0.000000 */
9576 91, /* B0 = 0.002806 */
9577 29921, /* A1 = -1.826233 */
9578 -32688, /* A2 = 0.997559 */
9579 11449, /* B2 = 0.349396 */
9580 -10426, /* B1 = -0.636383 */
9581 11449, /* B0 = 0.349396 */
9582 30045, /* A1 = -1.833862 */
9583 -32688, /* A2 = 0.997589 */
9584 13055, /* B2 = 0.398407 */
9585 -12028, /* B1 = -0.734161 */
9586 13055, /* B0 = 0.398407 */
9587 5, /* Internal filter scaling */
9588 159, /* Minimum in-band energy threshold */
9589 21, /* 21/32 in-band to broad-band ratio */
9590 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9593 28499, /* A1 = 1.739441 */
9594 -31129, /* A2 = -0.949982 */
9595 -849, /* B2 = -0.025922 */
9597 849, /* B0 = 0.025922 */
9598 28128, /* A1 = 1.716797 */
9599 -32130, /* A2 = -0.98056 */
9600 14556, /* B2 = 0.444214 */
9601 -12251, /* B1 = -0.747772 */
9602 14556, /* B0 = 0.444244 */
9603 29667, /* A1 = 1.81073 */
9604 -32244, /* A2 = -0.984039 */
9605 23038, /* B2 = 0.703064 */
9606 -21358, /* B1 = -1.303589 */
9607 23040, /* B0 = 0.703125 */
9608 7, /* Internal filter scaling */
9609 159, /* Minimum in-band energy threshold */
9610 21, /* 21/32 in-band to broad-band ratio */
9611 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9614 29271, /* A1 = -1.786560 */
9615 -32599, /* A2 = 0.994873 */
9616 -490, /* B2 = -0.014957 */
9617 0, /* B1 = 0.000000 */
9618 490, /* B0 = 0.014957 */
9619 29246, /* A1 = -1.785095 */
9620 -32700, /* A2 = 0.997925 */
9621 28961, /* B2 = 0.883850 */
9622 -25796, /* B1 = -1.574463 */
9623 28961, /* B0 = 0.883850 */
9624 29383, /* A1 = -1.793396 */
9625 -32700, /* A2 = 0.997955 */
9626 1299, /* B2 = 0.039650 */
9627 -1169, /* B1 = -0.071396 */
9628 1299, /* B0 = 0.039650 */
9629 5, /* Internal filter scaling */
9630 159, /* Minimum in-band energy threshold */
9631 21, /* 21/32 in-band to broad-band ratio */
9632 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9635 29230, /* A1 = -1.784058 */
9636 -32584, /* A2 = 0.994415 */
9637 -418, /* B2 = -0.012757 */
9638 0, /* B1 = 0.000000 */
9639 418, /* B0 = 0.012757 */
9640 29206, /* A1 = -1.782593 */
9641 -32688, /* A2 = 0.997559 */
9642 36556, /* B2 = 1.115601 */
9643 -32478, /* B1 = -1.982300 */
9644 36556, /* B0 = 1.115601 */
9645 29345, /* A1 = -1.791077 */
9646 -32688, /* A2 = 0.997589 */
9647 897, /* B2 = 0.027397 */
9648 -808, /* B1 = -0.049334 */
9649 897, /* B0 = 0.027397 */
9650 5, /* Internal filter scaling */
9651 159, /* Minimum in-band energy threshold */
9652 21, /* 21/32 in-band to broad-band ratio */
9653 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9656 29116, /* A1 = -1.777100 */
9657 -32603, /* A2 = 0.994965 */
9658 -165, /* B2 = -0.005039 */
9659 0, /* B1 = 0.000000 */
9660 165, /* B0 = 0.005039 */
9661 29089, /* A1 = -1.775452 */
9662 -32708, /* A2 = 0.998199 */
9663 6963, /* B2 = 0.212494 */
9664 -6172, /* B1 = -0.376770 */
9665 6963, /* B0 = 0.212494 */
9666 29237, /* A1 = -1.784485 */
9667 -32710, /* A2 = 0.998230 */
9668 24197, /* B2 = 0.738464 */
9669 -21657, /* B1 = -1.321899 */
9670 24197, /* B0 = 0.738464 */
9671 5, /* Internal filter scaling */
9672 159, /* Minimum in-band energy threshold */
9673 21, /* 21/32 in-band to broad-band ratio */
9674 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9677 28376, /* A1 = -1.731934 */
9678 -32567, /* A2 = 0.993896 */
9679 -363, /* B2 = -0.011102 */
9680 0, /* B1 = 0.000000 */
9681 363, /* B0 = 0.011102 */
9682 28337, /* A1 = -1.729614 */
9683 -32683, /* A2 = 0.997434 */
9684 21766, /* B2 = 0.664246 */
9685 -18761, /* B1 = -1.145081 */
9686 21766, /* B0 = 0.664246 */
9687 28513, /* A1 = -1.740356 */
9688 -32686, /* A2 = 0.997498 */
9689 2509, /* B2 = 0.076584 */
9690 -2196, /* B1 = -0.134041 */
9691 2509, /* B0 = 0.076584 */
9692 5, /* Internal filter scaling */
9693 159, /* Minimum in-band energy threshold */
9694 21, /* 21/32 in-band to broad-band ratio */
9695 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9698 27844, /* A1 = -1.699463 */
9699 -32563, /* A2 = 0.993744 */
9700 -366, /* B2 = -0.011187 */
9701 0, /* B1 = 0.000000 */
9702 366, /* B0 = 0.011187 */
9703 27797, /* A1 = -1.696655 */
9704 -32686, /* A2 = 0.997498 */
9705 22748, /* B2 = 0.694214 */
9706 -19235, /* B1 = -1.174072 */
9707 22748, /* B0 = 0.694214 */
9708 27995, /* A1 = -1.708740 */
9709 -32688, /* A2 = 0.997559 */
9710 2964, /* B2 = 0.090477 */
9711 -2546, /* B1 = -0.155449 */
9712 2964, /* B0 = 0.090477 */
9713 5, /* Internal filter scaling */
9714 159, /* Minimum in-band energy threshold */
9715 21, /* 21/32 in-band to broad-band ratio */
9716 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9719 27297, /* A1 = -1.666077 */
9720 -32551, /* A2 = 0.993408 */
9721 -345, /* B2 = -0.010540 */
9722 0, /* B1 = 0.000000 */
9723 345, /* B0 = 0.010540 */
9724 27240, /* A1 = -1.662598 */
9725 -32683, /* A2 = 0.997406 */
9726 22560, /* B2 = 0.688477 */
9727 -18688, /* B1 = -1.140625 */
9728 22560, /* B0 = 0.688477 */
9729 27461, /* A1 = -1.676147 */
9730 -32684, /* A2 = 0.997467 */
9731 3541, /* B2 = 0.108086 */
9732 -2985, /* B1 = -0.182220 */
9733 3541, /* B0 = 0.108086 */
9734 5, /* Internal filter scaling */
9735 159, /* Minimum in-band energy threshold */
9736 21, /* 21/32 in-band to broad-band ratio */
9737 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9740 27155, /* A1 = -1.657410 */
9741 -32551, /* A2 = 0.993408 */
9742 -462, /* B2 = -0.014117 */
9743 0, /* B1 = 0.000000 */
9744 462, /* B0 = 0.014117 */
9745 27097, /* A1 = -1.653870 */
9746 -32683, /* A2 = 0.997406 */
9747 32495, /* B2 = 0.991699 */
9748 -26776, /* B1 = -1.634338 */
9749 32495, /* B0 = 0.991699 */
9750 27321, /* A1 = -1.667542 */
9751 -32684, /* A2 = 0.997467 */
9752 1835, /* B2 = 0.056007 */
9753 -1539, /* B1 = -0.093948 */
9754 1835, /* B0 = 0.056007 */
9755 5, /* Internal filter scaling */
9756 159, /* Minimum in-band energy threshold */
9757 21, /* 21/32 in-band to broad-band ratio */
9758 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9761 19298, /* A1 = 1.177917 */
9762 -24471, /* A2 = -0.746796 */
9763 -4152, /* B2 = -0.126709 */
9765 4152, /* B0 = 0.126709 */
9766 12902, /* A1 = 0.787476 */
9767 -29091, /* A2 = -0.887817 */
9768 12491, /* B2 = 0.38121 */
9769 -1794, /* B1 = -0.109528 */
9770 12494, /* B0 = 0.381317 */
9771 26291, /* A1 = 1.604736 */
9772 -30470, /* A2 = -0.929901 */
9773 28859, /* B2 = 0.880737 */
9774 -26084, /* B1 = -1.592102 */
9775 28861, /* B0 = 0.880798 */
9776 7, /* Internal filter scaling */
9777 159, /* Minimum in-band energy threshold */
9778 21, /* 21/32 in-band to broad-band ratio */
9779 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9782 26867, /* A1 = -1.639832 */
9783 -32551, /* A2 = 0.993408 */
9784 -123, /* B2 = -0.003755 */
9785 0, /* B1 = 0.000000 */
9786 123, /* B0 = 0.003755 */
9787 26805, /* A1 = -1.636108 */
9788 -32683, /* A2 = 0.997406 */
9789 17297, /* B2 = 0.527863 */
9790 -14096, /* B1 = -0.860382 */
9791 17297, /* B0 = 0.527863 */
9792 27034, /* A1 = -1.650085 */
9793 -32684, /* A2 = 0.997467 */
9794 12958, /* B2 = 0.395477 */
9795 -10756, /* B1 = -0.656525 */
9796 12958, /* B0 = 0.395477 */
9797 5, /* Internal filter scaling */
9798 159, /* Minimum in-band energy threshold */
9799 21, /* 21/32 in-band to broad-band ratio */
9800 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9803 26413, /* A1 = -1.612122 */
9804 -32547, /* A2 = 0.993286 */
9805 -223, /* B2 = -0.006825 */
9806 0, /* B1 = 0.000000 */
9807 223, /* B0 = 0.006825 */
9808 26342, /* A1 = -1.607849 */
9809 -32686, /* A2 = 0.997498 */
9810 6391, /* B2 = 0.195053 */
9811 -5120, /* B1 = -0.312531 */
9812 6391, /* B0 = 0.195053 */
9813 26593, /* A1 = -1.623108 */
9814 -32688, /* A2 = 0.997559 */
9815 23681, /* B2 = 0.722717 */
9816 -19328, /* B1 = -1.179688 */
9817 23681, /* B0 = 0.722717 */
9818 5, /* Internal filter scaling */
9819 159, /* Minimum in-band energy threshold */
9820 21, /* 21/32 in-band to broad-band ratio */
9821 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9824 26168, /* A1 = -1.597209 */
9825 -32528, /* A2 = 0.992706 */
9826 -235, /* B2 = -0.007182 */
9827 0, /* B1 = 0.000000 */
9828 235, /* B0 = 0.007182 */
9829 26092, /* A1 = -1.592590 */
9830 -32675, /* A2 = 0.997192 */
9831 20823, /* B2 = 0.635498 */
9832 -16510, /* B1 = -1.007751 */
9833 20823, /* B0 = 0.635498 */
9834 26363, /* A1 = -1.609070 */
9835 -32677, /* A2 = 0.997253 */
9836 6739, /* B2 = 0.205688 */
9837 -5459, /* B1 = -0.333206 */
9838 6739, /* B0 = 0.205688 */
9839 5, /* Internal filter scaling */
9840 159, /* Minimum in-band energy threshold */
9841 21, /* 21/32 in-band to broad-band ratio */
9842 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9845 25641, /* A1 = -1.565063 */
9846 -32536, /* A2 = 0.992950 */
9847 -121, /* B2 = -0.003707 */
9848 0, /* B1 = 0.000000 */
9849 121, /* B0 = 0.003707 */
9850 25560, /* A1 = -1.560059 */
9851 -32684, /* A2 = 0.997437 */
9852 18341, /* B2 = 0.559753 */
9853 -14252, /* B1 = -0.869904 */
9854 18341, /* B0 = 0.559753 */
9855 25837, /* A1 = -1.577026 */
9856 -32684, /* A2 = 0.997467 */
9857 16679, /* B2 = 0.509003 */
9858 -13232, /* B1 = -0.807648 */
9859 16679, /* B0 = 0.509003 */
9860 5, /* Internal filter scaling */
9861 159, /* Minimum in-band energy threshold */
9862 21, /* 21/32 in-band to broad-band ratio */
9863 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9866 16415, /* A1 = 1.001953 */
9867 -23669, /* A2 = -0.722321 */
9868 -4549, /* B2 = -0.138847 */
9870 4549, /* B0 = 0.138847 */
9871 8456, /* A1 = 0.516174 */
9872 -28996, /* A2 = -0.884918 */
9873 13753, /* B2 = 0.419724 */
9874 -12, /* B1 = -0.000763 */
9875 13757, /* B0 = 0.419846 */
9876 24632, /* A1 = 1.503418 */
9877 -30271, /* A2 = -0.923828 */
9878 29070, /* B2 = 0.887146 */
9879 -25265, /* B1 = -1.542114 */
9880 29073, /* B0 = 0.887268 */
9881 7, /* Internal filter scaling */
9882 159, /* Minimum in-band energy threshold */
9883 21, /* 21/32 in-band to broad-band ratio */
9884 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9887 24806, /* A1 = -1.514099 */
9888 -32501, /* A2 = 0.991852 */
9889 -326, /* B2 = -0.009969 */
9890 0, /* B1 = 0.000000 */
9891 326, /* B0 = 0.009969 */
9892 24709, /* A1 = -1.508118 */
9893 -32659, /* A2 = 0.996674 */
9894 20277, /* B2 = 0.618835 */
9895 -15182, /* B1 = -0.926636 */
9896 20277, /* B0 = 0.618835 */
9897 25022, /* A1 = -1.527222 */
9898 -32661, /* A2 = 0.996735 */
9899 4320, /* B2 = 0.131836 */
9900 -3331, /* B1 = -0.203339 */
9901 4320, /* B0 = 0.131836 */
9902 5, /* Internal filter scaling */
9903 159, /* Minimum in-band energy threshold */
9904 21, /* 21/32 in-band to broad-band ratio */
9905 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9908 19776, /* A1 = 1.207092 */
9909 -27437, /* A2 = -0.837341 */
9910 -2666, /* B2 = -0.081371 */
9912 2666, /* B0 = 0.081371 */
9913 16302, /* A1 = 0.995026 */
9914 -30354, /* A2 = -0.926361 */
9915 10389, /* B2 = 0.317062 */
9916 -3327, /* B1 = -0.203064 */
9917 10389, /* B0 = 0.317062 */
9918 24299, /* A1 = 1.483154 */
9919 -30930, /* A2 = -0.943909 */
9920 25016, /* B2 = 0.763428 */
9921 -21171, /* B1 = -1.292236 */
9922 25016, /* B0 = 0.763428 */
9923 7, /* Internal filter scaling */
9924 159, /* Minimum in-band energy threshold */
9925 21, /* 21/32 in-band to broad-band ratio */
9926 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9929 20554, /* A1 = 1.254517 */
9930 -28764, /* A2 = -0.877838 */
9931 -2048, /* B2 = -0.062515 */
9933 2048, /* B0 = 0.062515 */
9934 18209, /* A1 = 1.11145 */
9935 -30951, /* A2 = -0.94458 */
9936 9390, /* B2 = 0.286575 */
9937 -3955, /* B1 = -0.241455 */
9938 9390, /* B0 = 0.286575 */
9939 23902, /* A1 = 1.458923 */
9940 -31286, /* A2 = -0.954803 */
9941 23252, /* B2 = 0.709595 */
9942 -19132, /* B1 = -1.167725 */
9943 23252, /* B0 = 0.709595 */
9944 7, /* Internal filter scaling */
9945 159, /* Minimum in-band energy threshold */
9946 21, /* 21/32 in-band to broad-band ratio */
9947 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9950 17543, /* A1 = 1.07074 */
9951 -26220, /* A2 = -0.800201 */
9952 -3298, /* B2 = -0.100647 */
9954 3298, /* B0 = 0.100647 */
9955 12423, /* A1 = 0.75827 */
9956 -30036, /* A2 = -0.916626 */
9957 12651, /* B2 = 0.386078 */
9958 -2444, /* B1 = -0.14917 */
9959 12653, /* B0 = 0.386154 */
9960 23518, /* A1 = 1.435425 */
9961 -30745, /* A2 = -0.938293 */
9962 27282, /* B2 = 0.832581 */
9963 -22529, /* B1 = -1.375122 */
9964 27286, /* B0 = 0.832703 */
9965 7, /* Internal filter scaling */
9966 159, /* Minimum in-band energy threshold */
9967 21, /* 21/32 in-band to broad-band ratio */
9968 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9971 24104, /* A1 = -1.471252 */
9972 -32507, /* A2 = 0.992065 */
9973 -351, /* B2 = -0.010722 */
9974 0, /* B1 = 0.000000 */
9975 351, /* B0 = 0.010722 */
9976 23996, /* A1 = -1.464600 */
9977 -32671, /* A2 = 0.997040 */
9978 22848, /* B2 = 0.697266 */
9979 -16639, /* B1 = -1.015564 */
9980 22848, /* B0 = 0.697266 */
9981 24332, /* A1 = -1.485168 */
9982 -32673, /* A2 = 0.997101 */
9983 4906, /* B2 = 0.149727 */
9984 -3672, /* B1 = -0.224174 */
9985 4906, /* B0 = 0.149727 */
9986 5, /* Internal filter scaling */
9987 159, /* Minimum in-band energy threshold */
9988 21, /* 21/32 in-band to broad-band ratio */
9989 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9992 23967, /* A1 = -1.462830 */
9993 -32507, /* A2 = 0.992065 */
9994 -518, /* B2 = -0.015821 */
9995 0, /* B1 = 0.000000 */
9996 518, /* B0 = 0.015821 */
9997 23856, /* A1 = -1.456055 */
9998 -32671, /* A2 = 0.997040 */
9999 26287, /* B2 = 0.802246 */
10000 -19031, /* B1 = -1.161560 */
10001 26287, /* B0 = 0.802246 */
10002 24195, /* A1 = -1.476746 */
10003 -32673, /* A2 = 0.997101 */
10004 2890, /* B2 = 0.088196 */
10005 -2151, /* B1 = -0.131317 */
10006 2890, /* B0 = 0.088196 */
10007 5, /* Internal filter scaling */
10008 159, /* Minimum in-band energy threshold */
10009 21, /* 21/32 in-band to broad-band ratio */
10010 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10012 { /* f950_1400[] */
10013 18294, /* A1 = 1.116638 */
10014 -26962, /* A2 = -0.822845 */
10015 -2914, /* B2 = -0.088936 */
10017 2914, /* B0 = 0.088936 */
10018 14119, /* A1 = 0.861786 */
10019 -30227, /* A2 = -0.922455 */
10020 11466, /* B2 = 0.349945 */
10021 -2833, /* B1 = -0.172943 */
10022 11466, /* B0 = 0.349945 */
10023 23431, /* A1 = 1.430115 */
10024 -30828, /* A2 = -0.940796 */
10025 25331, /* B2 = 0.773071 */
10026 -20911, /* B1 = -1.276367 */
10027 25331, /* B0 = 0.773071 */
10028 7, /* Internal filter scaling */
10029 159, /* Minimum in-band energy threshold */
10030 21, /* 21/32 in-band to broad-band ratio */
10031 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10034 23521, /* A1 = -1.435608 */
10035 -32489, /* A2 = 0.991516 */
10036 -193, /* B2 = -0.005915 */
10037 0, /* B1 = 0.000000 */
10038 193, /* B0 = 0.005915 */
10039 23404, /* A1 = -1.428467 */
10040 -32655, /* A2 = 0.996582 */
10041 17740, /* B2 = 0.541412 */
10042 -12567, /* B1 = -0.767029 */
10043 17740, /* B0 = 0.541412 */
10044 23753, /* A1 = -1.449829 */
10045 -32657, /* A2 = 0.996613 */
10046 9090, /* B2 = 0.277405 */
10047 -6662, /* B1 = -0.406647 */
10048 9090, /* B0 = 0.277405 */
10049 5, /* Internal filter scaling */
10050 159, /* Minimum in-band energy threshold */
10051 21, /* 21/32 in-band to broad-band ratio */
10052 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10055 23071, /* A1 = -1.408203 */
10056 -32489, /* A2 = 0.991516 */
10057 -293, /* B2 = -0.008965 */
10058 0, /* B1 = 0.000000 */
10059 293, /* B0 = 0.008965 */
10060 22951, /* A1 = -1.400818 */
10061 -32655, /* A2 = 0.996582 */
10062 5689, /* B2 = 0.173645 */
10063 -3951, /* B1 = -0.241150 */
10064 5689, /* B0 = 0.173645 */
10065 23307, /* A1 = -1.422607 */
10066 -32657, /* A2 = 0.996613 */
10067 18692, /* B2 = 0.570435 */
10068 -13447, /* B1 = -0.820770 */
10069 18692, /* B0 = 0.570435 */
10070 5, /* Internal filter scaling */
10071 159, /* Minimum in-band energy threshold */
10072 21, /* 21/32 in-band to broad-band ratio */
10073 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10076 22701, /* A1 = -1.385620 */
10077 -32474, /* A2 = 0.991058 */
10078 -292, /* B2 = -0.008933 */
10079 0, /*163840 , B1 = 10.000000 */
10080 292, /* B0 = 0.008933 */
10081 22564, /* A1 = -1.377258 */
10082 -32655, /* A2 = 0.996552 */
10083 20756, /* B2 = 0.633423 */
10084 -14176, /* B1 = -0.865295 */
10085 20756, /* B0 = 0.633423 */
10086 22960, /* A1 = -1.401428 */
10087 -32657, /* A2 = 0.996613 */
10088 6520, /* B2 = 0.198990 */
10089 -4619, /* B1 = -0.281937 */
10090 6520, /* B0 = 0.198990 */
10091 5, /* Internal filter scaling */
10092 159, /* Minimum in-band energy threshold */
10093 21, /* 21/32 in-band to broad-band ratio */
10094 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10097 22142, /* A1 = -1.351501 */
10098 -32474, /* A2 = 0.991058 */
10099 -147, /* B2 = -0.004493 */
10100 0, /* B1 = 0.000000 */
10101 147, /* B0 = 0.004493 */
10102 22000, /* A1 = -1.342834 */
10103 -32655, /* A2 = 0.996552 */
10104 15379, /* B2 = 0.469360 */
10105 -10237, /* B1 = -0.624847 */
10106 15379, /* B0 = 0.469360 */
10107 22406, /* A1 = -1.367554 */
10108 -32657, /* A2 = 0.996613 */
10109 17491, /* B2 = 0.533783 */
10110 -12096, /* B1 = -0.738312 */
10111 17491, /* B0 = 0.533783 */
10112 5, /* Internal filter scaling */
10113 159, /* Minimum in-band energy threshold */
10114 21, /* 21/32 in-band to broad-band ratio */
10115 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10117 { /* f1100_1750[] */
10118 12973, /* A1 = 0.79184 */
10119 -24916, /* A2 = -0.760376 */
10120 6655, /* B2 = 0.203102 */
10121 367, /* B1 = 0.0224 */
10122 6657, /* B0 = 0.203171 */
10123 5915, /* A1 = 0.361053 */
10124 -29560, /* A2 = -0.90213 */
10125 -7777, /* B2 = -0.23735 */
10127 7777, /* B0 = 0.23735 */
10128 20510, /* A1 = 1.251892 */
10129 -30260, /* A2 = -0.923462 */
10130 26662, /* B2 = 0.81366 */
10131 -20573, /* B1 = -1.255737 */
10132 26668, /* B0 = 0.813843 */
10133 7, /* Internal filter scaling */
10134 159, /* Minimum in-band energy threshold */
10135 21, /* 21/32 in-band to broad-band ratio */
10136 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10139 20392, /* A1 = -1.244629 */
10140 -32460, /* A2 = 0.990601 */
10141 -270, /* B2 = -0.008240 */
10142 0, /* B1 = 0.000000 */
10143 270, /* B0 = 0.008240 */
10144 20218, /* A1 = -1.234009 */
10145 -32655, /* A2 = 0.996582 */
10146 21337, /* B2 = 0.651154 */
10147 -13044, /* B1 = -0.796143 */
10148 21337, /* B0 = 0.651154 */
10149 20684, /* A1 = -1.262512 */
10150 -32657, /* A2 = 0.996643 */
10151 8572, /* B2 = 0.261612 */
10152 -5476, /* B1 = -0.334244 */
10153 8572, /* B0 = 0.261612 */
10154 5, /* Internal filter scaling */
10155 159, /* Minimum in-band energy threshold */
10156 21, /* 21/32 in-band to broad-band ratio */
10157 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10160 19159, /* A1 = -1.169373 */
10161 -32456, /* A2 = 0.990509 */
10162 -335, /* B2 = -0.010252 */
10163 0, /* B1 = 0.000000 */
10164 335, /* B0 = 0.010252 */
10165 18966, /* A1 = -1.157593 */
10166 -32661, /* A2 = 0.996735 */
10167 6802, /* B2 = 0.207588 */
10168 -3900, /* B1 = -0.238098 */
10169 6802, /* B0 = 0.207588 */
10170 19467, /* A1 = -1.188232 */
10171 -32661, /* A2 = 0.996765 */
10172 25035, /* B2 = 0.764008 */
10173 -15049, /* B1 = -0.918579 */
10174 25035, /* B0 = 0.764008 */
10175 5, /* Internal filter scaling */
10176 159, /* Minimum in-band energy threshold */
10177 21, /* 21/32 in-band to broad-band ratio */
10178 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10181 18976, /* A1 = -1.158264 */
10182 -32439, /* A2 = 0.989990 */
10183 -183, /* B2 = -0.005588 */
10184 0, /* B1 = 0.000000 */
10185 183, /* B0 = 0.005588 */
10186 18774, /* A1 = -1.145874 */
10187 -32650, /* A2 = 0.996429 */
10188 15468, /* B2 = 0.472076 */
10189 -8768, /* B1 = -0.535217 */
10190 15468, /* B0 = 0.472076 */
10191 19300, /* A1 = -1.177979 */
10192 -32652, /* A2 = 0.996490 */
10193 19840, /* B2 = 0.605499 */
10194 -11842, /* B1 = -0.722809 */
10195 19840, /* B0 = 0.605499 */
10196 5, /* Internal filter scaling */
10197 159, /* Minimum in-band energy threshold */
10198 21, /* 21/32 in-band to broad-band ratio */
10199 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10202 16357, /* A1 = -0.998413 */
10203 -32368, /* A2 = 0.987793 */
10204 -217, /* B2 = -0.006652 */
10205 0, /* B1 = 0.000000 */
10206 217, /* B0 = 0.006652 */
10207 16107, /* A1 = -0.983126 */
10208 -32601, /* A2 = 0.994904 */
10209 11602, /* B2 = 0.354065 */
10210 -5555, /* B1 = -0.339111 */
10211 11602, /* B0 = 0.354065 */
10212 16722, /* A1 = -1.020630 */
10213 -32603, /* A2 = 0.994965 */
10214 15574, /* B2 = 0.475311 */
10215 -8176, /* B1 = -0.499069 */
10216 15574, /* B0 = 0.475311 */
10217 5, /* Internal filter scaling */
10218 159, /* Minimum in-band energy threshold */
10219 21, /* 21/32 in-band to broad-band ratio */
10220 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10223 16234, /* A1 = -0.990875 */
10224 32404, /* A2 = -0.988922 */
10225 -193, /* B2 = -0.005908 */
10226 0, /* B1 = 0.000000 */
10227 193, /* B0 = 0.005908 */
10228 15986, /* A1 = -0.975769 */
10229 -32632, /* A2 = 0.995880 */
10230 18051, /* B2 = 0.550903 */
10231 -8658, /* B1 = -0.528473 */
10232 18051, /* B0 = 0.550903 */
10233 16591, /* A1 = -1.012695 */
10234 -32634, /* A2 = 0.995941 */
10235 15736, /* B2 = 0.480240 */
10236 -8125, /* B1 = -0.495926 */
10237 15736, /* B0 = 0.480240 */
10238 5, /* Internal filter scaling */
10239 159, /* Minimum in-band energy threshold */
10240 21, /* 21/32 in-band to broad-band ratio */
10241 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10244 15564, /* A1 = -0.949982 */
10245 -32404, /* A2 = 0.988922 */
10246 -269, /* B2 = -0.008216 */
10247 0, /* B1 = 0.000000 */
10248 269, /* B0 = 0.008216 */
10249 15310, /* A1 = -0.934479 */
10250 -32632, /* A2 = 0.995880 */
10251 10815, /* B2 = 0.330063 */
10252 -4962, /* B1 = -0.302887 */
10253 10815, /* B0 = 0.330063 */
10254 15924, /* A1 = -0.971924 */
10255 -32634, /* A2 = 0.995941 */
10256 18880, /* B2 = 0.576172 */
10257 -9364, /* B1 = -0.571594 */
10258 18880, /* B0 = 0.576172 */
10259 5, /* Internal filter scaling */
10260 159, /* Minimum in-band energy threshold */
10261 21, /* 21/32 in-band to broad-band ratio */
10262 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10265 15247, /* A1 = -0.930603 */
10266 -32397, /* A2 = 0.988708 */
10267 -244, /* B2 = -0.007451 */
10268 0, /* B1 = 0.000000 */
10269 244, /* B0 = 0.007451 */
10270 14989, /* A1 = -0.914886 */
10271 -32627, /* A2 = 0.995697 */
10272 18961, /* B2 = 0.578644 */
10273 -8498, /* B1 = -0.518707 */
10274 18961, /* B0 = 0.578644 */
10275 15608, /* A1 = -0.952667 */
10276 -32628, /* A2 = 0.995758 */
10277 11145, /* B2 = 0.340134 */
10278 -5430, /* B1 = -0.331467 */
10279 11145, /* B0 = 0.340134 */
10280 5, /* Internal filter scaling */
10281 159, /* Minimum in-band energy threshold */
10282 21, /* 21/32 in-band to broad-band ratio */
10283 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10286 14780, /* A1 = -0.902130 */
10287 -32393, /* A2 = 0.988586 */
10288 -396, /* B2 = -0.012086 */
10289 0, /* B1 = 0.000000 */
10290 396, /* B0 = 0.012086 */
10291 14510, /* A1 = -0.885651 */
10292 -32630, /* A2 = 0.995819 */
10293 6326, /* B2 = 0.193069 */
10294 -2747, /* B1 = -0.167671 */
10295 6326, /* B0 = 0.193069 */
10296 15154, /* A1 = -0.924957 */
10297 -32632, /* A2 = 0.995850 */
10298 23235, /* B2 = 0.709076 */
10299 -10983, /* B1 = -0.670380 */
10300 23235, /* B0 = 0.709076 */
10301 5, /* Internal filter scaling */
10302 159, /* Minimum in-band energy threshold */
10303 21, /* 21/32 in-band to broad-band ratio */
10304 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10307 13005, /* A1 = -0.793793 */
10308 -32368, /* A2 = 0.987823 */
10309 -500, /* B2 = -0.015265 */
10310 0, /* B1 = 0.000000 */
10311 500, /* B0 = 0.015265 */
10312 12708, /* A1 = -0.775665 */
10313 -32615, /* A2 = 0.995331 */
10314 11420, /* B2 = 0.348526 */
10315 -4306, /* B1 = -0.262833 */
10316 11420, /* B0 = 0.348526 */
10317 13397, /* A1 = -0.817688 */
10318 -32615, /* A2 = 0.995361 */
10319 9454, /* B2 = 0.288528 */
10320 -3981, /* B1 = -0.243027 */
10321 9454, /* B0 = 0.288528 */
10322 5, /* Internal filter scaling */
10323 159, /* Minimum in-band energy threshold */
10324 21, /* 21/32 in-band to broad-band ratio */
10325 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10328 10046, /* A1 = -0.613190 */
10329 -32331, /* A2 = 0.986694 */
10330 -455, /* B2 = -0.013915 */
10331 0, /* B1 = 0.000000 */
10332 455, /* B0 = 0.013915 */
10333 9694, /* A1 = -0.591705 */
10334 -32601, /* A2 = 0.994934 */
10335 6023, /* B2 = 0.183815 */
10336 -1708, /* B1 = -0.104279 */
10337 6023, /* B0 = 0.183815 */
10338 10478, /* A1 = -0.639587 */
10339 -32603, /* A2 = 0.994965 */
10340 22031, /* B2 = 0.672333 */
10341 -7342, /* B1 = -0.448151 */
10342 22031, /* B0 = 0.672333 */
10343 5, /* Internal filter scaling */
10344 159, /* Minimum in-band energy threshold */
10345 21, /* 21/32 in-band to broad-band ratio */
10346 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10348 { /* f1633_1638[] */
10349 9181, /* A1 = 0.560394 */
10350 -32256, /* A2 = -0.984375 */
10351 -556, /* B2 = -0.016975 */
10353 556, /* B0 = 0.016975 */
10354 8757, /* A1 = 0.534515 */
10355 -32574, /* A2 = -0.99408 */
10356 8443, /* B2 = 0.25769 */
10357 -2135, /* B1 = -0.130341 */
10358 8443, /* B0 = 0.25769 */
10359 9691, /* A1 = 0.591522 */
10360 -32574, /* A2 = -0.99411 */
10361 15446, /* B2 = 0.471375 */
10362 -4809, /* B1 = -0.293579 */
10363 15446, /* B0 = 0.471375 */
10364 7, /* Internal filter scaling */
10365 159, /* Minimum in-band energy threshold */
10366 21, /* 21/32 in-band to broad-band ratio */
10367 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10370 5076, /* A1 = -0.309875 */
10371 -32304, /* A2 = 0.985840 */
10372 -508, /* B2 = -0.015503 */
10373 0, /* B1 = 0.000000 */
10374 508, /* B0 = 0.015503 */
10375 4646, /* A1 = -0.283600 */
10376 -32605, /* A2 = 0.995026 */
10377 6742, /* B2 = 0.205780 */
10378 -878, /* B1 = -0.053635 */
10379 6742, /* B0 = 0.205780 */
10380 5552, /* A1 = -0.338928 */
10381 -32605, /* A2 = 0.995056 */
10382 23667, /* B2 = 0.722260 */
10383 -4297, /* B1 = -0.262329 */
10384 23667, /* B0 = 0.722260 */
10385 5, /* Internal filter scaling */
10386 159, /* Minimum in-band energy threshold */
10387 21, /* 21/32 in-band to broad-band ratio */
10388 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10391 3569, /* A1 = -0.217865 */
10392 -32292, /* A2 = 0.985504 */
10393 -239, /* B2 = -0.007322 */
10394 0, /* B1 = 0.000000 */
10395 239, /* B0 = 0.007322 */
10396 3117, /* A1 = -0.190277 */
10397 -32603, /* A2 = 0.994965 */
10398 18658, /* B2 = 0.569427 */
10399 -1557, /* B1 = -0.095032 */
10400 18658, /* B0 = 0.569427 */
10401 4054, /* A1 = -0.247437 */
10402 -32603, /* A2 = 0.994965 */
10403 18886, /* B2 = 0.576385 */
10404 -2566, /* B1 = -0.156647 */
10405 18886, /* B0 = 0.576385 */
10406 5, /* Internal filter scaling */
10407 159, /* Minimum in-band energy threshold */
10408 21, /* 21/32 in-band to broad-band ratio */
10409 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10412 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10414 unsigned short cmd;
10417 if (jf->filter > 3) {
10420 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10424 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10430 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10433 /* Select the filter (f0 - f3) to use. */
10434 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10437 if (jf->freq < 12 && jf->freq > 3) {
10438 /* Select the frequency for the selected filter. */
10439 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10441 } else if (jf->freq > 11) {
10442 /* We need to load a programmable filter set for undefined */
10443 /* frequencies. So we will point the filter to a programmable set. */
10444 /* Since there are only 4 filters and 4 programmable sets, we will */
10445 /* just point the filter to the same number set and program it for the */
10446 /* frequency we want. */
10447 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10449 if (j->ver.low != 0x12) {
10456 if (ixj_WriteDSPCommand(cmd, j))
10458 for (cnt = 0; cnt < max; cnt++) {
10459 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10463 j->filter_en[jf->filter] = jf->enable;
10467 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10469 unsigned short cmd;
10471 if (jfr->filter > 3) {
10474 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10477 if (!jfr->enable) {
10478 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10483 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10485 /* Select the filter (f0 - f3) to use. */
10486 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10489 /* We need to load a programmable filter set for undefined */
10490 /* frequencies. So we will point the filter to a programmable set. */
10491 /* Since there are only 4 filters and 4 programmable sets, we will */
10492 /* just point the filter to the same number set and program it for the */
10493 /* frequency we want. */
10494 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10496 if (j->ver.low != 0x12) {
10503 if (ixj_WriteDSPCommand(cmd, j))
10505 for (cnt = 0; cnt < max; cnt++) {
10506 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10509 j->filter_en[jfr->filter] = jfr->enable;
10513 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10516 unsigned short data;
10529 if(ti->tone_index > 12 && ti->tone_index < 28)
10531 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10533 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10536 if (ixj_WriteDSPCommand(data, j))
10539 if (ixj_WriteDSPCommand(data, j))