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;
3458 if(j->flags.cidplay) {
3459 for(cnt = 0; cnt < 480; cnt++) {
3460 if (!(cnt % 16) && !IsTxReady(j)) {
3462 while (!IsTxReady(j)) {
3470 dat.word = j->fskdata[j->cidcnt++];
3471 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3472 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3475 if(j->cidcnt >= j->fskdcnt) {
3478 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3479 and there is real audio data in the buffer, we need to throw it away because
3480 we just used it's time slot */
3481 if (j->write_buffer_rp > j->write_buffer_wp) {
3482 j->write_buffer_rp += j->cid_play_frame_size * 2;
3483 if (j->write_buffer_rp >= j->write_buffer_end) {
3484 j->write_buffer_rp = j->write_buffer;
3486 j->write_buffers_empty++;
3487 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3489 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3491 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3492 if (j->write_buffer_wp > j->write_buffer_rp) {
3494 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3496 if (j->write_buffer_rp > j->write_buffer_wp) {
3498 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3499 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3501 if (frame_count >= 1) {
3502 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3505 switch (j->play_mode) {
3506 case PLAYBACK_MODE_ULAW:
3507 case PLAYBACK_MODE_ALAW:
3508 blankword.low = blankword.high = 0xFF;
3510 case PLAYBACK_MODE_8LINEAR:
3511 case PLAYBACK_MODE_16LINEAR:
3513 blankword.low = blankword.high = 0x00;
3515 case PLAYBACK_MODE_8LINEAR_WSS:
3516 blankword.low = blankword.high = 0x80;
3519 for (cnt = 0; cnt < 16; cnt++) {
3520 if (!(cnt % 16) && !IsTxReady(j)) {
3522 while (!IsTxReady(j)) {
3530 outb_p((blankword.low), j->DSPbase + 0x0C);
3531 outb_p((blankword.high), j->DSPbase + 0x0D);
3533 j->flags.play_first_frame = 0;
3534 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3535 for (cnt = 0; cnt < 24; cnt++) {
3539 blankword.low = 0x02;
3540 blankword.high = 0x00;
3543 blankword.low = blankword.high = 0x00;
3545 if (!(cnt % 16) && !IsTxReady(j)) {
3547 while (!IsTxReady(j)) {
3555 outb_p((blankword.low), j->DSPbase + 0x0C);
3556 outb_p((blankword.high), j->DSPbase + 0x0D);
3558 j->flags.play_first_frame = 0;
3560 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3561 if (!(cnt % 16) && !IsTxReady(j)) {
3563 while (!IsTxReady(j)) {
3571 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3572 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3573 if (j->write_buffer_rp[cnt] == 0 &&
3574 j->write_buffer_rp[cnt + 1] == 0 &&
3575 j->write_buffer_rp[cnt + 2] == 0 &&
3576 j->write_buffer_rp[cnt + 3] == 0 &&
3577 j->write_buffer_rp[cnt + 4] == 0 &&
3578 j->write_buffer_rp[cnt + 5] == 0 &&
3579 j->write_buffer_rp[cnt + 6] == 0 &&
3580 j->write_buffer_rp[cnt + 7] == 0 &&
3581 j->write_buffer_rp[cnt + 8] == 0 &&
3582 j->write_buffer_rp[cnt + 9] == 0) {
3583 /* someone is trying to write silence lets make this a type 0 frame. */
3584 outb_p(0x00, j->DSPbase + 0x0C);
3585 outb_p(0x00, j->DSPbase + 0x0D);
3587 /* so all other frames are type 1. */
3588 outb_p(0x01, j->DSPbase + 0x0C);
3589 outb_p(0x00, j->DSPbase + 0x0D);
3592 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3593 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3594 *(j->write_buffer_rp + cnt) = 0;
3595 *(j->write_buffer_rp + cnt + 1) = 0;
3597 j->write_buffer_rp += j->play_frame_size * 2;
3598 if (j->write_buffer_rp >= j->write_buffer_end) {
3599 j->write_buffer_rp = j->write_buffer;
3601 j->write_buffers_empty++;
3602 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3604 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3611 if(j->ixj_signals[SIG_WRITE_READY]) {
3612 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3616 static int idle(IXJ *j)
3618 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3622 if (j->ssr.high || j->ssr.low) {
3626 j->flags.playing = 0;
3628 j->flags.recording = 0;
3633 static int set_base_frame(IXJ *j, int size)
3639 j->cid_play_aec_level = j->aec_level;
3641 for (cnt = 0; cnt < 10; cnt++) {
3645 if (j->ssr.high || j->ssr.low)
3647 if (j->dsp.low != 0x20) {
3651 /* Set Base Frame Size to 240 pg9-10 8021 */
3655 /* Set Base Frame Size to 160 pg9-10 8021 */
3659 /* Set Base Frame Size to 80 pg9-10 8021 */
3670 if (ixj_WriteDSPCommand(cmd, j)) {
3671 j->baseframe.high = j->baseframe.low = 0xFF;
3674 j->baseframe.high = j->ssr.high;
3675 j->baseframe.low = j->ssr.low;
3676 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3677 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3681 ixj_aec_start(j, j->cid_play_aec_level);
3685 static int set_rec_codec(IXJ *j, int rate)
3689 j->rec_codec = rate;
3693 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3694 j->rec_frame_size = 12;
3701 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3702 j->rec_frame_size = 10;
3709 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3710 j->rec_frame_size = 16;
3717 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3718 j->rec_frame_size = 9;
3725 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3726 j->rec_frame_size = 8;
3733 if (j->dsp.low != 0x20) {
3734 j->rec_frame_size = 48;
3741 if (j->dsp.low != 0x20) {
3742 if (!j->flags.g729_loaded) {
3746 switch (j->baseframe.low) {
3748 j->rec_frame_size = 10;
3751 j->rec_frame_size = 5;
3754 j->rec_frame_size = 15;
3763 if (j->dsp.low != 0x20) {
3764 if (!j->flags.g729_loaded) {
3768 switch (j->baseframe.low) {
3770 j->rec_frame_size = 12;
3773 j->rec_frame_size = 6;
3776 j->rec_frame_size = 18;
3785 switch (j->baseframe.low) {
3787 j->rec_frame_size = 80;
3790 j->rec_frame_size = 40;
3793 j->rec_frame_size = 120;
3799 switch (j->baseframe.low) {
3801 j->rec_frame_size = 80;
3804 j->rec_frame_size = 40;
3807 j->rec_frame_size = 120;
3813 switch (j->baseframe.low) {
3815 j->rec_frame_size = 160;
3818 j->rec_frame_size = 80;
3821 j->rec_frame_size = 240;
3827 switch (j->baseframe.low) {
3829 j->rec_frame_size = 80;
3832 j->rec_frame_size = 40;
3835 j->rec_frame_size = 120;
3841 switch (j->baseframe.low) {
3843 j->rec_frame_size = 80;
3846 j->rec_frame_size = 40;
3849 j->rec_frame_size = 120;
3855 kfree(j->read_buffer);
3856 j->rec_frame_size = 0;
3858 j->read_buffer = NULL;
3859 j->read_buffer_size = 0;
3866 static int ixj_record_start(IXJ *j)
3868 unsigned short cmd = 0x0000;
3870 if (j->read_buffer) {
3873 j->flags.recording = 1;
3874 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3876 if(ixjdebug & 0x0002)
3877 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3880 switch (j->rec_codec) {
3888 cmd = 0x5130; /* TrueSpeech 8.5 */
3892 cmd = 0x5133; /* TrueSpeech 4.8 */
3896 cmd = 0x5134; /* TrueSpeech 4.1 */
3909 if (ixj_WriteDSPCommand(cmd, j))
3912 if (!j->read_buffer) {
3913 if (!j->read_buffer)
3914 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3915 if (!j->read_buffer) {
3916 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3920 j->read_buffer_size = j->rec_frame_size * 2;
3922 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3926 switch (j->rec_mode) {
3928 cmd = 0x1C03; /* Record C1 */
3932 if (j->ver.low == 0x12) {
3933 cmd = 0x1E03; /* Record C1 */
3936 cmd = 0x1E01; /* Record C1 */
3941 if (j->ver.low == 0x12) {
3942 cmd = 0x1E83; /* Record C1 */
3945 cmd = 0x1E81; /* Record C1 */
3950 if (j->ver.low == 0x12) {
3951 cmd = 0x1F03; /* Record C1 */
3954 cmd = 0x1F01; /* Record C1 */
3959 if (j->ver.low == 0x12) {
3960 cmd = 0x1F83; /* Record C1 */
3962 cmd = 0x1F81; /* Record C1 */
3966 if (ixj_WriteDSPCommand(cmd, j))
3969 if (j->flags.playing) {
3970 ixj_aec_start(j, j->aec_level);
3975 static void ixj_record_stop(IXJ *j)
3977 if (ixjdebug & 0x0002)
3978 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3980 kfree(j->read_buffer);
3981 j->read_buffer = NULL;
3982 j->read_buffer_size = 0;
3983 if (j->rec_mode > -1) {
3984 ixj_WriteDSPCommand(0x5120, j);
3987 j->flags.recording = 0;
3989 static void ixj_vad(IXJ *j, int arg)
3992 ixj_WriteDSPCommand(0x513F, j);
3994 ixj_WriteDSPCommand(0x513E, j);
3997 static void set_rec_depth(IXJ *j, int depth)
4003 ixj_WriteDSPCommand(0x5180 + depth, j);
4006 static void set_dtmf_prescale(IXJ *j, int volume)
4008 ixj_WriteDSPCommand(0xCF07, j);
4009 ixj_WriteDSPCommand(volume, j);
4012 static int get_dtmf_prescale(IXJ *j)
4014 ixj_WriteDSPCommand(0xCF05, j);
4015 return j->ssr.high << 8 | j->ssr.low;
4018 static void set_rec_volume(IXJ *j, int volume)
4020 if(j->aec_level == AEC_AGC) {
4021 if (ixjdebug & 0x0002)
4022 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4023 ixj_WriteDSPCommand(0xCF96, j);
4024 ixj_WriteDSPCommand(volume, j);
4026 if (ixjdebug & 0x0002)
4027 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4028 ixj_WriteDSPCommand(0xCF03, j);
4029 ixj_WriteDSPCommand(volume, j);
4033 static int set_rec_volume_linear(IXJ *j, int volume)
4035 int newvolume, dsprecmax;
4037 if (ixjdebug & 0x0002)
4038 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4039 if(volume > 100 || volume < 0) {
4043 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4044 switch (j->cardtype) {
4050 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4051 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4052 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4054 case QTI_PHONEJACK_LITE:
4057 case QTI_PHONEJACK_PCI:
4066 newvolume = (dsprecmax * volume) / 100;
4067 set_rec_volume(j, newvolume);
4071 static int get_rec_volume(IXJ *j)
4073 if(j->aec_level == AEC_AGC) {
4074 if (ixjdebug & 0x0002)
4075 printk(KERN_INFO "Getting AGC Threshold\n");
4076 ixj_WriteDSPCommand(0xCF86, j);
4077 if (ixjdebug & 0x0002)
4078 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4079 return j->ssr.high << 8 | j->ssr.low;
4081 if (ixjdebug & 0x0002)
4082 printk(KERN_INFO "Getting Record Volume\n");
4083 ixj_WriteDSPCommand(0xCF01, j);
4084 return j->ssr.high << 8 | j->ssr.low;
4088 static int get_rec_volume_linear(IXJ *j)
4090 int volume, newvolume, dsprecmax;
4092 switch (j->cardtype) {
4099 case QTI_PHONEJACK_LITE:
4102 case QTI_PHONEJACK_PCI:
4111 volume = get_rec_volume(j);
4112 newvolume = (volume * 100) / dsprecmax;
4118 static int get_rec_level(IXJ *j)
4122 ixj_WriteDSPCommand(0xCF88, j);
4124 retval = j->ssr.high << 8 | j->ssr.low;
4125 retval = (retval * 256) / 240;
4129 static void ixj_aec_start(IXJ *j, int level)
4131 j->aec_level = level;
4132 if (ixjdebug & 0x0002)
4133 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4137 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4138 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4140 ixj_WriteDSPCommand(0x0300, j);
4142 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4144 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4148 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4150 ixj_WriteDSPCommand(0xE011, j);
4151 ixj_WriteDSPCommand(0xFFFF, j);
4153 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4154 ixj_WriteDSPCommand(0x0000, j); /* to off */
4159 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4161 ixj_WriteDSPCommand(0xE011, j);
4162 ixj_WriteDSPCommand(0x0080, j);
4164 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4165 ixj_WriteDSPCommand(0x0000, j); /* to off */
4170 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4172 ixj_WriteDSPCommand(0xE011, j);
4173 ixj_WriteDSPCommand(0x0080, j);
4175 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4176 ixj_WriteDSPCommand(0x0000, j); /* to off */
4181 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4182 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4184 ixj_WriteDSPCommand(0xE011, j);
4185 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4187 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4189 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4190 ixj_WriteDSPCommand(0x0224, j);
4192 ixj_WriteDSPCommand(0x1224, j);
4194 ixj_WriteDSPCommand(0xE014, j);
4195 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4197 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4199 /* Now we can set the AGC initial parameters and turn it on */
4200 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4201 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4203 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4204 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4206 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4207 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4209 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4210 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4212 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4213 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4215 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4216 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4218 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4219 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4221 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4222 ixj_WriteDSPCommand(0x0001, j); /* to on */
4227 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4229 ixj_WriteDSPCommand(0xE011, j);
4230 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4232 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4234 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4235 ixj_WriteDSPCommand(0x0224, j);
4237 ixj_WriteDSPCommand(0x1224, j);
4239 ixj_WriteDSPCommand(0xE014, j);
4240 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4242 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4249 static void aec_stop(IXJ *j)
4251 j->aec_level = AEC_OFF;
4252 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4253 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4255 ixj_WriteDSPCommand(0x0700, j);
4257 if (j->play_mode != -1 && j->rec_mode != -1)
4259 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4263 static int set_play_codec(IXJ *j, int rate)
4267 j->play_codec = rate;
4271 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4272 j->play_frame_size = 12;
4279 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4280 j->play_frame_size = 10;
4287 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4288 j->play_frame_size = 16;
4295 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4296 j->play_frame_size = 9;
4303 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4304 j->play_frame_size = 8;
4311 if (j->dsp.low != 0x20) {
4312 j->play_frame_size = 48;
4319 if (j->dsp.low != 0x20) {
4320 if (!j->flags.g729_loaded) {
4324 switch (j->baseframe.low) {
4326 j->play_frame_size = 10;
4329 j->play_frame_size = 5;
4332 j->play_frame_size = 15;
4341 if (j->dsp.low != 0x20) {
4342 if (!j->flags.g729_loaded) {
4346 switch (j->baseframe.low) {
4348 j->play_frame_size = 12;
4351 j->play_frame_size = 6;
4354 j->play_frame_size = 18;
4363 switch (j->baseframe.low) {
4365 j->play_frame_size = 80;
4368 j->play_frame_size = 40;
4371 j->play_frame_size = 120;
4377 switch (j->baseframe.low) {
4379 j->play_frame_size = 80;
4382 j->play_frame_size = 40;
4385 j->play_frame_size = 120;
4391 switch (j->baseframe.low) {
4393 j->play_frame_size = 160;
4396 j->play_frame_size = 80;
4399 j->play_frame_size = 240;
4405 switch (j->baseframe.low) {
4407 j->play_frame_size = 80;
4410 j->play_frame_size = 40;
4413 j->play_frame_size = 120;
4419 switch (j->baseframe.low) {
4421 j->play_frame_size = 80;
4424 j->play_frame_size = 40;
4427 j->play_frame_size = 120;
4433 kfree(j->write_buffer);
4434 j->play_frame_size = 0;
4436 j->write_buffer = NULL;
4437 j->write_buffer_size = 0;
4444 static int ixj_play_start(IXJ *j)
4446 unsigned short cmd = 0x0000;
4448 if (j->write_buffer) {
4452 if(ixjdebug & 0x0002)
4453 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4455 j->flags.playing = 1;
4456 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4458 j->flags.play_first_frame = 1;
4461 if (!j->play_mode) {
4462 switch (j->play_codec) {
4470 cmd = 0x5230; /* TrueSpeech 8.5 */
4474 cmd = 0x5233; /* TrueSpeech 4.8 */
4478 cmd = 0x5234; /* TrueSpeech 4.1 */
4491 if (ixj_WriteDSPCommand(cmd, j))
4494 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4495 if (!j->write_buffer) {
4496 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4499 /* j->write_buffers_empty = 2; */
4500 j->write_buffers_empty = 1;
4501 j->write_buffer_size = j->play_frame_size * 2;
4502 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4503 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4505 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4509 switch (j->play_mode) {
4514 if (j->ver.low == 0x12) {
4521 if (j->ver.low == 0x12) {
4528 if (j->ver.low == 0x12) {
4535 if (j->ver.low == 0x12) {
4542 if (ixj_WriteDSPCommand(cmd, j))
4545 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4548 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4551 if (j->flags.recording) {
4552 ixj_aec_start(j, j->aec_level);
4558 static void ixj_play_stop(IXJ *j)
4560 if (ixjdebug & 0x0002)
4561 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4563 kfree(j->write_buffer);
4564 j->write_buffer = NULL;
4565 j->write_buffer_size = 0;
4566 if (j->play_mode > -1) {
4567 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4571 j->flags.playing = 0;
4574 static inline int get_play_level(IXJ *j)
4578 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4579 return j->ssr.high << 8 | j->ssr.low;
4580 retval = j->ssr.high << 8 | j->ssr.low;
4581 retval = (retval * 256) / 240;
4585 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4587 unsigned int mask = 0;
4589 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4591 poll_wait(file_p, &(j->poll_q), wait);
4592 if (j->read_buffer_ready > 0)
4593 mask |= POLLIN | POLLRDNORM; /* readable */
4594 if (j->write_buffers_empty > 0)
4595 mask |= POLLOUT | POLLWRNORM; /* writable */
4601 static int ixj_play_tone(IXJ *j, char tone)
4603 if (!j->tone_state) {
4604 if(ixjdebug & 0x0002) {
4605 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4607 if (j->dsp.low == 0x20) {
4610 j->tone_start_jif = jiffies;
4615 j->tone_index = tone;
4616 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4622 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4624 j->tone_on_time = arg;
4626 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4630 if (ixj_WriteDSPCommand(arg, j))
4636 static int SCI_WaitHighSCI(IXJ *j)
4640 j->pld_scrr.byte = inb_p(j->XILINXbase);
4641 if (!j->pld_scrr.bits.sci) {
4642 for (cnt = 0; cnt < 10; cnt++) {
4644 j->pld_scrr.byte = inb_p(j->XILINXbase);
4646 if ((j->pld_scrr.bits.sci))
4649 if (ixjdebug & 0x0001)
4650 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4656 static int SCI_WaitLowSCI(IXJ *j)
4660 j->pld_scrr.byte = inb_p(j->XILINXbase);
4661 if (j->pld_scrr.bits.sci) {
4662 for (cnt = 0; cnt < 10; cnt++) {
4664 j->pld_scrr.byte = inb_p(j->XILINXbase);
4666 if (!(j->pld_scrr.bits.sci))
4669 if (ixjdebug & 0x0001)
4670 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4676 static int SCI_Control(IXJ *j, int control)
4680 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4682 j->pld_scrw.bits.c1 = 0; /* to no selection */
4685 case SCI_Enable_DAA:
4686 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4688 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4691 case SCI_Enable_Mixer:
4692 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4694 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4697 case SCI_Enable_EEPROM:
4698 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4700 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4707 outb_p(j->pld_scrw.byte, j->XILINXbase);
4713 case SCI_Enable_DAA:
4714 case SCI_Enable_Mixer:
4715 case SCI_Enable_EEPROM:
4716 if (!SCI_WaitHighSCI(j))
4726 static int SCI_Prepare(IXJ *j)
4728 if (!SCI_Control(j, SCI_End))
4731 if (!SCI_WaitLowSCI(j))
4737 static int ixj_get_mixer(long val, IXJ *j)
4739 int reg = (val & 0x1F00) >> 8;
4740 return j->mix.vol[reg];
4743 static int ixj_mixer(long val, IXJ *j)
4747 bytes.high = (val & 0x1F00) >> 8;
4748 bytes.low = val & 0x00FF;
4750 /* save mixer value so we can get back later on */
4751 j->mix.vol[bytes.high] = bytes.low;
4753 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4755 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4757 SCI_Control(j, SCI_Enable_Mixer);
4759 SCI_Control(j, SCI_End);
4764 static int daa_load(BYTES * p_bytes, IXJ *j)
4766 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4767 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4768 if (!SCI_Control(j, SCI_Enable_DAA))
4774 static int ixj_daa_cr4(IXJ *j, char reg)
4778 switch (j->daa_mode) {
4782 case SOP_PU_RINGING:
4785 case SOP_PU_CONVERSATION:
4788 case SOP_PU_PULSEDIALING:
4793 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4795 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4797 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4800 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4803 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4806 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4810 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4812 if (!daa_load(&bytes, j))
4815 if (!SCI_Prepare(j))
4821 static char daa_int_read(IXJ *j)
4825 if (!SCI_Prepare(j))
4830 outb_p(bytes.high, j->XILINXbase + 0x03);
4831 outb_p(bytes.low, j->XILINXbase + 0x02);
4833 if (!SCI_Control(j, SCI_Enable_DAA))
4836 bytes.high = inb_p(j->XILINXbase + 0x03);
4837 bytes.low = inb_p(j->XILINXbase + 0x02);
4838 if (bytes.low != ALISDAA_ID_BYTE) {
4839 if (ixjdebug & 0x0001)
4840 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4843 if (!SCI_Control(j, SCI_Enable_DAA))
4845 if (!SCI_Control(j, SCI_End))
4848 bytes.high = inb_p(j->XILINXbase + 0x03);
4849 bytes.low = inb_p(j->XILINXbase + 0x02);
4851 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4856 static char daa_CR_read(IXJ *j, int cr)
4861 if (!SCI_Prepare(j))
4864 switch (j->daa_mode) {
4866 bytes.high = 0x30 + cr;
4868 case SOP_PU_RINGING:
4869 bytes.high = 0x70 + cr;
4871 case SOP_PU_CONVERSATION:
4872 bytes.high = 0xB0 + cr;
4874 case SOP_PU_PULSEDIALING:
4876 bytes.high = 0xF0 + cr;
4882 outb_p(bytes.high, j->XILINXbase + 0x03);
4883 outb_p(bytes.low, j->XILINXbase + 0x02);
4885 if (!SCI_Control(j, SCI_Enable_DAA))
4888 bytes.high = inb_p(j->XILINXbase + 0x03);
4889 bytes.low = inb_p(j->XILINXbase + 0x02);
4890 if (bytes.low != ALISDAA_ID_BYTE) {
4891 if (ixjdebug & 0x0001)
4892 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4895 if (!SCI_Control(j, SCI_Enable_DAA))
4897 if (!SCI_Control(j, SCI_End))
4900 wdata.word = inw_p(j->XILINXbase + 0x02);
4904 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4907 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4910 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4913 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4916 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4919 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4927 static int ixj_daa_cid_reset(IXJ *j)
4932 if (ixjdebug & 0x0002)
4933 printk("DAA Clearing CID ram\n");
4935 if (!SCI_Prepare(j))
4940 outb_p(bytes.high, j->XILINXbase + 0x03);
4941 outb_p(bytes.low, j->XILINXbase + 0x02);
4943 if (!SCI_Control(j, SCI_Enable_DAA))
4946 if (!SCI_WaitHighSCI(j))
4949 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4950 bytes.high = bytes.low = 0x00;
4951 outb_p(bytes.high, j->XILINXbase + 0x03);
4953 if (i < ALISDAA_CALLERID_SIZE - 1)
4954 outb_p(bytes.low, j->XILINXbase + 0x02);
4956 if (!SCI_Control(j, SCI_Enable_DAA))
4959 if (!SCI_WaitHighSCI(j))
4964 if (!SCI_Control(j, SCI_End))
4967 if (ixjdebug & 0x0002)
4968 printk("DAA CID ram cleared\n");
4973 static int ixj_daa_cid_read(IXJ *j)
4977 char CID[ALISDAA_CALLERID_SIZE];
4981 if (!SCI_Prepare(j))
4986 outb_p(bytes.high, j->XILINXbase + 0x03);
4987 outb_p(bytes.low, j->XILINXbase + 0x02);
4989 if (!SCI_Control(j, SCI_Enable_DAA))
4992 if (!SCI_WaitHighSCI(j))
4995 bytes.high = inb_p(j->XILINXbase + 0x03);
4996 bytes.low = inb_p(j->XILINXbase + 0x02);
4997 if (bytes.low != ALISDAA_ID_BYTE) {
4998 if (ixjdebug & 0x0001)
4999 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5002 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5003 bytes.high = bytes.low = 0x00;
5004 outb_p(bytes.high, j->XILINXbase + 0x03);
5005 outb_p(bytes.low, j->XILINXbase + 0x02);
5007 if (!SCI_Control(j, SCI_Enable_DAA))
5010 if (!SCI_WaitHighSCI(j))
5013 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5014 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5017 if (!SCI_Control(j, SCI_End))
5021 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5024 if ((pIn[1] & 0x03) == 0x01) {
5027 if ((pIn[2] & 0x0c) == 0x04) {
5028 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5030 if ((pIn[3] & 0x30) == 0x10) {
5031 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5033 if ((pIn[4] & 0xc0) == 0x40) {
5034 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5038 pIn += 5, pOut += 4;
5040 memset(&j->cid, 0, sizeof(PHONE_CID));
5041 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5043 strncpy(j->cid.month, pOut, 2);
5045 strncpy(j->cid.day, pOut, 2);
5047 strncpy(j->cid.hour, pOut, 2);
5049 strncpy(j->cid.min, pOut, 2);
5051 j->cid.numlen = *pOut;
5053 strncpy(j->cid.number, pOut, j->cid.numlen);
5054 pOut += j->cid.numlen + 1;
5055 j->cid.namelen = *pOut;
5057 strncpy(j->cid.name, pOut, j->cid.namelen);
5059 ixj_daa_cid_reset(j);
5063 static char daa_get_version(IXJ *j)
5067 if (!SCI_Prepare(j))
5072 outb_p(bytes.high, j->XILINXbase + 0x03);
5073 outb_p(bytes.low, j->XILINXbase + 0x02);
5075 if (!SCI_Control(j, SCI_Enable_DAA))
5078 bytes.high = inb_p(j->XILINXbase + 0x03);
5079 bytes.low = inb_p(j->XILINXbase + 0x02);
5080 if (bytes.low != ALISDAA_ID_BYTE) {
5081 if (ixjdebug & 0x0001)
5082 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5085 if (!SCI_Control(j, SCI_Enable_DAA))
5088 if (!SCI_Control(j, SCI_End))
5091 bytes.high = inb_p(j->XILINXbase + 0x03);
5092 bytes.low = inb_p(j->XILINXbase + 0x02);
5093 if (ixjdebug & 0x0002)
5094 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5095 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5099 static int daa_set_mode(IXJ *j, int mode)
5102 The DAA *MUST* be in the conversation mode if the
5103 PSTN line is to be seized (PSTN line off-hook).
5104 Taking the PSTN line off-hook while the DAA is in
5105 a mode other than conversation mode will cause a
5106 hardware failure of the ALIS-A part.
5109 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5110 if the PSTN line is on-hook. Failure to have the PSTN line
5111 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5117 j->flags.pstn_rmr = 0;
5119 if (!SCI_Prepare(j))
5124 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5126 outb_p(j->pld_scrw.byte, j->XILINXbase);
5127 j->pld_slicw.bits.rly2 = 0;
5128 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5130 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5131 daa_load(&bytes, j);
5132 if (!SCI_Prepare(j))
5135 j->daa_mode = SOP_PU_SLEEP;
5138 if(j->daa_mode == SOP_PU_SLEEP)
5142 if (ixjdebug & 0x0008)
5143 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5144 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5146 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5148 outb_p(j->pld_scrw.byte, j->XILINXbase);
5149 j->pld_slicw.bits.rly2 = 0;
5150 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5152 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5153 daa_load(&bytes, j);
5154 if (!SCI_Prepare(j))
5157 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5159 outb_p(j->pld_scrw.byte, j->XILINXbase);
5160 j->pld_slicw.bits.rly2 = 0;
5161 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5163 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5164 daa_load(&bytes, j);
5165 if (!SCI_Prepare(j))
5168 j->daa_mode = SOP_PU_SLEEP;
5169 j->flags.pstn_ringing = 0;
5170 j->ex.bits.pstn_ring = 0;
5171 j->pstn_sleeptil = jiffies + (hertz / 4);
5172 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5173 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5174 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5176 case SOP_PU_RINGING:
5177 if (ixjdebug & 0x0008)
5178 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5179 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5181 outb_p(j->pld_scrw.byte, j->XILINXbase);
5182 j->pld_slicw.bits.rly2 = 0;
5183 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5185 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5186 daa_load(&bytes, j);
5187 if (!SCI_Prepare(j))
5189 j->daa_mode = SOP_PU_RINGING;
5191 case SOP_PU_CONVERSATION:
5192 if (ixjdebug & 0x0008)
5193 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5195 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5196 daa_load(&bytes, j);
5197 if (!SCI_Prepare(j))
5199 j->pld_slicw.bits.rly2 = 1;
5200 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5201 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5203 outb_p(j->pld_scrw.byte, j->XILINXbase);
5204 j->daa_mode = SOP_PU_CONVERSATION;
5205 j->flags.pstn_ringing = 0;
5206 j->ex.bits.pstn_ring = 0;
5207 j->pstn_sleeptil = jiffies;
5208 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5210 case SOP_PU_PULSEDIALING:
5211 if (ixjdebug & 0x0008)
5212 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5213 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5215 outb_p(j->pld_scrw.byte, j->XILINXbase);
5216 j->pld_slicw.bits.rly2 = 0;
5217 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5219 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5220 daa_load(&bytes, j);
5221 if (!SCI_Prepare(j))
5223 j->daa_mode = SOP_PU_PULSEDIALING;
5231 static int ixj_daa_write(IXJ *j)
5235 j->flags.pstncheck = 1;
5237 daa_set_mode(j, SOP_PU_SLEEP);
5239 if (!SCI_Prepare(j))
5242 outb_p(j->pld_scrw.byte, j->XILINXbase);
5245 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5246 if (!daa_load(&bytes, j))
5249 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5250 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5251 if (!daa_load(&bytes, j))
5254 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5255 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5256 if (!daa_load(&bytes, j))
5259 if (!SCI_Prepare(j))
5263 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5264 if (!daa_load(&bytes, j))
5267 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5268 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5269 if (!daa_load(&bytes, j))
5272 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5273 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5274 if (!daa_load(&bytes, j))
5277 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5278 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5279 if (!daa_load(&bytes, j))
5282 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5284 if (!daa_load(&bytes, j))
5287 if (!SCI_Prepare(j))
5291 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5292 if (!daa_load(&bytes, j))
5295 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5296 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5297 if (!daa_load(&bytes, j))
5300 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5301 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5302 if (!daa_load(&bytes, j))
5305 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5306 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5307 if (!daa_load(&bytes, j))
5310 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5312 if (!daa_load(&bytes, j))
5315 if (!SCI_Control(j, SCI_End))
5317 if (!SCI_WaitLowSCI(j))
5321 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5322 if (!daa_load(&bytes, j))
5325 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5326 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5327 if (!daa_load(&bytes, j))
5330 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5331 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5332 if (!daa_load(&bytes, j))
5335 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5336 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5337 if (!daa_load(&bytes, j))
5340 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5342 if (!daa_load(&bytes, j))
5345 if (!SCI_Control(j, SCI_End))
5347 if (!SCI_WaitLowSCI(j))
5351 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5352 if (!daa_load(&bytes, j))
5355 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5356 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5357 if (!daa_load(&bytes, j))
5360 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5361 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5362 if (!daa_load(&bytes, j))
5365 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5366 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5367 if (!daa_load(&bytes, j))
5370 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5372 if (!daa_load(&bytes, j))
5375 if (!SCI_Control(j, SCI_End))
5377 if (!SCI_WaitLowSCI(j))
5381 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5382 if (!daa_load(&bytes, j))
5385 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5386 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5387 if (!daa_load(&bytes, j))
5390 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5391 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5392 if (!daa_load(&bytes, j))
5395 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5396 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5397 if (!daa_load(&bytes, j))
5400 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5402 if (!daa_load(&bytes, j))
5405 if (!SCI_Control(j, SCI_End))
5407 if (!SCI_WaitLowSCI(j))
5411 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5412 if (!daa_load(&bytes, j))
5415 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5416 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5417 if (!daa_load(&bytes, j))
5420 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5421 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5422 if (!daa_load(&bytes, j))
5425 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5426 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5427 if (!daa_load(&bytes, j))
5430 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5432 if (!daa_load(&bytes, j))
5435 if (!SCI_Control(j, SCI_End))
5437 if (!SCI_WaitLowSCI(j))
5441 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5442 if (!daa_load(&bytes, j))
5445 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5446 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5447 if (!daa_load(&bytes, j))
5450 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5451 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5452 if (!daa_load(&bytes, j))
5455 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5456 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5457 if (!daa_load(&bytes, j))
5460 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5462 if (!daa_load(&bytes, j))
5465 if (!SCI_Control(j, SCI_End))
5467 if (!SCI_WaitLowSCI(j))
5471 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5472 if (!daa_load(&bytes, j))
5475 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5476 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5477 if (!daa_load(&bytes, j))
5480 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5481 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5482 if (!daa_load(&bytes, j))
5485 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5486 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5487 if (!daa_load(&bytes, j))
5490 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5492 if (!daa_load(&bytes, j))
5495 if (!SCI_Control(j, SCI_End))
5497 if (!SCI_WaitLowSCI(j))
5501 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5502 if (!daa_load(&bytes, j))
5505 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5506 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5507 if (!daa_load(&bytes, j))
5510 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5511 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5512 if (!daa_load(&bytes, j))
5515 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5516 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5517 if (!daa_load(&bytes, j))
5520 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5522 if (!daa_load(&bytes, j))
5525 if (!SCI_Control(j, SCI_End))
5527 if (!SCI_WaitLowSCI(j))
5531 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5532 if (!daa_load(&bytes, j))
5535 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5536 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5537 if (!daa_load(&bytes, j))
5540 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5541 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5542 if (!daa_load(&bytes, j))
5545 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5546 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5547 if (!daa_load(&bytes, j))
5550 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5552 if (!daa_load(&bytes, j))
5555 if (!SCI_Control(j, SCI_End))
5557 if (!SCI_WaitLowSCI(j))
5561 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5562 if (!daa_load(&bytes, j))
5565 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5566 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5567 if (!daa_load(&bytes, j))
5570 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5572 if (!daa_load(&bytes, j))
5575 if (!SCI_Control(j, SCI_End))
5577 if (!SCI_WaitLowSCI(j))
5581 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5582 if (!daa_load(&bytes, j))
5585 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5586 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5587 if (!daa_load(&bytes, j))
5590 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5592 if (!daa_load(&bytes, j))
5595 if (!SCI_Control(j, SCI_End))
5597 if (!SCI_WaitLowSCI(j))
5601 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5602 if (!daa_load(&bytes, j))
5605 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5606 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5607 if (!daa_load(&bytes, j))
5610 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5612 if (!daa_load(&bytes, j))
5615 if (!SCI_Control(j, SCI_End))
5617 if (!SCI_WaitLowSCI(j))
5621 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5622 if (!daa_load(&bytes, j))
5625 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5626 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5627 if (!daa_load(&bytes, j))
5630 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5632 if (!daa_load(&bytes, j))
5635 if (!SCI_Control(j, SCI_End))
5637 if (!SCI_WaitLowSCI(j))
5641 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5642 if (!daa_load(&bytes, j))
5645 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5646 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5647 if (!daa_load(&bytes, j))
5650 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5652 if (!daa_load(&bytes, j))
5655 if (!SCI_Control(j, SCI_End))
5657 if (!SCI_WaitLowSCI(j))
5661 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5662 if (!daa_load(&bytes, j))
5665 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5666 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5667 if (!daa_load(&bytes, j))
5670 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5671 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5672 if (!daa_load(&bytes, j))
5675 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5676 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5677 if (!daa_load(&bytes, j))
5680 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5682 if (!daa_load(&bytes, j))
5685 if (!SCI_Control(j, SCI_End))
5687 if (!SCI_WaitLowSCI(j))
5691 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5692 if (!daa_load(&bytes, j))
5695 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5696 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5697 if (!daa_load(&bytes, j))
5700 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5701 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5702 if (!daa_load(&bytes, j))
5705 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5706 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5707 if (!daa_load(&bytes, j))
5710 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5712 if (!daa_load(&bytes, j))
5716 j->pld_scrr.byte = inb_p(j->XILINXbase);
5717 if (!SCI_Control(j, SCI_End))
5720 outb_p(j->pld_scrw.byte, j->XILINXbase);
5722 if (ixjdebug & 0x0002)
5723 printk("DAA Coefficients Loaded\n");
5725 j->flags.pstncheck = 0;
5729 static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5731 j->tone_off_time = arg;
5732 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5735 if (ixj_WriteDSPCommand(arg, j))
5740 static int ixj_get_tone_on(IXJ *j)
5742 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5748 static int ixj_get_tone_off(IXJ *j)
5750 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5756 static void ixj_busytone(IXJ *j)
5758 j->flags.ringback = 0;
5759 j->flags.dialtone = 0;
5760 j->flags.busytone = 1;
5761 ixj_set_tone_on(0x07D0, j);
5762 ixj_set_tone_off(0x07D0, j);
5763 ixj_play_tone(j, 27);
5766 static void ixj_dialtone(IXJ *j)
5768 j->flags.ringback = 0;
5769 j->flags.dialtone = 1;
5770 j->flags.busytone = 0;
5771 if (j->dsp.low == 0x20) {
5774 ixj_set_tone_on(0xFFFF, j);
5775 ixj_set_tone_off(0x0000, j);
5776 ixj_play_tone(j, 25);
5780 static void ixj_cpt_stop(IXJ *j)
5782 if(j->tone_state || j->tone_cadence_state)
5784 j->flags.dialtone = 0;
5785 j->flags.busytone = 0;
5786 j->flags.ringback = 0;
5787 ixj_set_tone_on(0x0001, j);
5788 ixj_set_tone_off(0x0000, j);
5789 ixj_play_tone(j, 0);
5790 j->tone_state = j->tone_cadence_state = 0;
5792 kfree(j->cadence_t->ce);
5793 kfree(j->cadence_t);
5794 j->cadence_t = NULL;
5797 if (j->play_mode == -1 && j->rec_mode == -1)
5799 if (j->play_mode != -1 && j->dsp.low == 0x20)
5801 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5802 ixj_record_start(j);
5805 static void ixj_ringback(IXJ *j)
5807 j->flags.busytone = 0;
5808 j->flags.dialtone = 0;
5809 j->flags.ringback = 1;
5810 ixj_set_tone_on(0x0FA0, j);
5811 ixj_set_tone_off(0x2EE0, j);
5812 ixj_play_tone(j, 26);
5815 static void ixj_testram(IXJ *j)
5817 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5820 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5823 IXJ_CADENCE_ELEMENT __user *cep;
5824 IXJ_CADENCE_ELEMENT *lcep;
5828 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5833 if (copy_from_user(&lcp->elements_used,
5834 &cp->elements_used, sizeof(int)))
5836 if (copy_from_user(&lcp->termination,
5837 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5839 if (get_user(cep, &cp->ce))
5843 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5847 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5852 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5856 kfree(j->cadence_t->ce);
5857 kfree(j->cadence_t);
5859 lcp->ce = (void *) lcep;
5861 j->tone_cadence_state = 0;
5862 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5863 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5864 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5865 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5866 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5867 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5868 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5869 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5870 ixj_init_tone(j, &ti);
5872 ixj_play_tone(j, lcp->ce[0].index);
5881 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5883 IXJ_FILTER_CADENCE *lcp;
5884 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5886 if(ixjdebug & 0x0001) {
5887 printk(KERN_INFO "Could not allocate memory for cadence\n");
5891 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5892 if(ixjdebug & 0x0001) {
5893 printk(KERN_INFO "Could not copy cadence to kernel\n");
5898 if (lcp->filter > 5) {
5899 if(ixjdebug & 0x0001) {
5900 printk(KERN_INFO "Cadence out of range\n");
5905 j->cadence_f[lcp->filter].state = 0;
5906 j->cadence_f[lcp->filter].enable = lcp->enable;
5907 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5908 j->cadence_f[lcp->filter].on1 = lcp->on1;
5909 j->cadence_f[lcp->filter].on1min = 0;
5910 j->cadence_f[lcp->filter].on1max = 0;
5911 j->cadence_f[lcp->filter].off1 = lcp->off1;
5912 j->cadence_f[lcp->filter].off1min = 0;
5913 j->cadence_f[lcp->filter].off1max = 0;
5914 j->cadence_f[lcp->filter].on2 = lcp->on2;
5915 j->cadence_f[lcp->filter].on2min = 0;
5916 j->cadence_f[lcp->filter].on2max = 0;
5917 j->cadence_f[lcp->filter].off2 = lcp->off2;
5918 j->cadence_f[lcp->filter].off2min = 0;
5919 j->cadence_f[lcp->filter].off2max = 0;
5920 j->cadence_f[lcp->filter].on3 = lcp->on3;
5921 j->cadence_f[lcp->filter].on3min = 0;
5922 j->cadence_f[lcp->filter].on3max = 0;
5923 j->cadence_f[lcp->filter].off3 = lcp->off3;
5924 j->cadence_f[lcp->filter].off3min = 0;
5925 j->cadence_f[lcp->filter].off3max = 0;
5926 if(ixjdebug & 0x0002) {
5927 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5933 static void add_caps(IXJ *j)
5936 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5937 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5938 j->caplist[j->caps].captype = vendor;
5939 j->caplist[j->caps].handle = j->caps++;
5940 j->caplist[j->caps].captype = device;
5941 switch (j->cardtype) {
5943 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5946 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5948 case QTI_PHONEJACK_LITE:
5949 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5951 case QTI_PHONEJACK_PCI:
5952 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5955 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5958 j->caplist[j->caps].cap = j->cardtype;
5959 j->caplist[j->caps].handle = j->caps++;
5960 strcpy(j->caplist[j->caps].desc, "POTS");
5961 j->caplist[j->caps].captype = port;
5962 j->caplist[j->caps].cap = pots;
5963 j->caplist[j->caps].handle = j->caps++;
5965 /* add devices that can do speaker/mic */
5966 switch (j->cardtype) {
5969 case QTI_PHONEJACK_PCI:
5971 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5972 j->caplist[j->caps].captype = port;
5973 j->caplist[j->caps].cap = speaker;
5974 j->caplist[j->caps].handle = j->caps++;
5979 /* add devices that can do handset */
5980 switch (j->cardtype) {
5982 strcpy(j->caplist[j->caps].desc, "HANDSET");
5983 j->caplist[j->caps].captype = port;
5984 j->caplist[j->caps].cap = handset;
5985 j->caplist[j->caps].handle = j->caps++;
5991 /* add devices that can do PSTN */
5992 switch (j->cardtype) {
5994 strcpy(j->caplist[j->caps].desc, "PSTN");
5995 j->caplist[j->caps].captype = port;
5996 j->caplist[j->caps].cap = pstn;
5997 j->caplist[j->caps].handle = j->caps++;
6003 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6004 strcpy(j->caplist[j->caps].desc, "ULAW");
6005 j->caplist[j->caps].captype = codec;
6006 j->caplist[j->caps].cap = ULAW;
6007 j->caplist[j->caps].handle = j->caps++;
6009 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6010 j->caplist[j->caps].captype = codec;
6011 j->caplist[j->caps].cap = LINEAR16;
6012 j->caplist[j->caps].handle = j->caps++;
6014 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6015 j->caplist[j->caps].captype = codec;
6016 j->caplist[j->caps].cap = LINEAR8;
6017 j->caplist[j->caps].handle = j->caps++;
6019 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6020 j->caplist[j->caps].captype = codec;
6021 j->caplist[j->caps].cap = WSS;
6022 j->caplist[j->caps].handle = j->caps++;
6024 /* software ALAW codec, made from ULAW */
6025 strcpy(j->caplist[j->caps].desc, "ALAW");
6026 j->caplist[j->caps].captype = codec;
6027 j->caplist[j->caps].cap = ALAW;
6028 j->caplist[j->caps].handle = j->caps++;
6030 /* version 12 of the 8020 does the following codecs in a broken way */
6031 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6032 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6033 j->caplist[j->caps].captype = codec;
6034 j->caplist[j->caps].cap = G723_63;
6035 j->caplist[j->caps].handle = j->caps++;
6037 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6038 j->caplist[j->caps].captype = codec;
6039 j->caplist[j->caps].cap = G723_53;
6040 j->caplist[j->caps].handle = j->caps++;
6042 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6043 j->caplist[j->caps].captype = codec;
6044 j->caplist[j->caps].cap = TS48;
6045 j->caplist[j->caps].handle = j->caps++;
6047 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6048 j->caplist[j->caps].captype = codec;
6049 j->caplist[j->caps].cap = TS41;
6050 j->caplist[j->caps].handle = j->caps++;
6053 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6054 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6055 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6056 j->caplist[j->caps].captype = codec;
6057 j->caplist[j->caps].cap = TS85;
6058 j->caplist[j->caps].handle = j->caps++;
6061 /* 8021 chips can do G728 */
6062 if (j->dsp.low == 0x21) {
6063 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6064 j->caplist[j->caps].captype = codec;
6065 j->caplist[j->caps].cap = G728;
6066 j->caplist[j->caps].handle = j->caps++;
6069 /* 8021/8022 chips can do G729 if loaded */
6070 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6071 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6072 j->caplist[j->caps].captype = codec;
6073 j->caplist[j->caps].cap = G729;
6074 j->caplist[j->caps].handle = j->caps++;
6076 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6077 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6078 j->caplist[j->caps].captype = codec;
6079 j->caplist[j->caps].cap = G729B;
6080 j->caplist[j->caps].handle = j->caps++;
6084 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6088 for (cnt = 0; cnt < j->caps; cnt++) {
6089 if (pcreq->captype == j->caplist[cnt].captype
6090 && pcreq->cap == j->caplist[cnt].cap) {
6098 static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6103 void __user *argp = (void __user *)arg;
6104 struct inode *inode = file_p->f_path.dentry->d_inode;
6105 unsigned int minor = iminor(inode);
6106 unsigned int raise, mant;
6107 int board = NUM(inode);
6109 IXJ *j = get_ixj(NUM(inode));
6114 * Set up locks to ensure that only one process is talking to the DSP at a time.
6115 * This is necessary to keep the DSP from locking up.
6117 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6118 schedule_timeout_interruptible(1);
6119 if (ixjdebug & 0x0040)
6120 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6121 if (minor >= IXJMAX) {
6122 clear_bit(board, &j->busyflags);
6126 * Check ioctls only root can use.
6128 if (!capable(CAP_SYS_ADMIN)) {
6130 case IXJCTL_TESTRAM:
6136 case IXJCTL_TESTRAM:
6138 retval = (j->ssr.high << 8) + j->ssr.low;
6140 case IXJCTL_CARDTYPE:
6141 retval = j->cardtype;
6146 case IXJCTL_VERSION:
6149 snprintf(arg_str, sizeof(arg_str),
6150 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6151 IXJ_VER_MINOR, IXJ_BLD_VER);
6152 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6156 case PHONE_RING_CADENCE:
6157 j->ring_cadence = arg;
6161 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6166 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6170 /* Binary compatbility */
6171 case OLD_PHONE_RING_START:
6174 case PHONE_RING_START:
6176 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6182 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6186 case PHONE_RING_STOP:
6187 j->flags.cringing = 0;
6188 if(j->cadence_f[5].enable) {
6189 j->cadence_f[5].state = 0;
6194 retval = ixj_ring(j);
6196 case PHONE_EXCEPTION:
6197 retval = j->ex.bytes;
6198 if(j->ex.bits.flash) {
6200 j->ex.bits.flash = 0;
6202 j->ex.bits.pstn_ring = 0;
6203 j->ex.bits.caller_id = 0;
6204 j->ex.bits.pstn_wink = 0;
6213 j->ex.bits.reserved = 0;
6215 case PHONE_HOOKSTATE:
6216 j->ex.bits.hookstate = 0;
6217 retval = j->hookstate; //j->r_hook;
6219 case IXJCTL_SET_LED:
6220 LED_SetState(arg, j);
6223 retval = set_base_frame(j, arg);
6225 case PHONE_REC_CODEC:
6226 retval = set_rec_codec(j, arg);
6231 case PHONE_REC_START:
6232 ixj_record_start(j);
6234 case PHONE_REC_STOP:
6237 case PHONE_REC_DEPTH:
6238 set_rec_depth(j, arg);
6240 case PHONE_REC_VOLUME:
6242 retval = get_rec_volume(j);
6245 set_rec_volume(j, arg);
6249 case PHONE_REC_VOLUME_LINEAR:
6251 retval = get_rec_volume_linear(j);
6254 set_rec_volume_linear(j, arg);
6258 case IXJCTL_DTMF_PRESCALE:
6260 retval = get_dtmf_prescale(j);
6263 set_dtmf_prescale(j, arg);
6267 case PHONE_REC_LEVEL:
6268 retval = get_rec_level(j);
6271 retval = ixj_siadc(j, arg);
6274 retval = ixj_sidac(j, arg);
6276 case IXJCTL_AEC_START:
6277 ixj_aec_start(j, arg);
6279 case IXJCTL_AEC_STOP:
6282 case IXJCTL_AEC_GET_LEVEL:
6283 retval = j->aec_level;
6285 case PHONE_PLAY_CODEC:
6286 retval = set_play_codec(j, arg);
6288 case PHONE_PLAY_START:
6289 retval = ixj_play_start(j);
6291 case PHONE_PLAY_STOP:
6294 case PHONE_PLAY_DEPTH:
6295 set_play_depth(j, arg);
6297 case PHONE_PLAY_VOLUME:
6299 retval = get_play_volume(j);
6302 set_play_volume(j, arg);
6306 case PHONE_PLAY_VOLUME_LINEAR:
6308 retval = get_play_volume_linear(j);
6311 set_play_volume_linear(j, arg);
6315 case PHONE_PLAY_LEVEL:
6316 retval = get_play_level(j);
6318 case IXJCTL_DSP_TYPE:
6319 retval = (j->dsp.high << 8) + j->dsp.low;
6321 case IXJCTL_DSP_VERSION:
6322 retval = (j->ver.high << 8) + j->ver.low;
6333 case IXJCTL_DRYBUFFER_READ:
6334 put_user(j->drybuffer, (unsigned long __user *) argp);
6336 case IXJCTL_DRYBUFFER_CLEAR:
6339 case IXJCTL_FRAMES_READ:
6340 put_user(j->framesread, (unsigned long __user *) argp);
6342 case IXJCTL_FRAMES_WRITTEN:
6343 put_user(j->frameswritten, (unsigned long __user *) argp);
6345 case IXJCTL_READ_WAIT:
6346 put_user(j->read_wait, (unsigned long __user *) argp);
6348 case IXJCTL_WRITE_WAIT:
6349 put_user(j->write_wait, (unsigned long __user *) argp);
6351 case PHONE_MAXRINGS:
6354 case PHONE_SET_TONE_ON_TIME:
6355 ixj_set_tone_on(arg, j);
6357 case PHONE_SET_TONE_OFF_TIME:
6358 ixj_set_tone_off(arg, j);
6360 case PHONE_GET_TONE_ON_TIME:
6361 if (ixj_get_tone_on(j)) {
6364 retval = (j->ssr.high << 8) + j->ssr.low;
6367 case PHONE_GET_TONE_OFF_TIME:
6368 if (ixj_get_tone_off(j)) {
6371 retval = (j->ssr.high << 8) + j->ssr.low;
6374 case PHONE_PLAY_TONE:
6376 retval = ixj_play_tone(j, arg);
6380 case PHONE_GET_TONE_STATE:
6381 retval = j->tone_state;
6383 case PHONE_DTMF_READY:
6384 retval = j->ex.bits.dtmf_ready;
6386 case PHONE_GET_DTMF:
6387 if (ixj_hookstate(j)) {
6388 if (j->dtmf_rp != j->dtmf_wp) {
6389 retval = j->dtmfbuffer[j->dtmf_rp];
6391 if (j->dtmf_rp == 79)
6393 if (j->dtmf_rp == j->dtmf_wp) {
6394 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6399 case PHONE_GET_DTMF_ASCII:
6400 if (ixj_hookstate(j)) {
6401 if (j->dtmf_rp != j->dtmf_wp) {
6402 switch (j->dtmfbuffer[j->dtmf_rp]) {
6404 retval = 42; /* '*'; */
6408 retval = 48; /*'0'; */
6412 retval = 35; /*'#'; */
6416 retval = 65; /*'A'; */
6420 retval = 66; /*'B'; */
6424 retval = 67; /*'C'; */
6428 retval = 68; /*'D'; */
6432 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6436 if (j->dtmf_rp == 79)
6438 if(j->dtmf_rp == j->dtmf_wp)
6440 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6445 case PHONE_DTMF_OOB:
6446 j->flags.dtmf_oob = arg;
6448 case PHONE_DIALTONE:
6454 case PHONE_RINGBACK:
6458 if(j->cardtype == QTI_PHONEJACK)
6461 retval = ixj_wink(j);
6463 case PHONE_CPT_STOP:
6466 case PHONE_QUERY_CODEC:
6468 struct phone_codec_data pd;
6470 int proto_size[] = {
6472 12, 10, 16, 9, 8, 48, 5,
6473 40, 40, 80, 40, 40, 6
6475 if(copy_from_user(&pd, argp, sizeof(pd))) {
6479 if(pd.type<1 || pd.type>13) {
6480 retval = -EPROTONOSUPPORT;
6484 val=proto_size[pd.type];
6485 else switch(j->baseframe.low)
6487 case 0xA0:val=2*proto_size[pd.type];break;
6488 case 0x50:val=proto_size[pd.type];break;
6489 default:val=proto_size[pd.type]*3;break;
6491 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6492 if(copy_to_user(argp, &pd, sizeof(pd)))
6496 case IXJCTL_DSP_IDLE:
6500 if ((arg & 0xff) == 0xff)
6501 retval = ixj_get_mixer(arg, j);
6505 case IXJCTL_DAA_COEFF_SET:
6509 retval = ixj_daa_write(j);
6513 retval = ixj_daa_write(j);
6516 DAA_Coeff_France(j);
6517 retval = ixj_daa_write(j);
6520 DAA_Coeff_Germany(j);
6521 retval = ixj_daa_write(j);
6524 DAA_Coeff_Australia(j);
6525 retval = ixj_daa_write(j);
6529 retval = ixj_daa_write(j);
6536 case IXJCTL_DAA_AGAIN:
6537 ixj_daa_cr4(j, arg | 0x02);
6539 case IXJCTL_PSTN_LINETEST:
6540 retval = ixj_linetest(j);
6543 ixj_write_vmwi(j, arg);
6546 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6548 j->ex.bits.caller_id = 0;
6550 case IXJCTL_WINK_DURATION:
6555 retval = ixj_set_port(j, arg);
6559 case IXJCTL_POTS_PSTN:
6560 retval = ixj_set_pots(j, arg);
6562 case PHONE_CAPABILITIES:
6566 case PHONE_CAPABILITIES_LIST:
6568 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6571 case PHONE_CAPABILITIES_CHECK:
6573 struct phone_capability cap;
6574 if (copy_from_user(&cap, argp, sizeof(cap)))
6578 retval = capabilities_check(j, &cap);
6582 case PHONE_PSTN_SET_STATE:
6583 daa_set_mode(j, arg);
6585 case PHONE_PSTN_GET_STATE:
6586 retval = j->daa_mode;
6587 j->ex.bits.pstn_ring = 0;
6589 case IXJCTL_SET_FILTER:
6590 if (copy_from_user(&jf, argp, sizeof(jf)))
6592 retval = ixj_init_filter(j, &jf);
6594 case IXJCTL_SET_FILTER_RAW:
6595 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6598 retval = ixj_init_filter_raw(j, &jfr);
6600 case IXJCTL_GET_FILTER_HIST:
6604 retval = j->filter_hist[arg];
6606 case IXJCTL_INIT_TONE:
6607 if (copy_from_user(&ti, argp, sizeof(ti)))
6610 retval = ixj_init_tone(j, &ti);
6612 case IXJCTL_TONE_CADENCE:
6613 retval = ixj_build_cadence(j, argp);
6615 case IXJCTL_FILTER_CADENCE:
6616 retval = ixj_build_filter_cadence(j, argp);
6619 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6623 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6624 if(j->sigdef.event < 33) {
6626 for(mant = 0; mant < j->sigdef.event; mant++){
6629 if(j->sigdef.signal)
6630 j->ex_sig.bytes |= raise;
6632 j->ex_sig.bytes &= (raise^0xffff);
6635 case IXJCTL_INTERCOM_STOP:
6636 if(arg < 0 || arg >= IXJMAX)
6642 get_ixj(arg)->intercom = -1;
6643 ixj_record_stop(get_ixj(arg));
6644 ixj_play_stop(get_ixj(arg));
6647 case IXJCTL_INTERCOM_START:
6648 if(arg < 0 || arg >= IXJMAX)
6651 ixj_record_start(j);
6653 get_ixj(arg)->intercom = board;
6654 ixj_play_start(get_ixj(arg));
6655 ixj_record_start(get_ixj(arg));
6658 if (ixjdebug & 0x0040)
6659 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6660 clear_bit(board, &j->busyflags);
6664 static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6668 ret = do_ixj_ioctl(file_p, cmd, arg);
6673 static int ixj_fasync(int fd, struct file *file_p, int mode)
6675 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6677 return fasync_helper(fd, file_p, mode, &j->async_queue);
6680 static const struct file_operations ixj_fops =
6682 .owner = THIS_MODULE,
6683 .read = ixj_enhanced_read,
6684 .write = ixj_enhanced_write,
6686 .unlocked_ioctl = ixj_ioctl,
6687 .release = ixj_release,
6688 .fasync = ixj_fasync
6691 static int ixj_linetest(IXJ *j)
6693 j->flags.pstncheck = 1; /* Testing */
6694 j->flags.pstn_present = 0; /* Assume the line is not there */
6696 daa_int_read(j); /*Clear DAA Interrupt flags */
6698 /* Hold all relays in the normally de-energized position. */
6701 j->pld_slicw.bits.rly1 = 0;
6702 j->pld_slicw.bits.rly2 = 0;
6703 j->pld_slicw.bits.rly3 = 0;
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 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6709 if (j->pld_slicr.bits.potspstn) {
6710 j->flags.pots_pstn = 1;
6711 j->flags.pots_correct = 0;
6712 LED_SetState(0x4, j);
6714 j->flags.pots_pstn = 0;
6715 j->pld_slicw.bits.rly1 = 0;
6716 j->pld_slicw.bits.rly2 = 0;
6717 j->pld_slicw.bits.rly3 = 1;
6718 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6719 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6721 outb_p(j->pld_scrw.byte, j->XILINXbase);
6722 daa_set_mode(j, SOP_PU_CONVERSATION);
6725 daa_set_mode(j, SOP_PU_RESET);
6726 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6727 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6728 LED_SetState(0x4, j);
6729 j->pld_slicw.bits.rly3 = 0;
6730 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6732 j->flags.pots_correct = 1;
6733 LED_SetState(0x8, j);
6734 j->pld_slicw.bits.rly1 = 1;
6735 j->pld_slicw.bits.rly2 = 0;
6736 j->pld_slicw.bits.rly3 = 0;
6737 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6740 j->pld_slicw.bits.rly3 = 0;
6741 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6742 daa_set_mode(j, SOP_PU_CONVERSATION);
6745 daa_set_mode(j, SOP_PU_RESET);
6746 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6747 j->pstn_sleeptil = jiffies + (hertz / 4);
6748 j->flags.pstn_present = 1;
6750 j->flags.pstn_present = 0;
6752 if (j->flags.pstn_present) {
6753 if (j->flags.pots_correct) {
6754 LED_SetState(0xA, j);
6756 LED_SetState(0x6, j);
6759 if (j->flags.pots_correct) {
6760 LED_SetState(0x9, j);
6762 LED_SetState(0x5, j);
6765 j->flags.pstncheck = 0; /* Testing */
6766 return j->flags.pstn_present;
6769 static int ixj_selfprobe(IXJ *j)
6775 init_waitqueue_head(&j->poll_q);
6776 init_waitqueue_head(&j->read_q);
6777 init_waitqueue_head(&j->write_q);
6779 while(atomic_read(&j->DSPWrite) > 0)
6780 atomic_dec(&j->DSPWrite);
6781 if (ixjdebug & 0x0002)
6782 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6783 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6785 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6787 /* The read values of the SSR should be 0x00 for the IDLE command */
6788 if (j->ssr.low || j->ssr.high)
6790 if (ixjdebug & 0x0002)
6791 printk(KERN_INFO "Get Device ID Code\n");
6792 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6794 j->dsp.low = j->ssr.low;
6795 j->dsp.high = j->ssr.high;
6796 if (ixjdebug & 0x0002)
6797 printk(KERN_INFO "Get Device Version Code\n");
6798 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6800 j->ver.low = j->ssr.low;
6801 j->ver.high = j->ssr.high;
6803 if (j->dsp.low == 0x21) {
6804 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6805 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6806 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6807 bytes.low = inb_p(j->XILINXbase + 0x02);
6808 if (bytes.low == bytes.high) /* Register is read only on */
6809 /* Internet PhoneJack Lite */
6811 j->cardtype = QTI_PHONEJACK_LITE;
6812 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6813 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6816 j->pld_slicw.pcib.e1 = 1;
6817 outb_p(j->pld_slicw.byte, j->XILINXbase);
6819 j->cardtype = QTI_LINEJACK;
6821 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6822 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6826 } else if (j->dsp.low == 0x22) {
6827 j->cardtype = QTI_PHONEJACK_PCI;
6828 request_region(j->XILINXbase, 4, "ixj control");
6829 j->pld_slicw.pcib.e1 = 1;
6830 outb_p(j->pld_slicw.byte, j->XILINXbase);
6832 j->cardtype = QTI_PHONEJACK;
6834 switch (j->cardtype) {
6836 if (!j->dsp.low != 0x20) {
6839 ixj_WriteDSPCommand(0x3800, j);
6840 j->ver.low = j->ssr.low;
6841 j->ver.high = j->ssr.high;
6845 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6846 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6850 case QTI_PHONEJACK_LITE:
6851 case QTI_PHONEJACK_PCI:
6852 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6853 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6856 j->pld_slicw.pcib.e1 = 1;
6857 outb_p(j->pld_slicw.byte, j->XILINXbase);
6863 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6864 if (ixjdebug & 0x0002)
6865 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6866 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6868 if (ixjdebug & 0x0002)
6869 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6870 if (j->cardtype == QTI_PHONEJACK) {
6875 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6878 if (set_base_frame(j, 30) != 30)
6880 if (ixjdebug & 0x0002)
6881 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6882 if (j->cardtype == QTI_PHONECARD) {
6883 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6886 if (j->cardtype == QTI_LINEJACK) {
6887 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6889 if (ixjdebug & 0x0002)
6890 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6891 j->pld_clock.byte = 0;
6892 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6896 if (j->dsp.low == 0x20) {
6897 if (ixjdebug & 0x0002)
6898 printk(KERN_INFO "Configure GPIO pins\n");
6899 j->gpio.bytes.high = 0x09;
6900 /* bytes.low = 0xEF; 0xF7 */
6901 j->gpio.bits.gpio1 = 1;
6902 j->gpio.bits.gpio2 = 1;
6903 j->gpio.bits.gpio3 = 0;
6904 j->gpio.bits.gpio4 = 1;
6905 j->gpio.bits.gpio5 = 1;
6906 j->gpio.bits.gpio6 = 1;
6907 j->gpio.bits.gpio7 = 1;
6908 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6909 if (ixjdebug & 0x0002)
6910 printk(KERN_INFO "Enable SLIC\n");
6911 j->gpio.bytes.high = 0x0B;
6912 j->gpio.bytes.low = 0x00;
6913 j->gpio.bits.gpio1 = 0;
6914 j->gpio.bits.gpio2 = 1;
6915 j->gpio.bits.gpio5 = 0;
6916 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6917 j->port = PORT_POTS;
6919 if (j->cardtype == QTI_LINEJACK) {
6920 LED_SetState(0x1, j);
6922 LED_SetState(0x2, j);
6924 LED_SetState(0x4, j);
6926 LED_SetState(0x8, j);
6928 LED_SetState(0x0, j);
6930 if (ixjdebug & 0x0002)
6931 printk("Loading DAA Coefficients\n");
6933 if (!ixj_daa_write(j)) {
6934 printk("DAA write failed on board %d\n", j->board);
6937 if(!ixj_daa_cid_reset(j)) {
6938 printk("DAA CID reset failed on board %d\n", j->board);
6941 j->flags.pots_correct = 0;
6942 j->flags.pstn_present = 0;
6944 if (j->flags.pots_correct) {
6945 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6947 outb_p(j->pld_scrw.byte, j->XILINXbase);
6948 j->pld_slicw.bits.rly1 = 1;
6949 j->pld_slicw.bits.spken = 1;
6950 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6951 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6952 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6953 j->port = PORT_POTS;
6955 ixj_set_port(j, PORT_PSTN);
6957 if (ixjdebug & 0x0002)
6958 printk(KERN_INFO "Enable Mixer\n");
6959 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
6960 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
6962 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
6963 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
6965 ixj_mixer(0x0480, j); /*FM Left mute */
6966 ixj_mixer(0x0580, j); /*FM Right mute */
6968 ixj_mixer(0x0680, j); /*CD Left mute */
6969 ixj_mixer(0x0780, j); /*CD Right mute */
6971 ixj_mixer(0x0880, j); /*Line Left mute */
6972 ixj_mixer(0x0980, j); /*Line Right mute */
6974 ixj_mixer(0x0A80, j); /*Aux left mute */
6975 ixj_mixer(0x0B80, j); /*Aux right mute */
6977 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
6978 ixj_mixer(0x0D80, j); /*Mono2 mute */
6980 ixj_mixer(0x0E80, j); /*Mic mute */
6982 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
6984 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
6985 ixj_mixer(0x110C, j);
6988 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
6989 ixj_mixer(0x1401, j);
6991 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
6992 ixj_mixer(0x1501, j);
6994 ixj_mixer(0x1700, j); /*Clock select */
6996 ixj_mixer(0x1800, j); /*ADC input from mixer */
6998 ixj_mixer(0x1901, j); /*Mic gain 30db */
7000 if (ixjdebug & 0x0002)
7001 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
7002 j->cadence_f[4].state = 0;
7003 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7004 j->cadence_f[4].off1 = 0;
7005 j->cadence_f[4].on2 = 0;
7006 j->cadence_f[4].off2 = 0;
7007 j->cadence_f[4].on3 = 0;
7008 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7009 j->pstn_last_rmr = jiffies;
7012 if (j->cardtype == QTI_PHONECARD) {
7013 ixj_WriteDSPCommand(0xCF07, j);
7014 ixj_WriteDSPCommand(0x00B0, j);
7015 ixj_set_port(j, PORT_SPEAKER);
7017 ixj_set_port(j, PORT_POTS);
7018 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7019 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7025 j->framesread = j->frameswritten = 0;
7026 j->read_wait = j->write_wait = 0;
7027 j->rxreadycheck = j->txreadycheck = 0;
7029 /* initialise the DTMF prescale to a sensible value */
7030 if (j->cardtype == QTI_LINEJACK) {
7031 set_dtmf_prescale(j, 0x10);
7033 set_dtmf_prescale(j, 0x40);
7035 set_play_volume(j, 0x100);
7036 set_rec_volume(j, 0x100);
7038 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7040 /* The read values of the SSR should be 0x00 for the IDLE command */
7041 if (j->ssr.low || j->ssr.high)
7044 if (ixjdebug & 0x0002)
7045 printk(KERN_INFO "Enable Line Monitor\n");
7047 if (ixjdebug & 0x0002)
7048 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7050 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7053 if (ixjdebug & 0x002)
7054 printk(KERN_INFO "Enable DTMF Detectors\n");
7056 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7059 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7062 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7064 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7066 j->ex.bits.dtmf_ready = 0;
7068 j->dtmf_wp = j->dtmf_rp = 0;
7069 j->rec_mode = j->play_mode = -1;
7070 j->flags.ringing = 0;
7071 j->maxrings = MAXRINGS;
7072 j->ring_cadence = USA_RING_CADENCE;
7075 j->flags.dtmf_oob = 0;
7076 for (cnt = 0; cnt < 4; cnt++)
7077 j->cadence_f[cnt].enable = 0;
7078 /* must be a device on the specified address */
7079 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7081 /* Set up the default signals for events */
7082 for (cnt = 0; cnt < 35; cnt++)
7083 j->ixj_signals[cnt] = SIGIO;
7085 /* Set the excetion signal enable flags */
7086 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7087 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 =
7088 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;
7089 #ifdef IXJ_DYN_ALLOC
7095 /* Register with the Telephony for Linux subsystem */
7096 j->p.f_op = &ixj_fops;
7097 j->p.open = ixj_open;
7098 j->p.board = j->board;
7099 phone_register_device(&j->p, PHONE_UNIT_ANY);
7107 * Exported service for pcmcia card handling
7110 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7112 IXJ *j = ixj_alloc();
7117 j->XILINXbase = xilinx;
7118 j->cardtype = QTI_PHONECARD;
7123 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7125 static int ixj_get_status_proc(char *buf)
7131 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7132 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7133 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7134 len += sprintf(buf + len, "\nUsing old telephony API");
7135 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7137 for (cnt = 0; cnt < IXJMAX; cnt++) {
7142 len += sprintf(buf + len, "\nCard Num %d", cnt);
7143 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7144 if (j->cardtype != QTI_PHONEJACK)
7145 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7146 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7147 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7148 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7149 switch (j->cardtype) {
7150 case (QTI_PHONEJACK):
7151 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7153 case (QTI_LINEJACK):
7154 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7155 if (j->flags.g729_loaded)
7156 len += sprintf(buf + len, " w/G.729 A/B");
7157 len += sprintf(buf + len, " Country = %d", j->daa_country);
7159 case (QTI_PHONEJACK_LITE):
7160 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7161 if (j->flags.g729_loaded)
7162 len += sprintf(buf + len, " w/G.729 A/B");
7164 case (QTI_PHONEJACK_PCI):
7165 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7166 if (j->flags.g729_loaded)
7167 len += sprintf(buf + len, " w/G.729 A/B");
7169 case (QTI_PHONECARD):
7170 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7171 if (j->flags.g729_loaded)
7172 len += sprintf(buf + len, " w/G.729 A/B");
7173 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7174 if (!j->pccr1.bits.drf)
7175 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7176 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7179 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7182 len += sprintf(buf + len, "\nReaders %d", j->readers);
7183 len += sprintf(buf + len, "\nWriters %d", j->writers);
7185 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7186 if (j->dsp.low != 0x20)
7187 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7188 if (j->flags.cidsent)
7189 len += sprintf(buf + len, "\nCaller ID data sent");
7191 len += sprintf(buf + len, "\nCaller ID data not sent");
7193 len += sprintf(buf + len, "\nPlay CODEC ");
7194 switch (j->play_codec) {
7196 len += sprintf(buf + len, "G.723.1 6.3");
7199 len += sprintf(buf + len, "G.723.1 5.3");
7202 len += sprintf(buf + len, "TrueSpeech 8.5");
7205 len += sprintf(buf + len, "TrueSpeech 4.8");
7208 len += sprintf(buf + len, "TrueSpeech 4.1");
7211 len += sprintf(buf + len, "G.728");
7214 len += sprintf(buf + len, "G.729");
7217 len += sprintf(buf + len, "G.729B");
7220 len += sprintf(buf + len, "uLaw");
7223 len += sprintf(buf + len, "aLaw");
7226 len += sprintf(buf + len, "16 bit Linear");
7229 len += sprintf(buf + len, "8 bit Linear");
7232 len += sprintf(buf + len, "Windows Sound System");
7235 len += sprintf(buf + len, "NO CODEC CHOSEN");
7238 len += sprintf(buf + len, "\nRecord CODEC ");
7239 switch (j->rec_codec) {
7241 len += sprintf(buf + len, "G.723.1 6.3");
7244 len += sprintf(buf + len, "G.723.1 5.3");
7247 len += sprintf(buf + len, "TrueSpeech 8.5");
7250 len += sprintf(buf + len, "TrueSpeech 4.8");
7253 len += sprintf(buf + len, "TrueSpeech 4.1");
7256 len += sprintf(buf + len, "G.728");
7259 len += sprintf(buf + len, "G.729");
7262 len += sprintf(buf + len, "G.729B");
7265 len += sprintf(buf + len, "uLaw");
7268 len += sprintf(buf + len, "aLaw");
7271 len += sprintf(buf + len, "16 bit Linear");
7274 len += sprintf(buf + len, "8 bit Linear");
7277 len += sprintf(buf + len, "Windows Sound System");
7280 len += sprintf(buf + len, "NO CODEC CHOSEN");
7283 len += sprintf(buf + len, "\nAEC ");
7284 switch (j->aec_level) {
7286 len += sprintf(buf + len, "Off");
7289 len += sprintf(buf + len, "Low");
7292 len += sprintf(buf + len, "Med");
7295 len += sprintf(buf + len, "High");
7298 len += sprintf(buf + len, "Auto");
7301 len += sprintf(buf + len, "AEC/AGC");
7304 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7308 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7309 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7310 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7312 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7314 if (j->cardtype == QTI_LINEJACK) {
7315 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7316 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7317 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7318 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7319 switch (j->daa_mode) {
7321 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7323 case SOP_PU_RINGING:
7324 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7325 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7327 case SOP_PU_CONVERSATION:
7328 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7330 case SOP_PU_PULSEDIALING:
7331 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7334 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7335 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7336 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7337 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7338 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7339 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7340 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7341 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7342 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7343 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7347 len += sprintf(buf + len, "\nPort POTS");
7350 len += sprintf(buf + len, "\nPort PSTN");
7353 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7356 len += sprintf(buf + len, "\nPort HANDSET");
7359 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7360 len += sprintf(buf + len, "\nSLIC state ");
7361 switch (SLIC_GetState(j)) {
7362 case PLD_SLIC_STATE_OC:
7363 len += sprintf(buf + len, "OC");
7365 case PLD_SLIC_STATE_RINGING:
7366 len += sprintf(buf + len, "RINGING");
7368 case PLD_SLIC_STATE_ACTIVE:
7369 len += sprintf(buf + len, "ACTIVE");
7371 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7372 len += sprintf(buf + len, "OHT");
7374 case PLD_SLIC_STATE_TIPOPEN:
7375 len += sprintf(buf + len, "TIPOPEN");
7377 case PLD_SLIC_STATE_STANDBY:
7378 len += sprintf(buf + len, "STANDBY");
7380 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7381 len += sprintf(buf + len, "APR");
7383 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7384 len += sprintf(buf + len, "OHTPR");
7387 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7391 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7392 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7393 #ifdef PERFMON_STATS
7394 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7395 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7396 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7397 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7398 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7399 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7400 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7401 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7402 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7403 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7404 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7405 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7406 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7407 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7410 len += sprintf(buf + len, "\n");
7416 static int ixj_read_proc(char *page, char **start, off_t off,
7417 int count, int *eof, void *data)
7419 int len = ixj_get_status_proc(page);
7420 if (len <= off+count) *eof = 1;
7421 *start = page + off;
7423 if (len>count) len = count;
7429 static void cleanup(void)
7434 for (cnt = 0; cnt < IXJMAX; cnt++) {
7436 if(j != NULL && j->DSPbase) {
7437 if (ixjdebug & 0x0002)
7438 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7439 del_timer(&j->timer);
7440 if (j->cardtype == QTI_LINEJACK) {
7441 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7443 outb_p(j->pld_scrw.byte, j->XILINXbase);
7444 j->pld_slicw.bits.rly1 = 0;
7445 j->pld_slicw.bits.rly2 = 0;
7446 j->pld_slicw.bits.rly3 = 0;
7447 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7448 LED_SetState(0x0, j);
7449 if (ixjdebug & 0x0002)
7450 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7451 release_region(j->XILINXbase, 8);
7452 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7453 if (ixjdebug & 0x0002)
7454 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7455 release_region(j->XILINXbase, 4);
7457 kfree(j->read_buffer);
7458 kfree(j->write_buffer);
7460 pnp_device_detach(j->dev);
7461 if (ixjdebug & 0x0002)
7462 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7463 phone_unregister_device(&j->p);
7464 if (ixjdebug & 0x0002)
7465 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7466 release_region(j->DSPbase, 16);
7467 #ifdef IXJ_DYN_ALLOC
7468 if (ixjdebug & 0x0002)
7469 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7475 if (ixjdebug & 0x0002)
7476 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7477 remove_proc_entry ("ixj", NULL);
7486 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7488 lastLCC = lastLCC & 0xfb;
7489 lastLCC = lastLCC | (byData ? 4 : 0);
7490 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7493 lastLCC = lastLCC | 0x01;
7494 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7496 byData = byData << 1;
7497 lastLCC = lastLCC & 0xfe;
7499 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7503 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7506 lastLCC = lastLCC | 0x01;
7507 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7509 lastLCC = lastLCC & 0xfe;
7511 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7513 return ((inb(wEEPROMAddress) >> 3) & 1);
7516 static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7519 WORD wEEPROMAddress = wAddress + 3;
7523 lastLCC = inb(wEEPROMAddress);
7524 lastLCC = lastLCC | 0x02;
7525 lastLCC = lastLCC & 0xfe;
7526 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7528 mdelay(1); /* delay */
7530 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7531 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7532 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7533 for (i = 0; i < 8; i++) {
7534 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7538 for (i = 0; i < 16; i++) {
7539 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7540 *pwResult = (*pwResult << 1) | byResult;
7543 mdelay(1); /* another delay */
7545 lastLCC = lastLCC & 0xfd;
7546 outb(lastLCC, wEEPROMAddress); /* negate CS */
7551 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7554 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7556 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7558 return (((DWORD) wHi << 16) | wLo);
7561 static int dspio[IXJMAX + 1] =
7565 static int xio[IXJMAX + 1] =
7570 module_param_array(dspio, int, NULL, 0);
7571 module_param_array(xio, int, NULL, 0);
7572 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7573 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7574 MODULE_LICENSE("GPL");
7576 static void __exit ixj_exit(void)
7581 static IXJ *new_ixj(unsigned long port)
7584 if (!request_region(port, 16, "ixj DSP")) {
7585 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7590 release_region(port, 16);
7591 printk(KERN_INFO "ixj: out of memory\n");
7594 res->DSPbase = port;
7598 static int __init ixj_probe_isapnp(int *cnt)
7602 struct pnp_dev *dev = NULL, *old_dev = NULL;
7610 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7611 ISAPNP_FUNCTION(func), old_dev);
7612 if (!dev || !dev->card)
7614 result = pnp_device_attach(dev);
7616 printk("pnp attach failed %d \n", result);
7619 if (pnp_activate_dev(dev) < 0) {
7620 printk("pnp activate failed (out of resources?)\n");
7621 pnp_device_detach(dev);
7625 if (!pnp_port_valid(dev, 0)) {
7626 pnp_device_detach(dev);
7630 j = new_ixj(pnp_port_start(dev, 0));
7635 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7639 j->cardtype = QTI_PHONEJACK;
7642 j->cardtype = QTI_LINEJACK;
7645 j->cardtype = QTI_PHONEJACK_LITE;
7649 probe = ixj_selfprobe(j);
7651 j->serial = dev->card->serial;
7655 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7658 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7661 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7678 static int __init ixj_probe_isa(int *cnt)
7682 /* Use passed parameters for older kernels without PnP */
7683 for (i = 0; i < IXJMAX; i++) {
7685 IXJ *j = new_ixj(dspio[i]);
7690 j->XILINXbase = xio[i];
7694 probe = ixj_selfprobe(j);
7702 static int __init ixj_probe_pci(int *cnt)
7704 struct pci_dev *pci = NULL;
7708 for (i = 0; i < IXJMAX - *cnt; i++) {
7709 pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7710 PCI_DEVICE_ID_QUICKNET_XJ, pci);
7714 if (pci_enable_device(pci))
7716 j = new_ixj(pci_resource_start(pci, 0));
7720 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7721 j->XILINXbase = j->DSPbase + 0x10;
7722 j->cardtype = QTI_PHONEJACK_PCI;
7724 probe = ixj_selfprobe(j);
7726 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7733 static int __init ixj_init(void)
7740 /* These might be no-ops, see above. */
7741 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7744 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7747 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7750 printk(KERN_INFO "ixj driver initialized.\n");
7751 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7755 module_init(ixj_init);
7756 module_exit(ixj_exit);
7758 static void DAA_Coeff_US(IXJ *j)
7762 j->daa_country = DAA_US;
7763 /*----------------------------------------------- */
7765 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7766 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7769 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7771 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7772 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7773 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7774 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7775 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7776 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7777 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7778 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7779 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7780 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7781 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7782 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7783 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7784 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7785 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7786 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7787 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7788 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7789 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7790 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7791 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7792 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7793 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7794 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7795 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7796 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7797 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7798 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7799 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7800 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7801 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7802 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7803 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7804 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7805 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7806 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7807 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7808 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7809 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7810 /* Bytes for AR-filter (09): 52,D3,11,42 */
7811 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7812 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7813 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7814 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7815 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7817 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7818 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7821 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7822 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7824 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7826 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7827 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7828 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7829 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7830 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7831 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7832 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7833 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7834 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7835 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7836 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7837 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7838 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7839 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7840 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7841 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7842 /* ; (10K, 0.68uF) */
7844 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7846 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7847 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7848 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7849 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7850 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7851 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7852 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7853 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7854 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7855 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7856 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7857 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7858 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7859 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7860 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7861 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7863 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7864 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7865 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7866 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7867 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7869 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7870 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7871 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7872 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7873 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7874 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7875 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7876 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7877 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7878 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7879 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7880 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7881 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7882 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7883 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7884 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7885 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7886 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7888 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7889 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7890 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7891 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7892 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7894 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7896 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7897 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7898 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7899 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7900 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7901 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7902 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7903 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7904 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7905 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7906 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7907 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7908 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7909 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7910 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7911 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7914 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7915 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7916 /* Config. Reg. 1 (dialing) (cr1):05 */
7917 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7918 /* Config. Reg. 2 (caller ID) (cr2):04 */
7919 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7920 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7921 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7922 /* Config. Reg. 4 (analog gain) (cr4):02 */
7923 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7924 /* Config. Reg. 5 (Version) (cr5):02 */
7925 /* Config. Reg. 6 (Reserved) (cr6):00 */
7926 /* Config. Reg. 7 (Reserved) (cr7):00 */
7929 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7931 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7932 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7934 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7935 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7936 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7937 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7938 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7939 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7941 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7942 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7943 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7944 /* Ext. Reg. 6 (Power State) (xr6):00 */
7945 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7946 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7947 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7949 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7950 /* 12,33,5A,C3 ; 770 Hz */
7951 /* 13,3C,5B,32 ; 852 Hz */
7952 /* 1D,1B,5C,CC ; 941 Hz */
7954 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7955 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7956 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7957 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7958 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7959 /* EC,1D,52,22 ; 1336 Hz */
7960 /* AA,AC,51,D2 ; 1477 Hz */
7961 /* 9B,3B,51,25 ; 1633 Hz */
7962 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7963 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7964 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7965 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7968 static void DAA_Coeff_UK(IXJ *j)
7972 j->daa_country = DAA_UK;
7973 /*----------------------------------------------- */
7975 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7976 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7979 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7981 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7982 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7983 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7984 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7985 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7986 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7987 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7988 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7989 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7990 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7991 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7992 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7993 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7994 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7995 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7996 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7997 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7998 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7999 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
8000 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
8001 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
8002 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8003 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8004 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8005 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8006 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8007 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8008 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8009 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8010 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8011 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8012 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8013 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8014 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8015 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8016 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8017 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8018 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8019 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8020 /* Bytes for AR-filter (09): E2,27,10,D6 */
8021 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8022 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8023 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8024 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8025 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8027 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8028 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8031 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8032 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8034 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8036 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8037 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8038 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8039 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8040 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8041 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8042 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8043 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8044 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8045 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8046 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8047 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8048 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8049 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8050 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8051 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8053 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8055 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8056 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8057 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8058 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8059 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8060 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8061 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8062 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8063 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8064 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8065 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8066 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8067 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8068 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8069 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8070 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8071 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8072 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8073 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8074 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8075 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8076 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8078 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8079 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8080 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8081 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8082 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8083 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8084 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8085 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8086 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8087 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8088 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8089 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8090 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8091 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8092 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8093 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8095 /* Config. Reg. 0 (filters) (cr0):FF */
8096 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8097 /* Config. Reg. 1 (dialing) (cr1):05 */
8098 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8099 /* Config. Reg. 2 (caller ID) (cr2):04 */
8100 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8101 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8102 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8103 /* Config. Reg. 4 (analog gain) (cr4):02 */
8104 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8105 /* Config. Reg. 5 (Version) (cr5):02 */
8106 /* Config. Reg. 6 (Reserved) (cr6):00 */
8107 /* Config. Reg. 7 (Reserved) (cr7):00 */
8109 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8111 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8112 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8114 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8115 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8117 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8118 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8119 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8120 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8121 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8122 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8123 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8124 /* Ext. Reg. 6 (Power State) (xr6):00 */
8125 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8126 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8127 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8128 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8129 /* 12,33,5A,C3 ; 770 Hz */
8130 /* 13,3C,5B,32 ; 852 Hz */
8131 /* 1D,1B,5C,CC ; 941 Hz */
8133 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8134 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8135 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8136 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8137 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8138 /* EC,1D,52,22 ; 1336 Hz */
8139 /* AA,AC,51,D2 ; 1477 Hz */
8140 /* 9B,3B,51,25 ; 1633 Hz */
8141 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8142 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8143 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8144 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8148 static void DAA_Coeff_France(IXJ *j)
8152 j->daa_country = DAA_FRANCE;
8153 /*----------------------------------------------- */
8155 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8156 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8159 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8161 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8162 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8163 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8164 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8165 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8166 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8167 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8168 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8169 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8170 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8171 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8172 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8173 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8174 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8175 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8176 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8177 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8178 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8179 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8180 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8181 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8182 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8183 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8184 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8185 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8186 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8187 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8188 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8189 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8190 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8191 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8192 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8193 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8194 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8195 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8196 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8197 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8198 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8199 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8200 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8201 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8202 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8203 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8204 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8205 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8207 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8208 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8211 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8212 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8214 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8216 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8217 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8218 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8219 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8220 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8221 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8222 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8223 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8224 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8225 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8226 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8227 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8228 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8229 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8230 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8231 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8233 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8235 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8236 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8237 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8238 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8239 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8240 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8241 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8242 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8243 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8244 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8245 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8246 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8247 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8248 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8249 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8250 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8251 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8252 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8253 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8254 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8255 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8256 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8258 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8259 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8260 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8261 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8262 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8263 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8264 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8265 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8266 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8267 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8268 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8269 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8270 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8271 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8272 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8273 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8275 /* Config. Reg. 0 (filters) (cr0):FF */
8276 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8277 /* Config. Reg. 1 (dialing) (cr1):05 */
8278 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8279 /* Config. Reg. 2 (caller ID) (cr2):04 */
8280 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8281 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8282 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8283 /* Config. Reg. 4 (analog gain) (cr4):02 */
8284 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8285 /* Config. Reg. 5 (Version) (cr5):02 */
8286 /* Config. Reg. 6 (Reserved) (cr6):00 */
8287 /* Config. Reg. 7 (Reserved) (cr7):00 */
8289 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8291 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8292 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8294 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8295 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8297 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8298 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8299 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8300 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8301 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8302 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8303 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8304 /* Ext. Reg. 6 (Power State) (xr6):00 */
8305 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8306 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8307 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8308 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8309 /* 12,33,5A,C3 ; 770 Hz */
8310 /* 13,3C,5B,32 ; 852 Hz */
8311 /* 1D,1B,5C,CC ; 941 Hz */
8313 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8314 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8315 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8316 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8317 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8318 /* EC,1D,52,22 ; 1336 Hz */
8319 /* AA,AC,51,D2 ; 1477 Hz */
8320 /* 9B,3B,51,25 ; 1633 Hz */
8321 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8322 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8323 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8324 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8328 static void DAA_Coeff_Germany(IXJ *j)
8332 j->daa_country = DAA_GERMANY;
8333 /*----------------------------------------------- */
8335 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8336 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8339 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8341 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8342 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8343 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8344 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8345 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8346 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8347 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8348 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8349 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8350 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8351 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8352 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8353 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8354 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8355 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8356 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8357 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8358 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8359 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8360 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8361 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8362 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8363 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8364 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8365 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8366 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8367 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8368 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8369 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8370 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8371 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8372 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8373 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8374 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8375 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8376 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8377 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8378 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8379 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8380 /* Bytes for AR-filter (09): 72,42,13,4B */
8381 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8382 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8383 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8384 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8385 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8387 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8388 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8391 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8392 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8394 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8396 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8397 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8398 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8399 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8400 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8401 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8402 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8403 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8404 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8405 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8406 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8407 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8408 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8409 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8410 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8411 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8412 /* ; (10K, 0.68uF) */
8413 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8415 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8416 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8417 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8418 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8419 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8420 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8421 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8422 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8423 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8424 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8425 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8426 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8427 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8428 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8429 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8430 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8431 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8432 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8433 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8434 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8435 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8436 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8438 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8439 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8440 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8441 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8442 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8443 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8444 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8445 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8446 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8447 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8448 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8449 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8450 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8451 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8452 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8453 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8455 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8456 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8457 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8458 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8459 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8460 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8461 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8462 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8463 /* Config. Reg. 4 (analog gain) (cr4):02 */
8464 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8465 /* Config. Reg. 5 (Version) (cr5):02 */
8466 /* Config. Reg. 6 (Reserved) (cr6):00 */
8467 /* Config. Reg. 7 (Reserved) (cr7):00 */
8469 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8471 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8472 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8474 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8475 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8477 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8478 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8479 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8480 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8481 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8482 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8483 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8484 /* Ext. Reg. 6 (Power State) (xr6):00 */
8485 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8486 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8487 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8488 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8489 /* 12,33,5A,C3 ; 770 Hz */
8490 /* 13,3C,5B,32 ; 852 Hz */
8491 /* 1D,1B,5C,CC ; 941 Hz */
8493 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8494 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8495 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8496 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8497 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8498 /* EC,1D,52,22 ; 1336 Hz */
8499 /* AA,AC,51,D2 ; 1477 Hz */
8500 /* 9B,3B,51,25 ; 1633 Hz */
8501 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8502 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8503 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8504 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8508 static void DAA_Coeff_Australia(IXJ *j)
8512 j->daa_country = DAA_AUSTRALIA;
8513 /*----------------------------------------------- */
8515 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8516 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8519 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8521 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8522 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8523 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8524 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8525 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8526 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8527 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8528 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8529 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8530 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8531 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8532 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8533 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8534 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8535 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8536 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8537 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8538 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8539 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8540 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8541 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8542 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8543 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8544 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8545 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8546 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8547 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8548 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8549 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8550 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8551 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8552 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8553 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8554 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8555 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8556 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8557 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8558 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8559 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8560 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8561 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8562 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8563 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8564 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8565 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8567 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8568 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8571 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8572 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8574 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8576 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8577 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8578 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8579 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8580 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8581 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8582 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8583 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8584 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8585 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8586 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8587 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8588 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8589 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8590 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8591 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8593 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8595 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8596 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8597 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8598 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8599 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8600 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8601 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8602 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8603 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8604 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8605 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8606 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8607 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8608 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8609 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8610 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8611 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8612 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8613 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8614 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8615 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8616 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8618 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8619 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8620 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8621 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8622 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8623 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8624 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8625 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8626 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8627 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8628 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8629 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8630 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8631 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8632 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8633 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8635 /* Config. Reg. 0 (filters) (cr0):FF */
8636 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8637 /* Config. Reg. 1 (dialing) (cr1):05 */
8638 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8639 /* Config. Reg. 2 (caller ID) (cr2):04 */
8640 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8641 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8642 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8643 /* Config. Reg. 4 (analog gain) (cr4):02 */
8644 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8645 /* Config. Reg. 5 (Version) (cr5):02 */
8646 /* Config. Reg. 6 (Reserved) (cr6):00 */
8647 /* Config. Reg. 7 (Reserved) (cr7):00 */
8649 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8651 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8652 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8654 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8655 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8657 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8658 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8659 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8660 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8661 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8662 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8663 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8664 /* Ext. Reg. 6 (Power State) (xr6):00 */
8665 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8666 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8667 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8669 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8670 /* 12,33,5A,C3 ; 770 Hz */
8671 /* 13,3C,5B,32 ; 852 Hz */
8672 /* 1D,1B,5C,CC ; 941 Hz */
8673 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8674 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8675 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8676 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8678 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8679 /* EC,1D,52,22 ; 1336 Hz */
8680 /* AA,AC,51,D2 ; 1477 Hz */
8681 /* 9B,3B,51,25 ; 1633 Hz */
8682 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8683 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8684 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8685 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8688 static void DAA_Coeff_Japan(IXJ *j)
8692 j->daa_country = DAA_JAPAN;
8693 /*----------------------------------------------- */
8695 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8696 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8699 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8701 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8702 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8703 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8704 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8705 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8706 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8707 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8708 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8709 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8710 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8711 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8712 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8713 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8714 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8715 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8716 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8717 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8718 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8719 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8720 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8721 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8722 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8723 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8724 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8725 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8726 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8727 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8728 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8729 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8730 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8731 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8732 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8733 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8734 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8735 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8736 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8737 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8738 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8739 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8740 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8741 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8742 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8743 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8744 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8745 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8747 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8748 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8751 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8752 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8754 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8756 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8757 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8758 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8759 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8760 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8761 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8762 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8763 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8764 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8765 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8766 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8767 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8768 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8769 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8770 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8771 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8773 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8775 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8776 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8777 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8778 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8779 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8780 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8781 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8782 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8783 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8784 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8785 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8786 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8787 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8788 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8789 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8790 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8791 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8792 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8793 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8794 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8795 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8796 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8798 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8799 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8800 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8801 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8802 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8803 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8804 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8805 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8806 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8807 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8808 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8809 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8810 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8811 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8812 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8813 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8815 /* Config. Reg. 0 (filters) (cr0):FF */
8816 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8817 /* Config. Reg. 1 (dialing) (cr1):05 */
8818 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8819 /* Config. Reg. 2 (caller ID) (cr2):04 */
8820 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8821 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8822 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8823 /* Config. Reg. 4 (analog gain) (cr4):02 */
8824 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8825 /* Config. Reg. 5 (Version) (cr5):02 */
8826 /* Config. Reg. 6 (Reserved) (cr6):00 */
8827 /* Config. Reg. 7 (Reserved) (cr7):00 */
8829 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8831 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8832 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8834 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8835 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8837 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8838 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8839 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8840 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8841 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8842 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8843 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8844 /* Ext. Reg. 6 (Power State) (xr6):00 */
8845 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8846 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8847 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8848 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8849 /* 12,33,5A,C3 ; 770 Hz */
8850 /* 13,3C,5B,32 ; 852 Hz */
8851 /* 1D,1B,5C,CC ; 941 Hz */
8853 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8854 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8855 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8856 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8857 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8858 /* EC,1D,52,22 ; 1336 Hz */
8859 /* AA,AC,51,D2 ; 1477 Hz */
8860 /* 9B,3B,51,25 ; 1633 Hz */
8861 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8862 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8863 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8864 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8867 static s16 tone_table[][19] =
8870 32538, /* A1 = 1.985962 */
8871 -32325, /* A2 = -0.986511 */
8872 -343, /* B2 = -0.010493 */
8874 343, /* B0 = 0.010493 */
8875 32619, /* A1 = 1.990906 */
8876 -32520, /* A2 = -0.992462 */
8877 19179, /* B2 = 0.585327 */
8878 -19178, /* B1 = -1.170593 */
8879 19179, /* B0 = 0.585327 */
8880 32723, /* A1 = 1.997314 */
8881 -32686, /* A2 = -0.997528 */
8882 9973, /* B2 = 0.304352 */
8883 -9955, /* B1 = -0.607605 */
8884 9973, /* B0 = 0.304352 */
8885 7, /* Internal filter scaling */
8886 159, /* Minimum in-band energy threshold */
8887 21, /* 21/32 in-band to broad-band ratio */
8888 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8890 { /* f133_200[] 12 */
8891 32072, /* A1 = 1.95752 */
8892 -31896, /* A2 = -0.973419 */
8893 -435, /* B2 = -0.013294 */
8895 435, /* B0 = 0.013294 */
8896 32188, /* A1 = 1.9646 */
8897 -32400, /* A2 = -0.98877 */
8898 15139, /* B2 = 0.462036 */
8899 -14882, /* B1 = -0.908356 */
8900 15139, /* B0 = 0.462036 */
8901 32473, /* A1 = 1.981995 */
8902 -32524, /* A2 = -0.992584 */
8903 23200, /* B2 = 0.708008 */
8904 -23113, /* B1 = -1.410706 */
8905 23200, /* B0 = 0.708008 */
8906 7, /* Internal filter scaling */
8907 159, /* Minimum in-band energy threshold */
8908 21, /* 21/32 in-band to broad-band ratio */
8909 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8912 31769, /* A1 = -1.939026 */
8913 -32584, /* A2 = 0.994385 */
8914 -475, /* B2 = -0.014522 */
8915 0, /* B1 = 0.000000 */
8916 475, /* B0 = 0.014522 */
8917 31789, /* A1 = -1.940247 */
8918 -32679, /* A2 = 0.997284 */
8919 17280, /* B2 = 0.527344 */
8920 -16865, /* B1 = -1.029358 */
8921 17280, /* B0 = 0.527344 */
8922 31841, /* A1 = -1.943481 */
8923 -32681, /* A2 = 0.997345 */
8924 543, /* B2 = 0.016579 */
8925 -525, /* B1 = -0.032097 */
8926 543, /* B0 = 0.016579 */
8927 5, /* Internal filter scaling */
8928 159, /* Minimum in-band energy threshold */
8929 21, /* 21/32 in-band to broad-band ratio */
8930 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8932 { /* f300_420[] 14 */
8933 30750, /* A1 = 1.876892 */
8934 -31212, /* A2 = -0.952515 */
8935 -804, /* B2 = -0.024541 */
8937 804, /* B0 = 0.024541 */
8938 30686, /* A1 = 1.872925 */
8939 -32145, /* A2 = -0.980988 */
8940 14747, /* B2 = 0.450043 */
8941 -13703, /* B1 = -0.836395 */
8942 14747, /* B0 = 0.450043 */
8943 31651, /* A1 = 1.931824 */
8944 -32321, /* A2 = -0.986389 */
8945 24425, /* B2 = 0.745422 */
8946 -23914, /* B1 = -1.459595 */
8947 24427, /* B0 = 0.745483 */
8948 7, /* Internal filter scaling */
8949 159, /* Minimum in-band energy threshold */
8950 21, /* 21/32 in-band to broad-band ratio */
8951 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8954 31613, /* A1 = -1.929565 */
8955 -32646, /* A2 = 0.996277 */
8956 -185, /* B2 = -0.005657 */
8957 0, /* B1 = 0.000000 */
8958 185, /* B0 = 0.005657 */
8959 31620, /* A1 = -1.929932 */
8960 -32713, /* A2 = 0.998352 */
8961 19253, /* B2 = 0.587585 */
8962 -18566, /* B1 = -1.133179 */
8963 19253, /* B0 = 0.587585 */
8964 31674, /* A1 = -1.933228 */
8965 -32715, /* A2 = 0.998413 */
8966 2575, /* B2 = 0.078590 */
8967 -2495, /* B1 = -0.152283 */
8968 2575, /* B0 = 0.078590 */
8969 5, /* Internal filter scaling */
8970 159, /* Minimum in-band energy threshold */
8971 21, /* 21/32 in-band to broad-band ratio */
8972 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8974 { /* f300_425[] 16 */
8975 30741, /* A1 = 1.876282 */
8976 -31475, /* A2 = -0.960541 */
8977 -703, /* B2 = -0.021484 */
8979 703, /* B0 = 0.021484 */
8980 30688, /* A1 = 1.873047 */
8981 -32248, /* A2 = -0.984161 */
8982 14542, /* B2 = 0.443787 */
8983 -13523, /* B1 = -0.825439 */
8984 14542, /* B0 = 0.443817 */
8985 31494, /* A1 = 1.922302 */
8986 -32366, /* A2 = -0.987762 */
8987 21577, /* B2 = 0.658508 */
8988 -21013, /* B1 = -1.282532 */
8989 21577, /* B0 = 0.658508 */
8990 7, /* Internal filter scaling */
8991 159, /* Minimum in-band energy threshold */
8992 21, /* 21/32 in-band to broad-band ratio */
8993 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8995 { /* f330_440[] 17 */
8996 30627, /* A1 = 1.869324 */
8997 -31338, /* A2 = -0.95636 */
8998 -843, /* B2 = -0.025749 */
9000 843, /* B0 = 0.025749 */
9001 30550, /* A1 = 1.864685 */
9002 -32221, /* A2 = -0.983337 */
9003 13594, /* B2 = 0.414886 */
9004 -12589, /* B1 = -0.768402 */
9005 13594, /* B0 = 0.414886 */
9006 31488, /* A1 = 1.921936 */
9007 -32358, /* A2 = -0.987518 */
9008 24684, /* B2 = 0.753296 */
9009 -24029, /* B1 = -1.466614 */
9010 24684, /* B0 = 0.753296 */
9011 7, /* Internal filter scaling */
9012 159, /* Minimum in-band energy threshold */
9013 21, /* 21/32 in-band to broad-band ratio */
9014 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9017 31546, /* A1 = -1.925476 */
9018 -32646, /* A2 = 0.996277 */
9019 -445, /* B2 = -0.013588 */
9020 0, /* B1 = 0.000000 */
9021 445, /* B0 = 0.013588 */
9022 31551, /* A1 = -1.925781 */
9023 -32713, /* A2 = 0.998352 */
9024 23884, /* B2 = 0.728882 */
9025 -22979, /* B1 = -1.402527 */
9026 23884, /* B0 = 0.728882 */
9027 31606, /* A1 = -1.929138 */
9028 -32715, /* A2 = 0.998413 */
9029 863, /* B2 = 0.026367 */
9030 -835, /* B1 = -0.050985 */
9031 863, /* B0 = 0.026367 */
9032 5, /* Internal filter scaling */
9033 159, /* Minimum in-band energy threshold */
9034 21, /* 21/32 in-band to broad-band ratio */
9035 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9037 { /* f350_400[] 19 */
9038 31006, /* A1 = 1.892517 */
9039 -32029, /* A2 = -0.977448 */
9040 -461, /* B2 = -0.014096 */
9042 461, /* B0 = 0.014096 */
9043 30999, /* A1 = 1.892029 */
9044 -32487, /* A2 = -0.991455 */
9045 11325, /* B2 = 0.345612 */
9046 -10682, /* B1 = -0.651978 */
9047 11325, /* B0 = 0.345612 */
9048 31441, /* A1 = 1.919067 */
9049 -32526, /* A2 = -0.992615 */
9050 24324, /* B2 = 0.74231 */
9051 -23535, /* B1 = -1.436523 */
9052 24324, /* B0 = 0.74231 */
9053 7, /* Internal filter scaling */
9054 159, /* Minimum in-band energy threshold */
9055 21, /* 21/32 in-band to broad-band ratio */
9056 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9059 30634, /* A1 = 1.869751 */
9060 -31533, /* A2 = -0.962341 */
9061 -680, /* B2 = -0.020782 */
9063 680, /* B0 = 0.020782 */
9064 30571, /* A1 = 1.865906 */
9065 -32277, /* A2 = -0.985016 */
9066 12894, /* B2 = 0.393524 */
9067 -11945, /* B1 = -0.729065 */
9068 12894, /* B0 = 0.393524 */
9069 31367, /* A1 = 1.91449 */
9070 -32379, /* A2 = -0.988129 */
9071 23820, /* B2 = 0.726929 */
9072 -23104, /* B1 = -1.410217 */
9073 23820, /* B0 = 0.726929 */
9074 7, /* Internal filter scaling */
9075 159, /* Minimum in-band energy threshold */
9076 21, /* 21/32 in-band to broad-band ratio */
9077 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9080 30552, /* A1 = 1.864807 */
9081 -31434, /* A2 = -0.95929 */
9082 -690, /* B2 = -0.021066 */
9084 690, /* B0 = 0.021066 */
9085 30472, /* A1 = 1.859924 */
9086 -32248, /* A2 = -0.984161 */
9087 13385, /* B2 = 0.408478 */
9088 -12357, /* B1 = -0.754242 */
9089 13385, /* B0 = 0.408478 */
9090 31358, /* A1 = 1.914001 */
9091 -32366, /* A2 = -0.987732 */
9092 26488, /* B2 = 0.80835 */
9093 -25692, /* B1 = -1.568176 */
9094 26490, /* B0 = 0.808411 */
9095 7, /* Internal filter scaling */
9096 159, /* Minimum in-band energy threshold */
9097 21, /* 21/32 in-band to broad-band ratio */
9098 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9101 31397, /* A1 = -1.916321 */
9102 -32623, /* A2 = 0.995605 */
9103 -117, /* B2 = -0.003598 */
9104 0, /* B1 = 0.000000 */
9105 117, /* B0 = 0.003598 */
9106 31403, /* A1 = -1.916687 */
9107 -32700, /* A2 = 0.997925 */
9108 3388, /* B2 = 0.103401 */
9109 -3240, /* B1 = -0.197784 */
9110 3388, /* B0 = 0.103401 */
9111 31463, /* A1 = -1.920410 */
9112 -32702, /* A2 = 0.997986 */
9113 13346, /* B2 = 0.407288 */
9114 -12863, /* B1 = -0.785126 */
9115 13346, /* B0 = 0.407288 */
9116 5, /* Internal filter scaling */
9117 159, /* Minimum in-band energy threshold */
9118 21, /* 21/32 in-band to broad-band ratio */
9119 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9122 30831, /* A1 = 1.881775 */
9123 -32064, /* A2 = -0.978546 */
9124 -367, /* B2 = -0.01122 */
9126 367, /* B0 = 0.01122 */
9127 30813, /* A1 = 1.880737 */
9128 -32456, /* A2 = -0.990509 */
9129 11068, /* B2 = 0.337769 */
9130 -10338, /* B1 = -0.631042 */
9131 11068, /* B0 = 0.337769 */
9132 31214, /* A1 = 1.905212 */
9133 -32491, /* A2 = -0.991577 */
9134 16374, /* B2 = 0.499695 */
9135 -15781, /* B1 = -0.963196 */
9136 16374, /* B0 = 0.499695 */
9137 7, /* Internal filter scaling */
9138 159, /* Minimum in-band energy threshold */
9139 21, /* 21/32 in-band to broad-band ratio */
9140 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9143 31152, /* A1 = -1.901428 */
9144 -32613, /* A2 = 0.995300 */
9145 -314, /* B2 = -0.009605 */
9146 0, /* B1 = 0.000000 */
9147 314, /* B0 = 0.009605 */
9148 31156, /* A1 = -1.901672 */
9149 -32694, /* A2 = 0.997742 */
9150 28847, /* B2 = 0.880371 */
9151 -2734, /* B1 = -0.166901 */
9152 28847, /* B0 = 0.880371 */
9153 31225, /* A1 = -1.905823 */
9154 -32696, /* A2 = 0.997803 */
9155 462, /* B2 = 0.014108 */
9156 -442, /* B1 = -0.027019 */
9157 462, /* B0 = 0.014108 */
9158 5, /* Internal filter scaling */
9159 159, /* Minimum in-band energy threshold */
9160 21, /* 21/32 in-band to broad-band ratio */
9161 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9164 30836, /* A1 = 1.882141 */
9165 -32296, /* A2 = -0.985596 */
9166 -324, /* B2 = -0.009903 */
9168 324, /* B0 = 0.009903 */
9169 30825, /* A1 = 1.881409 */
9170 -32570, /* A2 = -0.993958 */
9171 16847, /* B2 = 0.51416 */
9172 -15792, /* B1 = -0.963898 */
9173 16847, /* B0 = 0.51416 */
9174 31106, /* A1 = 1.89856 */
9175 -32584, /* A2 = -0.994415 */
9176 9579, /* B2 = 0.292328 */
9177 -9164, /* B1 = -0.559357 */
9178 9579, /* B0 = 0.292328 */
9179 7, /* Internal filter scaling */
9180 159, /* Minimum in-band energy threshold */
9181 21, /* 21/32 in-band to broad-band ratio */
9182 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9185 30702, /* A1 = 1.873962 */
9186 -32134, /* A2 = -0.980682 */
9187 -517, /* B2 = -0.015793 */
9189 517, /* B0 = 0.015793 */
9190 30676, /* A1 = 1.872375 */
9191 -32520, /* A2 = -0.992462 */
9192 8144, /* B2 = 0.24855 */
9193 -7596, /* B1 = -0.463684 */
9194 8144, /* B0 = 0.24855 */
9195 31084, /* A1 = 1.897217 */
9196 -32547, /* A2 = -0.993256 */
9197 22713, /* B2 = 0.693176 */
9198 -21734, /* B1 = -1.326599 */
9199 22713, /* B0 = 0.693176 */
9200 7, /* Internal filter scaling */
9201 159, /* Minimum in-band energy threshold */
9202 21, /* 21/32 in-band to broad-band ratio */
9203 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9206 30613, /* A1 = 1.86853 */
9207 -32031, /* A2 = -0.977509 */
9208 -618, /* B2 = -0.018866 */
9210 618, /* B0 = 0.018866 */
9211 30577, /* A1 = 1.866272 */
9212 -32491, /* A2 = -0.991577 */
9213 9612, /* B2 = 0.293335 */
9214 -8935, /* B1 = -0.54541 */
9215 9612, /* B0 = 0.293335 */
9216 31071, /* A1 = 1.896484 */
9217 -32524, /* A2 = -0.992584 */
9218 21596, /* B2 = 0.659058 */
9219 -20667, /* B1 = -1.261414 */
9220 21596, /* B0 = 0.659058 */
9221 7, /* Internal filter scaling */
9222 159, /* Minimum in-band energy threshold */
9223 21, /* 21/32 in-band to broad-band ratio */
9224 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9227 30914, /* A1 = -1.886841 */
9228 -32584, /* A2 = 0.994385 */
9229 -426, /* B2 = -0.013020 */
9230 0, /* B1 = 0.000000 */
9231 426, /* B0 = 0.013020 */
9232 30914, /* A1 = -1.886841 */
9233 -32679, /* A2 = 0.997314 */
9234 17520, /* B2 = 0.534668 */
9235 -16471, /* B1 = -1.005310 */
9236 17520, /* B0 = 0.534668 */
9237 31004, /* A1 = -1.892334 */
9238 -32683, /* A2 = 0.997406 */
9239 819, /* B2 = 0.025023 */
9240 -780, /* B1 = -0.047619 */
9241 819, /* B0 = 0.025023 */
9242 5, /* Internal filter scaling */
9243 159, /* Minimum in-band energy threshold */
9244 21, /* 21/32 in-band to broad-band ratio */
9245 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9249 30881, /* A1 = -1.884827 */
9250 -32603, /* A2 = 0.994965 */
9251 -496, /* B2 = -0.015144 */
9252 0, /* B1 = 0.000000 */
9253 496, /* B0 = 0.015144 */
9254 30880, /* A1 = -1.884766 */
9255 -32692, /* A2 = 0.997711 */
9256 24767, /* B2 = 0.755859 */
9257 -23290, /* B1 = -1.421509 */
9258 24767, /* B0 = 0.755859 */
9259 30967, /* A1 = -1.890076 */
9260 -32694, /* A2 = 0.997772 */
9261 728, /* B2 = 0.022232 */
9262 -691, /* B1 = -0.042194 */
9263 728, /* B0 = 0.022232 */
9264 5, /* Internal filter scaling */
9265 159, /* Minimum in-band energy threshold */
9266 21, /* 21/32 in-band to broad-band ratio */
9267 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9293 30646, /* A1 = 1.870544 */
9294 -32327, /* A2 = -0.986572 */
9295 -287, /* B2 = -0.008769 */
9297 287, /* B0 = 0.008769 */
9298 30627, /* A1 = 1.869324 */
9299 -32607, /* A2 = -0.995087 */
9300 13269, /* B2 = 0.404968 */
9301 -12376, /* B1 = -0.755432 */
9302 13269, /* B0 = 0.404968 */
9303 30924, /* A1 = 1.887512 */
9304 -32619, /* A2 = -0.995453 */
9305 19950, /* B2 = 0.608826 */
9306 -18940, /* B1 = -1.156006 */
9307 19950, /* B0 = 0.608826 */
9308 7, /* Internal filter scaling */
9309 159, /* Minimum in-band energy threshold */
9310 21, /* 21/32 in-band to broad-band ratio */
9311 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9314 30396, /* A1 = 1.855225 */
9315 -32014, /* A2 = -0.97699 */
9316 -395, /* B2 = -0.012055 */
9318 395, /* B0 = 0.012055 */
9319 30343, /* A1 = 1.85199 */
9320 -32482, /* A2 = -0.991302 */
9321 17823, /* B2 = 0.543945 */
9322 -16431, /* B1 = -1.002869 */
9323 17823, /* B0 = 0.543945 */
9324 30872, /* A1 = 1.884338 */
9325 -32516, /* A2 = -0.99231 */
9326 18124, /* B2 = 0.553101 */
9327 -17246, /* B1 = -1.052673 */
9328 18124, /* B0 = 0.553101 */
9329 7, /* Internal filter scaling */
9330 159, /* Minimum in-band energy threshold */
9331 21, /* 21/32 in-band to broad-band ratio */
9332 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9335 30796, /* A1 = -1.879639 */
9336 -32603, /* A2 = 0.994965 */
9337 -254, /* B2 = -0.007762 */
9338 0, /* B1 = 0.000000 */
9339 254, /* B0 = 0.007762 */
9340 30793, /* A1 = -1.879456 */
9341 -32692, /* A2 = 0.997711 */
9342 18934, /* B2 = 0.577820 */
9343 -17751, /* B1 = -1.083496 */
9344 18934, /* B0 = 0.577820 */
9345 30882, /* A1 = -1.884888 */
9346 -32694, /* A2 = 0.997772 */
9347 1858, /* B2 = 0.056713 */
9348 -1758, /* B1 = -0.107357 */
9349 1858, /* B0 = 0.056713 */
9350 5, /* Internal filter scaling */
9351 159, /* Minimum in-band energy threshold */
9352 21, /* 21/32 in-band to broad-band ratio */
9353 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9356 30641, /* A1 = 1.870239 */
9357 -32458, /* A2 = -0.99057 */
9358 -155, /* B2 = -0.004735 */
9360 155, /* B0 = 0.004735 */
9361 30631, /* A1 = 1.869568 */
9362 -32630, /* A2 = -0.995789 */
9363 11453, /* B2 = 0.349548 */
9364 -10666, /* B1 = -0.651001 */
9365 11453, /* B0 = 0.349548 */
9366 30810, /* A1 = 1.880554 */
9367 -32634, /* A2 = -0.995941 */
9368 12237, /* B2 = 0.373474 */
9369 -11588, /* B1 = -0.707336 */
9370 12237, /* B0 = 0.373474 */
9371 7, /* Internal filter scaling */
9372 159, /* Minimum in-band energy threshold */
9373 21, /* 21/32 in-band to broad-band ratio */
9374 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9377 30367, /* A1 = 1.853455 */
9378 -32147, /* A2 = -0.981079 */
9379 -495, /* B2 = -0.015113 */
9381 495, /* B0 = 0.015113 */
9382 30322, /* A1 = 1.850769 */
9383 -32543, /* A2 = -0.993134 */
9384 10031, /* B2 = 0.306152 */
9385 -9252, /* B1 = -0.564728 */
9386 10031, /* B0 = 0.306152 */
9387 30770, /* A1 = 1.878052 */
9388 -32563, /* A2 = -0.993774 */
9389 22674, /* B2 = 0.691956 */
9390 -21465, /* B1 = -1.31012 */
9391 22674, /* B0 = 0.691956 */
9392 7, /* Internal filter scaling */
9393 159, /* Minimum in-band energy threshold */
9394 21, /* 21/32 in-band to broad-band ratio */
9395 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9398 30709, /* A1 = -1.874329 */
9399 -32603, /* A2 = 0.994965 */
9400 -83, /* B2 = -0.002545 */
9401 0, /* B1 = 0.000000 */
9402 83, /* B0 = 0.002545 */
9403 30704, /* A1 = -1.874084 */
9404 -32692, /* A2 = 0.997711 */
9405 10641, /* B2 = 0.324738 */
9406 -9947, /* B1 = -0.607147 */
9407 10641, /* B0 = 0.324738 */
9408 30796, /* A1 = -1.879639 */
9409 -32694, /* A2 = 0.997772 */
9410 10079, /* B2 = 0.307587 */
9411 9513, /* B1 = 0.580688 */
9412 10079, /* B0 = 0.307587 */
9413 5, /* Internal filter scaling */
9414 159, /* Minimum in-band energy threshold */
9415 21, /* 21/32 in-band to broad-band ratio */
9416 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9419 30664, /* A1 = -1.871643 */
9420 -32603, /* A2 = 0.994965 */
9421 -164, /* B2 = -0.005029 */
9422 0, /* B1 = 0.000000 */
9423 164, /* B0 = 0.005029 */
9424 30661, /* A1 = -1.871399 */
9425 -32692, /* A2 = 0.997711 */
9426 15294, /* B2 = 0.466736 */
9427 -14275, /* B1 = -0.871307 */
9428 15294, /* B0 = 0.466736 */
9429 30751, /* A1 = -1.876953 */
9430 -32694, /* A2 = 0.997772 */
9431 3548, /* B2 = 0.108284 */
9432 -3344, /* B1 = -0.204155 */
9433 3548, /* B0 = 0.108284 */
9434 5, /* Internal filter scaling */
9435 159, /* Minimum in-band energy threshold */
9436 21, /* 21/32 in-band to broad-band ratio */
9437 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9440 30653, /* A1 = -1.870911 */
9441 -32615, /* A2 = 0.995361 */
9442 -209, /* B2 = -0.006382 */
9443 0, /* B1 = 0.000000 */
9444 209, /* B0 = 0.006382 */
9445 30647, /* A1 = -1.870605 */
9446 -32702, /* A2 = 0.997986 */
9447 18971, /* B2 = 0.578979 */
9448 -17716, /* B1 = -1.081299 */
9449 18971, /* B0 = 0.578979 */
9450 30738, /* A1 = -1.876099 */
9451 -32702, /* A2 = 0.998016 */
9452 2967, /* B2 = 0.090561 */
9453 -2793, /* B1 = -0.170502 */
9454 2967, /* B0 = 0.090561 */
9455 5, /* Internal filter scaling */
9456 159, /* Minimum in-band energy threshold */
9457 21, /* 21/32 in-band to broad-band ratio */
9458 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9461 30437, /* A1 = -1.857727 */
9462 -32603, /* A2 = 0.994965 */
9463 -264, /* B2 = -0.008062 */
9464 0, /* B1 = 0.000000 */
9465 264, /* B0 = 0.008062 */
9466 30430, /* A1 = -1.857300 */
9467 -32692, /* A2 = 0.997711 */
9468 21681, /* B2 = 0.661682 */
9469 -20082, /* B1 = -1.225708 */
9470 21681, /* B0 = 0.661682 */
9471 30526, /* A1 = -1.863220 */
9472 -32694, /* A2 = 0.997742 */
9473 1559, /* B2 = 0.047600 */
9474 -1459, /* B1 = -0.089096 */
9475 1559, /* B0 = 0.047600 */
9476 5, /* Internal filter scaling */
9477 159, /* Minimum in-band energy threshold */
9478 21, /* 21/32 in-band to broad-band ratio */
9479 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9482 28975, /* A1 = 1.768494 */
9483 -30955, /* A2 = -0.944672 */
9484 -1026, /* B2 = -0.03133 */
9486 1026, /* B0 = 0.03133 */
9487 28613, /* A1 = 1.746399 */
9488 -32089, /* A2 = -0.979309 */
9489 14214, /* B2 = 0.433807 */
9490 -12202, /* B1 = -0.744812 */
9491 14214, /* B0 = 0.433807 */
9492 30243, /* A1 = 1.845947 */
9493 -32238, /* A2 = -0.983856 */
9494 24825, /* B2 = 0.757629 */
9495 -23402, /* B1 = -1.428345 */
9496 24825, /* B0 = 0.757629 */
9497 7, /* Internal filter scaling */
9498 159, /* Minimum in-band energy threshold */
9499 21, /* 21/32 in-band to broad-band ratio */
9500 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9503 30257, /* A1 = -1.846741 */
9504 -32605, /* A2 = 0.995056 */
9505 -249, /* B2 = -0.007625 */
9506 0, /* B1 = 0.000000 */
9507 249, /* B0 = 0.007625 */
9508 30247, /* A1 = -1.846191 */
9509 -32694, /* A2 = 0.997772 */
9510 18088, /* B2 = 0.552002 */
9511 -16652, /* B1 = -1.016418 */
9512 18088, /* B0 = 0.552002 */
9513 30348, /* A1 = -1.852295 */
9514 -32696, /* A2 = 0.997803 */
9515 2099, /* B2 = 0.064064 */
9516 -1953, /* B1 = -0.119202 */
9517 2099, /* B0 = 0.064064 */
9518 5, /* Internal filter scaling */
9519 159, /* Minimum in-band energy threshold */
9520 21, /* 21/32 in-band to broad-band ratio */
9521 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9524 30202, /* A1 = -1.843431 */
9525 -32624, /* A2 = 0.995622 */
9526 -413, /* B2 = -0.012622 */
9527 0, /* B1 = 0.000000 */
9528 413, /* B0 = 0.012622 */
9529 30191, /* A1 = -1.842721 */
9530 -32714, /* A2 = 0.998364 */
9531 25954, /* B2 = 0.792057 */
9532 -23890, /* B1 = -1.458131 */
9533 25954, /* B0 = 0.792057 */
9534 30296, /* A1 = -1.849172 */
9535 -32715, /* A2 = 0.998397 */
9536 2007, /* B2 = 0.061264 */
9537 -1860, /* B1 = -0.113568 */
9538 2007, /* B0 = 0.061264 */
9539 5, /* Internal filter scaling */
9540 159, /* Minimum in-band energy threshold */
9541 21, /* 21/32 in-band to broad-band ratio */
9542 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9545 30001, /* A1 = -1.831116 */
9546 -32613, /* A2 = 0.995270 */
9547 -155, /* B2 = -0.004750 */
9548 0, /* B1 = 0.000000 */
9549 155, /* B0 = 0.004750 */
9550 29985, /* A1 = -1.830200 */
9551 -32710, /* A2 = 0.998260 */
9552 6584, /* B2 = 0.200928 */
9553 -6018, /* B1 = -0.367355 */
9554 6584, /* B0 = 0.200928 */
9555 30105, /* A1 = -1.837524 */
9556 -32712, /* A2 = 0.998291 */
9557 23812, /* B2 = 0.726685 */
9558 -21936, /* B1 = -1.338928 */
9559 23812, /* B0 = 0.726685 */
9560 5, /* Internal filter scaling */
9561 159, /* Minimum in-band energy threshold */
9562 21, /* 21/32 in-band to broad-band ratio */
9563 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9566 29964, /* A1 = -1.828918 */
9567 -32601, /* A2 = 0.994904 */
9568 -101, /* B2 = -0.003110 */
9569 0, /* B1 = 0.000000 */
9570 101, /* B0 = 0.003110 */
9571 29949, /* A1 = -1.827942 */
9572 -32700, /* A2 = 0.997925 */
9573 11041, /* B2 = 0.336975 */
9574 -10075, /* B1 = -0.614960 */
9575 11041, /* B0 = 0.336975 */
9576 30070, /* A1 = -1.835388 */
9577 -32702, /* A2 = 0.997986 */
9578 16762, /* B2 = 0.511536 */
9579 -15437, /* B1 = -0.942230 */
9580 16762, /* B0 = 0.511536 */
9581 5, /* Internal filter scaling */
9582 159, /* Minimum in-band energy threshold */
9583 21, /* 21/32 in-band to broad-band ratio */
9584 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9587 29936, /* A1 = -1.827209 */
9588 -32584, /* A2 = 0.994415 */
9589 -91, /* B2 = -0.002806 */
9590 0, /* B1 = 0.000000 */
9591 91, /* B0 = 0.002806 */
9592 29921, /* A1 = -1.826233 */
9593 -32688, /* A2 = 0.997559 */
9594 11449, /* B2 = 0.349396 */
9595 -10426, /* B1 = -0.636383 */
9596 11449, /* B0 = 0.349396 */
9597 30045, /* A1 = -1.833862 */
9598 -32688, /* A2 = 0.997589 */
9599 13055, /* B2 = 0.398407 */
9600 -12028, /* B1 = -0.734161 */
9601 13055, /* B0 = 0.398407 */
9602 5, /* Internal filter scaling */
9603 159, /* Minimum in-band energy threshold */
9604 21, /* 21/32 in-band to broad-band ratio */
9605 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9608 28499, /* A1 = 1.739441 */
9609 -31129, /* A2 = -0.949982 */
9610 -849, /* B2 = -0.025922 */
9612 849, /* B0 = 0.025922 */
9613 28128, /* A1 = 1.716797 */
9614 -32130, /* A2 = -0.98056 */
9615 14556, /* B2 = 0.444214 */
9616 -12251, /* B1 = -0.747772 */
9617 14556, /* B0 = 0.444244 */
9618 29667, /* A1 = 1.81073 */
9619 -32244, /* A2 = -0.984039 */
9620 23038, /* B2 = 0.703064 */
9621 -21358, /* B1 = -1.303589 */
9622 23040, /* B0 = 0.703125 */
9623 7, /* Internal filter scaling */
9624 159, /* Minimum in-band energy threshold */
9625 21, /* 21/32 in-band to broad-band ratio */
9626 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9629 29271, /* A1 = -1.786560 */
9630 -32599, /* A2 = 0.994873 */
9631 -490, /* B2 = -0.014957 */
9632 0, /* B1 = 0.000000 */
9633 490, /* B0 = 0.014957 */
9634 29246, /* A1 = -1.785095 */
9635 -32700, /* A2 = 0.997925 */
9636 28961, /* B2 = 0.883850 */
9637 -25796, /* B1 = -1.574463 */
9638 28961, /* B0 = 0.883850 */
9639 29383, /* A1 = -1.793396 */
9640 -32700, /* A2 = 0.997955 */
9641 1299, /* B2 = 0.039650 */
9642 -1169, /* B1 = -0.071396 */
9643 1299, /* B0 = 0.039650 */
9644 5, /* Internal filter scaling */
9645 159, /* Minimum in-band energy threshold */
9646 21, /* 21/32 in-band to broad-band ratio */
9647 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9650 29230, /* A1 = -1.784058 */
9651 -32584, /* A2 = 0.994415 */
9652 -418, /* B2 = -0.012757 */
9653 0, /* B1 = 0.000000 */
9654 418, /* B0 = 0.012757 */
9655 29206, /* A1 = -1.782593 */
9656 -32688, /* A2 = 0.997559 */
9657 36556, /* B2 = 1.115601 */
9658 -32478, /* B1 = -1.982300 */
9659 36556, /* B0 = 1.115601 */
9660 29345, /* A1 = -1.791077 */
9661 -32688, /* A2 = 0.997589 */
9662 897, /* B2 = 0.027397 */
9663 -808, /* B1 = -0.049334 */
9664 897, /* B0 = 0.027397 */
9665 5, /* Internal filter scaling */
9666 159, /* Minimum in-band energy threshold */
9667 21, /* 21/32 in-band to broad-band ratio */
9668 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9671 29116, /* A1 = -1.777100 */
9672 -32603, /* A2 = 0.994965 */
9673 -165, /* B2 = -0.005039 */
9674 0, /* B1 = 0.000000 */
9675 165, /* B0 = 0.005039 */
9676 29089, /* A1 = -1.775452 */
9677 -32708, /* A2 = 0.998199 */
9678 6963, /* B2 = 0.212494 */
9679 -6172, /* B1 = -0.376770 */
9680 6963, /* B0 = 0.212494 */
9681 29237, /* A1 = -1.784485 */
9682 -32710, /* A2 = 0.998230 */
9683 24197, /* B2 = 0.738464 */
9684 -21657, /* B1 = -1.321899 */
9685 24197, /* B0 = 0.738464 */
9686 5, /* Internal filter scaling */
9687 159, /* Minimum in-band energy threshold */
9688 21, /* 21/32 in-band to broad-band ratio */
9689 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9692 28376, /* A1 = -1.731934 */
9693 -32567, /* A2 = 0.993896 */
9694 -363, /* B2 = -0.011102 */
9695 0, /* B1 = 0.000000 */
9696 363, /* B0 = 0.011102 */
9697 28337, /* A1 = -1.729614 */
9698 -32683, /* A2 = 0.997434 */
9699 21766, /* B2 = 0.664246 */
9700 -18761, /* B1 = -1.145081 */
9701 21766, /* B0 = 0.664246 */
9702 28513, /* A1 = -1.740356 */
9703 -32686, /* A2 = 0.997498 */
9704 2509, /* B2 = 0.076584 */
9705 -2196, /* B1 = -0.134041 */
9706 2509, /* B0 = 0.076584 */
9707 5, /* Internal filter scaling */
9708 159, /* Minimum in-band energy threshold */
9709 21, /* 21/32 in-band to broad-band ratio */
9710 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9713 27844, /* A1 = -1.699463 */
9714 -32563, /* A2 = 0.993744 */
9715 -366, /* B2 = -0.011187 */
9716 0, /* B1 = 0.000000 */
9717 366, /* B0 = 0.011187 */
9718 27797, /* A1 = -1.696655 */
9719 -32686, /* A2 = 0.997498 */
9720 22748, /* B2 = 0.694214 */
9721 -19235, /* B1 = -1.174072 */
9722 22748, /* B0 = 0.694214 */
9723 27995, /* A1 = -1.708740 */
9724 -32688, /* A2 = 0.997559 */
9725 2964, /* B2 = 0.090477 */
9726 -2546, /* B1 = -0.155449 */
9727 2964, /* B0 = 0.090477 */
9728 5, /* Internal filter scaling */
9729 159, /* Minimum in-band energy threshold */
9730 21, /* 21/32 in-band to broad-band ratio */
9731 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9734 27297, /* A1 = -1.666077 */
9735 -32551, /* A2 = 0.993408 */
9736 -345, /* B2 = -0.010540 */
9737 0, /* B1 = 0.000000 */
9738 345, /* B0 = 0.010540 */
9739 27240, /* A1 = -1.662598 */
9740 -32683, /* A2 = 0.997406 */
9741 22560, /* B2 = 0.688477 */
9742 -18688, /* B1 = -1.140625 */
9743 22560, /* B0 = 0.688477 */
9744 27461, /* A1 = -1.676147 */
9745 -32684, /* A2 = 0.997467 */
9746 3541, /* B2 = 0.108086 */
9747 -2985, /* B1 = -0.182220 */
9748 3541, /* B0 = 0.108086 */
9749 5, /* Internal filter scaling */
9750 159, /* Minimum in-band energy threshold */
9751 21, /* 21/32 in-band to broad-band ratio */
9752 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9755 27155, /* A1 = -1.657410 */
9756 -32551, /* A2 = 0.993408 */
9757 -462, /* B2 = -0.014117 */
9758 0, /* B1 = 0.000000 */
9759 462, /* B0 = 0.014117 */
9760 27097, /* A1 = -1.653870 */
9761 -32683, /* A2 = 0.997406 */
9762 32495, /* B2 = 0.991699 */
9763 -26776, /* B1 = -1.634338 */
9764 32495, /* B0 = 0.991699 */
9765 27321, /* A1 = -1.667542 */
9766 -32684, /* A2 = 0.997467 */
9767 1835, /* B2 = 0.056007 */
9768 -1539, /* B1 = -0.093948 */
9769 1835, /* B0 = 0.056007 */
9770 5, /* Internal filter scaling */
9771 159, /* Minimum in-band energy threshold */
9772 21, /* 21/32 in-band to broad-band ratio */
9773 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9776 19298, /* A1 = 1.177917 */
9777 -24471, /* A2 = -0.746796 */
9778 -4152, /* B2 = -0.126709 */
9780 4152, /* B0 = 0.126709 */
9781 12902, /* A1 = 0.787476 */
9782 -29091, /* A2 = -0.887817 */
9783 12491, /* B2 = 0.38121 */
9784 -1794, /* B1 = -0.109528 */
9785 12494, /* B0 = 0.381317 */
9786 26291, /* A1 = 1.604736 */
9787 -30470, /* A2 = -0.929901 */
9788 28859, /* B2 = 0.880737 */
9789 -26084, /* B1 = -1.592102 */
9790 28861, /* B0 = 0.880798 */
9791 7, /* Internal filter scaling */
9792 159, /* Minimum in-band energy threshold */
9793 21, /* 21/32 in-band to broad-band ratio */
9794 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9797 26867, /* A1 = -1.639832 */
9798 -32551, /* A2 = 0.993408 */
9799 -123, /* B2 = -0.003755 */
9800 0, /* B1 = 0.000000 */
9801 123, /* B0 = 0.003755 */
9802 26805, /* A1 = -1.636108 */
9803 -32683, /* A2 = 0.997406 */
9804 17297, /* B2 = 0.527863 */
9805 -14096, /* B1 = -0.860382 */
9806 17297, /* B0 = 0.527863 */
9807 27034, /* A1 = -1.650085 */
9808 -32684, /* A2 = 0.997467 */
9809 12958, /* B2 = 0.395477 */
9810 -10756, /* B1 = -0.656525 */
9811 12958, /* B0 = 0.395477 */
9812 5, /* Internal filter scaling */
9813 159, /* Minimum in-band energy threshold */
9814 21, /* 21/32 in-band to broad-band ratio */
9815 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9818 26413, /* A1 = -1.612122 */
9819 -32547, /* A2 = 0.993286 */
9820 -223, /* B2 = -0.006825 */
9821 0, /* B1 = 0.000000 */
9822 223, /* B0 = 0.006825 */
9823 26342, /* A1 = -1.607849 */
9824 -32686, /* A2 = 0.997498 */
9825 6391, /* B2 = 0.195053 */
9826 -5120, /* B1 = -0.312531 */
9827 6391, /* B0 = 0.195053 */
9828 26593, /* A1 = -1.623108 */
9829 -32688, /* A2 = 0.997559 */
9830 23681, /* B2 = 0.722717 */
9831 -19328, /* B1 = -1.179688 */
9832 23681, /* B0 = 0.722717 */
9833 5, /* Internal filter scaling */
9834 159, /* Minimum in-band energy threshold */
9835 21, /* 21/32 in-band to broad-band ratio */
9836 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9839 26168, /* A1 = -1.597209 */
9840 -32528, /* A2 = 0.992706 */
9841 -235, /* B2 = -0.007182 */
9842 0, /* B1 = 0.000000 */
9843 235, /* B0 = 0.007182 */
9844 26092, /* A1 = -1.592590 */
9845 -32675, /* A2 = 0.997192 */
9846 20823, /* B2 = 0.635498 */
9847 -16510, /* B1 = -1.007751 */
9848 20823, /* B0 = 0.635498 */
9849 26363, /* A1 = -1.609070 */
9850 -32677, /* A2 = 0.997253 */
9851 6739, /* B2 = 0.205688 */
9852 -5459, /* B1 = -0.333206 */
9853 6739, /* B0 = 0.205688 */
9854 5, /* Internal filter scaling */
9855 159, /* Minimum in-band energy threshold */
9856 21, /* 21/32 in-band to broad-band ratio */
9857 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9860 25641, /* A1 = -1.565063 */
9861 -32536, /* A2 = 0.992950 */
9862 -121, /* B2 = -0.003707 */
9863 0, /* B1 = 0.000000 */
9864 121, /* B0 = 0.003707 */
9865 25560, /* A1 = -1.560059 */
9866 -32684, /* A2 = 0.997437 */
9867 18341, /* B2 = 0.559753 */
9868 -14252, /* B1 = -0.869904 */
9869 18341, /* B0 = 0.559753 */
9870 25837, /* A1 = -1.577026 */
9871 -32684, /* A2 = 0.997467 */
9872 16679, /* B2 = 0.509003 */
9873 -13232, /* B1 = -0.807648 */
9874 16679, /* B0 = 0.509003 */
9875 5, /* Internal filter scaling */
9876 159, /* Minimum in-band energy threshold */
9877 21, /* 21/32 in-band to broad-band ratio */
9878 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9881 16415, /* A1 = 1.001953 */
9882 -23669, /* A2 = -0.722321 */
9883 -4549, /* B2 = -0.138847 */
9885 4549, /* B0 = 0.138847 */
9886 8456, /* A1 = 0.516174 */
9887 -28996, /* A2 = -0.884918 */
9888 13753, /* B2 = 0.419724 */
9889 -12, /* B1 = -0.000763 */
9890 13757, /* B0 = 0.419846 */
9891 24632, /* A1 = 1.503418 */
9892 -30271, /* A2 = -0.923828 */
9893 29070, /* B2 = 0.887146 */
9894 -25265, /* B1 = -1.542114 */
9895 29073, /* B0 = 0.887268 */
9896 7, /* Internal filter scaling */
9897 159, /* Minimum in-band energy threshold */
9898 21, /* 21/32 in-band to broad-band ratio */
9899 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9902 24806, /* A1 = -1.514099 */
9903 -32501, /* A2 = 0.991852 */
9904 -326, /* B2 = -0.009969 */
9905 0, /* B1 = 0.000000 */
9906 326, /* B0 = 0.009969 */
9907 24709, /* A1 = -1.508118 */
9908 -32659, /* A2 = 0.996674 */
9909 20277, /* B2 = 0.618835 */
9910 -15182, /* B1 = -0.926636 */
9911 20277, /* B0 = 0.618835 */
9912 25022, /* A1 = -1.527222 */
9913 -32661, /* A2 = 0.996735 */
9914 4320, /* B2 = 0.131836 */
9915 -3331, /* B1 = -0.203339 */
9916 4320, /* B0 = 0.131836 */
9917 5, /* Internal filter scaling */
9918 159, /* Minimum in-band energy threshold */
9919 21, /* 21/32 in-band to broad-band ratio */
9920 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9923 19776, /* A1 = 1.207092 */
9924 -27437, /* A2 = -0.837341 */
9925 -2666, /* B2 = -0.081371 */
9927 2666, /* B0 = 0.081371 */
9928 16302, /* A1 = 0.995026 */
9929 -30354, /* A2 = -0.926361 */
9930 10389, /* B2 = 0.317062 */
9931 -3327, /* B1 = -0.203064 */
9932 10389, /* B0 = 0.317062 */
9933 24299, /* A1 = 1.483154 */
9934 -30930, /* A2 = -0.943909 */
9935 25016, /* B2 = 0.763428 */
9936 -21171, /* B1 = -1.292236 */
9937 25016, /* B0 = 0.763428 */
9938 7, /* Internal filter scaling */
9939 159, /* Minimum in-band energy threshold */
9940 21, /* 21/32 in-band to broad-band ratio */
9941 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9944 20554, /* A1 = 1.254517 */
9945 -28764, /* A2 = -0.877838 */
9946 -2048, /* B2 = -0.062515 */
9948 2048, /* B0 = 0.062515 */
9949 18209, /* A1 = 1.11145 */
9950 -30951, /* A2 = -0.94458 */
9951 9390, /* B2 = 0.286575 */
9952 -3955, /* B1 = -0.241455 */
9953 9390, /* B0 = 0.286575 */
9954 23902, /* A1 = 1.458923 */
9955 -31286, /* A2 = -0.954803 */
9956 23252, /* B2 = 0.709595 */
9957 -19132, /* B1 = -1.167725 */
9958 23252, /* B0 = 0.709595 */
9959 7, /* Internal filter scaling */
9960 159, /* Minimum in-band energy threshold */
9961 21, /* 21/32 in-band to broad-band ratio */
9962 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9965 17543, /* A1 = 1.07074 */
9966 -26220, /* A2 = -0.800201 */
9967 -3298, /* B2 = -0.100647 */
9969 3298, /* B0 = 0.100647 */
9970 12423, /* A1 = 0.75827 */
9971 -30036, /* A2 = -0.916626 */
9972 12651, /* B2 = 0.386078 */
9973 -2444, /* B1 = -0.14917 */
9974 12653, /* B0 = 0.386154 */
9975 23518, /* A1 = 1.435425 */
9976 -30745, /* A2 = -0.938293 */
9977 27282, /* B2 = 0.832581 */
9978 -22529, /* B1 = -1.375122 */
9979 27286, /* B0 = 0.832703 */
9980 7, /* Internal filter scaling */
9981 159, /* Minimum in-band energy threshold */
9982 21, /* 21/32 in-band to broad-band ratio */
9983 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9986 24104, /* A1 = -1.471252 */
9987 -32507, /* A2 = 0.992065 */
9988 -351, /* B2 = -0.010722 */
9989 0, /* B1 = 0.000000 */
9990 351, /* B0 = 0.010722 */
9991 23996, /* A1 = -1.464600 */
9992 -32671, /* A2 = 0.997040 */
9993 22848, /* B2 = 0.697266 */
9994 -16639, /* B1 = -1.015564 */
9995 22848, /* B0 = 0.697266 */
9996 24332, /* A1 = -1.485168 */
9997 -32673, /* A2 = 0.997101 */
9998 4906, /* B2 = 0.149727 */
9999 -3672, /* B1 = -0.224174 */
10000 4906, /* B0 = 0.149727 */
10001 5, /* Internal filter scaling */
10002 159, /* Minimum in-band energy threshold */
10003 21, /* 21/32 in-band to broad-band ratio */
10004 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10007 23967, /* A1 = -1.462830 */
10008 -32507, /* A2 = 0.992065 */
10009 -518, /* B2 = -0.015821 */
10010 0, /* B1 = 0.000000 */
10011 518, /* B0 = 0.015821 */
10012 23856, /* A1 = -1.456055 */
10013 -32671, /* A2 = 0.997040 */
10014 26287, /* B2 = 0.802246 */
10015 -19031, /* B1 = -1.161560 */
10016 26287, /* B0 = 0.802246 */
10017 24195, /* A1 = -1.476746 */
10018 -32673, /* A2 = 0.997101 */
10019 2890, /* B2 = 0.088196 */
10020 -2151, /* B1 = -0.131317 */
10021 2890, /* B0 = 0.088196 */
10022 5, /* Internal filter scaling */
10023 159, /* Minimum in-band energy threshold */
10024 21, /* 21/32 in-band to broad-band ratio */
10025 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10027 { /* f950_1400[] */
10028 18294, /* A1 = 1.116638 */
10029 -26962, /* A2 = -0.822845 */
10030 -2914, /* B2 = -0.088936 */
10032 2914, /* B0 = 0.088936 */
10033 14119, /* A1 = 0.861786 */
10034 -30227, /* A2 = -0.922455 */
10035 11466, /* B2 = 0.349945 */
10036 -2833, /* B1 = -0.172943 */
10037 11466, /* B0 = 0.349945 */
10038 23431, /* A1 = 1.430115 */
10039 -30828, /* A2 = -0.940796 */
10040 25331, /* B2 = 0.773071 */
10041 -20911, /* B1 = -1.276367 */
10042 25331, /* B0 = 0.773071 */
10043 7, /* Internal filter scaling */
10044 159, /* Minimum in-band energy threshold */
10045 21, /* 21/32 in-band to broad-band ratio */
10046 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10049 23521, /* A1 = -1.435608 */
10050 -32489, /* A2 = 0.991516 */
10051 -193, /* B2 = -0.005915 */
10052 0, /* B1 = 0.000000 */
10053 193, /* B0 = 0.005915 */
10054 23404, /* A1 = -1.428467 */
10055 -32655, /* A2 = 0.996582 */
10056 17740, /* B2 = 0.541412 */
10057 -12567, /* B1 = -0.767029 */
10058 17740, /* B0 = 0.541412 */
10059 23753, /* A1 = -1.449829 */
10060 -32657, /* A2 = 0.996613 */
10061 9090, /* B2 = 0.277405 */
10062 -6662, /* B1 = -0.406647 */
10063 9090, /* B0 = 0.277405 */
10064 5, /* Internal filter scaling */
10065 159, /* Minimum in-band energy threshold */
10066 21, /* 21/32 in-band to broad-band ratio */
10067 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10070 23071, /* A1 = -1.408203 */
10071 -32489, /* A2 = 0.991516 */
10072 -293, /* B2 = -0.008965 */
10073 0, /* B1 = 0.000000 */
10074 293, /* B0 = 0.008965 */
10075 22951, /* A1 = -1.400818 */
10076 -32655, /* A2 = 0.996582 */
10077 5689, /* B2 = 0.173645 */
10078 -3951, /* B1 = -0.241150 */
10079 5689, /* B0 = 0.173645 */
10080 23307, /* A1 = -1.422607 */
10081 -32657, /* A2 = 0.996613 */
10082 18692, /* B2 = 0.570435 */
10083 -13447, /* B1 = -0.820770 */
10084 18692, /* B0 = 0.570435 */
10085 5, /* Internal filter scaling */
10086 159, /* Minimum in-band energy threshold */
10087 21, /* 21/32 in-band to broad-band ratio */
10088 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10091 22701, /* A1 = -1.385620 */
10092 -32474, /* A2 = 0.991058 */
10093 -292, /* B2 = -0.008933 */
10094 0, /*163840 , B1 = 10.000000 */
10095 292, /* B0 = 0.008933 */
10096 22564, /* A1 = -1.377258 */
10097 -32655, /* A2 = 0.996552 */
10098 20756, /* B2 = 0.633423 */
10099 -14176, /* B1 = -0.865295 */
10100 20756, /* B0 = 0.633423 */
10101 22960, /* A1 = -1.401428 */
10102 -32657, /* A2 = 0.996613 */
10103 6520, /* B2 = 0.198990 */
10104 -4619, /* B1 = -0.281937 */
10105 6520, /* B0 = 0.198990 */
10106 5, /* Internal filter scaling */
10107 159, /* Minimum in-band energy threshold */
10108 21, /* 21/32 in-band to broad-band ratio */
10109 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10112 22142, /* A1 = -1.351501 */
10113 -32474, /* A2 = 0.991058 */
10114 -147, /* B2 = -0.004493 */
10115 0, /* B1 = 0.000000 */
10116 147, /* B0 = 0.004493 */
10117 22000, /* A1 = -1.342834 */
10118 -32655, /* A2 = 0.996552 */
10119 15379, /* B2 = 0.469360 */
10120 -10237, /* B1 = -0.624847 */
10121 15379, /* B0 = 0.469360 */
10122 22406, /* A1 = -1.367554 */
10123 -32657, /* A2 = 0.996613 */
10124 17491, /* B2 = 0.533783 */
10125 -12096, /* B1 = -0.738312 */
10126 17491, /* B0 = 0.533783 */
10127 5, /* Internal filter scaling */
10128 159, /* Minimum in-band energy threshold */
10129 21, /* 21/32 in-band to broad-band ratio */
10130 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10132 { /* f1100_1750[] */
10133 12973, /* A1 = 0.79184 */
10134 -24916, /* A2 = -0.760376 */
10135 6655, /* B2 = 0.203102 */
10136 367, /* B1 = 0.0224 */
10137 6657, /* B0 = 0.203171 */
10138 5915, /* A1 = 0.361053 */
10139 -29560, /* A2 = -0.90213 */
10140 -7777, /* B2 = -0.23735 */
10142 7777, /* B0 = 0.23735 */
10143 20510, /* A1 = 1.251892 */
10144 -30260, /* A2 = -0.923462 */
10145 26662, /* B2 = 0.81366 */
10146 -20573, /* B1 = -1.255737 */
10147 26668, /* B0 = 0.813843 */
10148 7, /* Internal filter scaling */
10149 159, /* Minimum in-band energy threshold */
10150 21, /* 21/32 in-band to broad-band ratio */
10151 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10154 20392, /* A1 = -1.244629 */
10155 -32460, /* A2 = 0.990601 */
10156 -270, /* B2 = -0.008240 */
10157 0, /* B1 = 0.000000 */
10158 270, /* B0 = 0.008240 */
10159 20218, /* A1 = -1.234009 */
10160 -32655, /* A2 = 0.996582 */
10161 21337, /* B2 = 0.651154 */
10162 -13044, /* B1 = -0.796143 */
10163 21337, /* B0 = 0.651154 */
10164 20684, /* A1 = -1.262512 */
10165 -32657, /* A2 = 0.996643 */
10166 8572, /* B2 = 0.261612 */
10167 -5476, /* B1 = -0.334244 */
10168 8572, /* B0 = 0.261612 */
10169 5, /* Internal filter scaling */
10170 159, /* Minimum in-band energy threshold */
10171 21, /* 21/32 in-band to broad-band ratio */
10172 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10175 19159, /* A1 = -1.169373 */
10176 -32456, /* A2 = 0.990509 */
10177 -335, /* B2 = -0.010252 */
10178 0, /* B1 = 0.000000 */
10179 335, /* B0 = 0.010252 */
10180 18966, /* A1 = -1.157593 */
10181 -32661, /* A2 = 0.996735 */
10182 6802, /* B2 = 0.207588 */
10183 -3900, /* B1 = -0.238098 */
10184 6802, /* B0 = 0.207588 */
10185 19467, /* A1 = -1.188232 */
10186 -32661, /* A2 = 0.996765 */
10187 25035, /* B2 = 0.764008 */
10188 -15049, /* B1 = -0.918579 */
10189 25035, /* B0 = 0.764008 */
10190 5, /* Internal filter scaling */
10191 159, /* Minimum in-band energy threshold */
10192 21, /* 21/32 in-band to broad-band ratio */
10193 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10196 18976, /* A1 = -1.158264 */
10197 -32439, /* A2 = 0.989990 */
10198 -183, /* B2 = -0.005588 */
10199 0, /* B1 = 0.000000 */
10200 183, /* B0 = 0.005588 */
10201 18774, /* A1 = -1.145874 */
10202 -32650, /* A2 = 0.996429 */
10203 15468, /* B2 = 0.472076 */
10204 -8768, /* B1 = -0.535217 */
10205 15468, /* B0 = 0.472076 */
10206 19300, /* A1 = -1.177979 */
10207 -32652, /* A2 = 0.996490 */
10208 19840, /* B2 = 0.605499 */
10209 -11842, /* B1 = -0.722809 */
10210 19840, /* B0 = 0.605499 */
10211 5, /* Internal filter scaling */
10212 159, /* Minimum in-band energy threshold */
10213 21, /* 21/32 in-band to broad-band ratio */
10214 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10217 16357, /* A1 = -0.998413 */
10218 -32368, /* A2 = 0.987793 */
10219 -217, /* B2 = -0.006652 */
10220 0, /* B1 = 0.000000 */
10221 217, /* B0 = 0.006652 */
10222 16107, /* A1 = -0.983126 */
10223 -32601, /* A2 = 0.994904 */
10224 11602, /* B2 = 0.354065 */
10225 -5555, /* B1 = -0.339111 */
10226 11602, /* B0 = 0.354065 */
10227 16722, /* A1 = -1.020630 */
10228 -32603, /* A2 = 0.994965 */
10229 15574, /* B2 = 0.475311 */
10230 -8176, /* B1 = -0.499069 */
10231 15574, /* B0 = 0.475311 */
10232 5, /* Internal filter scaling */
10233 159, /* Minimum in-band energy threshold */
10234 21, /* 21/32 in-band to broad-band ratio */
10235 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10238 16234, /* A1 = -0.990875 */
10239 32404, /* A2 = -0.988922 */
10240 -193, /* B2 = -0.005908 */
10241 0, /* B1 = 0.000000 */
10242 193, /* B0 = 0.005908 */
10243 15986, /* A1 = -0.975769 */
10244 -32632, /* A2 = 0.995880 */
10245 18051, /* B2 = 0.550903 */
10246 -8658, /* B1 = -0.528473 */
10247 18051, /* B0 = 0.550903 */
10248 16591, /* A1 = -1.012695 */
10249 -32634, /* A2 = 0.995941 */
10250 15736, /* B2 = 0.480240 */
10251 -8125, /* B1 = -0.495926 */
10252 15736, /* B0 = 0.480240 */
10253 5, /* Internal filter scaling */
10254 159, /* Minimum in-band energy threshold */
10255 21, /* 21/32 in-band to broad-band ratio */
10256 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10259 15564, /* A1 = -0.949982 */
10260 -32404, /* A2 = 0.988922 */
10261 -269, /* B2 = -0.008216 */
10262 0, /* B1 = 0.000000 */
10263 269, /* B0 = 0.008216 */
10264 15310, /* A1 = -0.934479 */
10265 -32632, /* A2 = 0.995880 */
10266 10815, /* B2 = 0.330063 */
10267 -4962, /* B1 = -0.302887 */
10268 10815, /* B0 = 0.330063 */
10269 15924, /* A1 = -0.971924 */
10270 -32634, /* A2 = 0.995941 */
10271 18880, /* B2 = 0.576172 */
10272 -9364, /* B1 = -0.571594 */
10273 18880, /* B0 = 0.576172 */
10274 5, /* Internal filter scaling */
10275 159, /* Minimum in-band energy threshold */
10276 21, /* 21/32 in-band to broad-band ratio */
10277 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10280 15247, /* A1 = -0.930603 */
10281 -32397, /* A2 = 0.988708 */
10282 -244, /* B2 = -0.007451 */
10283 0, /* B1 = 0.000000 */
10284 244, /* B0 = 0.007451 */
10285 14989, /* A1 = -0.914886 */
10286 -32627, /* A2 = 0.995697 */
10287 18961, /* B2 = 0.578644 */
10288 -8498, /* B1 = -0.518707 */
10289 18961, /* B0 = 0.578644 */
10290 15608, /* A1 = -0.952667 */
10291 -32628, /* A2 = 0.995758 */
10292 11145, /* B2 = 0.340134 */
10293 -5430, /* B1 = -0.331467 */
10294 11145, /* B0 = 0.340134 */
10295 5, /* Internal filter scaling */
10296 159, /* Minimum in-band energy threshold */
10297 21, /* 21/32 in-band to broad-band ratio */
10298 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10301 14780, /* A1 = -0.902130 */
10302 -32393, /* A2 = 0.988586 */
10303 -396, /* B2 = -0.012086 */
10304 0, /* B1 = 0.000000 */
10305 396, /* B0 = 0.012086 */
10306 14510, /* A1 = -0.885651 */
10307 -32630, /* A2 = 0.995819 */
10308 6326, /* B2 = 0.193069 */
10309 -2747, /* B1 = -0.167671 */
10310 6326, /* B0 = 0.193069 */
10311 15154, /* A1 = -0.924957 */
10312 -32632, /* A2 = 0.995850 */
10313 23235, /* B2 = 0.709076 */
10314 -10983, /* B1 = -0.670380 */
10315 23235, /* B0 = 0.709076 */
10316 5, /* Internal filter scaling */
10317 159, /* Minimum in-band energy threshold */
10318 21, /* 21/32 in-band to broad-band ratio */
10319 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10322 13005, /* A1 = -0.793793 */
10323 -32368, /* A2 = 0.987823 */
10324 -500, /* B2 = -0.015265 */
10325 0, /* B1 = 0.000000 */
10326 500, /* B0 = 0.015265 */
10327 12708, /* A1 = -0.775665 */
10328 -32615, /* A2 = 0.995331 */
10329 11420, /* B2 = 0.348526 */
10330 -4306, /* B1 = -0.262833 */
10331 11420, /* B0 = 0.348526 */
10332 13397, /* A1 = -0.817688 */
10333 -32615, /* A2 = 0.995361 */
10334 9454, /* B2 = 0.288528 */
10335 -3981, /* B1 = -0.243027 */
10336 9454, /* B0 = 0.288528 */
10337 5, /* Internal filter scaling */
10338 159, /* Minimum in-band energy threshold */
10339 21, /* 21/32 in-band to broad-band ratio */
10340 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10343 10046, /* A1 = -0.613190 */
10344 -32331, /* A2 = 0.986694 */
10345 -455, /* B2 = -0.013915 */
10346 0, /* B1 = 0.000000 */
10347 455, /* B0 = 0.013915 */
10348 9694, /* A1 = -0.591705 */
10349 -32601, /* A2 = 0.994934 */
10350 6023, /* B2 = 0.183815 */
10351 -1708, /* B1 = -0.104279 */
10352 6023, /* B0 = 0.183815 */
10353 10478, /* A1 = -0.639587 */
10354 -32603, /* A2 = 0.994965 */
10355 22031, /* B2 = 0.672333 */
10356 -7342, /* B1 = -0.448151 */
10357 22031, /* B0 = 0.672333 */
10358 5, /* Internal filter scaling */
10359 159, /* Minimum in-band energy threshold */
10360 21, /* 21/32 in-band to broad-band ratio */
10361 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10363 { /* f1633_1638[] */
10364 9181, /* A1 = 0.560394 */
10365 -32256, /* A2 = -0.984375 */
10366 -556, /* B2 = -0.016975 */
10368 556, /* B0 = 0.016975 */
10369 8757, /* A1 = 0.534515 */
10370 -32574, /* A2 = -0.99408 */
10371 8443, /* B2 = 0.25769 */
10372 -2135, /* B1 = -0.130341 */
10373 8443, /* B0 = 0.25769 */
10374 9691, /* A1 = 0.591522 */
10375 -32574, /* A2 = -0.99411 */
10376 15446, /* B2 = 0.471375 */
10377 -4809, /* B1 = -0.293579 */
10378 15446, /* B0 = 0.471375 */
10379 7, /* Internal filter scaling */
10380 159, /* Minimum in-band energy threshold */
10381 21, /* 21/32 in-band to broad-band ratio */
10382 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10385 5076, /* A1 = -0.309875 */
10386 -32304, /* A2 = 0.985840 */
10387 -508, /* B2 = -0.015503 */
10388 0, /* B1 = 0.000000 */
10389 508, /* B0 = 0.015503 */
10390 4646, /* A1 = -0.283600 */
10391 -32605, /* A2 = 0.995026 */
10392 6742, /* B2 = 0.205780 */
10393 -878, /* B1 = -0.053635 */
10394 6742, /* B0 = 0.205780 */
10395 5552, /* A1 = -0.338928 */
10396 -32605, /* A2 = 0.995056 */
10397 23667, /* B2 = 0.722260 */
10398 -4297, /* B1 = -0.262329 */
10399 23667, /* B0 = 0.722260 */
10400 5, /* Internal filter scaling */
10401 159, /* Minimum in-band energy threshold */
10402 21, /* 21/32 in-band to broad-band ratio */
10403 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10406 3569, /* A1 = -0.217865 */
10407 -32292, /* A2 = 0.985504 */
10408 -239, /* B2 = -0.007322 */
10409 0, /* B1 = 0.000000 */
10410 239, /* B0 = 0.007322 */
10411 3117, /* A1 = -0.190277 */
10412 -32603, /* A2 = 0.994965 */
10413 18658, /* B2 = 0.569427 */
10414 -1557, /* B1 = -0.095032 */
10415 18658, /* B0 = 0.569427 */
10416 4054, /* A1 = -0.247437 */
10417 -32603, /* A2 = 0.994965 */
10418 18886, /* B2 = 0.576385 */
10419 -2566, /* B1 = -0.156647 */
10420 18886, /* B0 = 0.576385 */
10421 5, /* Internal filter scaling */
10422 159, /* Minimum in-band energy threshold */
10423 21, /* 21/32 in-band to broad-band ratio */
10424 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10427 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10429 unsigned short cmd;
10432 if (jf->filter > 3) {
10435 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10439 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10445 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10448 /* Select the filter (f0 - f3) to use. */
10449 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10452 if (jf->freq < 12 && jf->freq > 3) {
10453 /* Select the frequency for the selected filter. */
10454 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10456 } else if (jf->freq > 11) {
10457 /* We need to load a programmable filter set for undefined */
10458 /* frequencies. So we will point the filter to a programmable set. */
10459 /* Since there are only 4 filters and 4 programmable sets, we will */
10460 /* just point the filter to the same number set and program it for the */
10461 /* frequency we want. */
10462 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10464 if (j->ver.low != 0x12) {
10471 if (ixj_WriteDSPCommand(cmd, j))
10473 for (cnt = 0; cnt < max; cnt++) {
10474 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10478 j->filter_en[jf->filter] = jf->enable;
10482 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10484 unsigned short cmd;
10486 if (jfr->filter > 3) {
10489 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10492 if (!jfr->enable) {
10493 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10498 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10500 /* Select the filter (f0 - f3) to use. */
10501 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10504 /* We need to load a programmable filter set for undefined */
10505 /* frequencies. So we will point the filter to a programmable set. */
10506 /* Since there are only 4 filters and 4 programmable sets, we will */
10507 /* just point the filter to the same number set and program it for the */
10508 /* frequency we want. */
10509 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10511 if (j->ver.low != 0x12) {
10518 if (ixj_WriteDSPCommand(cmd, j))
10520 for (cnt = 0; cnt < max; cnt++) {
10521 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10524 j->filter_en[jfr->filter] = jfr->enable;
10528 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10531 unsigned short data;
10544 if(ti->tone_index > 12 && ti->tone_index < 28)
10546 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10548 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10551 if (ixj_WriteDSPCommand(data, j))
10554 if (ixj_WriteDSPCommand(data, j))