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 /************************************************************************
289 * ixjdebug meanings are now bit mapped instead of level based
290 * Values can be or'ed together to turn on multiple messages
292 * bit 0 (0x0001) = any failure
293 * bit 1 (0x0002) = general messages
294 * bit 2 (0x0004) = POTS ringing related
295 * bit 3 (0x0008) = PSTN events
296 * bit 4 (0x0010) = PSTN Cadence state details
297 * bit 5 (0x0020) = Tone detection triggers
298 * bit 6 (0x0040) = Tone detection cadence details
299 * bit 7 (0x0080) = ioctl tracking
300 * bit 8 (0x0100) = signal tracking
301 * bit 9 (0x0200) = CallerID generation details
303 ************************************************************************/
307 static IXJ
*ixj
[IXJMAX
];
308 #define get_ixj(b) ixj[(b)]
311 * Allocate a free IXJ device
314 static IXJ
*ixj_alloc()
316 for(cnt
=0; cnt
<IXJMAX
; cnt
++)
318 if(ixj
[cnt
] == NULL
|| !ixj
[cnt
]->DSPbase
)
320 j
= kmalloc(sizeof(IXJ
), GFP_KERNEL
);
330 static void ixj_fsk_free(IXJ
*j
)
332 if(j
->fskdata
!= NULL
) {
338 static void ixj_fsk_alloc(IXJ
*j
)
341 j
->fskdata
= kmalloc(8000, GFP_KERNEL
);
343 if(ixjdebug
& 0x0200) {
344 printk("IXJ phone%d - allocate failed\n", j
->board
);
349 if(ixjdebug
& 0x0200) {
350 printk("IXJ phone%d - allocate succeded\n", j
->board
);
358 static IXJ ixj
[IXJMAX
];
359 #define get_ixj(b) (&ixj[(b)])
362 * Allocate a free IXJ device
365 static IXJ
*ixj_alloc(void)
368 for(cnt
=0; cnt
<IXJMAX
; cnt
++) {
369 if(!ixj
[cnt
].DSPbase
)
375 static inline void ixj_fsk_free(IXJ
*j
) {;}
377 static inline void ixj_fsk_alloc(IXJ
*j
)
385 #define ixj_perfmon(x) ((x)++)
387 #define ixj_perfmon(x) do { } while(0)
390 static int ixj_convert_loaded
;
392 static int ixj_WriteDSPCommand(unsigned short, IXJ
*j
);
394 /************************************************************************
396 * These are function definitions to allow external modules to register
397 * enhanced functionality call backs.
399 ************************************************************************/
401 static int Stub(IXJ
* J
, unsigned long arg
)
406 static IXJ_REGFUNC ixj_PreRead
= &Stub
;
407 static IXJ_REGFUNC ixj_PostRead
= &Stub
;
408 static IXJ_REGFUNC ixj_PreWrite
= &Stub
;
409 static IXJ_REGFUNC ixj_PostWrite
= &Stub
;
411 static void ixj_read_frame(IXJ
*j
);
412 static void ixj_write_frame(IXJ
*j
);
413 static void ixj_init_timer(IXJ
*j
);
414 static void ixj_add_timer(IXJ
* j
);
415 static void ixj_timeout(unsigned long ptr
);
416 static int read_filters(IXJ
*j
);
417 static int LineMonitor(IXJ
*j
);
418 static int ixj_fasync(int fd
, struct file
*, int mode
);
419 static int ixj_set_port(IXJ
*j
, int arg
);
420 static int ixj_set_pots(IXJ
*j
, int arg
);
421 static int ixj_hookstate(IXJ
*j
);
422 static int ixj_record_start(IXJ
*j
);
423 static void ixj_record_stop(IXJ
*j
);
424 static void set_rec_volume(IXJ
*j
, int volume
);
425 static int get_rec_volume(IXJ
*j
);
426 static int set_rec_codec(IXJ
*j
, int rate
);
427 static void ixj_vad(IXJ
*j
, int arg
);
428 static int ixj_play_start(IXJ
*j
);
429 static void ixj_play_stop(IXJ
*j
);
430 static int ixj_set_tone_on(unsigned short arg
, IXJ
*j
);
431 static int ixj_set_tone_off(unsigned short, IXJ
*j
);
432 static int ixj_play_tone(IXJ
*j
, char tone
);
433 static void ixj_aec_start(IXJ
*j
, int level
);
434 static int idle(IXJ
*j
);
435 static void ixj_ring_on(IXJ
*j
);
436 static void ixj_ring_off(IXJ
*j
);
437 static void aec_stop(IXJ
*j
);
438 static void ixj_ringback(IXJ
*j
);
439 static void ixj_busytone(IXJ
*j
);
440 static void ixj_dialtone(IXJ
*j
);
441 static void ixj_cpt_stop(IXJ
*j
);
442 static char daa_int_read(IXJ
*j
);
443 static char daa_CR_read(IXJ
*j
, int cr
);
444 static int daa_set_mode(IXJ
*j
, int mode
);
445 static int ixj_linetest(IXJ
*j
);
446 static int ixj_daa_write(IXJ
*j
);
447 static int ixj_daa_cid_read(IXJ
*j
);
448 static void DAA_Coeff_US(IXJ
*j
);
449 static void DAA_Coeff_UK(IXJ
*j
);
450 static void DAA_Coeff_France(IXJ
*j
);
451 static void DAA_Coeff_Germany(IXJ
*j
);
452 static void DAA_Coeff_Australia(IXJ
*j
);
453 static void DAA_Coeff_Japan(IXJ
*j
);
454 static int ixj_init_filter(IXJ
*j
, IXJ_FILTER
* jf
);
455 static int ixj_init_filter_raw(IXJ
*j
, IXJ_FILTER_RAW
* jfr
);
456 static int ixj_init_tone(IXJ
*j
, IXJ_TONE
* ti
);
457 static int ixj_build_cadence(IXJ
*j
, IXJ_CADENCE __user
* cp
);
458 static int ixj_build_filter_cadence(IXJ
*j
, IXJ_FILTER_CADENCE __user
* cp
);
459 /* Serial Control Interface funtions */
460 static int SCI_Control(IXJ
*j
, int control
);
461 static int SCI_Prepare(IXJ
*j
);
462 static int SCI_WaitHighSCI(IXJ
*j
);
463 static int SCI_WaitLowSCI(IXJ
*j
);
464 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
);
465 static int ixj_PCcontrol_wait(IXJ
*j
);
466 static void ixj_pre_cid(IXJ
*j
);
467 static void ixj_write_cid(IXJ
*j
);
468 static void ixj_write_cid_bit(IXJ
*j
, int bit
);
469 static int set_base_frame(IXJ
*j
, int size
);
470 static int set_play_codec(IXJ
*j
, int rate
);
471 static void set_rec_depth(IXJ
*j
, int depth
);
472 static int ixj_mixer(long val
, IXJ
*j
);
474 /************************************************************************
475 CT8020/CT8021 Host Programmers Model
476 Host address Function Access
478 0-1 Aux Software Status Register (reserved) Read Only
479 2-3 Software Status Register Read Only
480 4-5 Aux Software Control Register (reserved) Read Write
481 6-7 Software Control Register Read Write
482 8-9 Hardware Status Register Read Only
483 A-B Hardware Control Register Read Write
484 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
485 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
486 ************************************************************************/
488 static inline void ixj_read_HSR(IXJ
*j
)
490 j
->hsr
.bytes
.low
= inb_p(j
->DSPbase
+ 8);
491 j
->hsr
.bytes
.high
= inb_p(j
->DSPbase
+ 9);
494 static inline int IsControlReady(IXJ
*j
)
497 return j
->hsr
.bits
.controlrdy
? 1 : 0;
500 static inline int IsPCControlReady(IXJ
*j
)
502 j
->pccr1
.byte
= inb_p(j
->XILINXbase
+ 3);
503 return j
->pccr1
.bits
.crr
? 1 : 0;
506 static inline int IsStatusReady(IXJ
*j
)
509 return j
->hsr
.bits
.statusrdy
? 1 : 0;
512 static inline int IsRxReady(IXJ
*j
)
515 ixj_perfmon(j
->rxreadycheck
);
516 return j
->hsr
.bits
.rxrdy
? 1 : 0;
519 static inline int IsTxReady(IXJ
*j
)
522 ixj_perfmon(j
->txreadycheck
);
523 return j
->hsr
.bits
.txrdy
? 1 : 0;
526 static inline void set_play_volume(IXJ
*j
, int volume
)
528 if (ixjdebug
& 0x0002)
529 printk(KERN_INFO
"IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j
->board
, volume
);
530 ixj_WriteDSPCommand(0xCF02, j
);
531 ixj_WriteDSPCommand(volume
, j
);
534 static int set_play_volume_linear(IXJ
*j
, int volume
)
536 int newvolume
, dspplaymax
;
538 if (ixjdebug
& 0x0002)
539 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j
->board
, volume
);
540 if(volume
> 100 || volume
< 0) {
544 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
545 switch (j
->cardtype
) {
550 if(j
->port
== PORT_PSTN
) {
556 case QTI_PHONEJACK_LITE
:
559 case QTI_PHONEJACK_PCI
:
568 newvolume
= (dspplaymax
* volume
) / 100;
569 set_play_volume(j
, newvolume
);
573 static inline void set_play_depth(IXJ
*j
, int depth
)
579 ixj_WriteDSPCommand(0x5280 + depth
, j
);
582 static inline int get_play_volume(IXJ
*j
)
584 ixj_WriteDSPCommand(0xCF00, j
);
585 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
588 static int get_play_volume_linear(IXJ
*j
)
590 int volume
, newvolume
, dspplaymax
;
592 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
593 switch (j
->cardtype
) {
598 if(j
->port
== PORT_PSTN
) {
604 case QTI_PHONEJACK_LITE
:
607 case QTI_PHONEJACK_PCI
:
616 volume
= get_play_volume(j
);
617 newvolume
= (volume
* 100) / dspplaymax
;
623 static inline BYTE
SLIC_GetState(IXJ
*j
)
625 if (j
->cardtype
== QTI_PHONECARD
) {
627 j
->psccr
.bits
.dev
= 3;
628 j
->psccr
.bits
.rw
= 1;
629 outw_p(j
->psccr
.byte
<< 8, j
->XILINXbase
+ 0x00);
630 ixj_PCcontrol_wait(j
);
631 j
->pslic
.byte
= inw_p(j
->XILINXbase
+ 0x00) & 0xFF;
632 ixj_PCcontrol_wait(j
);
633 if (j
->pslic
.bits
.powerdown
)
634 return PLD_SLIC_STATE_OC
;
635 else if (!j
->pslic
.bits
.ring0
&& !j
->pslic
.bits
.ring1
)
636 return PLD_SLIC_STATE_ACTIVE
;
638 return PLD_SLIC_STATE_RINGING
;
640 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
642 return j
->pld_slicr
.bits
.state
;
645 static BOOL
SLIC_SetState(BYTE byState
, IXJ
*j
)
647 BOOL fRetVal
= FALSE
;
649 if (j
->cardtype
== QTI_PHONECARD
) {
650 if (j
->flags
.pcmciasct
) {
652 case PLD_SLIC_STATE_TIPOPEN
:
653 case PLD_SLIC_STATE_OC
:
654 j
->pslic
.bits
.powerdown
= 1;
655 j
->pslic
.bits
.ring0
= j
->pslic
.bits
.ring1
= 0;
658 case PLD_SLIC_STATE_RINGING
:
659 if (j
->readers
|| j
->writers
) {
660 j
->pslic
.bits
.powerdown
= 0;
661 j
->pslic
.bits
.ring0
= 1;
662 j
->pslic
.bits
.ring1
= 0;
666 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
668 case PLD_SLIC_STATE_STANDBY
:
669 case PLD_SLIC_STATE_ACTIVE
:
670 if (j
->readers
|| j
->writers
) {
671 j
->pslic
.bits
.powerdown
= 0;
673 j
->pslic
.bits
.powerdown
= 1;
675 j
->pslic
.bits
.ring0
= j
->pslic
.bits
.ring1
= 0;
678 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
680 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
686 j
->psccr
.bits
.dev
= 3;
687 j
->psccr
.bits
.rw
= 0;
688 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
689 ixj_PCcontrol_wait(j
);
692 /* Set the C1, C2, C3 & B2EN signals. */
694 case PLD_SLIC_STATE_OC
:
695 j
->pld_slicw
.bits
.c1
= 0;
696 j
->pld_slicw
.bits
.c2
= 0;
697 j
->pld_slicw
.bits
.c3
= 0;
698 j
->pld_slicw
.bits
.b2en
= 0;
699 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
702 case PLD_SLIC_STATE_RINGING
:
703 j
->pld_slicw
.bits
.c1
= 1;
704 j
->pld_slicw
.bits
.c2
= 0;
705 j
->pld_slicw
.bits
.c3
= 0;
706 j
->pld_slicw
.bits
.b2en
= 1;
707 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
710 case PLD_SLIC_STATE_ACTIVE
:
711 j
->pld_slicw
.bits
.c1
= 0;
712 j
->pld_slicw
.bits
.c2
= 1;
713 j
->pld_slicw
.bits
.c3
= 0;
714 j
->pld_slicw
.bits
.b2en
= 0;
715 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
718 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
720 j
->pld_slicw
.bits
.c1
= 1;
721 j
->pld_slicw
.bits
.c2
= 1;
722 j
->pld_slicw
.bits
.c3
= 0;
723 j
->pld_slicw
.bits
.b2en
= 0;
724 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
727 case PLD_SLIC_STATE_TIPOPEN
:
728 j
->pld_slicw
.bits
.c1
= 0;
729 j
->pld_slicw
.bits
.c2
= 0;
730 j
->pld_slicw
.bits
.c3
= 1;
731 j
->pld_slicw
.bits
.b2en
= 0;
732 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
735 case PLD_SLIC_STATE_STANDBY
:
736 j
->pld_slicw
.bits
.c1
= 1;
737 j
->pld_slicw
.bits
.c2
= 0;
738 j
->pld_slicw
.bits
.c3
= 1;
739 j
->pld_slicw
.bits
.b2en
= 1;
740 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
743 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
745 j
->pld_slicw
.bits
.c1
= 0;
746 j
->pld_slicw
.bits
.c2
= 1;
747 j
->pld_slicw
.bits
.c3
= 1;
748 j
->pld_slicw
.bits
.b2en
= 0;
749 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
752 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
754 j
->pld_slicw
.bits
.c1
= 1;
755 j
->pld_slicw
.bits
.c2
= 1;
756 j
->pld_slicw
.bits
.c3
= 1;
757 j
->pld_slicw
.bits
.b2en
= 0;
758 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
770 static int ixj_wink(IXJ
*j
)
774 slicnow
= SLIC_GetState(j
);
776 j
->pots_winkstart
= jiffies
;
777 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
779 while (time_before(jiffies
, j
->pots_winkstart
+ j
->winktime
)) {
780 set_current_state(TASK_INTERRUPTIBLE
);
784 SLIC_SetState(slicnow
, j
);
788 static void ixj_init_timer(IXJ
*j
)
790 init_timer(&j
->timer
);
791 j
->timer
.function
= ixj_timeout
;
792 j
->timer
.data
= (unsigned long)j
;
795 static void ixj_add_timer(IXJ
*j
)
797 j
->timer
.expires
= jiffies
+ (hertz
/ samplerate
);
798 add_timer(&j
->timer
);
801 static void ixj_tone_timeout(IXJ
*j
)
806 if (j
->tone_state
== 3) {
809 j
->tone_cadence_state
++;
810 if (j
->tone_cadence_state
>= j
->cadence_t
->elements_used
) {
811 switch (j
->cadence_t
->termination
) {
815 case REPEAT_LAST_ELEMENT
:
816 j
->tone_cadence_state
--;
817 ixj_play_tone(j
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
820 j
->tone_cadence_state
= 0;
821 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
) {
822 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
823 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
824 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
825 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
826 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
827 ixj_init_tone(j
, &ti
);
829 ixj_set_tone_on(j
->cadence_t
->ce
[0].tone_on_time
, j
);
830 ixj_set_tone_off(j
->cadence_t
->ce
[0].tone_off_time
, j
);
831 ixj_play_tone(j
, j
->cadence_t
->ce
[0].index
);
835 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
) {
836 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
837 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
838 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
839 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
840 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
841 ixj_init_tone(j
, &ti
);
843 ixj_set_tone_on(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_on_time
, j
);
844 ixj_set_tone_off(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_off_time
, j
);
845 ixj_play_tone(j
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
851 static inline void ixj_kill_fasync(IXJ
*j
, IXJ_SIGEVENT event
, int dir
)
853 if(j
->ixj_signals
[event
]) {
854 if(ixjdebug
& 0x0100)
855 printk("Sending signal for event %d\n", event
);
856 /* Send apps notice of change */
857 /* see config.h for macro definition */
858 kill_fasync(&(j
->async_queue
), j
->ixj_signals
[event
], dir
);
862 static void ixj_pstn_state(IXJ
*j
)
865 union XOPXR0 XR0
, daaint
;
869 XR0
.reg
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
;
871 XR0
.bitreg
.RMR
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
;
873 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
874 if (j
->pld_scrr
.bits
.daaflag
) {
876 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.RING
) {
877 if(time_after(jiffies
, j
->pstn_sleeptil
) && !(j
->flags
.pots_pstn
&& j
->hookstate
)) {
878 daaint
.bitreg
.RING
= 1;
879 if(ixjdebug
& 0x0008) {
880 printk(KERN_INFO
"IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
883 daa_set_mode(j
, SOP_PU_RESET
);
886 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Caller_ID
) {
887 daaint
.bitreg
.Caller_ID
= 1;
888 j
->pstn_cid_intr
= 1;
889 j
->pstn_cid_received
= jiffies
;
890 if(ixjdebug
& 0x0008) {
891 printk(KERN_INFO
"IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
894 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Cadence
) {
895 daaint
.bitreg
.Cadence
= 1;
896 if(ixjdebug
& 0x0008) {
897 printk(KERN_INFO
"IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
900 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
!= XR0
.bitreg
.VDD_OK
) {
901 daaint
.bitreg
.VDD_OK
= 1;
902 daaint
.bitreg
.SI_0
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
;
906 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
)) {
907 daaint
.bitreg
.RMR
= 1;
908 daaint
.bitreg
.SI_1
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
;
909 if(ixjdebug
& 0x0008) {
910 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
);
912 j
->pstn_prev_rmr
= j
->pstn_last_rmr
;
913 j
->pstn_last_rmr
= jiffies
;
915 switch(j
->daa_mode
) {
917 if (daaint
.bitreg
.RING
) {
918 if (!j
->flags
.pstn_ringing
) {
919 if (j
->daa_mode
!= SOP_PU_RINGING
) {
920 j
->pstn_ring_int
= jiffies
;
921 daa_set_mode(j
, SOP_PU_RINGING
);
927 if (daaint
.bitreg
.RMR
) {
928 if (ixjdebug
& 0x0008) {
929 printk(KERN_INFO
"IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j
->cadence_f
[4].state
, j
->board
, jiffies
);
931 if (daaint
.bitreg
.SI_1
) { /* Rising edge of RMR */
932 j
->flags
.pstn_rmr
= 1;
933 j
->pstn_ring_start
= jiffies
;
934 j
->pstn_ring_stop
= 0;
935 j
->ex
.bits
.pstn_ring
= 0;
936 if (j
->cadence_f
[4].state
== 0) {
937 j
->cadence_f
[4].state
= 1;
938 j
->cadence_f
[4].on1min
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100 - var
)) / 10000);
939 j
->cadence_f
[4].on1dot
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100)) / 10000);
940 j
->cadence_f
[4].on1max
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100 + var
)) / 10000);
941 } else if (j
->cadence_f
[4].state
== 2) {
942 if((time_after(jiffies
, j
->cadence_f
[4].off1min
) &&
943 time_before(jiffies
, j
->cadence_f
[4].off1max
))) {
944 if (j
->cadence_f
[4].on2
) {
945 j
->cadence_f
[4].state
= 3;
946 j
->cadence_f
[4].on2min
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100 - var
)) / 10000));
947 j
->cadence_f
[4].on2dot
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100)) / 10000));
948 j
->cadence_f
[4].on2max
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100 + var
)) / 10000));
950 j
->cadence_f
[4].state
= 7;
953 if (ixjdebug
& 0x0008) {
954 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
955 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
956 j
->cadence_f
[4].off1
);
958 j
->cadence_f
[4].state
= 0;
960 } else if (j
->cadence_f
[4].state
== 4) {
961 if((time_after(jiffies
, j
->cadence_f
[4].off2min
) &&
962 time_before(jiffies
, j
->cadence_f
[4].off2max
))) {
963 if (j
->cadence_f
[4].on3
) {
964 j
->cadence_f
[4].state
= 5;
965 j
->cadence_f
[4].on3min
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100 - var
)) / 10000));
966 j
->cadence_f
[4].on3dot
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100)) / 10000));
967 j
->cadence_f
[4].on3max
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100 + var
)) / 10000));
969 j
->cadence_f
[4].state
= 7;
972 if (ixjdebug
& 0x0008) {
973 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
974 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
975 j
->cadence_f
[4].off2
);
977 j
->cadence_f
[4].state
= 0;
979 } else if (j
->cadence_f
[4].state
== 6) {
980 if((time_after(jiffies
, j
->cadence_f
[4].off3min
) &&
981 time_before(jiffies
, j
->cadence_f
[4].off3max
))) {
982 j
->cadence_f
[4].state
= 7;
984 if (ixjdebug
& 0x0008) {
985 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
986 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
987 j
->cadence_f
[4].off3
);
989 j
->cadence_f
[4].state
= 0;
992 j
->cadence_f
[4].state
= 0;
994 } else { /* Falling edge of RMR */
995 j
->pstn_ring_start
= 0;
996 j
->pstn_ring_stop
= jiffies
;
997 if (j
->cadence_f
[4].state
== 1) {
998 if(!j
->cadence_f
[4].on1
) {
999 j
->cadence_f
[4].state
= 7;
1000 } else if((time_after(jiffies
, j
->cadence_f
[4].on1min
) &&
1001 time_before(jiffies
, j
->cadence_f
[4].on1max
))) {
1002 if (j
->cadence_f
[4].off1
) {
1003 j
->cadence_f
[4].state
= 2;
1004 j
->cadence_f
[4].off1min
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100 - var
)) / 10000));
1005 j
->cadence_f
[4].off1dot
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100)) / 10000));
1006 j
->cadence_f
[4].off1max
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100 + var
)) / 10000));
1008 j
->cadence_f
[4].state
= 7;
1011 if (ixjdebug
& 0x0008) {
1012 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1013 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1014 j
->cadence_f
[4].on1
);
1016 j
->cadence_f
[4].state
= 0;
1018 } else if (j
->cadence_f
[4].state
== 3) {
1019 if((time_after(jiffies
, j
->cadence_f
[4].on2min
) &&
1020 time_before(jiffies
, j
->cadence_f
[4].on2max
))) {
1021 if (j
->cadence_f
[4].off2
) {
1022 j
->cadence_f
[4].state
= 4;
1023 j
->cadence_f
[4].off2min
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100 - var
)) / 10000));
1024 j
->cadence_f
[4].off2dot
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100)) / 10000));
1025 j
->cadence_f
[4].off2max
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100 + var
)) / 10000));
1027 j
->cadence_f
[4].state
= 7;
1030 if (ixjdebug
& 0x0008) {
1031 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1032 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1033 j
->cadence_f
[4].on2
);
1035 j
->cadence_f
[4].state
= 0;
1037 } else if (j
->cadence_f
[4].state
== 5) {
1038 if((time_after(jiffies
, j
->cadence_f
[4].on3min
) &&
1039 time_before(jiffies
, j
->cadence_f
[4].on3max
))) {
1040 if (j
->cadence_f
[4].off3
) {
1041 j
->cadence_f
[4].state
= 6;
1042 j
->cadence_f
[4].off3min
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100 - var
)) / 10000));
1043 j
->cadence_f
[4].off3dot
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100)) / 10000));
1044 j
->cadence_f
[4].off3max
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100 + var
)) / 10000));
1046 j
->cadence_f
[4].state
= 7;
1049 j
->cadence_f
[4].state
= 0;
1052 if (ixjdebug
& 0x0008) {
1053 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1054 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1055 j
->cadence_f
[4].on3
);
1057 j
->cadence_f
[4].state
= 0;
1060 if (ixjdebug
& 0x0010) {
1061 printk(KERN_INFO
"IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j
->cadence_f
[4].state
, j
->board
, jiffies
);
1063 if (ixjdebug
& 0x0010) {
1064 switch(j
->cadence_f
[4].state
) {
1066 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1067 j
->cadence_f
[4].on1
, j
->cadence_f
[4].on1min
, j
->cadence_f
[4].on1dot
, j
->cadence_f
[4].on1max
);
1070 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1071 j
->cadence_f
[4].off1
, j
->cadence_f
[4].off1min
, j
->cadence_f
[4].off1dot
, j
->cadence_f
[4].off1max
);
1074 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1075 j
->cadence_f
[4].on2
, j
->cadence_f
[4].on2min
, j
->cadence_f
[4].on2dot
, j
->cadence_f
[4].on2max
);
1078 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1079 j
->cadence_f
[4].off2
, j
->cadence_f
[4].off2min
, j
->cadence_f
[4].off2dot
, j
->cadence_f
[4].off2max
);
1082 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1083 j
->cadence_f
[4].on3
, j
->cadence_f
[4].on3min
, j
->cadence_f
[4].on3dot
, j
->cadence_f
[4].on3max
);
1086 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1087 j
->cadence_f
[4].off3
, j
->cadence_f
[4].off3min
, j
->cadence_f
[4].off3dot
, j
->cadence_f
[4].off3max
);
1092 if (j
->cadence_f
[4].state
== 7) {
1093 j
->cadence_f
[4].state
= 0;
1094 j
->pstn_ring_stop
= jiffies
;
1095 j
->ex
.bits
.pstn_ring
= 1;
1096 ixj_kill_fasync(j
, SIG_PSTN_RING
, POLL_IN
);
1097 if(ixjdebug
& 0x0008) {
1098 printk(KERN_INFO
"IXJ Ring int set /dev/phone%d at %ld\n", j
->board
, jiffies
);
1101 if((j
->pstn_ring_int
!= 0 && time_after(jiffies
, j
->pstn_ring_int
+ (hertz
* 5)) && !j
->flags
.pstn_rmr
) ||
1102 (j
->pstn_ring_stop
!= 0 && time_after(jiffies
, j
->pstn_ring_stop
+ (hertz
* 5)))) {
1103 if(ixjdebug
& 0x0008) {
1104 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j
->board
, jiffies
);
1105 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j
->board
, j
->pstn_ring_int
);
1106 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j
->board
, j
->pstn_ring_stop
);
1108 j
->pstn_ring_stop
= j
->pstn_ring_int
= 0;
1109 daa_set_mode(j
, SOP_PU_SLEEP
);
1111 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
1112 if (j
->pstn_cid_intr
&& time_after(jiffies
, j
->pstn_cid_received
+ hertz
)) {
1113 ixj_daa_cid_read(j
);
1114 j
->ex
.bits
.caller_id
= 1;
1115 ixj_kill_fasync(j
, SIG_CALLER_ID
, POLL_IN
);
1116 j
->pstn_cid_intr
= 0;
1118 if (daaint
.bitreg
.Cadence
) {
1119 if(ixjdebug
& 0x0008) {
1120 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j
->board
);
1122 daa_set_mode(j
, SOP_PU_SLEEP
);
1123 j
->ex
.bits
.pstn_ring
= 0;
1126 case SOP_PU_CONVERSATION
:
1127 if (daaint
.bitreg
.VDD_OK
) {
1128 if(!daaint
.bitreg
.SI_0
) {
1129 if (!j
->pstn_winkstart
) {
1130 if(ixjdebug
& 0x0008) {
1131 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j
->board
, jiffies
);
1133 j
->pstn_winkstart
= jiffies
;
1136 if (j
->pstn_winkstart
) {
1137 if(ixjdebug
& 0x0008) {
1138 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j
->board
, jiffies
);
1140 j
->pstn_winkstart
= 0;
1144 if (j
->pstn_winkstart
&& time_after(jiffies
, j
->pstn_winkstart
+ ((hertz
* j
->winktime
) / 1000))) {
1145 if(ixjdebug
& 0x0008) {
1146 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j
->board
, jiffies
);
1148 daa_set_mode(j
, SOP_PU_SLEEP
);
1149 j
->pstn_winkstart
= 0;
1150 j
->ex
.bits
.pstn_wink
= 1;
1151 ixj_kill_fasync(j
, SIG_PSTN_WINK
, POLL_IN
);
1157 static void ixj_timeout(unsigned long ptr
)
1160 unsigned long jifon
;
1161 IXJ
*j
= (IXJ
*)ptr
;
1164 if (j
->DSPbase
&& atomic_read(&j
->DSPWrite
) == 0 && test_and_set_bit(board
, (void *)&j
->busyflags
) == 0) {
1165 ixj_perfmon(j
->timerchecks
);
1166 j
->hookstate
= ixj_hookstate(j
);
1167 if (j
->tone_state
) {
1168 if (!(j
->hookstate
)) {
1172 j
->ex
.bits
.hookstate
= 1;
1173 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1175 clear_bit(board
, &j
->busyflags
);
1179 if (j
->tone_state
== 1)
1180 jifon
= ((hertz
* j
->tone_on_time
) * 25 / 100000);
1182 jifon
= ((hertz
* j
->tone_on_time
) * 25 / 100000) + ((hertz
* j
->tone_off_time
) * 25 / 100000);
1183 if (time_before(jiffies
, j
->tone_start_jif
+ jifon
)) {
1184 if (j
->tone_state
== 1) {
1185 ixj_play_tone(j
, j
->tone_index
);
1186 if (j
->dsp
.low
== 0x20) {
1187 clear_bit(board
, &j
->busyflags
);
1192 ixj_play_tone(j
, 0);
1193 if (j
->dsp
.low
== 0x20) {
1194 clear_bit(board
, &j
->busyflags
);
1200 ixj_tone_timeout(j
);
1201 if (j
->flags
.dialtone
) {
1204 if (j
->flags
.busytone
) {
1206 if (j
->dsp
.low
== 0x20) {
1207 clear_bit(board
, &j
->busyflags
);
1212 if (j
->flags
.ringback
) {
1214 if (j
->dsp
.low
== 0x20) {
1215 clear_bit(board
, &j
->busyflags
);
1220 if (!j
->tone_state
) {
1225 if (!(j
->tone_state
&& j
->dsp
.low
== 0x20)) {
1233 if (j
->flags
.cringing
) {
1234 if (j
->hookstate
& 1) {
1235 j
->flags
.cringing
= 0;
1237 } else if(j
->cadence_f
[5].enable
&& ((!j
->cadence_f
[5].en_filter
) || (j
->cadence_f
[5].en_filter
&& j
->flags
.firstring
))) {
1238 switch(j
->cadence_f
[5].state
) {
1240 j
->cadence_f
[5].on1dot
= jiffies
+ (long)((j
->cadence_f
[5].on1
* (hertz
* 100) / 10000));
1241 if (time_before(jiffies
, j
->cadence_f
[5].on1dot
)) {
1242 if(ixjdebug
& 0x0004) {
1243 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1247 j
->cadence_f
[5].state
= 1;
1250 if (time_after(jiffies
, j
->cadence_f
[5].on1dot
)) {
1251 j
->cadence_f
[5].off1dot
= jiffies
+ (long)((j
->cadence_f
[5].off1
* (hertz
* 100) / 10000));
1252 if(ixjdebug
& 0x0004) {
1253 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1256 j
->cadence_f
[5].state
= 2;
1260 if (time_after(jiffies
, j
->cadence_f
[5].off1dot
)) {
1261 if(ixjdebug
& 0x0004) {
1262 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1265 if (j
->cadence_f
[5].on2
) {
1266 j
->cadence_f
[5].on2dot
= jiffies
+ (long)((j
->cadence_f
[5].on2
* (hertz
* 100) / 10000));
1267 j
->cadence_f
[5].state
= 3;
1269 j
->cadence_f
[5].state
= 7;
1274 if (time_after(jiffies
, j
->cadence_f
[5].on2dot
)) {
1275 if(ixjdebug
& 0x0004) {
1276 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1279 if (j
->cadence_f
[5].off2
) {
1280 j
->cadence_f
[5].off2dot
= jiffies
+ (long)((j
->cadence_f
[5].off2
* (hertz
* 100) / 10000));
1281 j
->cadence_f
[5].state
= 4;
1283 j
->cadence_f
[5].state
= 7;
1288 if (time_after(jiffies
, j
->cadence_f
[5].off2dot
)) {
1289 if(ixjdebug
& 0x0004) {
1290 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1293 if (j
->cadence_f
[5].on3
) {
1294 j
->cadence_f
[5].on3dot
= jiffies
+ (long)((j
->cadence_f
[5].on3
* (hertz
* 100) / 10000));
1295 j
->cadence_f
[5].state
= 5;
1297 j
->cadence_f
[5].state
= 7;
1302 if (time_after(jiffies
, j
->cadence_f
[5].on3dot
)) {
1303 if(ixjdebug
& 0x0004) {
1304 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1307 if (j
->cadence_f
[5].off3
) {
1308 j
->cadence_f
[5].off3dot
= jiffies
+ (long)((j
->cadence_f
[5].off3
* (hertz
* 100) / 10000));
1309 j
->cadence_f
[5].state
= 6;
1311 j
->cadence_f
[5].state
= 7;
1316 if (time_after(jiffies
, j
->cadence_f
[5].off3dot
)) {
1317 if(ixjdebug
& 0x0004) {
1318 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1320 j
->cadence_f
[5].state
= 7;
1324 if(ixjdebug
& 0x0004) {
1325 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1327 j
->flags
.cidring
= 1;
1328 j
->cadence_f
[5].state
= 0;
1331 if (j
->flags
.cidring
&& !j
->flags
.cidsent
) {
1332 j
->flags
.cidsent
= 1;
1334 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
1337 j
->flags
.cidring
= 0;
1339 clear_bit(board
, &j
->busyflags
);
1343 if (time_after(jiffies
, j
->ring_cadence_jif
+ (hertz
/ 2))) {
1344 if (j
->flags
.cidring
&& !j
->flags
.cidsent
) {
1345 j
->flags
.cidsent
= 1;
1347 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
1350 j
->flags
.cidring
= 0;
1352 j
->ring_cadence_t
--;
1353 if (j
->ring_cadence_t
== -1)
1354 j
->ring_cadence_t
= 15;
1355 j
->ring_cadence_jif
= jiffies
;
1357 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
1358 if(j
->flags
.cidsent
&& j
->cadence_f
[5].en_filter
)
1359 j
->flags
.firstring
= 1;
1364 if(!j
->flags
.cidsent
)
1365 j
->flags
.cidring
= 1;
1368 clear_bit(board
, &j
->busyflags
);
1373 if (!j
->flags
.ringing
) {
1374 if (j
->hookstate
) { /* & 1) { */
1375 if (j
->dsp
.low
!= 0x20 &&
1376 SLIC_GetState(j
) != PLD_SLIC_STATE_ACTIVE
) {
1377 SLIC_SetState(PLD_SLIC_STATE_ACTIVE
, j
);
1381 ixj_WriteDSPCommand(0x511B, j
);
1382 j
->proc_load
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
1383 if (!j
->m_hook
&& (j
->hookstate
& 1)) {
1384 j
->m_hook
= j
->ex
.bits
.hookstate
= 1;
1385 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1388 if (j
->ex
.bits
.dtmf_ready
) {
1389 j
->dtmf_wp
= j
->dtmf_rp
= j
->ex
.bits
.dtmf_ready
= 0;
1393 j
->ex
.bits
.hookstate
= 1;
1394 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1398 if (j
->cardtype
== QTI_LINEJACK
&& !j
->flags
.pstncheck
&& j
->flags
.pstn_present
) {
1402 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
1404 clear_bit(board
, &j
->busyflags
);
1409 static int ixj_status_wait(IXJ
*j
)
1413 jif
= jiffies
+ ((60 * hertz
) / 100);
1414 while (!IsStatusReady(j
)) {
1415 ixj_perfmon(j
->statuswait
);
1416 if (time_after(jiffies
, jif
)) {
1417 ixj_perfmon(j
->statuswaitfail
);
1424 static int ixj_PCcontrol_wait(IXJ
*j
)
1428 jif
= jiffies
+ ((60 * hertz
) / 100);
1429 while (!IsPCControlReady(j
)) {
1430 ixj_perfmon(j
->pcontrolwait
);
1431 if (time_after(jiffies
, jif
)) {
1432 ixj_perfmon(j
->pcontrolwaitfail
);
1439 static int ixj_WriteDSPCommand(unsigned short cmd
, IXJ
*j
)
1444 atomic_inc(&j
->DSPWrite
);
1445 if(atomic_read(&j
->DSPWrite
) > 1) {
1446 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j
->board
, cmd
);
1449 bytes
.high
= (cmd
& 0xFF00) >> 8;
1450 bytes
.low
= cmd
& 0x00FF;
1451 jif
= jiffies
+ ((60 * hertz
) / 100);
1452 while (!IsControlReady(j
)) {
1453 ixj_perfmon(j
->iscontrolready
);
1454 if (time_after(jiffies
, jif
)) {
1455 ixj_perfmon(j
->iscontrolreadyfail
);
1456 atomic_dec(&j
->DSPWrite
);
1457 if(atomic_read(&j
->DSPWrite
) > 0) {
1458 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j
->board
, cmd
);
1459 while(atomic_read(&j
->DSPWrite
) > 0) {
1460 atomic_dec(&j
->DSPWrite
);
1466 outb(bytes
.low
, j
->DSPbase
+ 6);
1467 outb(bytes
.high
, j
->DSPbase
+ 7);
1469 if (ixj_status_wait(j
)) {
1472 atomic_dec(&j
->DSPWrite
);
1473 if(atomic_read(&j
->DSPWrite
) > 0) {
1474 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j
->board
, cmd
);
1475 while(atomic_read(&j
->DSPWrite
) > 0) {
1476 atomic_dec(&j
->DSPWrite
);
1481 /* Read Software Status Register */
1482 j
->ssr
.low
= inb_p(j
->DSPbase
+ 2);
1483 j
->ssr
.high
= inb_p(j
->DSPbase
+ 3);
1484 atomic_dec(&j
->DSPWrite
);
1485 if(atomic_read(&j
->DSPWrite
) > 0) {
1486 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j
->board
, cmd
);
1487 while(atomic_read(&j
->DSPWrite
) > 0) {
1488 atomic_dec(&j
->DSPWrite
);
1494 /***************************************************************************
1496 * General Purpose IO Register read routine
1498 ***************************************************************************/
1499 static inline int ixj_gpio_read(IXJ
*j
)
1501 if (ixj_WriteDSPCommand(0x5143, j
))
1504 j
->gpio
.bytes
.low
= j
->ssr
.low
;
1505 j
->gpio
.bytes
.high
= j
->ssr
.high
;
1510 static inline void LED_SetState(int state
, IXJ
*j
)
1512 if (j
->cardtype
== QTI_LINEJACK
) {
1513 j
->pld_scrw
.bits
.led1
= state
& 0x1 ? 1 : 0;
1514 j
->pld_scrw
.bits
.led2
= state
& 0x2 ? 1 : 0;
1515 j
->pld_scrw
.bits
.led3
= state
& 0x4 ? 1 : 0;
1516 j
->pld_scrw
.bits
.led4
= state
& 0x8 ? 1 : 0;
1518 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1522 /*********************************************************************
1523 * GPIO Pins are configured as follows on the Quicknet Internet
1524 * PhoneJACK Telephony Cards
1526 * POTS Select GPIO_6=0 GPIO_7=0
1527 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1528 * Handset Select GPIO_6=1 GPIO_7=0
1530 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1531 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1532 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1534 * Hook Switch changes reported on GPIO_3
1535 *********************************************************************/
1536 static int ixj_set_port(IXJ
*j
, int arg
)
1538 if (j
->cardtype
== QTI_PHONEJACK_LITE
) {
1539 if (arg
!= PORT_POTS
)
1546 j
->port
= PORT_POTS
;
1547 switch (j
->cardtype
) {
1549 if (j
->flags
.pcmciasct
== 1)
1550 SLIC_SetState(PLD_SLIC_STATE_ACTIVE
, j
);
1554 case QTI_PHONEJACK_PCI
:
1555 j
->pld_slicw
.pcib
.mic
= 0;
1556 j
->pld_slicw
.pcib
.spk
= 0;
1557 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1560 ixj_set_pots(j
, 0); /* Disconnect POTS/PSTN relay */
1561 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to
1562 Software Control Register */
1564 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
1566 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1567 j
->pld_clock
.byte
= 0;
1568 outb(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
1569 j
->pld_slicw
.bits
.rly1
= 1;
1570 j
->pld_slicw
.bits
.spken
= 0;
1571 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1572 ixj_mixer(0x1200, j
); /* Turn Off MIC switch on mixer left */
1573 ixj_mixer(0x1401, j
); /* Turn On Mono1 switch on mixer left */
1574 ixj_mixer(0x1300, j
); /* Turn Off MIC switch on mixer right */
1575 ixj_mixer(0x1501, j
); /* Turn On Mono1 switch on mixer right */
1576 ixj_mixer(0x0E80, j
); /*Mic mute */
1577 ixj_mixer(0x0F00, j
); /* Set mono out (SLIC) to 0dB */
1578 ixj_mixer(0x0080, j
); /* Mute Master Left volume */
1579 ixj_mixer(0x0180, j
); /* Mute Master Right volume */
1580 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
1581 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1584 j
->gpio
.bytes
.high
= 0x0B;
1585 j
->gpio
.bits
.gpio6
= 0;
1586 j
->gpio
.bits
.gpio7
= 0;
1587 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1592 if (j
->cardtype
== QTI_LINEJACK
) {
1593 ixj_WriteDSPCommand(0xC534, j
); /* Write CODEC config to Software Control Register */
1595 j
->pld_slicw
.bits
.rly3
= 0;
1596 j
->pld_slicw
.bits
.rly1
= 1;
1597 j
->pld_slicw
.bits
.spken
= 0;
1598 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1599 j
->port
= PORT_PSTN
;
1605 j
->port
= PORT_SPEAKER
;
1606 switch (j
->cardtype
) {
1608 if (j
->flags
.pcmciasct
) {
1609 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
1612 case QTI_PHONEJACK_PCI
:
1613 j
->pld_slicw
.pcib
.mic
= 1;
1614 j
->pld_slicw
.pcib
.spk
= 1;
1615 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1618 ixj_set_pots(j
, 0); /* Disconnect POTS/PSTN relay */
1619 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to
1620 Software Control Register */
1622 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
1624 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1625 j
->pld_clock
.byte
= 0;
1626 outb(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
1627 j
->pld_slicw
.bits
.rly1
= 1;
1628 j
->pld_slicw
.bits
.spken
= 1;
1629 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1630 ixj_mixer(0x1201, j
); /* Turn On MIC switch on mixer left */
1631 ixj_mixer(0x1400, j
); /* Turn Off Mono1 switch on mixer left */
1632 ixj_mixer(0x1301, j
); /* Turn On MIC switch on mixer right */
1633 ixj_mixer(0x1500, j
); /* Turn Off Mono1 switch on mixer right */
1634 ixj_mixer(0x0E06, j
); /*Mic un-mute 0dB */
1635 ixj_mixer(0x0F80, j
); /* Mute mono out (SLIC) */
1636 ixj_mixer(0x0000, j
); /* Set Master Left volume to 0dB */
1637 ixj_mixer(0x0100, j
); /* Set Master Right volume to 0dB */
1640 j
->gpio
.bytes
.high
= 0x0B;
1641 j
->gpio
.bits
.gpio6
= 0;
1642 j
->gpio
.bits
.gpio7
= 1;
1643 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1648 if (j
->cardtype
!= QTI_PHONEJACK
) {
1651 j
->gpio
.bytes
.high
= 0x0B;
1652 j
->gpio
.bits
.gpio6
= 1;
1653 j
->gpio
.bits
.gpio7
= 0;
1654 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1655 j
->port
= PORT_HANDSET
;
1665 static int ixj_set_pots(IXJ
*j
, int arg
)
1667 if (j
->cardtype
== QTI_LINEJACK
) {
1669 if (j
->port
== PORT_PSTN
) {
1670 j
->pld_slicw
.bits
.rly1
= 0;
1671 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1672 j
->flags
.pots_pstn
= 1;
1675 j
->flags
.pots_pstn
= 0;
1679 j
->pld_slicw
.bits
.rly1
= 1;
1680 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1681 j
->flags
.pots_pstn
= 0;
1689 static void ixj_ring_on(IXJ
*j
)
1691 if (j
->dsp
.low
== 0x20) /* Internet PhoneJACK */
1693 if (ixjdebug
& 0x0004)
1694 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", j
->board
);
1696 j
->gpio
.bytes
.high
= 0x0B;
1697 j
->gpio
.bytes
.low
= 0x00;
1698 j
->gpio
.bits
.gpio1
= 1;
1699 j
->gpio
.bits
.gpio2
= 1;
1700 j
->gpio
.bits
.gpio5
= 0;
1701 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* send the ring signal */
1702 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1704 if (ixjdebug
& 0x0004)
1705 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", j
->board
);
1707 SLIC_SetState(PLD_SLIC_STATE_RINGING
, j
);
1711 static int ixj_siadc(IXJ
*j
, int val
)
1713 if(j
->cardtype
== QTI_PHONECARD
){
1714 if(j
->flags
.pcmciascp
){
1716 return j
->siadc
.bits
.rxg
;
1718 if(val
< 0 || val
> 0x1F)
1721 j
->siadc
.bits
.hom
= 0; /* Handset Out Mute */
1722 j
->siadc
.bits
.lom
= 0; /* Line Out Mute */
1723 j
->siadc
.bits
.rxg
= val
; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1724 j
->psccr
.bits
.addr
= 6; /* R/W Smart Cable Register Address */
1725 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1726 j
->psccr
.bits
.dev
= 0;
1727 outb(j
->siadc
.byte
, j
->XILINXbase
+ 0x00);
1728 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1729 ixj_PCcontrol_wait(j
);
1730 return j
->siadc
.bits
.rxg
;
1736 static int ixj_sidac(IXJ
*j
, int val
)
1738 if(j
->cardtype
== QTI_PHONECARD
){
1739 if(j
->flags
.pcmciascp
){
1741 return j
->sidac
.bits
.txg
;
1743 if(val
< 0 || val
> 0x1F)
1746 j
->sidac
.bits
.srm
= 1; /* Speaker Right Mute */
1747 j
->sidac
.bits
.slm
= 1; /* Speaker Left Mute */
1748 j
->sidac
.bits
.txg
= val
; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1749 j
->psccr
.bits
.addr
= 7; /* R/W Smart Cable Register Address */
1750 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1751 j
->psccr
.bits
.dev
= 0;
1752 outb(j
->sidac
.byte
, j
->XILINXbase
+ 0x00);
1753 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1754 ixj_PCcontrol_wait(j
);
1755 return j
->sidac
.bits
.txg
;
1761 static int ixj_pcmcia_cable_check(IXJ
*j
)
1763 j
->pccr1
.byte
= inb_p(j
->XILINXbase
+ 0x03);
1764 if (!j
->flags
.pcmciastate
) {
1765 j
->pccr2
.byte
= inb_p(j
->XILINXbase
+ 0x02);
1766 if (j
->pccr1
.bits
.drf
|| j
->pccr2
.bits
.rstc
) {
1767 j
->flags
.pcmciastate
= 4;
1770 if (j
->pccr1
.bits
.ed
) {
1771 j
->pccr1
.bits
.ed
= 0;
1772 j
->psccr
.bits
.dev
= 3;
1773 j
->psccr
.bits
.rw
= 1;
1774 outw_p(j
->psccr
.byte
<< 8, j
->XILINXbase
+ 0x00);
1775 ixj_PCcontrol_wait(j
);
1776 j
->pslic
.byte
= inw_p(j
->XILINXbase
+ 0x00) & 0xFF;
1777 j
->pslic
.bits
.led2
= j
->pslic
.bits
.det
? 1 : 0;
1778 j
->psccr
.bits
.dev
= 3;
1779 j
->psccr
.bits
.rw
= 0;
1780 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
1781 ixj_PCcontrol_wait(j
);
1782 return j
->pslic
.bits
.led2
? 1 : 0;
1783 } else if (j
->flags
.pcmciasct
) {
1788 } else if (j
->flags
.pcmciastate
== 4) {
1789 if (!j
->pccr1
.bits
.drf
) {
1790 j
->flags
.pcmciastate
= 3;
1793 } else if (j
->flags
.pcmciastate
== 3) {
1794 j
->pccr2
.bits
.pwr
= 0;
1795 j
->pccr2
.bits
.rstc
= 1;
1796 outb(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1797 j
->checkwait
= jiffies
+ (hertz
* 2);
1798 j
->flags
.incheck
= 1;
1799 j
->flags
.pcmciastate
= 2;
1801 } else if (j
->flags
.pcmciastate
== 2) {
1802 if (j
->flags
.incheck
) {
1803 if (time_before(jiffies
, j
->checkwait
)) {
1806 j
->flags
.incheck
= 0;
1809 j
->pccr2
.bits
.pwr
= 0;
1810 j
->pccr2
.bits
.rstc
= 0;
1811 outb_p(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1812 j
->flags
.pcmciastate
= 1;
1814 } else if (j
->flags
.pcmciastate
== 1) {
1815 j
->flags
.pcmciastate
= 0;
1816 if (!j
->pccr1
.bits
.drf
) {
1817 j
->psccr
.bits
.dev
= 3;
1818 j
->psccr
.bits
.rw
= 1;
1819 outb_p(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1820 ixj_PCcontrol_wait(j
);
1821 j
->flags
.pcmciascp
= 1; /* Set Cable Present Flag */
1823 j
->flags
.pcmciasct
= (inw_p(j
->XILINXbase
+ 0x00) >> 8) & 0x03; /* Get Cable Type */
1825 if (j
->flags
.pcmciasct
== 3) {
1826 j
->flags
.pcmciastate
= 4;
1828 } else if (j
->flags
.pcmciasct
== 0) {
1829 j
->pccr2
.bits
.pwr
= 1;
1830 j
->pccr2
.bits
.rstc
= 0;
1831 outb_p(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1832 j
->port
= PORT_SPEAKER
;
1834 j
->port
= PORT_POTS
;
1836 j
->sic1
.bits
.cpd
= 0; /* Chip Power Down */
1837 j
->sic1
.bits
.mpd
= 0; /* MIC Bias Power Down */
1838 j
->sic1
.bits
.hpd
= 0; /* Handset Bias Power Down */
1839 j
->sic1
.bits
.lpd
= 0; /* Line Bias Power Down */
1840 j
->sic1
.bits
.spd
= 1; /* Speaker Drive Power Down */
1841 j
->psccr
.bits
.addr
= 1; /* R/W Smart Cable Register Address */
1842 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1843 j
->psccr
.bits
.dev
= 0;
1844 outb(j
->sic1
.byte
, j
->XILINXbase
+ 0x00);
1845 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1846 ixj_PCcontrol_wait(j
);
1848 j
->sic2
.bits
.al
= 0; /* Analog Loopback DAC analog -> ADC analog */
1849 j
->sic2
.bits
.dl2
= 0; /* Digital Loopback DAC -> ADC one bit */
1850 j
->sic2
.bits
.dl1
= 0; /* Digital Loopback ADC -> DAC one bit */
1851 j
->sic2
.bits
.pll
= 0; /* 1 = div 10, 0 = div 5 */
1852 j
->sic2
.bits
.hpd
= 0; /* HPF disable */
1853 j
->psccr
.bits
.addr
= 2; /* R/W Smart Cable Register Address */
1854 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1855 j
->psccr
.bits
.dev
= 0;
1856 outb(j
->sic2
.byte
, j
->XILINXbase
+ 0x00);
1857 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1858 ixj_PCcontrol_wait(j
);
1860 j
->psccr
.bits
.addr
= 3; /* R/W Smart Cable Register Address */
1861 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1862 j
->psccr
.bits
.dev
= 0;
1863 outb(0x00, j
->XILINXbase
+ 0x00); /* PLL Divide N1 */
1864 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1865 ixj_PCcontrol_wait(j
);
1867 j
->psccr
.bits
.addr
= 4; /* R/W Smart Cable Register Address */
1868 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1869 j
->psccr
.bits
.dev
= 0;
1870 outb(0x09, j
->XILINXbase
+ 0x00); /* PLL Multiply M1 */
1871 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1872 ixj_PCcontrol_wait(j
);
1874 j
->sirxg
.bits
.lig
= 1; /* Line In Gain */
1875 j
->sirxg
.bits
.lim
= 1; /* Line In Mute */
1876 j
->sirxg
.bits
.mcg
= 0; /* MIC In Gain was 3 */
1877 j
->sirxg
.bits
.mcm
= 0; /* MIC In Mute */
1878 j
->sirxg
.bits
.him
= 0; /* Handset In Mute */
1879 j
->sirxg
.bits
.iir
= 1; /* IIR */
1880 j
->psccr
.bits
.addr
= 5; /* R/W Smart Cable Register Address */
1881 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1882 j
->psccr
.bits
.dev
= 0;
1883 outb(j
->sirxg
.byte
, j
->XILINXbase
+ 0x00);
1884 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1885 ixj_PCcontrol_wait(j
);
1890 j
->siaatt
.bits
.sot
= 0;
1891 j
->psccr
.bits
.addr
= 9; /* R/W Smart Cable Register Address */
1892 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1893 j
->psccr
.bits
.dev
= 0;
1894 outb(j
->siaatt
.byte
, j
->XILINXbase
+ 0x00);
1895 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1896 ixj_PCcontrol_wait(j
);
1898 if (j
->flags
.pcmciasct
== 1 && !j
->readers
&& !j
->writers
) {
1899 j
->psccr
.byte
= j
->pslic
.byte
= 0;
1900 j
->pslic
.bits
.powerdown
= 1;
1901 j
->psccr
.bits
.dev
= 3;
1902 j
->psccr
.bits
.rw
= 0;
1903 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
1904 ixj_PCcontrol_wait(j
);
1909 j
->flags
.pcmciascp
= 0;
1915 static int ixj_hookstate(IXJ
*j
)
1920 switch (j
->cardtype
) {
1923 fOffHook
= j
->gpio
.bits
.gpio3read
? 1 : 0;
1926 case QTI_PHONEJACK_LITE
:
1927 case QTI_PHONEJACK_PCI
:
1929 if(j
->cardtype
== QTI_LINEJACK
&& j
->flags
.pots_pstn
== 1 && (j
->readers
|| j
->writers
)) {
1930 fOffHook
= j
->pld_slicr
.bits
.potspstn
? 1 : 0;
1931 if(fOffHook
!= j
->p_hook
) {
1933 j
->checkwait
= jiffies
;
1935 if(time_before(jiffies
, j
->checkwait
+ 2)) {
1940 j
->p_hook
= fOffHook
;
1941 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j
->board
, fOffHook
, jiffies
);
1944 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_ACTIVE
||
1945 j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_STANDBY
) {
1946 if (j
->flags
.ringing
|| j
->flags
.cringing
) {
1947 if (!in_interrupt()) {
1948 det
= jiffies
+ (hertz
/ 50);
1949 while (time_before(jiffies
, det
)) {
1950 set_current_state(TASK_INTERRUPTIBLE
);
1951 schedule_timeout(1);
1955 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_RINGING
) {
1959 if (j
->cardtype
== QTI_PHONEJACK_PCI
) {
1960 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
1961 fOffHook
= j
->pld_scrr
.pcib
.det
? 1 : 0;
1963 fOffHook
= j
->pld_slicr
.bits
.det
? 1 : 0;
1968 fOffHook
= ixj_pcmcia_cable_check(j
);
1971 if (j
->r_hook
!= fOffHook
) {
1972 j
->r_hook
= fOffHook
;
1973 if (j
->port
== PORT_SPEAKER
|| j
->port
== PORT_HANDSET
) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1974 j
->ex
.bits
.hookstate
= 1;
1975 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1976 } else if (!fOffHook
) {
1977 j
->flash_end
= jiffies
+ ((60 * hertz
) / 100);
1981 if(time_before(jiffies
, j
->flash_end
)) {
1982 j
->ex
.bits
.flash
= 1;
1984 ixj_kill_fasync(j
, SIG_FLASH
, POLL_IN
);
1987 if(time_before(jiffies
, j
->flash_end
)) {
1992 if (j
->port
== PORT_PSTN
&& j
->daa_mode
== SOP_PU_CONVERSATION
)
1995 if (j
->port
== PORT_SPEAKER
) {
1996 if(j
->cardtype
== QTI_PHONECARD
) {
1997 if(j
->flags
.pcmciascp
&& j
->flags
.pcmciasct
) {
2005 if (j
->port
== PORT_HANDSET
)
2011 static void ixj_ring_off(IXJ
*j
)
2013 if (j
->dsp
.low
== 0x20) /* Internet PhoneJACK */
2015 if (ixjdebug
& 0x0004)
2016 printk(KERN_INFO
"IXJ Ring Off\n");
2017 j
->gpio
.bytes
.high
= 0x0B;
2018 j
->gpio
.bytes
.low
= 0x00;
2019 j
->gpio
.bits
.gpio1
= 0;
2020 j
->gpio
.bits
.gpio2
= 1;
2021 j
->gpio
.bits
.gpio5
= 0;
2022 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
2023 } else /* Internet LineJACK */
2025 if (ixjdebug
& 0x0004)
2026 printk(KERN_INFO
"IXJ Ring Off\n");
2028 if(!j
->flags
.cidplay
)
2029 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
2035 static void ixj_ring_start(IXJ
*j
)
2037 j
->flags
.cringing
= 1;
2038 if (ixjdebug
& 0x0004)
2039 printk(KERN_INFO
"IXJ Cadence Ringing Start /dev/phone%d\n", j
->board
);
2040 if (ixj_hookstate(j
) & 1) {
2041 if (j
->port
== PORT_POTS
)
2043 j
->flags
.cringing
= 0;
2044 if (ixjdebug
& 0x0004)
2045 printk(KERN_INFO
"IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j
->board
);
2046 } else if(j
->cadence_f
[5].enable
&& (!j
->cadence_f
[5].en_filter
)) {
2047 j
->ring_cadence_jif
= jiffies
;
2048 j
->flags
.cidsent
= j
->flags
.cidring
= 0;
2049 j
->cadence_f
[5].state
= 0;
2050 if(j
->cadence_f
[5].on1
)
2053 j
->ring_cadence_jif
= jiffies
;
2054 j
->ring_cadence_t
= 15;
2055 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
2060 j
->flags
.cidsent
= j
->flags
.cidring
= j
->flags
.firstring
= 0;
2064 static int ixj_ring(IXJ
*j
)
2067 unsigned long jif
, det
;
2069 j
->flags
.ringing
= 1;
2070 if (ixj_hookstate(j
) & 1) {
2072 j
->flags
.ringing
= 0;
2076 for (cntr
= 0; cntr
< j
->maxrings
; cntr
++) {
2077 jif
= jiffies
+ (1 * hertz
);
2079 while (time_before(jiffies
, jif
)) {
2080 if (ixj_hookstate(j
) & 1) {
2082 j
->flags
.ringing
= 0;
2085 set_current_state(TASK_INTERRUPTIBLE
);
2086 schedule_timeout(1);
2087 if (signal_pending(current
))
2090 jif
= jiffies
+ (3 * hertz
);
2092 while (time_before(jiffies
, jif
)) {
2093 if (ixj_hookstate(j
) & 1) {
2094 det
= jiffies
+ (hertz
/ 100);
2095 while (time_before(jiffies
, det
)) {
2096 set_current_state(TASK_INTERRUPTIBLE
);
2097 schedule_timeout(1);
2098 if (signal_pending(current
))
2101 if (ixj_hookstate(j
) & 1) {
2102 j
->flags
.ringing
= 0;
2106 set_current_state(TASK_INTERRUPTIBLE
);
2107 schedule_timeout(1);
2108 if (signal_pending(current
))
2113 j
->flags
.ringing
= 0;
2117 static int ixj_open(struct phone_device
*p
, struct file
*file_p
)
2119 IXJ
*j
= get_ixj(p
->board
);
2120 file_p
->private_data
= j
;
2125 if (file_p
->f_mode
& FMODE_READ
) {
2133 if (file_p
->f_mode
& FMODE_WRITE
) {
2137 if (file_p
->f_mode
& FMODE_READ
){
2144 if (j
->cardtype
== QTI_PHONECARD
) {
2145 j
->pslic
.bits
.powerdown
= 0;
2146 j
->psccr
.bits
.dev
= 3;
2147 j
->psccr
.bits
.rw
= 0;
2148 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
2149 ixj_PCcontrol_wait(j
);
2152 j
->flags
.cidplay
= 0;
2153 j
->flags
.cidcw_ack
= 0;
2155 if (ixjdebug
& 0x0002)
2156 printk(KERN_INFO
"Opening board %d\n", p
->board
);
2158 j
->framesread
= j
->frameswritten
= 0;
2162 static int ixj_release(struct inode
*inode
, struct file
*file_p
)
2166 IXJ
*j
= file_p
->private_data
;
2167 int board
= j
->p
.board
;
2170 * Set up locks to ensure that only one process is talking to the DSP at a time.
2171 * This is necessary to keep the DSP from locking up.
2173 while(test_and_set_bit(board
, (void *)&j
->busyflags
) != 0) {
2174 set_current_state(TASK_INTERRUPTIBLE
);
2175 schedule_timeout(1);
2177 if (ixjdebug
& 0x0002)
2178 printk(KERN_INFO
"Closing board %d\n", NUM(inode
));
2180 if (j
->cardtype
== QTI_PHONECARD
)
2181 ixj_set_port(j
, PORT_SPEAKER
);
2183 ixj_set_port(j
, PORT_POTS
);
2188 set_play_volume(j
, 0x100);
2189 set_rec_volume(j
, 0x100);
2192 /* Restore the tone table to default settings. */
2198 ixj_init_tone(j
, &ti
);
2204 ixj_init_tone(j
, &ti
);
2210 ixj_init_tone(j
, &ti
);
2216 ixj_init_tone(j
, &ti
);
2222 ixj_init_tone(j
, &ti
);
2228 ixj_init_tone(j
, &ti
);
2234 ixj_init_tone(j
, &ti
);
2240 ixj_init_tone(j
, &ti
);
2246 ixj_init_tone(j
, &ti
);
2252 ixj_init_tone(j
, &ti
);
2258 ixj_init_tone(j
, &ti
);
2264 ixj_init_tone(j
, &ti
);
2270 ixj_init_tone(j
, &ti
);
2276 ixj_init_tone(j
, &ti
);
2282 ixj_init_tone(j
, &ti
);
2288 ixj_init_tone(j
, &ti
);
2294 ixj_init_tone(j
, &ti
);
2300 ixj_init_tone(j
, &ti
);
2302 set_rec_depth(j
, 2); /* Set Record Channel Limit to 2 frames */
2304 set_play_depth(j
, 2); /* Set Playback Channel Limit to 2 frames */
2306 j
->ex
.bits
.dtmf_ready
= 0;
2308 j
->dtmf_wp
= j
->dtmf_rp
= 0;
2309 j
->rec_mode
= j
->play_mode
= -1;
2310 j
->flags
.ringing
= 0;
2311 j
->maxrings
= MAXRINGS
;
2312 j
->ring_cadence
= USA_RING_CADENCE
;
2313 if(j
->cadence_f
[5].enable
) {
2314 j
->cadence_f
[5].enable
= j
->cadence_f
[5].en_filter
= j
->cadence_f
[5].state
= 0;
2318 j
->flags
.dtmf_oob
= 0;
2319 for (cnt
= 0; cnt
< 4; cnt
++)
2320 j
->cadence_f
[cnt
].enable
= 0;
2324 if(j
->cardtype
== QTI_PHONECARD
) {
2325 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
2328 if (file_p
->f_mode
& FMODE_READ
)
2330 if (file_p
->f_mode
& FMODE_WRITE
)
2333 if (j
->read_buffer
&& !j
->readers
) {
2334 kfree(j
->read_buffer
);
2335 j
->read_buffer
= NULL
;
2336 j
->read_buffer_size
= 0;
2338 if (j
->write_buffer
&& !j
->writers
) {
2339 kfree(j
->write_buffer
);
2340 j
->write_buffer
= NULL
;
2341 j
->write_buffer_size
= 0;
2343 j
->rec_codec
= j
->play_codec
= 0;
2344 j
->rec_frame_size
= j
->play_frame_size
= 0;
2345 j
->flags
.cidsent
= j
->flags
.cidring
= 0;
2346 ixj_fasync(-1, file_p
, 0); /* remove from list of async notification */
2348 if(j
->cardtype
== QTI_LINEJACK
&& !j
->readers
&& !j
->writers
) {
2349 ixj_set_port(j
, PORT_PSTN
);
2350 daa_set_mode(j
, SOP_PU_SLEEP
);
2353 ixj_WriteDSPCommand(0x0FE3, j
); /* Put the DSP in 1/5 power mode. */
2355 /* Set up the default signals for events */
2356 for (cnt
= 0; cnt
< 35; cnt
++)
2357 j
->ixj_signals
[cnt
] = SIGIO
;
2359 /* Set the excetion signal enable flags */
2360 j
->ex_sig
.bits
.dtmf_ready
= j
->ex_sig
.bits
.hookstate
= j
->ex_sig
.bits
.flash
= j
->ex_sig
.bits
.pstn_ring
=
2361 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
=
2362 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;
2364 file_p
->private_data
= NULL
;
2365 clear_bit(board
, &j
->busyflags
);
2369 static int read_filters(IXJ
*j
)
2371 unsigned short fc
, cnt
, trg
;
2375 if (ixj_WriteDSPCommand(0x5144, j
)) {
2376 if(ixjdebug
& 0x0001) {
2377 printk(KERN_INFO
"Read Frame Counter failed!\n");
2381 fc
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
2382 if (fc
== j
->frame_count
)
2385 j
->frame_count
= fc
;
2392 for (cnt
= 0; cnt
< 4; cnt
++) {
2393 if (ixj_WriteDSPCommand(0x5154 + cnt
, j
)) {
2394 if(ixjdebug
& 0x0001) {
2395 printk(KERN_INFO
"Select Filter %d failed!\n", cnt
);
2399 if (ixj_WriteDSPCommand(0x515C, j
)) {
2400 if(ixjdebug
& 0x0001) {
2401 printk(KERN_INFO
"Read Filter History %d failed!\n", cnt
);
2405 j
->filter_hist
[cnt
] = j
->ssr
.high
<< 8 | j
->ssr
.low
;
2407 if (j
->cadence_f
[cnt
].enable
) {
2408 if (j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12)) {
2409 if (j
->cadence_f
[cnt
].state
== 0) {
2410 j
->cadence_f
[cnt
].state
= 1;
2411 j
->cadence_f
[cnt
].on1min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100 - var
)) / 10000));
2412 j
->cadence_f
[cnt
].on1dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100)) / 10000));
2413 j
->cadence_f
[cnt
].on1max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100 + var
)) / 10000));
2414 } else if (j
->cadence_f
[cnt
].state
== 2 &&
2415 (time_after(jiffies
, j
->cadence_f
[cnt
].off1min
) &&
2416 time_before(jiffies
, j
->cadence_f
[cnt
].off1max
))) {
2417 if (j
->cadence_f
[cnt
].on2
) {
2418 j
->cadence_f
[cnt
].state
= 3;
2419 j
->cadence_f
[cnt
].on2min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100 - var
)) / 10000));
2420 j
->cadence_f
[cnt
].on2dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100)) / 10000));
2421 j
->cadence_f
[cnt
].on2max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100 + var
)) / 10000));
2423 j
->cadence_f
[cnt
].state
= 7;
2425 } else if (j
->cadence_f
[cnt
].state
== 4 &&
2426 (time_after(jiffies
, j
->cadence_f
[cnt
].off2min
) &&
2427 time_before(jiffies
, j
->cadence_f
[cnt
].off2max
))) {
2428 if (j
->cadence_f
[cnt
].on3
) {
2429 j
->cadence_f
[cnt
].state
= 5;
2430 j
->cadence_f
[cnt
].on3min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100 - var
)) / 10000));
2431 j
->cadence_f
[cnt
].on3dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100)) / 10000));
2432 j
->cadence_f
[cnt
].on3max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100 + var
)) / 10000));
2434 j
->cadence_f
[cnt
].state
= 7;
2437 j
->cadence_f
[cnt
].state
= 0;
2439 } else if (j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3)) {
2440 if (j
->cadence_f
[cnt
].state
== 1) {
2441 if(!j
->cadence_f
[cnt
].on1
) {
2442 j
->cadence_f
[cnt
].state
= 7;
2443 } else if((time_after(jiffies
, j
->cadence_f
[cnt
].on1min
) &&
2444 time_before(jiffies
, j
->cadence_f
[cnt
].on1max
))) {
2445 if(j
->cadence_f
[cnt
].off1
) {
2446 j
->cadence_f
[cnt
].state
= 2;
2447 j
->cadence_f
[cnt
].off1min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100 - var
)) / 10000));
2448 j
->cadence_f
[cnt
].off1dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100)) / 10000));
2449 j
->cadence_f
[cnt
].off1max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100 + var
)) / 10000));
2451 j
->cadence_f
[cnt
].state
= 7;
2454 j
->cadence_f
[cnt
].state
= 0;
2456 } else if (j
->cadence_f
[cnt
].state
== 3) {
2457 if((time_after(jiffies
, j
->cadence_f
[cnt
].on2min
) &&
2458 time_before(jiffies
, j
->cadence_f
[cnt
].on2max
))) {
2459 if(j
->cadence_f
[cnt
].off2
) {
2460 j
->cadence_f
[cnt
].state
= 4;
2461 j
->cadence_f
[cnt
].off2min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100 - var
)) / 10000));
2462 j
->cadence_f
[cnt
].off2dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100)) / 10000));
2463 j
->cadence_f
[cnt
].off2max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100 + var
)) / 10000));
2465 j
->cadence_f
[cnt
].state
= 7;
2468 j
->cadence_f
[cnt
].state
= 0;
2470 } else if (j
->cadence_f
[cnt
].state
== 5) {
2471 if ((time_after(jiffies
, j
->cadence_f
[cnt
].on3min
) &&
2472 time_before(jiffies
, j
->cadence_f
[cnt
].on3max
))) {
2473 if(j
->cadence_f
[cnt
].off3
) {
2474 j
->cadence_f
[cnt
].state
= 6;
2475 j
->cadence_f
[cnt
].off3min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100 - var
)) / 10000));
2476 j
->cadence_f
[cnt
].off3dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100)) / 10000));
2477 j
->cadence_f
[cnt
].off3max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100 + var
)) / 10000));
2479 j
->cadence_f
[cnt
].state
= 7;
2482 j
->cadence_f
[cnt
].state
= 0;
2485 j
->cadence_f
[cnt
].state
= 0;
2488 switch(j
->cadence_f
[cnt
].state
) {
2490 if(time_after(jiffies
, j
->cadence_f
[cnt
].on1dot
) &&
2491 !j
->cadence_f
[cnt
].off1
&&
2492 !j
->cadence_f
[cnt
].on2
&& !j
->cadence_f
[cnt
].off2
&&
2493 !j
->cadence_f
[cnt
].on3
&& !j
->cadence_f
[cnt
].off3
) {
2494 j
->cadence_f
[cnt
].state
= 7;
2498 if(time_after(jiffies
, j
->cadence_f
[cnt
].on2dot
) &&
2499 !j
->cadence_f
[cnt
].off2
&&
2500 !j
->cadence_f
[cnt
].on3
&& !j
->cadence_f
[cnt
].off3
) {
2501 j
->cadence_f
[cnt
].state
= 7;
2505 if(time_after(jiffies
, j
->cadence_f
[cnt
].on3dot
) &&
2506 !j
->cadence_f
[cnt
].off3
) {
2507 j
->cadence_f
[cnt
].state
= 7;
2513 if (ixjdebug
& 0x0040) {
2514 printk(KERN_INFO
"IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j
->cadence_f
[cnt
].state
, j
->board
, jiffies
);
2515 switch(j
->cadence_f
[cnt
].state
) {
2517 printk(KERN_INFO
"IXJ /dev/phone%d No Tone detected\n", j
->board
);
2520 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j
->board
,
2521 j
->cadence_f
[cnt
].on1
, j
->cadence_f
[cnt
].on1min
, j
->cadence_f
[cnt
].on1dot
, j
->cadence_f
[cnt
].on1max
);
2524 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off1min
,
2525 j
->cadence_f
[cnt
].off1max
);
2528 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].on2min
,
2529 j
->cadence_f
[cnt
].on2max
);
2532 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off2min
,
2533 j
->cadence_f
[cnt
].off2max
);
2536 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].on3min
,
2537 j
->cadence_f
[cnt
].on3max
);
2540 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off3min
,
2541 j
->cadence_f
[cnt
].off3max
);
2546 if (j
->cadence_f
[cnt
].state
== 7) {
2547 j
->cadence_f
[cnt
].state
= 0;
2548 if (j
->cadence_f
[cnt
].enable
== 1)
2549 j
->cadence_f
[cnt
].enable
= 0;
2552 if(ixjdebug
& 0x0020) {
2553 printk(KERN_INFO
"Filter Cadence 0 triggered %ld\n", jiffies
);
2556 ixj_kill_fasync(j
, SIG_FC0
, POLL_IN
);
2559 if(ixjdebug
& 0x0020) {
2560 printk(KERN_INFO
"Filter Cadence 1 triggered %ld\n", jiffies
);
2563 ixj_kill_fasync(j
, SIG_FC1
, POLL_IN
);
2566 if(ixjdebug
& 0x0020) {
2567 printk(KERN_INFO
"Filter Cadence 2 triggered %ld\n", jiffies
);
2570 ixj_kill_fasync(j
, SIG_FC2
, POLL_IN
);
2573 if(ixjdebug
& 0x0020) {
2574 printk(KERN_INFO
"Filter Cadence 3 triggered %ld\n", jiffies
);
2577 ixj_kill_fasync(j
, SIG_FC3
, POLL_IN
);
2581 if (j
->filter_en
[cnt
] && ((j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12)) ||
2582 (j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3)))) {
2583 if((j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12))) {
2585 } else if((j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3))) {
2590 if(ixjdebug
& 0x0020) {
2591 printk(KERN_INFO
"Filter 0 triggered %d at %ld\n", trg
, jiffies
);
2594 ixj_kill_fasync(j
, SIG_F0
, POLL_IN
);
2597 if(ixjdebug
& 0x0020) {
2598 printk(KERN_INFO
"Filter 1 triggered %d at %ld\n", trg
, jiffies
);
2601 ixj_kill_fasync(j
, SIG_F1
, POLL_IN
);
2604 if(ixjdebug
& 0x0020) {
2605 printk(KERN_INFO
"Filter 2 triggered %d at %ld\n", trg
, jiffies
);
2608 ixj_kill_fasync(j
, SIG_F2
, POLL_IN
);
2611 if(ixjdebug
& 0x0020) {
2612 printk(KERN_INFO
"Filter 3 triggered %d at %ld\n", trg
, jiffies
);
2615 ixj_kill_fasync(j
, SIG_F3
, POLL_IN
);
2623 static int LineMonitor(IXJ
*j
)
2630 if (ixj_WriteDSPCommand(0x7000, j
)) /* Line Monitor */
2633 j
->dtmf
.bytes
.high
= j
->ssr
.high
;
2634 j
->dtmf
.bytes
.low
= j
->ssr
.low
;
2635 if (!j
->dtmf_state
&& j
->dtmf
.bits
.dtmf_valid
) {
2637 j
->dtmf_current
= j
->dtmf
.bits
.digit
;
2639 if (j
->dtmf_state
&& !j
->dtmf
.bits
.dtmf_valid
) /* && j->dtmf_wp != j->dtmf_rp) */
2641 if(!j
->cidcw_wait
) {
2642 j
->dtmfbuffer
[j
->dtmf_wp
] = j
->dtmf_current
;
2644 if (j
->dtmf_wp
== 79)
2646 j
->ex
.bits
.dtmf_ready
= 1;
2647 if(j
->ex_sig
.bits
.dtmf_ready
) {
2648 ixj_kill_fasync(j
, SIG_DTMF_READY
, POLL_IN
);
2651 else if(j
->dtmf_current
== 0x00 || j
->dtmf_current
== 0x0D) {
2652 if(ixjdebug
& 0x0020) {
2653 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j
->board
, j
->dtmf_current
, jiffies
);
2655 j
->flags
.cidcw_ack
= 1;
2664 /************************************************************************
2666 * Functions to allow alaw <-> ulaw conversions.
2668 ************************************************************************/
2670 static void ulaw2alaw(unsigned char *buff
, unsigned long len
)
2672 static unsigned char table_ulaw2alaw
[] =
2674 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2675 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2676 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2677 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2678 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2679 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2680 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2681 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2682 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2683 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2684 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2685 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2686 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2687 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2688 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2689 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2690 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2691 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2692 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2693 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2694 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2695 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2696 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2697 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2698 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2699 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2700 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2701 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2702 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2703 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2704 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2705 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2710 *buff
= table_ulaw2alaw
[*(unsigned char *)buff
];
2715 static void alaw2ulaw(unsigned char *buff
, unsigned long len
)
2717 static unsigned char table_alaw2ulaw
[] =
2719 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2720 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2721 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2722 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2723 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2724 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2725 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2726 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2727 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2728 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2729 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2730 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2731 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2732 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2733 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2734 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2735 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2736 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2737 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2738 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2739 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2740 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2741 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2742 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2743 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2744 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2745 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2746 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2747 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2748 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2749 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2750 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2755 *buff
= table_alaw2ulaw
[*(unsigned char *)buff
];
2760 static ssize_t
ixj_read(struct file
* file_p
, char __user
*buf
, size_t length
, loff_t
* ppos
)
2762 unsigned long i
= *ppos
;
2763 IXJ
* j
= get_ixj(NUM(file_p
->f_dentry
->d_inode
));
2765 DECLARE_WAITQUEUE(wait
, current
);
2767 if (j
->flags
.inread
)
2770 j
->flags
.inread
= 1;
2772 add_wait_queue(&j
->read_q
, &wait
);
2773 set_current_state(TASK_INTERRUPTIBLE
);
2776 while (!j
->read_buffer_ready
|| (j
->dtmf_state
&& j
->flags
.dtmf_oob
)) {
2778 if (file_p
->f_flags
& O_NONBLOCK
) {
2779 set_current_state(TASK_RUNNING
);
2780 remove_wait_queue(&j
->read_q
, &wait
);
2781 j
->flags
.inread
= 0;
2784 if (!ixj_hookstate(j
)) {
2785 set_current_state(TASK_RUNNING
);
2786 remove_wait_queue(&j
->read_q
, &wait
);
2787 j
->flags
.inread
= 0;
2790 interruptible_sleep_on(&j
->read_q
);
2791 if (signal_pending(current
)) {
2792 set_current_state(TASK_RUNNING
);
2793 remove_wait_queue(&j
->read_q
, &wait
);
2794 j
->flags
.inread
= 0;
2799 remove_wait_queue(&j
->read_q
, &wait
);
2800 set_current_state(TASK_RUNNING
);
2801 /* Don't ever copy more than the user asks */
2802 if(j
->rec_codec
== ALAW
)
2803 ulaw2alaw(j
->read_buffer
, min(length
, j
->read_buffer_size
));
2804 i
= copy_to_user(buf
, j
->read_buffer
, min(length
, j
->read_buffer_size
));
2805 j
->read_buffer_ready
= 0;
2807 j
->flags
.inread
= 0;
2810 j
->flags
.inread
= 0;
2811 return min(length
, j
->read_buffer_size
);
2815 static ssize_t
ixj_enhanced_read(struct file
* file_p
, char __user
*buf
, size_t length
,
2819 ssize_t read_retval
= 0;
2820 IXJ
*j
= get_ixj(NUM(file_p
->f_dentry
->d_inode
));
2822 pre_retval
= ixj_PreRead(j
, 0L);
2823 switch (pre_retval
) {
2825 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
2826 ixj_PostRead(j
, 0L);
2829 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
2832 ixj_PostRead(j
, 0L);
2835 read_retval
= pre_retval
;
2840 static ssize_t
ixj_write(struct file
*file_p
, const char __user
*buf
, size_t count
, loff_t
* ppos
)
2842 unsigned long i
= *ppos
;
2843 IXJ
*j
= file_p
->private_data
;
2845 DECLARE_WAITQUEUE(wait
, current
);
2847 if (j
->flags
.inwrite
)
2850 j
->flags
.inwrite
= 1;
2852 add_wait_queue(&j
->write_q
, &wait
);
2853 set_current_state(TASK_INTERRUPTIBLE
);
2857 while (!j
->write_buffers_empty
) {
2859 if (file_p
->f_flags
& O_NONBLOCK
) {
2860 set_current_state(TASK_RUNNING
);
2861 remove_wait_queue(&j
->write_q
, &wait
);
2862 j
->flags
.inwrite
= 0;
2865 if (!ixj_hookstate(j
)) {
2866 set_current_state(TASK_RUNNING
);
2867 remove_wait_queue(&j
->write_q
, &wait
);
2868 j
->flags
.inwrite
= 0;
2871 interruptible_sleep_on(&j
->write_q
);
2872 if (signal_pending(current
)) {
2873 set_current_state(TASK_RUNNING
);
2874 remove_wait_queue(&j
->write_q
, &wait
);
2875 j
->flags
.inwrite
= 0;
2879 set_current_state(TASK_RUNNING
);
2880 remove_wait_queue(&j
->write_q
, &wait
);
2881 if (j
->write_buffer_wp
+ count
>= j
->write_buffer_end
)
2882 j
->write_buffer_wp
= j
->write_buffer
;
2883 i
= copy_from_user(j
->write_buffer_wp
, buf
, min(count
, j
->write_buffer_size
));
2885 j
->flags
.inwrite
= 0;
2888 if(j
->play_codec
== ALAW
)
2889 alaw2ulaw(j
->write_buffer_wp
, min(count
, j
->write_buffer_size
));
2890 j
->flags
.inwrite
= 0;
2891 return min(count
, j
->write_buffer_size
);
2894 static ssize_t
ixj_enhanced_write(struct file
* file_p
, const char __user
*buf
, size_t count
, loff_t
* ppos
)
2897 ssize_t write_retval
= 0;
2899 IXJ
*j
= get_ixj(NUM(file_p
->f_dentry
->d_inode
));
2901 pre_retval
= ixj_PreWrite(j
, 0L);
2902 switch (pre_retval
) {
2904 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
2905 if (write_retval
> 0) {
2906 ixj_PostWrite(j
, 0L);
2907 j
->write_buffer_wp
+= write_retval
;
2908 j
->write_buffers_empty
--;
2912 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
2913 if (write_retval
> 0) {
2914 j
->write_buffer_wp
+= write_retval
;
2915 j
->write_buffers_empty
--;
2919 ixj_PostWrite(j
, 0L);
2922 write_retval
= pre_retval
;
2924 return write_retval
;
2927 static void ixj_read_frame(IXJ
*j
)
2931 if (j
->read_buffer
) {
2932 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
2933 if (!(cnt
% 16) && !IsRxReady(j
)) {
2935 while (!IsRxReady(j
)) {
2943 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2944 if (j
->rec_codec
== G729
&& (cnt
== 0 || cnt
== 10 || cnt
== 20)) {
2945 inb_p(j
->DSPbase
+ 0x0E);
2946 inb_p(j
->DSPbase
+ 0x0F);
2948 *(j
->read_buffer
+ cnt
) = inb_p(j
->DSPbase
+ 0x0E);
2949 *(j
->read_buffer
+ cnt
+ 1) = inb_p(j
->DSPbase
+ 0x0F);
2952 if (j
->intercom
!= -1) {
2953 if (IsTxReady(get_ixj(j
->intercom
))) {
2954 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
2955 if (!(cnt
% 16) && !IsTxReady(j
)) {
2957 while (!IsTxReady(j
)) {
2965 outb_p(*(j
->read_buffer
+ cnt
), get_ixj(j
->intercom
)->DSPbase
+ 0x0C);
2966 outb_p(*(j
->read_buffer
+ cnt
+ 1), get_ixj(j
->intercom
)->DSPbase
+ 0x0D);
2968 get_ixj(j
->intercom
)->frameswritten
++;
2971 j
->read_buffer_ready
= 1;
2972 wake_up_interruptible(&j
->read_q
); /* Wake any blocked readers */
2974 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
2976 if(j
->ixj_signals
[SIG_READ_READY
])
2977 ixj_kill_fasync(j
, SIG_READ_READY
, POLL_OUT
);
2982 static short fsk
[][6][20] =
2986 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2987 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2990 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2991 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2994 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2995 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2998 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2999 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
3002 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
3003 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
3006 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
3007 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
3012 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3013 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3016 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3017 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3020 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3021 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3024 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3025 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3028 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3029 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3032 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3033 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3039 static void ixj_write_cid_bit(IXJ
*j
, int bit
)
3041 while (j
->fskcnt
< 20) {
3042 if(j
->fskdcnt
< (j
->fsksize
- 1))
3043 j
->fskdata
[j
->fskdcnt
++] = fsk
[bit
][j
->fskz
][j
->fskcnt
];
3056 static void ixj_write_cid_byte(IXJ
*j
, char byte
)
3061 ixj_write_cid_bit(j
, 0);
3062 ixj_write_cid_bit(j
, cb
.cbits
.b0
? 1 : 0);
3063 ixj_write_cid_bit(j
, cb
.cbits
.b1
? 1 : 0);
3064 ixj_write_cid_bit(j
, cb
.cbits
.b2
? 1 : 0);
3065 ixj_write_cid_bit(j
, cb
.cbits
.b3
? 1 : 0);
3066 ixj_write_cid_bit(j
, cb
.cbits
.b4
? 1 : 0);
3067 ixj_write_cid_bit(j
, cb
.cbits
.b5
? 1 : 0);
3068 ixj_write_cid_bit(j
, cb
.cbits
.b6
? 1 : 0);
3069 ixj_write_cid_bit(j
, cb
.cbits
.b7
? 1 : 0);
3070 ixj_write_cid_bit(j
, 1);
3073 static void ixj_write_cid_seize(IXJ
*j
)
3077 for (cnt
= 0; cnt
< 150; cnt
++) {
3078 ixj_write_cid_bit(j
, 0);
3079 ixj_write_cid_bit(j
, 1);
3081 for (cnt
= 0; cnt
< 180; cnt
++) {
3082 ixj_write_cid_bit(j
, 1);
3086 static void ixj_write_cidcw_seize(IXJ
*j
)
3090 for (cnt
= 0; cnt
< 80; cnt
++) {
3091 ixj_write_cid_bit(j
, 1);
3095 static int ixj_write_cid_string(IXJ
*j
, char *s
, int checksum
)
3099 for (cnt
= 0; cnt
< strlen(s
); cnt
++) {
3100 ixj_write_cid_byte(j
, s
[cnt
]);
3101 checksum
= (checksum
+ s
[cnt
]);
3106 static void ixj_pad_fsk(IXJ
*j
, int pad
)
3110 for (cnt
= 0; cnt
< pad
; cnt
++) {
3111 if(j
->fskdcnt
< (j
->fsksize
- 1))
3112 j
->fskdata
[j
->fskdcnt
++] = 0x0000;
3114 for (cnt
= 0; cnt
< 720; cnt
++) {
3115 if(j
->fskdcnt
< (j
->fsksize
- 1))
3116 j
->fskdata
[j
->fskdcnt
++] = 0x0000;
3120 static void ixj_pre_cid(IXJ
*j
)
3122 j
->cid_play_codec
= j
->play_codec
;
3123 j
->cid_play_frame_size
= j
->play_frame_size
;
3124 j
->cid_play_volume
= get_play_volume(j
);
3125 j
->cid_play_flag
= j
->flags
.playing
;
3127 j
->cid_rec_codec
= j
->rec_codec
;
3128 j
->cid_rec_volume
= get_rec_volume(j
);
3129 j
->cid_rec_flag
= j
->flags
.recording
;
3131 j
->cid_play_aec_level
= j
->aec_level
;
3133 switch(j
->baseframe
.low
) {
3135 j
->cid_base_frame_size
= 20;
3138 j
->cid_base_frame_size
= 10;
3141 j
->cid_base_frame_size
= 30;
3148 j
->flags
.cidplay
= 1;
3150 set_base_frame(j
, 30);
3151 set_play_codec(j
, LINEAR16
);
3152 set_play_volume(j
, 0x1B);
3156 static void ixj_post_cid(IXJ
*j
)
3160 if(j
->cidsize
> 5000) {
3161 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
3163 j
->flags
.cidplay
= 0;
3164 if(ixjdebug
& 0x0200) {
3165 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j
->board
, jiffies
);
3171 set_base_frame(j
, j
->cid_base_frame_size
);
3172 set_play_codec(j
, j
->cid_play_codec
);
3173 ixj_aec_start(j
, j
->cid_play_aec_level
);
3174 set_play_volume(j
, j
->cid_play_volume
);
3176 set_rec_codec(j
, j
->cid_rec_codec
);
3177 set_rec_volume(j
, j
->cid_rec_volume
);
3180 ixj_record_start(j
);
3182 if(j
->cid_play_flag
)
3185 if(j
->cid_play_flag
) {
3186 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3190 static void ixj_write_cid(IXJ
*j
)
3195 char mdmflen
, len1
, len2
, len3
;
3200 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3203 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3204 j
->cidsize
= j
->cidcnt
= 0;
3208 strcpy(sdmf1
, j
->cid_send
.month
);
3209 strcat(sdmf1
, j
->cid_send
.day
);
3210 strcat(sdmf1
, j
->cid_send
.hour
);
3211 strcat(sdmf1
, j
->cid_send
.min
);
3212 strcpy(sdmf2
, j
->cid_send
.number
);
3213 strcpy(sdmf3
, j
->cid_send
.name
);
3215 len1
= strlen(sdmf1
);
3216 len2
= strlen(sdmf2
);
3217 len3
= strlen(sdmf3
);
3218 mdmflen
= len1
+ len2
+ len3
+ 6;
3221 ixj_write_cid_seize(j
);
3223 ixj_write_cid_byte(j
, 0x80);
3225 ixj_write_cid_byte(j
, mdmflen
);
3226 checksum
= checksum
+ mdmflen
;
3228 ixj_write_cid_byte(j
, 0x01);
3229 checksum
= checksum
+ 0x01;
3230 ixj_write_cid_byte(j
, len1
);
3231 checksum
= checksum
+ len1
;
3232 checksum
= ixj_write_cid_string(j
, sdmf1
, checksum
);
3233 if(ixj_hookstate(j
) & 1)
3236 ixj_write_cid_byte(j
, 0x02);
3237 checksum
= checksum
+ 0x02;
3238 ixj_write_cid_byte(j
, len2
);
3239 checksum
= checksum
+ len2
;
3240 checksum
= ixj_write_cid_string(j
, sdmf2
, checksum
);
3241 if(ixj_hookstate(j
) & 1)
3244 ixj_write_cid_byte(j
, 0x07);
3245 checksum
= checksum
+ 0x07;
3246 ixj_write_cid_byte(j
, len3
);
3247 checksum
= checksum
+ len3
;
3248 checksum
= ixj_write_cid_string(j
, sdmf3
, checksum
);
3249 if(ixj_hookstate(j
) & 1)
3256 ixj_write_cid_byte(j
, (char) checksum
);
3258 pad
= j
->fskdcnt
% 240;
3262 ixj_pad_fsk(j
, pad
);
3269 static void ixj_write_cidcw(IXJ
*j
)
3276 char mdmflen
, len1
, len2
, len3
;
3281 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3284 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3285 j
->cidsize
= j
->cidcnt
= 0;
3289 j
->flags
.cidcw_ack
= 0;
3296 ixj_init_tone(j
, &ti
);
3298 ixj_set_tone_on(1500, j
);
3299 ixj_set_tone_off(32, j
);
3300 if(ixjdebug
& 0x0200) {
3301 printk("IXJ cidcw phone%d first tone start at %ld\n", j
->board
, jiffies
);
3303 ixj_play_tone(j
, 23);
3305 clear_bit(j
->board
, &j
->busyflags
);
3306 while(j
->tone_state
) {
3307 set_current_state(TASK_INTERRUPTIBLE
);
3308 schedule_timeout(1);
3310 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0) {
3311 set_current_state(TASK_INTERRUPTIBLE
);
3312 schedule_timeout(1);
3314 if(ixjdebug
& 0x0200) {
3315 printk("IXJ cidcw phone%d first tone end at %ld\n", j
->board
, jiffies
);
3323 ixj_init_tone(j
, &ti
);
3325 ixj_set_tone_off(10, j
);
3326 ixj_set_tone_on(600, j
);
3327 if(ixjdebug
& 0x0200) {
3328 printk("IXJ cidcw phone%d second tone start at %ld\n", j
->board
, jiffies
);
3330 ixj_play_tone(j
, 24);
3332 clear_bit(j
->board
, &j
->busyflags
);
3333 while(j
->tone_state
) {
3334 set_current_state(TASK_INTERRUPTIBLE
);
3335 schedule_timeout(1);
3337 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0) {
3338 set_current_state(TASK_INTERRUPTIBLE
);
3339 schedule_timeout(1);
3341 if(ixjdebug
& 0x0200) {
3342 printk("IXJ cidcw phone%d sent second tone at %ld\n", j
->board
, jiffies
);
3345 j
->cidcw_wait
= jiffies
+ ((50 * hertz
) / 100);
3347 clear_bit(j
->board
, &j
->busyflags
);
3348 while(!j
->flags
.cidcw_ack
&& time_before(jiffies
, j
->cidcw_wait
)) {
3349 set_current_state(TASK_INTERRUPTIBLE
);
3350 schedule_timeout(1);
3352 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0) {
3353 set_current_state(TASK_INTERRUPTIBLE
);
3354 schedule_timeout(1);
3357 if(!j
->flags
.cidcw_ack
) {
3358 if(ixjdebug
& 0x0200) {
3359 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j
->board
, jiffies
);
3362 if(j
->cid_play_flag
) {
3363 wake_up_interruptible(&j
->write_q
); /* Wake any blocked readers */
3369 j
->flags
.cidcw_ack
= 0;
3370 strcpy(sdmf1
, j
->cid_send
.month
);
3371 strcat(sdmf1
, j
->cid_send
.day
);
3372 strcat(sdmf1
, j
->cid_send
.hour
);
3373 strcat(sdmf1
, j
->cid_send
.min
);
3374 strcpy(sdmf2
, j
->cid_send
.number
);
3375 strcpy(sdmf3
, j
->cid_send
.name
);
3377 len1
= strlen(sdmf1
);
3378 len2
= strlen(sdmf2
);
3379 len3
= strlen(sdmf3
);
3380 mdmflen
= len1
+ len2
+ len3
+ 6;
3382 ixj_write_cidcw_seize(j
);
3384 ixj_write_cid_byte(j
, 0x80);
3386 ixj_write_cid_byte(j
, mdmflen
);
3387 checksum
= checksum
+ mdmflen
;
3389 ixj_write_cid_byte(j
, 0x01);
3390 checksum
= checksum
+ 0x01;
3391 ixj_write_cid_byte(j
, len1
);
3392 checksum
= checksum
+ len1
;
3393 checksum
= ixj_write_cid_string(j
, sdmf1
, checksum
);
3395 ixj_write_cid_byte(j
, 0x02);
3396 checksum
= checksum
+ 0x02;
3397 ixj_write_cid_byte(j
, len2
);
3398 checksum
= checksum
+ len2
;
3399 checksum
= ixj_write_cid_string(j
, sdmf2
, checksum
);
3401 ixj_write_cid_byte(j
, 0x07);
3402 checksum
= checksum
+ 0x07;
3403 ixj_write_cid_byte(j
, len3
);
3404 checksum
= checksum
+ len3
;
3405 checksum
= ixj_write_cid_string(j
, sdmf3
, checksum
);
3411 ixj_write_cid_byte(j
, (char) checksum
);
3413 pad
= j
->fskdcnt
% 240;
3417 ixj_pad_fsk(j
, pad
);
3418 if(ixjdebug
& 0x0200) {
3419 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j
->board
, jiffies
);
3423 static void ixj_write_vmwi(IXJ
*j
, int msg
)
3430 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3433 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3434 j
->cidsize
= j
->cidcnt
= 0;
3440 if (j
->port
== PORT_POTS
)
3441 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
3443 ixj_write_cid_seize(j
);
3445 ixj_write_cid_byte(j
, 0x82);
3447 ixj_write_cid_byte(j
, mdmflen
);
3448 checksum
= checksum
+ mdmflen
;
3450 ixj_write_cid_byte(j
, 0x0B);
3451 checksum
= checksum
+ 0x0B;
3452 ixj_write_cid_byte(j
, 1);
3453 checksum
= checksum
+ 1;
3456 ixj_write_cid_byte(j
, 0xFF);
3457 checksum
= checksum
+ 0xFF;
3460 ixj_write_cid_byte(j
, 0x00);
3461 checksum
= checksum
+ 0x00;
3468 ixj_write_cid_byte(j
, (char) checksum
);
3470 pad
= j
->fskdcnt
% 240;
3474 ixj_pad_fsk(j
, pad
);
3477 static void ixj_write_frame(IXJ
*j
)
3479 int cnt
, frame_count
, dly
;
3484 if(j
->flags
.cidplay
) {
3485 for(cnt
= 0; cnt
< 480; cnt
++) {
3486 if (!(cnt
% 16) && !IsTxReady(j
)) {
3488 while (!IsTxReady(j
)) {
3496 dat
.word
= j
->fskdata
[j
->cidcnt
++];
3497 outb_p(dat
.bytes
.low
, j
->DSPbase
+ 0x0C);
3498 outb_p(dat
.bytes
.high
, j
->DSPbase
+ 0x0D);
3501 if(j
->cidcnt
>= j
->fskdcnt
) {
3504 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3505 and there is real audio data in the buffer, we need to throw it away because
3506 we just used it's time slot */
3507 if (j
->write_buffer_rp
> j
->write_buffer_wp
) {
3508 j
->write_buffer_rp
+= j
->cid_play_frame_size
* 2;
3509 if (j
->write_buffer_rp
>= j
->write_buffer_end
) {
3510 j
->write_buffer_rp
= j
->write_buffer
;
3512 j
->write_buffers_empty
++;
3513 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3515 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
3517 } else if (j
->write_buffer
&& j
->write_buffers_empty
< 1) {
3518 if (j
->write_buffer_wp
> j
->write_buffer_rp
) {
3520 (j
->write_buffer_wp
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
3522 if (j
->write_buffer_rp
> j
->write_buffer_wp
) {
3524 (j
->write_buffer_wp
- j
->write_buffer
) / (j
->play_frame_size
* 2) +
3525 (j
->write_buffer_end
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
3527 if (frame_count
>= 1) {
3528 if (j
->ver
.low
== 0x12 && j
->play_mode
&& j
->flags
.play_first_frame
) {
3529 switch (j
->play_mode
) {
3530 case PLAYBACK_MODE_ULAW
:
3531 case PLAYBACK_MODE_ALAW
:
3532 blankword
.low
= blankword
.high
= 0xFF;
3534 case PLAYBACK_MODE_8LINEAR
:
3535 case PLAYBACK_MODE_16LINEAR
:
3536 blankword
.low
= blankword
.high
= 0x00;
3538 case PLAYBACK_MODE_8LINEAR_WSS
:
3539 blankword
.low
= blankword
.high
= 0x80;
3542 for (cnt
= 0; cnt
< 16; cnt
++) {
3543 if (!(cnt
% 16) && !IsTxReady(j
)) {
3545 while (!IsTxReady(j
)) {
3553 outb_p((blankword
.low
), j
->DSPbase
+ 0x0C);
3554 outb_p((blankword
.high
), j
->DSPbase
+ 0x0D);
3556 j
->flags
.play_first_frame
= 0;
3557 } else if (j
->play_codec
== G723_63
&& j
->flags
.play_first_frame
) {
3558 for (cnt
= 0; cnt
< 24; cnt
++) {
3560 blankword
.low
= 0x02;
3561 blankword
.high
= 0x00;
3564 blankword
.low
= blankword
.high
= 0x00;
3566 if (!(cnt
% 16) && !IsTxReady(j
)) {
3568 while (!IsTxReady(j
)) {
3576 outb_p((blankword
.low
), j
->DSPbase
+ 0x0C);
3577 outb_p((blankword
.high
), j
->DSPbase
+ 0x0D);
3579 j
->flags
.play_first_frame
= 0;
3581 for (cnt
= 0; cnt
< j
->play_frame_size
* 2; cnt
+= 2) {
3582 if (!(cnt
% 16) && !IsTxReady(j
)) {
3584 while (!IsTxReady(j
)) {
3592 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3593 if (j
->play_codec
== G729
&& (cnt
== 0 || cnt
== 10 || cnt
== 20)) {
3594 if(j
->write_buffer_rp
+ cnt
== 0 && j
->write_buffer_rp
+ cnt
+ 1 == 0 && j
->write_buffer_rp
+ cnt
+ 2 == 0 &&
3595 j
->write_buffer_rp
+ cnt
+ 3 == 0 && j
->write_buffer_rp
+ cnt
+ 4 == 0 && j
->write_buffer_rp
+ cnt
+ 5 == 0 &&
3596 j
->write_buffer_rp
+ cnt
+ 6 == 0 && j
->write_buffer_rp
+ cnt
+ 7 == 0 && j
->write_buffer_rp
+ cnt
+ 8 == 0 &&
3597 j
->write_buffer_rp
+ cnt
+ 9 == 0) {
3598 /* someone is trying to write silence lets make this a type 0 frame. */
3599 outb_p(0x00, j
->DSPbase
+ 0x0C);
3600 outb_p(0x00, j
->DSPbase
+ 0x0D);
3602 /* so all other frames are type 1. */
3603 outb_p(0x01, j
->DSPbase
+ 0x0C);
3604 outb_p(0x00, j
->DSPbase
+ 0x0D);
3607 outb_p(*(j
->write_buffer_rp
+ cnt
), j
->DSPbase
+ 0x0C);
3608 outb_p(*(j
->write_buffer_rp
+ cnt
+ 1), j
->DSPbase
+ 0x0D);
3609 *(j
->write_buffer_rp
+ cnt
) = 0;
3610 *(j
->write_buffer_rp
+ cnt
+ 1) = 0;
3612 j
->write_buffer_rp
+= j
->play_frame_size
* 2;
3613 if (j
->write_buffer_rp
>= j
->write_buffer_end
) {
3614 j
->write_buffer_rp
= j
->write_buffer
;
3616 j
->write_buffers_empty
++;
3617 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3619 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
3626 if(j
->ixj_signals
[SIG_WRITE_READY
]) {
3627 ixj_kill_fasync(j
, SIG_WRITE_READY
, POLL_OUT
);
3631 static int idle(IXJ
*j
)
3633 if (ixj_WriteDSPCommand(0x0000, j
)) /* DSP Idle */
3637 if (j
->ssr
.high
|| j
->ssr
.low
) {
3641 j
->flags
.playing
= 0;
3643 j
->flags
.recording
= 0;
3648 static int set_base_frame(IXJ
*j
, int size
)
3654 j
->cid_play_aec_level
= j
->aec_level
;
3656 for (cnt
= 0; cnt
< 10; cnt
++) {
3660 if (j
->ssr
.high
|| j
->ssr
.low
)
3662 if (j
->dsp
.low
!= 0x20) {
3666 /* Set Base Frame Size to 240 pg9-10 8021 */
3670 /* Set Base Frame Size to 160 pg9-10 8021 */
3674 /* Set Base Frame Size to 80 pg9-10 8021 */
3685 if (ixj_WriteDSPCommand(cmd
, j
)) {
3686 j
->baseframe
.high
= j
->baseframe
.low
= 0xFF;
3689 j
->baseframe
.high
= j
->ssr
.high
;
3690 j
->baseframe
.low
= j
->ssr
.low
;
3691 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3692 if(j
->baseframe
.high
== 0x00 && j
->baseframe
.low
== 0x00) {
3696 ixj_aec_start(j
, j
->cid_play_aec_level
);
3700 static int set_rec_codec(IXJ
*j
, int rate
)
3704 j
->rec_codec
= rate
;
3708 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3709 j
->rec_frame_size
= 12;
3716 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3717 j
->rec_frame_size
= 10;
3724 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
3725 j
->rec_frame_size
= 16;
3732 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3733 j
->rec_frame_size
= 9;
3740 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3741 j
->rec_frame_size
= 8;
3748 if (j
->dsp
.low
!= 0x20) {
3749 j
->rec_frame_size
= 48;
3756 if (j
->dsp
.low
!= 0x20) {
3757 if (!j
->flags
.g729_loaded
) {
3761 switch (j
->baseframe
.low
) {
3763 j
->rec_frame_size
= 10;
3766 j
->rec_frame_size
= 5;
3769 j
->rec_frame_size
= 15;
3778 if (j
->dsp
.low
!= 0x20) {
3779 if (!j
->flags
.g729_loaded
) {
3783 switch (j
->baseframe
.low
) {
3785 j
->rec_frame_size
= 12;
3788 j
->rec_frame_size
= 6;
3791 j
->rec_frame_size
= 18;
3800 switch (j
->baseframe
.low
) {
3802 j
->rec_frame_size
= 80;
3805 j
->rec_frame_size
= 40;
3808 j
->rec_frame_size
= 120;
3814 switch (j
->baseframe
.low
) {
3816 j
->rec_frame_size
= 80;
3819 j
->rec_frame_size
= 40;
3822 j
->rec_frame_size
= 120;
3828 switch (j
->baseframe
.low
) {
3830 j
->rec_frame_size
= 160;
3833 j
->rec_frame_size
= 80;
3836 j
->rec_frame_size
= 240;
3842 switch (j
->baseframe
.low
) {
3844 j
->rec_frame_size
= 80;
3847 j
->rec_frame_size
= 40;
3850 j
->rec_frame_size
= 120;
3856 switch (j
->baseframe
.low
) {
3858 j
->rec_frame_size
= 80;
3861 j
->rec_frame_size
= 40;
3864 j
->rec_frame_size
= 120;
3870 j
->rec_frame_size
= 0;
3872 if (j
->read_buffer
) {
3873 kfree(j
->read_buffer
);
3874 j
->read_buffer
= NULL
;
3875 j
->read_buffer_size
= 0;
3883 static int ixj_record_start(IXJ
*j
)
3885 unsigned short cmd
= 0x0000;
3887 if (j
->read_buffer
) {
3890 j
->flags
.recording
= 1;
3891 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
3893 if(ixjdebug
& 0x0002)
3894 printk("IXJ %d Starting Record Codec %d at %ld\n", j
->board
, j
->rec_codec
, jiffies
);
3897 switch (j
->rec_codec
) {
3905 cmd
= 0x5130; /* TrueSpeech 8.5 */
3909 cmd
= 0x5133; /* TrueSpeech 4.8 */
3913 cmd
= 0x5134; /* TrueSpeech 4.1 */
3926 if (ixj_WriteDSPCommand(cmd
, j
))
3929 if (!j
->read_buffer
) {
3930 if (!j
->read_buffer
)
3931 j
->read_buffer
= kmalloc(j
->rec_frame_size
* 2, GFP_ATOMIC
);
3932 if (!j
->read_buffer
) {
3933 printk("Read buffer allocation for ixj board %d failed!\n", j
->board
);
3937 j
->read_buffer_size
= j
->rec_frame_size
* 2;
3939 if (ixj_WriteDSPCommand(0x5102, j
)) /* Set Poll sync mode */
3943 switch (j
->rec_mode
) {
3945 cmd
= 0x1C03; /* Record C1 */
3949 if (j
->ver
.low
== 0x12) {
3950 cmd
= 0x1E03; /* Record C1 */
3953 cmd
= 0x1E01; /* Record C1 */
3958 if (j
->ver
.low
== 0x12) {
3959 cmd
= 0x1E83; /* Record C1 */
3962 cmd
= 0x1E81; /* Record C1 */
3967 if (j
->ver
.low
== 0x12) {
3968 cmd
= 0x1F03; /* Record C1 */
3971 cmd
= 0x1F01; /* Record C1 */
3976 if (j
->ver
.low
== 0x12) {
3977 cmd
= 0x1F83; /* Record C1 */
3979 cmd
= 0x1F81; /* Record C1 */
3983 if (ixj_WriteDSPCommand(cmd
, j
))
3986 if (j
->flags
.playing
) {
3987 ixj_aec_start(j
, j
->aec_level
);
3992 static void ixj_record_stop(IXJ
*j
)
3994 if(ixjdebug
& 0x0002)
3995 printk("IXJ %d Stopping Record Codec %d at %ld\n", j
->board
, j
->rec_codec
, jiffies
);
3997 if (j
->read_buffer
) {
3998 kfree(j
->read_buffer
);
3999 j
->read_buffer
= NULL
;
4000 j
->read_buffer_size
= 0;
4002 if (j
->rec_mode
> -1) {
4003 ixj_WriteDSPCommand(0x5120, j
);
4006 j
->flags
.recording
= 0;
4008 static void ixj_vad(IXJ
*j
, int arg
)
4011 ixj_WriteDSPCommand(0x513F, j
);
4013 ixj_WriteDSPCommand(0x513E, j
);
4016 static void set_rec_depth(IXJ
*j
, int depth
)
4022 ixj_WriteDSPCommand(0x5180 + depth
, j
);
4025 static void set_dtmf_prescale(IXJ
*j
, int volume
)
4027 ixj_WriteDSPCommand(0xCF07, j
);
4028 ixj_WriteDSPCommand(volume
, j
);
4031 static int get_dtmf_prescale(IXJ
*j
)
4033 ixj_WriteDSPCommand(0xCF05, j
);
4034 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4037 static void set_rec_volume(IXJ
*j
, int volume
)
4039 if(j
->aec_level
== AEC_AGC
) {
4040 if (ixjdebug
& 0x0002)
4041 printk(KERN_INFO
"IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j
->board
, volume
);
4042 ixj_WriteDSPCommand(0xCF96, j
);
4043 ixj_WriteDSPCommand(volume
, j
);
4045 if (ixjdebug
& 0x0002)
4046 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j
->board
, volume
);
4047 ixj_WriteDSPCommand(0xCF03, j
);
4048 ixj_WriteDSPCommand(volume
, j
);
4052 static int set_rec_volume_linear(IXJ
*j
, int volume
)
4054 int newvolume
, dsprecmax
;
4056 if (ixjdebug
& 0x0002)
4057 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j
->board
, volume
);
4058 if(volume
> 100 || volume
< 0) {
4062 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4063 switch (j
->cardtype
) {
4069 ixj_mixer(0x0203, j
); /*Voice Left Volume unmute 6db */
4070 ixj_mixer(0x0303, j
); /*Voice Right Volume unmute 6db */
4071 ixj_mixer(0x0C00, j
); /*Mono1 unmute 12db */
4073 case QTI_PHONEJACK_LITE
:
4076 case QTI_PHONEJACK_PCI
:
4085 newvolume
= (dsprecmax
* volume
) / 100;
4086 set_rec_volume(j
, newvolume
);
4090 static int get_rec_volume(IXJ
*j
)
4092 if(j
->aec_level
== AEC_AGC
) {
4093 if (ixjdebug
& 0x0002)
4094 printk(KERN_INFO
"Getting AGC Threshold\n");
4095 ixj_WriteDSPCommand(0xCF86, j
);
4096 if (ixjdebug
& 0x0002)
4097 printk(KERN_INFO
"AGC Threshold is 0x%2.2x%2.2x\n", j
->ssr
.high
, j
->ssr
.low
);
4098 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4100 if (ixjdebug
& 0x0002)
4101 printk(KERN_INFO
"Getting Record Volume\n");
4102 ixj_WriteDSPCommand(0xCF01, j
);
4103 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4107 static int get_rec_volume_linear(IXJ
*j
)
4109 int volume
, newvolume
, dsprecmax
;
4111 switch (j
->cardtype
) {
4118 case QTI_PHONEJACK_LITE
:
4121 case QTI_PHONEJACK_PCI
:
4130 volume
= get_rec_volume(j
);
4131 newvolume
= (volume
* 100) / dsprecmax
;
4137 static int get_rec_level(IXJ
*j
)
4141 ixj_WriteDSPCommand(0xCF88, j
);
4143 retval
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
4144 retval
= (retval
* 256) / 240;
4148 static void ixj_aec_start(IXJ
*j
, int level
)
4150 j
->aec_level
= level
;
4151 if (ixjdebug
& 0x0002)
4152 printk(KERN_INFO
"AGC set = 0x%2.2x\n", j
->aec_level
);
4156 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
|| j
->rec_codec
== G729B
|| j
->play_codec
== G729B
) {
4157 ixj_WriteDSPCommand(0xE022, j
); /* Move AEC filter buffer */
4159 ixj_WriteDSPCommand(0x0300, j
);
4161 ixj_WriteDSPCommand(0xB001, j
); /* AEC On */
4163 ixj_WriteDSPCommand(0xE013, j
); /* Advanced AEC C1 */
4167 ixj_WriteDSPCommand(0x0000, j
); /* Advanced AEC C2 = off */
4169 ixj_WriteDSPCommand(0xE011, j
);
4170 ixj_WriteDSPCommand(0xFFFF, j
);
4172 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4173 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4178 ixj_WriteDSPCommand(0x0600, j
); /* Advanced AEC C2 = on medium */
4180 ixj_WriteDSPCommand(0xE011, j
);
4181 ixj_WriteDSPCommand(0x0080, j
);
4183 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4184 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4189 ixj_WriteDSPCommand(0x0C00, j
); /* Advanced AEC C2 = on high */
4191 ixj_WriteDSPCommand(0xE011, j
);
4192 ixj_WriteDSPCommand(0x0080, j
);
4194 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4195 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4200 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4201 ixj_WriteDSPCommand(0x0002, j
); /* Attenuation scaling factor of 2 */
4203 ixj_WriteDSPCommand(0xE011, j
);
4204 ixj_WriteDSPCommand(0x0100, j
); /* Higher Threshold Floor */
4206 ixj_WriteDSPCommand(0xE012, j
); /* Set Train and Lock */
4208 if(j
->cardtype
== QTI_LINEJACK
|| j
->cardtype
== QTI_PHONECARD
)
4209 ixj_WriteDSPCommand(0x0224, j
);
4211 ixj_WriteDSPCommand(0x1224, j
);
4213 ixj_WriteDSPCommand(0xE014, j
);
4214 ixj_WriteDSPCommand(0x0003, j
); /* Lock threashold at 3dB */
4216 ixj_WriteDSPCommand(0xE338, j
); /* Set Echo Suppresser Attenuation to 0dB */
4218 /* Now we can set the AGC initial parameters and turn it on */
4219 ixj_WriteDSPCommand(0xCF90, j
); /* Set AGC Minumum gain */
4220 ixj_WriteDSPCommand(0x0020, j
); /* to 0.125 (-18dB) */
4222 ixj_WriteDSPCommand(0xCF91, j
); /* Set AGC Maximum gain */
4223 ixj_WriteDSPCommand(0x1000, j
); /* to 16 (24dB) */
4225 ixj_WriteDSPCommand(0xCF92, j
); /* Set AGC start gain */
4226 ixj_WriteDSPCommand(0x0800, j
); /* to 8 (+18dB) */
4228 ixj_WriteDSPCommand(0xCF93, j
); /* Set AGC hold time */
4229 ixj_WriteDSPCommand(0x1F40, j
); /* to 2 seconds (units are 250us) */
4231 ixj_WriteDSPCommand(0xCF94, j
); /* Set AGC Attack Time Constant */
4232 ixj_WriteDSPCommand(0x0005, j
); /* to 8ms */
4234 ixj_WriteDSPCommand(0xCF95, j
); /* Set AGC Decay Time Constant */
4235 ixj_WriteDSPCommand(0x000D, j
); /* to 4096ms */
4237 ixj_WriteDSPCommand(0xCF96, j
); /* Set AGC Attack Threshold */
4238 ixj_WriteDSPCommand(0x1200, j
); /* to 25% */
4240 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4241 ixj_WriteDSPCommand(0x0001, j
); /* to on */
4246 ixj_WriteDSPCommand(0x0002, j
); /* Attenuation scaling factor of 2 */
4248 ixj_WriteDSPCommand(0xE011, j
);
4249 ixj_WriteDSPCommand(0x0100, j
); /* Higher Threshold Floor */
4251 ixj_WriteDSPCommand(0xE012, j
); /* Set Train and Lock */
4253 if(j
->cardtype
== QTI_LINEJACK
|| j
->cardtype
== QTI_PHONECARD
)
4254 ixj_WriteDSPCommand(0x0224, j
);
4256 ixj_WriteDSPCommand(0x1224, j
);
4258 ixj_WriteDSPCommand(0xE014, j
);
4259 ixj_WriteDSPCommand(0x0003, j
); /* Lock threashold at 3dB */
4261 ixj_WriteDSPCommand(0xE338, j
); /* Set Echo Suppresser Attenuation to 0dB */
4268 static void aec_stop(IXJ
*j
)
4270 j
->aec_level
= AEC_OFF
;
4271 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
|| j
->rec_codec
== G729B
|| j
->play_codec
== G729B
) {
4272 ixj_WriteDSPCommand(0xE022, j
); /* Move AEC filter buffer back */
4274 ixj_WriteDSPCommand(0x0700, j
);
4276 if (j
->play_mode
!= -1 && j
->rec_mode
!= -1)
4278 ixj_WriteDSPCommand(0xB002, j
); /* AEC Stop */
4282 static int set_play_codec(IXJ
*j
, int rate
)
4286 j
->play_codec
= rate
;
4290 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4291 j
->play_frame_size
= 12;
4298 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4299 j
->play_frame_size
= 10;
4306 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
4307 j
->play_frame_size
= 16;
4314 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4315 j
->play_frame_size
= 9;
4322 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4323 j
->play_frame_size
= 8;
4330 if (j
->dsp
.low
!= 0x20) {
4331 j
->play_frame_size
= 48;
4338 if (j
->dsp
.low
!= 0x20) {
4339 if (!j
->flags
.g729_loaded
) {
4343 switch (j
->baseframe
.low
) {
4345 j
->play_frame_size
= 10;
4348 j
->play_frame_size
= 5;
4351 j
->play_frame_size
= 15;
4360 if (j
->dsp
.low
!= 0x20) {
4361 if (!j
->flags
.g729_loaded
) {
4365 switch (j
->baseframe
.low
) {
4367 j
->play_frame_size
= 12;
4370 j
->play_frame_size
= 6;
4373 j
->play_frame_size
= 18;
4382 switch (j
->baseframe
.low
) {
4384 j
->play_frame_size
= 80;
4387 j
->play_frame_size
= 40;
4390 j
->play_frame_size
= 120;
4396 switch (j
->baseframe
.low
) {
4398 j
->play_frame_size
= 80;
4401 j
->play_frame_size
= 40;
4404 j
->play_frame_size
= 120;
4410 switch (j
->baseframe
.low
) {
4412 j
->play_frame_size
= 160;
4415 j
->play_frame_size
= 80;
4418 j
->play_frame_size
= 240;
4424 switch (j
->baseframe
.low
) {
4426 j
->play_frame_size
= 80;
4429 j
->play_frame_size
= 40;
4432 j
->play_frame_size
= 120;
4438 switch (j
->baseframe
.low
) {
4440 j
->play_frame_size
= 80;
4443 j
->play_frame_size
= 40;
4446 j
->play_frame_size
= 120;
4452 j
->play_frame_size
= 0;
4454 if (j
->write_buffer
) {
4455 kfree(j
->write_buffer
);
4456 j
->write_buffer
= NULL
;
4457 j
->write_buffer_size
= 0;
4465 static int ixj_play_start(IXJ
*j
)
4467 unsigned short cmd
= 0x0000;
4469 if (j
->write_buffer
) {
4473 if(ixjdebug
& 0x0002)
4474 printk("IXJ %d Starting Play Codec %d at %ld\n", j
->board
, j
->play_codec
, jiffies
);
4476 j
->flags
.playing
= 1;
4477 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
4479 j
->flags
.play_first_frame
= 1;
4482 if (!j
->play_mode
) {
4483 switch (j
->play_codec
) {
4491 cmd
= 0x5230; /* TrueSpeech 8.5 */
4495 cmd
= 0x5233; /* TrueSpeech 4.8 */
4499 cmd
= 0x5234; /* TrueSpeech 4.1 */
4512 if (ixj_WriteDSPCommand(cmd
, j
))
4515 j
->write_buffer
= kmalloc(j
->play_frame_size
* 2, GFP_ATOMIC
);
4516 if (!j
->write_buffer
) {
4517 printk("Write buffer allocation for ixj board %d failed!\n", j
->board
);
4520 /* j->write_buffers_empty = 2; */
4521 j
->write_buffers_empty
= 1;
4522 j
->write_buffer_size
= j
->play_frame_size
* 2;
4523 j
->write_buffer_end
= j
->write_buffer
+ j
->play_frame_size
* 2;
4524 j
->write_buffer_rp
= j
->write_buffer_wp
= j
->write_buffer
;
4526 if (ixj_WriteDSPCommand(0x5202, j
)) /* Set Poll sync mode */
4530 switch (j
->play_mode
) {
4535 if (j
->ver
.low
== 0x12) {
4542 if (j
->ver
.low
== 0x12) {
4549 if (j
->ver
.low
== 0x12) {
4556 if (j
->ver
.low
== 0x12) {
4563 if (ixj_WriteDSPCommand(cmd
, j
))
4566 if (ixj_WriteDSPCommand(0x2000, j
)) /* Playback C2 */
4569 if (ixj_WriteDSPCommand(0x2000 + j
->play_frame_size
, j
)) /* Playback C3 */
4572 if (j
->flags
.recording
) {
4573 ixj_aec_start(j
, j
->aec_level
);
4579 static void ixj_play_stop(IXJ
*j
)
4581 if(ixjdebug
& 0x0002)
4582 printk("IXJ %d Stopping Play Codec %d at %ld\n", j
->board
, j
->play_codec
, jiffies
);
4584 if (j
->write_buffer
) {
4585 kfree(j
->write_buffer
);
4586 j
->write_buffer
= NULL
;
4587 j
->write_buffer_size
= 0;
4589 if (j
->play_mode
> -1) {
4590 ixj_WriteDSPCommand(0x5221, j
); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4594 j
->flags
.playing
= 0;
4597 static inline int get_play_level(IXJ
*j
)
4601 ixj_WriteDSPCommand(0xCF8F, j
); /* 8022 Reference page 9-38 */
4602 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4603 retval
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
4604 retval
= (retval
* 256) / 240;
4608 static unsigned int ixj_poll(struct file
*file_p
, poll_table
* wait
)
4610 unsigned int mask
= 0;
4612 IXJ
*j
= get_ixj(NUM(file_p
->f_dentry
->d_inode
));
4614 poll_wait(file_p
, &(j
->poll_q
), wait
);
4615 if (j
->read_buffer_ready
> 0)
4616 mask
|= POLLIN
| POLLRDNORM
; /* readable */
4617 if (j
->write_buffers_empty
> 0)
4618 mask
|= POLLOUT
| POLLWRNORM
; /* writable */
4624 static int ixj_play_tone(IXJ
*j
, char tone
)
4626 if (!j
->tone_state
) {
4627 if(ixjdebug
& 0x0002) {
4628 printk("IXJ %d starting tone %d at %ld\n", j
->board
, tone
, jiffies
);
4630 if (j
->dsp
.low
== 0x20) {
4633 j
->tone_start_jif
= jiffies
;
4638 j
->tone_index
= tone
;
4639 if (ixj_WriteDSPCommand(0x6000 + j
->tone_index
, j
))
4645 static int ixj_set_tone_on(unsigned short arg
, IXJ
*j
)
4647 j
->tone_on_time
= arg
;
4649 if (ixj_WriteDSPCommand(0x6E04, j
)) /* Set Tone On Period */
4653 if (ixj_WriteDSPCommand(arg
, j
))
4659 static int SCI_WaitHighSCI(IXJ
*j
)
4663 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4664 if (!j
->pld_scrr
.bits
.sci
) {
4665 for (cnt
= 0; cnt
< 10; cnt
++) {
4667 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4669 if ((j
->pld_scrr
.bits
.sci
))
4672 if (ixjdebug
& 0x0001)
4673 printk(KERN_INFO
"SCI Wait High failed %x\n", j
->pld_scrr
.byte
);
4679 static int SCI_WaitLowSCI(IXJ
*j
)
4683 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4684 if (j
->pld_scrr
.bits
.sci
) {
4685 for (cnt
= 0; cnt
< 10; cnt
++) {
4687 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4689 if (!(j
->pld_scrr
.bits
.sci
))
4692 if (ixjdebug
& 0x0001)
4693 printk(KERN_INFO
"SCI Wait Low failed %x\n", j
->pld_scrr
.byte
);
4699 static int SCI_Control(IXJ
*j
, int control
)
4703 j
->pld_scrw
.bits
.c0
= 0; /* Set PLD Serial control interface */
4705 j
->pld_scrw
.bits
.c1
= 0; /* to no selection */
4708 case SCI_Enable_DAA
:
4709 j
->pld_scrw
.bits
.c0
= 1; /* Set PLD Serial control interface */
4711 j
->pld_scrw
.bits
.c1
= 0; /* to write to DAA */
4714 case SCI_Enable_Mixer
:
4715 j
->pld_scrw
.bits
.c0
= 0; /* Set PLD Serial control interface */
4717 j
->pld_scrw
.bits
.c1
= 1; /* to write to mixer */
4720 case SCI_Enable_EEPROM
:
4721 j
->pld_scrw
.bits
.c0
= 1; /* Set PLD Serial control interface */
4723 j
->pld_scrw
.bits
.c1
= 1; /* to write to EEPROM */
4730 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
4736 case SCI_Enable_DAA
:
4737 case SCI_Enable_Mixer
:
4738 case SCI_Enable_EEPROM
:
4739 if (!SCI_WaitHighSCI(j
))
4749 static int SCI_Prepare(IXJ
*j
)
4751 if (!SCI_Control(j
, SCI_End
))
4754 if (!SCI_WaitLowSCI(j
))
4760 static int ixj_get_mixer(long val
, IXJ
*j
)
4762 int reg
= (val
& 0x1F00) >> 8;
4763 return j
->mix
.vol
[reg
];
4766 static int ixj_mixer(long val
, IXJ
*j
)
4770 bytes
.high
= (val
& 0x1F00) >> 8;
4771 bytes
.low
= val
& 0x00FF;
4773 /* save mixer value so we can get back later on */
4774 j
->mix
.vol
[bytes
.high
] = bytes
.low
;
4776 outb_p(bytes
.high
& 0x1F, j
->XILINXbase
+ 0x03); /* Load Mixer Address */
4778 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02); /* Load Mixer Data */
4780 SCI_Control(j
, SCI_Enable_Mixer
);
4782 SCI_Control(j
, SCI_End
);
4787 static int daa_load(BYTES
* p_bytes
, IXJ
*j
)
4789 outb_p(p_bytes
->high
, j
->XILINXbase
+ 0x03);
4790 outb_p(p_bytes
->low
, j
->XILINXbase
+ 0x02);
4791 if (!SCI_Control(j
, SCI_Enable_DAA
))
4797 static int ixj_daa_cr4(IXJ
*j
, char reg
)
4801 switch (j
->daa_mode
) {
4805 case SOP_PU_RINGING
:
4808 case SOP_PU_CONVERSATION
:
4811 case SOP_PU_PULSEDIALING
:
4816 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= reg
;
4818 switch (j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGX
) {
4820 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 0;
4823 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 2;
4826 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 1;
4829 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 3;
4833 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
4835 if (!daa_load(&bytes
, j
))
4838 if (!SCI_Prepare(j
))
4844 static char daa_int_read(IXJ
*j
)
4848 if (!SCI_Prepare(j
))
4853 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4854 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4856 if (!SCI_Control(j
, SCI_Enable_DAA
))
4859 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4860 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4861 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
4862 if (ixjdebug
& 0x0001)
4863 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
4866 if (!SCI_Control(j
, SCI_Enable_DAA
))
4868 if (!SCI_Control(j
, SCI_End
))
4871 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4872 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4874 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
= bytes
.high
;
4879 static char daa_CR_read(IXJ
*j
, int cr
)
4884 if (!SCI_Prepare(j
))
4887 switch (j
->daa_mode
) {
4889 bytes
.high
= 0x30 + cr
;
4891 case SOP_PU_RINGING
:
4892 bytes
.high
= 0x70 + cr
;
4894 case SOP_PU_CONVERSATION
:
4895 bytes
.high
= 0xB0 + cr
;
4897 case SOP_PU_PULSEDIALING
:
4898 bytes
.high
= 0xF0 + cr
;
4904 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4905 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4907 if (!SCI_Control(j
, SCI_Enable_DAA
))
4910 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4911 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4912 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
4913 if (ixjdebug
& 0x0001)
4914 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
4917 if (!SCI_Control(j
, SCI_Enable_DAA
))
4919 if (!SCI_Control(j
, SCI_End
))
4922 wdata
.word
= inw_p(j
->XILINXbase
+ 0x02);
4926 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
= wdata
.bytes
.high
;
4929 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= wdata
.bytes
.high
;
4932 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= wdata
.bytes
.high
;
4935 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= wdata
.bytes
.high
;
4938 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= wdata
.bytes
.high
;
4941 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= wdata
.bytes
.high
;
4949 static int ixj_daa_cid_reset(IXJ
*j
)
4954 if (ixjdebug
& 0x0002)
4955 printk("DAA Clearing CID ram\n");
4957 if (!SCI_Prepare(j
))
4962 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4963 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4965 if (!SCI_Control(j
, SCI_Enable_DAA
))
4968 if (!SCI_WaitHighSCI(j
))
4971 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
- 1; i
+= 2) {
4972 bytes
.high
= bytes
.low
= 0x00;
4973 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4975 if (i
< ALISDAA_CALLERID_SIZE
- 1)
4976 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4978 if (!SCI_Control(j
, SCI_Enable_DAA
))
4981 if (!SCI_WaitHighSCI(j
))
4986 if (!SCI_Control(j
, SCI_End
))
4989 if (ixjdebug
& 0x0002)
4990 printk("DAA CID ram cleared\n");
4995 static int ixj_daa_cid_read(IXJ
*j
)
4999 char CID
[ALISDAA_CALLERID_SIZE
], mContinue
;
5002 if (!SCI_Prepare(j
))
5007 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
5008 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
5010 if (!SCI_Control(j
, SCI_Enable_DAA
))
5013 if (!SCI_WaitHighSCI(j
))
5016 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
5017 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
5018 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
5019 if (ixjdebug
& 0x0001)
5020 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
5023 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
+= 2) {
5024 bytes
.high
= bytes
.low
= 0x00;
5025 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
5026 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
5028 if (!SCI_Control(j
, SCI_Enable_DAA
))
5031 if (!SCI_WaitHighSCI(j
))
5034 CID
[i
+ 0] = inb_p(j
->XILINXbase
+ 0x03);
5035 CID
[i
+ 1] = inb_p(j
->XILINXbase
+ 0x02);
5038 if (!SCI_Control(j
, SCI_End
))
5042 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
5045 if ((pIn
[1] & 0x03) == 0x01) {
5048 if ((pIn
[2] & 0x0c) == 0x04) {
5049 pOut
[1] = ((pIn
[2] & 0x03) << 6) | ((pIn
[1] & 0xfc) >> 2);
5051 if ((pIn
[3] & 0x30) == 0x10) {
5052 pOut
[2] = ((pIn
[3] & 0x0f) << 4) | ((pIn
[2] & 0xf0) >> 4);
5054 if ((pIn
[4] & 0xc0) == 0x40) {
5055 pOut
[3] = ((pIn
[4] & 0x3f) << 2) | ((pIn
[3] & 0xc0) >> 6);
5059 pIn
+= 5, pOut
+= 4;
5061 memset(&j
->cid
, 0, sizeof(PHONE_CID
));
5062 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
5064 strncpy(j
->cid
.month
, pOut
, 2);
5066 strncpy(j
->cid
.day
, pOut
, 2);
5068 strncpy(j
->cid
.hour
, pOut
, 2);
5070 strncpy(j
->cid
.min
, pOut
, 2);
5072 j
->cid
.numlen
= *pOut
;
5074 strncpy(j
->cid
.number
, pOut
, j
->cid
.numlen
);
5075 pOut
+= j
->cid
.numlen
+ 1;
5076 j
->cid
.namelen
= *pOut
;
5078 strncpy(j
->cid
.name
, pOut
, j
->cid
.namelen
);
5080 ixj_daa_cid_reset(j
);
5084 static char daa_get_version(IXJ
*j
)
5088 if (!SCI_Prepare(j
))
5093 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
5094 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
5096 if (!SCI_Control(j
, SCI_Enable_DAA
))
5099 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
5100 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
5101 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
5102 if (ixjdebug
& 0x0001)
5103 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
5106 if (!SCI_Control(j
, SCI_Enable_DAA
))
5109 if (!SCI_Control(j
, SCI_End
))
5112 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
5113 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
5114 if (ixjdebug
& 0x0002)
5115 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes
.high
, bytes
.low
);
5116 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
= bytes
.high
;
5120 static int daa_set_mode(IXJ
*j
, int mode
)
5123 The DAA *MUST* be in the conversation mode if the
5124 PSTN line is to be seized (PSTN line off-hook).
5125 Taking the PSTN line off-hook while the DAA is in
5126 a mode other than conversation mode will cause a
5127 hardware failure of the ALIS-A part.
5130 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5131 if the PSTN line is on-hook. Failure to have the PSTN line
5132 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5138 j
->flags
.pstn_rmr
= 0;
5140 if (!SCI_Prepare(j
))
5145 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5147 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5148 j
->pld_slicw
.bits
.rly2
= 0;
5149 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5151 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5152 daa_load(&bytes
, j
);
5153 if (!SCI_Prepare(j
))
5156 j
->daa_mode
= SOP_PU_SLEEP
;
5159 if(j
->daa_mode
== SOP_PU_SLEEP
)
5163 if (ixjdebug
& 0x0008)
5164 printk(KERN_INFO
"phone DAA: SOP_PU_SLEEP at %ld\n", jiffies
);
5165 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5167 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5169 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5170 j
->pld_slicw
.bits
.rly2
= 0;
5171 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5173 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5174 daa_load(&bytes
, j
);
5175 if (!SCI_Prepare(j
))
5178 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5180 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5181 j
->pld_slicw
.bits
.rly2
= 0;
5182 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5184 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5185 daa_load(&bytes
, j
);
5186 if (!SCI_Prepare(j
))
5189 j
->daa_mode
= SOP_PU_SLEEP
;
5190 j
->flags
.pstn_ringing
= 0;
5191 j
->ex
.bits
.pstn_ring
= 0;
5192 j
->pstn_sleeptil
= jiffies
+ (hertz
/ 4);
5193 wake_up_interruptible(&j
->read_q
); /* Wake any blocked readers */
5194 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
5195 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
5197 case SOP_PU_RINGING
:
5198 if (ixjdebug
& 0x0008)
5199 printk(KERN_INFO
"phone DAA: SOP_PU_RINGING at %ld\n", jiffies
);
5200 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5202 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5203 j
->pld_slicw
.bits
.rly2
= 0;
5204 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5206 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5207 daa_load(&bytes
, j
);
5208 if (!SCI_Prepare(j
))
5210 j
->daa_mode
= SOP_PU_RINGING
;
5212 case SOP_PU_CONVERSATION
:
5213 if (ixjdebug
& 0x0008)
5214 printk(KERN_INFO
"phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies
);
5216 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5217 daa_load(&bytes
, j
);
5218 if (!SCI_Prepare(j
))
5220 j
->pld_slicw
.bits
.rly2
= 1;
5221 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5222 j
->pld_scrw
.bits
.daafsyncen
= 1; /* Turn on DAA Frame Sync */
5224 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5225 j
->daa_mode
= SOP_PU_CONVERSATION
;
5226 j
->flags
.pstn_ringing
= 0;
5227 j
->ex
.bits
.pstn_ring
= 0;
5228 j
->pstn_sleeptil
= jiffies
;
5229 j
->pstn_ring_start
= j
->pstn_ring_stop
= j
->pstn_ring_int
= 0;
5231 case SOP_PU_PULSEDIALING
:
5232 if (ixjdebug
& 0x0008)
5233 printk(KERN_INFO
"phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies
);
5234 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5236 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5237 j
->pld_slicw
.bits
.rly2
= 0;
5238 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5240 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5241 daa_load(&bytes
, j
);
5242 if (!SCI_Prepare(j
))
5244 j
->daa_mode
= SOP_PU_PULSEDIALING
;
5252 static int ixj_daa_write(IXJ
*j
)
5256 j
->flags
.pstncheck
= 1;
5258 daa_set_mode(j
, SOP_PU_SLEEP
);
5260 if (!SCI_Prepare(j
))
5263 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5266 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
5267 if (!daa_load(&bytes
, j
))
5270 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
;
5271 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
;
5272 if (!daa_load(&bytes
, j
))
5275 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
;
5276 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5277 if (!daa_load(&bytes
, j
))
5280 if (!SCI_Prepare(j
))
5284 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
;
5285 if (!daa_load(&bytes
, j
))
5288 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
;
5289 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
;
5290 if (!daa_load(&bytes
, j
))
5293 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
;
5294 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
;
5295 if (!daa_load(&bytes
, j
))
5298 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
;
5299 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
;
5300 if (!daa_load(&bytes
, j
))
5303 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
;
5305 if (!daa_load(&bytes
, j
))
5308 if (!SCI_Prepare(j
))
5312 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7];
5313 if (!daa_load(&bytes
, j
))
5316 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6];
5317 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5];
5318 if (!daa_load(&bytes
, j
))
5321 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4];
5322 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3];
5323 if (!daa_load(&bytes
, j
))
5326 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2];
5327 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1];
5328 if (!daa_load(&bytes
, j
))
5331 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0];
5333 if (!daa_load(&bytes
, j
))
5336 if (!SCI_Control(j
, SCI_End
))
5338 if (!SCI_WaitLowSCI(j
))
5342 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7];
5343 if (!daa_load(&bytes
, j
))
5346 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6];
5347 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5];
5348 if (!daa_load(&bytes
, j
))
5351 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4];
5352 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3];
5353 if (!daa_load(&bytes
, j
))
5356 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2];
5357 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1];
5358 if (!daa_load(&bytes
, j
))
5361 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0];
5363 if (!daa_load(&bytes
, j
))
5366 if (!SCI_Control(j
, SCI_End
))
5368 if (!SCI_WaitLowSCI(j
))
5372 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7];
5373 if (!daa_load(&bytes
, j
))
5376 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6];
5377 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5];
5378 if (!daa_load(&bytes
, j
))
5381 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4];
5382 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3];
5383 if (!daa_load(&bytes
, j
))
5386 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2];
5387 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1];
5388 if (!daa_load(&bytes
, j
))
5391 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0];
5393 if (!daa_load(&bytes
, j
))
5396 if (!SCI_Control(j
, SCI_End
))
5398 if (!SCI_WaitLowSCI(j
))
5402 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7];
5403 if (!daa_load(&bytes
, j
))
5406 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6];
5407 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5];
5408 if (!daa_load(&bytes
, j
))
5411 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4];
5412 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3];
5413 if (!daa_load(&bytes
, j
))
5416 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2];
5417 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1];
5418 if (!daa_load(&bytes
, j
))
5421 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0];
5423 if (!daa_load(&bytes
, j
))
5426 if (!SCI_Control(j
, SCI_End
))
5428 if (!SCI_WaitLowSCI(j
))
5432 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7];
5433 if (!daa_load(&bytes
, j
))
5436 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6];
5437 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5];
5438 if (!daa_load(&bytes
, j
))
5441 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4];
5442 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3];
5443 if (!daa_load(&bytes
, j
))
5446 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2];
5447 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1];
5448 if (!daa_load(&bytes
, j
))
5451 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0];
5453 if (!daa_load(&bytes
, j
))
5456 if (!SCI_Control(j
, SCI_End
))
5458 if (!SCI_WaitLowSCI(j
))
5462 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7];
5463 if (!daa_load(&bytes
, j
))
5466 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6];
5467 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5];
5468 if (!daa_load(&bytes
, j
))
5471 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4];
5472 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3];
5473 if (!daa_load(&bytes
, j
))
5476 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2];
5477 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1];
5478 if (!daa_load(&bytes
, j
))
5481 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0];
5483 if (!daa_load(&bytes
, j
))
5486 if (!SCI_Control(j
, SCI_End
))
5488 if (!SCI_WaitLowSCI(j
))
5492 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7];
5493 if (!daa_load(&bytes
, j
))
5496 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6];
5497 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5];
5498 if (!daa_load(&bytes
, j
))
5501 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4];
5502 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3];
5503 if (!daa_load(&bytes
, j
))
5506 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2];
5507 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1];
5508 if (!daa_load(&bytes
, j
))
5511 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0];
5513 if (!daa_load(&bytes
, j
))
5516 if (!SCI_Control(j
, SCI_End
))
5518 if (!SCI_WaitLowSCI(j
))
5522 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7];
5523 if (!daa_load(&bytes
, j
))
5526 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6];
5527 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5];
5528 if (!daa_load(&bytes
, j
))
5531 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4];
5532 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3];
5533 if (!daa_load(&bytes
, j
))
5536 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2];
5537 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1];
5538 if (!daa_load(&bytes
, j
))
5541 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0];
5543 if (!daa_load(&bytes
, j
))
5546 if (!SCI_Control(j
, SCI_End
))
5548 if (!SCI_WaitLowSCI(j
))
5552 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7];
5553 if (!daa_load(&bytes
, j
))
5556 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6];
5557 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5];
5558 if (!daa_load(&bytes
, j
))
5561 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4];
5562 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3];
5563 if (!daa_load(&bytes
, j
))
5566 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2];
5567 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1];
5568 if (!daa_load(&bytes
, j
))
5571 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0];
5573 if (!daa_load(&bytes
, j
))
5576 if (!SCI_Control(j
, SCI_End
))
5578 if (!SCI_WaitLowSCI(j
))
5582 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3];
5583 if (!daa_load(&bytes
, j
))
5586 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2];
5587 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1];
5588 if (!daa_load(&bytes
, j
))
5591 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0];
5593 if (!daa_load(&bytes
, j
))
5596 if (!SCI_Control(j
, SCI_End
))
5598 if (!SCI_WaitLowSCI(j
))
5602 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3];
5603 if (!daa_load(&bytes
, j
))
5606 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2];
5607 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1];
5608 if (!daa_load(&bytes
, j
))
5611 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0];
5613 if (!daa_load(&bytes
, j
))
5616 if (!SCI_Control(j
, SCI_End
))
5618 if (!SCI_WaitLowSCI(j
))
5622 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3];
5623 if (!daa_load(&bytes
, j
))
5626 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2];
5627 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1];
5628 if (!daa_load(&bytes
, j
))
5631 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0];
5633 if (!daa_load(&bytes
, j
))
5636 if (!SCI_Control(j
, SCI_End
))
5638 if (!SCI_WaitLowSCI(j
))
5642 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3];
5643 if (!daa_load(&bytes
, j
))
5646 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2];
5647 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1];
5648 if (!daa_load(&bytes
, j
))
5651 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0];
5653 if (!daa_load(&bytes
, j
))
5656 if (!SCI_Control(j
, SCI_End
))
5658 if (!SCI_WaitLowSCI(j
))
5662 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3];
5663 if (!daa_load(&bytes
, j
))
5666 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2];
5667 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1];
5668 if (!daa_load(&bytes
, j
))
5671 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0];
5673 if (!daa_load(&bytes
, j
))
5676 if (!SCI_Control(j
, SCI_End
))
5678 if (!SCI_WaitLowSCI(j
))
5682 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7];
5683 if (!daa_load(&bytes
, j
))
5686 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6];
5687 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5];
5688 if (!daa_load(&bytes
, j
))
5691 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4];
5692 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3];
5693 if (!daa_load(&bytes
, j
))
5696 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2];
5697 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1];
5698 if (!daa_load(&bytes
, j
))
5701 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0];
5703 if (!daa_load(&bytes
, j
))
5706 if (!SCI_Control(j
, SCI_End
))
5708 if (!SCI_WaitLowSCI(j
))
5712 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7];
5713 if (!daa_load(&bytes
, j
))
5716 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6];
5717 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5];
5718 if (!daa_load(&bytes
, j
))
5721 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4];
5722 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3];
5723 if (!daa_load(&bytes
, j
))
5726 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2];
5727 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1];
5728 if (!daa_load(&bytes
, j
))
5731 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0];
5733 if (!daa_load(&bytes
, j
))
5737 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
5738 if (!SCI_Control(j
, SCI_End
))
5741 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5743 if (ixjdebug
& 0x0002)
5744 printk("DAA Coefficients Loaded\n");
5746 j
->flags
.pstncheck
= 0;
5750 int ixj_set_tone_off(unsigned short arg
, IXJ
*j
)
5752 j
->tone_off_time
= arg
;
5753 if (ixj_WriteDSPCommand(0x6E05, j
)) /* Set Tone Off Period */
5756 if (ixj_WriteDSPCommand(arg
, j
))
5761 static int ixj_get_tone_on(IXJ
*j
)
5763 if (ixj_WriteDSPCommand(0x6E06, j
)) /* Get Tone On Period */
5769 static int ixj_get_tone_off(IXJ
*j
)
5771 if (ixj_WriteDSPCommand(0x6E07, j
)) /* Get Tone Off Period */
5777 static void ixj_busytone(IXJ
*j
)
5779 j
->flags
.ringback
= 0;
5780 j
->flags
.dialtone
= 0;
5781 j
->flags
.busytone
= 1;
5782 ixj_set_tone_on(0x07D0, j
);
5783 ixj_set_tone_off(0x07D0, j
);
5784 ixj_play_tone(j
, 27);
5787 static void ixj_dialtone(IXJ
*j
)
5789 j
->flags
.ringback
= 0;
5790 j
->flags
.dialtone
= 1;
5791 j
->flags
.busytone
= 0;
5792 if (j
->dsp
.low
== 0x20) {
5795 ixj_set_tone_on(0xFFFF, j
);
5796 ixj_set_tone_off(0x0000, j
);
5797 ixj_play_tone(j
, 25);
5801 static void ixj_cpt_stop(IXJ
*j
)
5803 if(j
->tone_state
|| j
->tone_cadence_state
)
5805 j
->flags
.dialtone
= 0;
5806 j
->flags
.busytone
= 0;
5807 j
->flags
.ringback
= 0;
5808 ixj_set_tone_on(0x0001, j
);
5809 ixj_set_tone_off(0x0000, j
);
5810 ixj_play_tone(j
, 0);
5811 j
->tone_state
= j
->tone_cadence_state
= 0;
5813 if (j
->cadence_t
->ce
) {
5814 kfree(j
->cadence_t
->ce
);
5816 kfree(j
->cadence_t
);
5817 j
->cadence_t
= NULL
;
5820 if (j
->play_mode
== -1 && j
->rec_mode
== -1)
5822 if (j
->play_mode
!= -1 && j
->dsp
.low
== 0x20)
5824 if (j
->rec_mode
!= -1 && j
->dsp
.low
== 0x20)
5825 ixj_record_start(j
);
5828 static void ixj_ringback(IXJ
*j
)
5830 j
->flags
.busytone
= 0;
5831 j
->flags
.dialtone
= 0;
5832 j
->flags
.ringback
= 1;
5833 ixj_set_tone_on(0x0FA0, j
);
5834 ixj_set_tone_off(0x2EE0, j
);
5835 ixj_play_tone(j
, 26);
5838 static void ixj_testram(IXJ
*j
)
5840 ixj_WriteDSPCommand(0x3001, j
); /* Test External SRAM */
5843 static int ixj_build_cadence(IXJ
*j
, IXJ_CADENCE __user
* cp
)
5846 IXJ_CADENCE_ELEMENT __user
*cep
;
5847 IXJ_CADENCE_ELEMENT
*lcep
;
5851 lcp
= kmalloc(sizeof(ixj_cadence
), GFP_KERNEL
);
5856 if (copy_from_user(&lcp
->elements_used
,
5857 &cp
->elements_used
, sizeof(int)))
5859 if (copy_from_user(&lcp
->termination
,
5860 &cp
->termination
, sizeof(IXJ_CADENCE_TERM
)))
5862 if (get_user(cep
, &cp
->ce
))
5866 if ((unsigned)lcp
->elements_used
>= ~0U/sizeof(IXJ_CADENCE_ELEMENT
))
5870 lcep
= kmalloc(sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
, GFP_KERNEL
);
5875 if (copy_from_user(lcep
, cep
, sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
))
5879 kfree(j
->cadence_t
->ce
);
5880 kfree(j
->cadence_t
);
5882 lcp
->ce
= (void *) lcep
;
5884 j
->tone_cadence_state
= 0;
5885 ixj_set_tone_on(lcp
->ce
[0].tone_on_time
, j
);
5886 ixj_set_tone_off(lcp
->ce
[0].tone_off_time
, j
);
5887 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
) {
5888 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
5889 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
5890 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
5891 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
5892 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
5893 ixj_init_tone(j
, &ti
);
5895 ixj_play_tone(j
, lcp
->ce
[0].index
);
5904 static int ixj_build_filter_cadence(IXJ
*j
, IXJ_FILTER_CADENCE __user
* cp
)
5906 IXJ_FILTER_CADENCE
*lcp
;
5907 lcp
= kmalloc(sizeof(IXJ_FILTER_CADENCE
), GFP_KERNEL
);
5909 if(ixjdebug
& 0x0001) {
5910 printk(KERN_INFO
"Could not allocate memory for cadence\n");
5914 if (copy_from_user(lcp
, cp
, sizeof(IXJ_FILTER_CADENCE
))) {
5915 if(ixjdebug
& 0x0001) {
5916 printk(KERN_INFO
"Could not copy cadence to kernel\n");
5921 if (lcp
->filter
> 5) {
5922 if(ixjdebug
& 0x0001) {
5923 printk(KERN_INFO
"Cadence out of range\n");
5928 j
->cadence_f
[lcp
->filter
].state
= 0;
5929 j
->cadence_f
[lcp
->filter
].enable
= lcp
->enable
;
5930 j
->filter_en
[lcp
->filter
] = j
->cadence_f
[lcp
->filter
].en_filter
= lcp
->en_filter
;
5931 j
->cadence_f
[lcp
->filter
].on1
= lcp
->on1
;
5932 j
->cadence_f
[lcp
->filter
].on1min
= 0;
5933 j
->cadence_f
[lcp
->filter
].on1max
= 0;
5934 j
->cadence_f
[lcp
->filter
].off1
= lcp
->off1
;
5935 j
->cadence_f
[lcp
->filter
].off1min
= 0;
5936 j
->cadence_f
[lcp
->filter
].off1max
= 0;
5937 j
->cadence_f
[lcp
->filter
].on2
= lcp
->on2
;
5938 j
->cadence_f
[lcp
->filter
].on2min
= 0;
5939 j
->cadence_f
[lcp
->filter
].on2max
= 0;
5940 j
->cadence_f
[lcp
->filter
].off2
= lcp
->off2
;
5941 j
->cadence_f
[lcp
->filter
].off2min
= 0;
5942 j
->cadence_f
[lcp
->filter
].off2max
= 0;
5943 j
->cadence_f
[lcp
->filter
].on3
= lcp
->on3
;
5944 j
->cadence_f
[lcp
->filter
].on3min
= 0;
5945 j
->cadence_f
[lcp
->filter
].on3max
= 0;
5946 j
->cadence_f
[lcp
->filter
].off3
= lcp
->off3
;
5947 j
->cadence_f
[lcp
->filter
].off3min
= 0;
5948 j
->cadence_f
[lcp
->filter
].off3max
= 0;
5949 if(ixjdebug
& 0x0002) {
5950 printk(KERN_INFO
"Cadence %d loaded\n", lcp
->filter
);
5956 static void add_caps(IXJ
*j
)
5959 j
->caplist
[j
->caps
].cap
= PHONE_VENDOR_QUICKNET
;
5960 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Technologies, Inc. (www.quicknet.net)");
5961 j
->caplist
[j
->caps
].captype
= vendor
;
5962 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5963 j
->caplist
[j
->caps
].captype
= device
;
5964 switch (j
->cardtype
) {
5966 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK");
5969 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet LineJACK");
5971 case QTI_PHONEJACK_LITE
:
5972 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK Lite");
5974 case QTI_PHONEJACK_PCI
:
5975 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK PCI");
5978 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneCARD");
5981 j
->caplist
[j
->caps
].cap
= j
->cardtype
;
5982 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5983 strcpy(j
->caplist
[j
->caps
].desc
, "POTS");
5984 j
->caplist
[j
->caps
].captype
= port
;
5985 j
->caplist
[j
->caps
].cap
= pots
;
5986 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5988 /* add devices that can do speaker/mic */
5989 switch (j
->cardtype
) {
5992 case QTI_PHONEJACK_PCI
:
5994 strcpy(j
->caplist
[j
->caps
].desc
, "SPEAKER");
5995 j
->caplist
[j
->caps
].captype
= port
;
5996 j
->caplist
[j
->caps
].cap
= speaker
;
5997 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6002 /* add devices that can do handset */
6003 switch (j
->cardtype
) {
6005 strcpy(j
->caplist
[j
->caps
].desc
, "HANDSET");
6006 j
->caplist
[j
->caps
].captype
= port
;
6007 j
->caplist
[j
->caps
].cap
= handset
;
6008 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6014 /* add devices that can do PSTN */
6015 switch (j
->cardtype
) {
6017 strcpy(j
->caplist
[j
->caps
].desc
, "PSTN");
6018 j
->caplist
[j
->caps
].captype
= port
;
6019 j
->caplist
[j
->caps
].cap
= pstn
;
6020 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6026 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6027 strcpy(j
->caplist
[j
->caps
].desc
, "ULAW");
6028 j
->caplist
[j
->caps
].captype
= codec
;
6029 j
->caplist
[j
->caps
].cap
= ULAW
;
6030 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6032 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 16 bit");
6033 j
->caplist
[j
->caps
].captype
= codec
;
6034 j
->caplist
[j
->caps
].cap
= LINEAR16
;
6035 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6037 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 8 bit");
6038 j
->caplist
[j
->caps
].captype
= codec
;
6039 j
->caplist
[j
->caps
].cap
= LINEAR8
;
6040 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6042 strcpy(j
->caplist
[j
->caps
].desc
, "Windows Sound System");
6043 j
->caplist
[j
->caps
].captype
= codec
;
6044 j
->caplist
[j
->caps
].cap
= WSS
;
6045 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6047 /* software ALAW codec, made from ULAW */
6048 strcpy(j
->caplist
[j
->caps
].desc
, "ALAW");
6049 j
->caplist
[j
->caps
].captype
= codec
;
6050 j
->caplist
[j
->caps
].cap
= ALAW
;
6051 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6053 /* version 12 of the 8020 does the following codecs in a broken way */
6054 if (j
->dsp
.low
!= 0x20 || j
->ver
.low
!= 0x12) {
6055 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 6.3kbps");
6056 j
->caplist
[j
->caps
].captype
= codec
;
6057 j
->caplist
[j
->caps
].cap
= G723_63
;
6058 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6060 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 5.3kbps");
6061 j
->caplist
[j
->caps
].captype
= codec
;
6062 j
->caplist
[j
->caps
].cap
= G723_53
;
6063 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6065 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.8kbps");
6066 j
->caplist
[j
->caps
].captype
= codec
;
6067 j
->caplist
[j
->caps
].cap
= TS48
;
6068 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6070 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.1kbps");
6071 j
->caplist
[j
->caps
].captype
= codec
;
6072 j
->caplist
[j
->caps
].cap
= TS41
;
6073 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6076 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6077 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
6078 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 8.5kbps");
6079 j
->caplist
[j
->caps
].captype
= codec
;
6080 j
->caplist
[j
->caps
].cap
= TS85
;
6081 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6084 /* 8021 chips can do G728 */
6085 if (j
->dsp
.low
== 0x21) {
6086 strcpy(j
->caplist
[j
->caps
].desc
, "G.728 16kbps");
6087 j
->caplist
[j
->caps
].captype
= codec
;
6088 j
->caplist
[j
->caps
].cap
= G728
;
6089 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6092 /* 8021/8022 chips can do G729 if loaded */
6093 if (j
->dsp
.low
!= 0x20 && j
->flags
.g729_loaded
) {
6094 strcpy(j
->caplist
[j
->caps
].desc
, "G.729A 8kbps");
6095 j
->caplist
[j
->caps
].captype
= codec
;
6096 j
->caplist
[j
->caps
].cap
= G729
;
6097 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6099 if (j
->dsp
.low
!= 0x20 && j
->flags
.g729_loaded
) {
6100 strcpy(j
->caplist
[j
->caps
].desc
, "G.729B 8kbps");
6101 j
->caplist
[j
->caps
].captype
= codec
;
6102 j
->caplist
[j
->caps
].cap
= G729B
;
6103 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6107 static int capabilities_check(IXJ
*j
, struct phone_capability
*pcreq
)
6111 for (cnt
= 0; cnt
< j
->caps
; cnt
++) {
6112 if (pcreq
->captype
== j
->caplist
[cnt
].captype
6113 && pcreq
->cap
== j
->caplist
[cnt
].cap
) {
6121 static int ixj_ioctl(struct inode
*inode
, struct file
*file_p
, unsigned int cmd
, unsigned long arg
)
6126 void __user
*argp
= (void __user
*)arg
;
6128 unsigned int raise
, mant
;
6129 unsigned int minor
= iminor(inode
);
6130 int board
= NUM(inode
);
6132 IXJ
*j
= get_ixj(NUM(inode
));
6137 * Set up locks to ensure that only one process is talking to the DSP at a time.
6138 * This is necessary to keep the DSP from locking up.
6140 while(test_and_set_bit(board
, (void *)&j
->busyflags
) != 0) {
6141 set_current_state(TASK_INTERRUPTIBLE
);
6142 schedule_timeout(1);
6144 if (ixjdebug
& 0x0040)
6145 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor
, cmd
, arg
);
6146 if (minor
>= IXJMAX
) {
6147 clear_bit(board
, &j
->busyflags
);
6151 * Check ioctls only root can use.
6153 if (!capable(CAP_SYS_ADMIN
)) {
6155 case IXJCTL_TESTRAM
:
6161 case IXJCTL_TESTRAM
:
6163 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6165 case IXJCTL_CARDTYPE
:
6166 retval
= j
->cardtype
;
6171 case IXJCTL_VERSION
:
6174 snprintf(arg_str
, sizeof(arg_str
),
6175 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR
,
6176 IXJ_VER_MINOR
, IXJ_BLD_VER
);
6177 if (copy_to_user(argp
, arg_str
, strlen(arg_str
)))
6181 case PHONE_RING_CADENCE
:
6182 j
->ring_cadence
= arg
;
6186 if (copy_from_user(&j
->cid_send
, argp
, sizeof(PHONE_CID
))) {
6191 memset(&j
->cid_send
, 0, sizeof(PHONE_CID
));
6195 /* Binary compatbility */
6196 case OLD_PHONE_RING_START
:
6199 case PHONE_RING_START
:
6201 if (copy_from_user(&j
->cid_send
, argp
, sizeof(PHONE_CID
))) {
6207 memset(&j
->cid_send
, 0, sizeof(PHONE_CID
));
6211 case PHONE_RING_STOP
:
6212 j
->flags
.cringing
= 0;
6213 if(j
->cadence_f
[5].enable
) {
6214 j
->cadence_f
[5].state
= 0;
6219 retval
= ixj_ring(j
);
6221 case PHONE_EXCEPTION
:
6222 retval
= j
->ex
.bytes
;
6223 if(j
->ex
.bits
.flash
) {
6225 j
->ex
.bits
.flash
= 0;
6227 j
->ex
.bits
.pstn_ring
= 0;
6228 j
->ex
.bits
.caller_id
= 0;
6229 j
->ex
.bits
.pstn_wink
= 0;
6238 j
->ex
.bits
.reserved
= 0;
6240 case PHONE_HOOKSTATE
:
6241 j
->ex
.bits
.hookstate
= 0;
6242 retval
= j
->hookstate
; //j->r_hook;
6244 case IXJCTL_SET_LED
:
6245 LED_SetState(arg
, j
);
6248 retval
= set_base_frame(j
, arg
);
6250 case PHONE_REC_CODEC
:
6251 retval
= set_rec_codec(j
, arg
);
6256 case PHONE_REC_START
:
6257 ixj_record_start(j
);
6259 case PHONE_REC_STOP
:
6262 case PHONE_REC_DEPTH
:
6263 set_rec_depth(j
, arg
);
6265 case PHONE_REC_VOLUME
:
6267 retval
= get_rec_volume(j
);
6270 set_rec_volume(j
, arg
);
6274 case PHONE_REC_VOLUME_LINEAR
:
6276 retval
= get_rec_volume_linear(j
);
6279 set_rec_volume_linear(j
, arg
);
6283 case IXJCTL_DTMF_PRESCALE
:
6285 retval
= get_dtmf_prescale(j
);
6288 set_dtmf_prescale(j
, arg
);
6292 case PHONE_REC_LEVEL
:
6293 retval
= get_rec_level(j
);
6296 retval
= ixj_siadc(j
, arg
);
6299 retval
= ixj_sidac(j
, arg
);
6301 case IXJCTL_AEC_START
:
6302 ixj_aec_start(j
, arg
);
6304 case IXJCTL_AEC_STOP
:
6307 case IXJCTL_AEC_GET_LEVEL
:
6308 retval
= j
->aec_level
;
6310 case PHONE_PLAY_CODEC
:
6311 retval
= set_play_codec(j
, arg
);
6313 case PHONE_PLAY_START
:
6314 retval
= ixj_play_start(j
);
6316 case PHONE_PLAY_STOP
:
6319 case PHONE_PLAY_DEPTH
:
6320 set_play_depth(j
, arg
);
6322 case PHONE_PLAY_VOLUME
:
6324 retval
= get_play_volume(j
);
6327 set_play_volume(j
, arg
);
6331 case PHONE_PLAY_VOLUME_LINEAR
:
6333 retval
= get_play_volume_linear(j
);
6336 set_play_volume_linear(j
, arg
);
6340 case PHONE_PLAY_LEVEL
:
6341 retval
= get_play_level(j
);
6343 case IXJCTL_DSP_TYPE
:
6344 retval
= (j
->dsp
.high
<< 8) + j
->dsp
.low
;
6346 case IXJCTL_DSP_VERSION
:
6347 retval
= (j
->ver
.high
<< 8) + j
->ver
.low
;
6358 case IXJCTL_DRYBUFFER_READ
:
6359 put_user(j
->drybuffer
, (unsigned long __user
*) argp
);
6361 case IXJCTL_DRYBUFFER_CLEAR
:
6364 case IXJCTL_FRAMES_READ
:
6365 put_user(j
->framesread
, (unsigned long __user
*) argp
);
6367 case IXJCTL_FRAMES_WRITTEN
:
6368 put_user(j
->frameswritten
, (unsigned long __user
*) argp
);
6370 case IXJCTL_READ_WAIT
:
6371 put_user(j
->read_wait
, (unsigned long __user
*) argp
);
6373 case IXJCTL_WRITE_WAIT
:
6374 put_user(j
->write_wait
, (unsigned long __user
*) argp
);
6376 case PHONE_MAXRINGS
:
6379 case PHONE_SET_TONE_ON_TIME
:
6380 ixj_set_tone_on(arg
, j
);
6382 case PHONE_SET_TONE_OFF_TIME
:
6383 ixj_set_tone_off(arg
, j
);
6385 case PHONE_GET_TONE_ON_TIME
:
6386 if (ixj_get_tone_on(j
)) {
6389 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6392 case PHONE_GET_TONE_OFF_TIME
:
6393 if (ixj_get_tone_off(j
)) {
6396 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6399 case PHONE_PLAY_TONE
:
6401 retval
= ixj_play_tone(j
, arg
);
6405 case PHONE_GET_TONE_STATE
:
6406 retval
= j
->tone_state
;
6408 case PHONE_DTMF_READY
:
6409 retval
= j
->ex
.bits
.dtmf_ready
;
6411 case PHONE_GET_DTMF
:
6412 if (ixj_hookstate(j
)) {
6413 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
6414 retval
= j
->dtmfbuffer
[j
->dtmf_rp
];
6416 if (j
->dtmf_rp
== 79)
6418 if (j
->dtmf_rp
== j
->dtmf_wp
) {
6419 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
6424 case PHONE_GET_DTMF_ASCII
:
6425 if (ixj_hookstate(j
)) {
6426 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
6427 switch (j
->dtmfbuffer
[j
->dtmf_rp
]) {
6429 retval
= 42; /* '*'; */
6433 retval
= 48; /*'0'; */
6437 retval
= 35; /*'#'; */
6441 retval
= 65; /*'A'; */
6445 retval
= 66; /*'B'; */
6449 retval
= 67; /*'C'; */
6453 retval
= 68; /*'D'; */
6457 retval
= 48 + j
->dtmfbuffer
[j
->dtmf_rp
];
6461 if (j
->dtmf_rp
== 79)
6463 if(j
->dtmf_rp
== j
->dtmf_wp
)
6465 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
6470 case PHONE_DTMF_OOB
:
6471 j
->flags
.dtmf_oob
= arg
;
6473 case PHONE_DIALTONE
:
6479 case PHONE_RINGBACK
:
6483 if(j
->cardtype
== QTI_PHONEJACK
)
6486 retval
= ixj_wink(j
);
6488 case PHONE_CPT_STOP
:
6491 case PHONE_QUERY_CODEC
:
6493 struct phone_codec_data pd
;
6495 int proto_size
[] = {
6497 12, 10, 16, 9, 8, 48, 5,
6498 40, 40, 80, 40, 40, 6
6500 if(copy_from_user(&pd
, argp
, sizeof(pd
))) {
6504 if(pd
.type
<1 || pd
.type
>13) {
6505 retval
= -EPROTONOSUPPORT
;
6509 val
=proto_size
[pd
.type
];
6510 else switch(j
->baseframe
.low
)
6512 case 0xA0:val
=2*proto_size
[pd
.type
];break;
6513 case 0x50:val
=proto_size
[pd
.type
];break;
6514 default:val
=proto_size
[pd
.type
]*3;break;
6516 pd
.buf_min
=pd
.buf_max
=pd
.buf_opt
=val
;
6517 if(copy_to_user(argp
, &pd
, sizeof(pd
)))
6521 case IXJCTL_DSP_IDLE
:
6525 if ((arg
& 0xff) == 0xff)
6526 retval
= ixj_get_mixer(arg
, j
);
6530 case IXJCTL_DAA_COEFF_SET
:
6534 retval
= ixj_daa_write(j
);
6538 retval
= ixj_daa_write(j
);
6541 DAA_Coeff_France(j
);
6542 retval
= ixj_daa_write(j
);
6545 DAA_Coeff_Germany(j
);
6546 retval
= ixj_daa_write(j
);
6549 DAA_Coeff_Australia(j
);
6550 retval
= ixj_daa_write(j
);
6554 retval
= ixj_daa_write(j
);
6561 case IXJCTL_DAA_AGAIN
:
6562 ixj_daa_cr4(j
, arg
| 0x02);
6564 case IXJCTL_PSTN_LINETEST
:
6565 retval
= ixj_linetest(j
);
6568 ixj_write_vmwi(j
, arg
);
6571 if (copy_to_user(argp
, &j
->cid
, sizeof(PHONE_CID
)))
6573 j
->ex
.bits
.caller_id
= 0;
6575 case IXJCTL_WINK_DURATION
:
6580 retval
= ixj_set_port(j
, arg
);
6584 case IXJCTL_POTS_PSTN
:
6585 retval
= ixj_set_pots(j
, arg
);
6587 case PHONE_CAPABILITIES
:
6591 case PHONE_CAPABILITIES_LIST
:
6593 if (copy_to_user(argp
, j
->caplist
, sizeof(struct phone_capability
) * j
->caps
))
6596 case PHONE_CAPABILITIES_CHECK
:
6598 struct phone_capability cap
;
6599 if (copy_from_user(&cap
, argp
, sizeof(cap
)))
6603 retval
= capabilities_check(j
, &cap
);
6607 case PHONE_PSTN_SET_STATE
:
6608 daa_set_mode(j
, arg
);
6610 case PHONE_PSTN_GET_STATE
:
6611 retval
= j
->daa_mode
;
6612 j
->ex
.bits
.pstn_ring
= 0;
6614 case IXJCTL_SET_FILTER
:
6615 if (copy_from_user(&jf
, argp
, sizeof(jf
)))
6617 retval
= ixj_init_filter(j
, &jf
);
6619 case IXJCTL_SET_FILTER_RAW
:
6620 if (copy_from_user(&jfr
, argp
, sizeof(jfr
)))
6623 retval
= ixj_init_filter_raw(j
, &jfr
);
6625 case IXJCTL_GET_FILTER_HIST
:
6629 retval
= j
->filter_hist
[arg
];
6631 case IXJCTL_INIT_TONE
:
6632 if (copy_from_user(&ti
, argp
, sizeof(ti
)))
6635 retval
= ixj_init_tone(j
, &ti
);
6637 case IXJCTL_TONE_CADENCE
:
6638 retval
= ixj_build_cadence(j
, argp
);
6640 case IXJCTL_FILTER_CADENCE
:
6641 retval
= ixj_build_filter_cadence(j
, argp
);
6644 if (copy_from_user(&j
->sigdef
, argp
, sizeof(IXJ_SIGDEF
))) {
6648 j
->ixj_signals
[j
->sigdef
.event
] = j
->sigdef
.signal
;
6649 if(j
->sigdef
.event
< 33) {
6651 for(mant
= 0; mant
< j
->sigdef
.event
; mant
++){
6654 if(j
->sigdef
.signal
)
6655 j
->ex_sig
.bytes
|= raise
;
6657 j
->ex_sig
.bytes
&= (raise
^0xffff);
6660 case IXJCTL_INTERCOM_STOP
:
6661 if(arg
< 0 || arg
>= IXJMAX
)
6667 get_ixj(arg
)->intercom
= -1;
6668 ixj_record_stop(get_ixj(arg
));
6669 ixj_play_stop(get_ixj(arg
));
6672 case IXJCTL_INTERCOM_START
:
6673 if(arg
< 0 || arg
>= IXJMAX
)
6676 ixj_record_start(j
);
6678 get_ixj(arg
)->intercom
= board
;
6679 ixj_play_start(get_ixj(arg
));
6680 ixj_record_start(get_ixj(arg
));
6683 if (ixjdebug
& 0x0040)
6684 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor
, cmd
, arg
);
6685 clear_bit(board
, &j
->busyflags
);
6689 static int ixj_fasync(int fd
, struct file
*file_p
, int mode
)
6691 IXJ
*j
= get_ixj(NUM(file_p
->f_dentry
->d_inode
));
6693 return fasync_helper(fd
, file_p
, mode
, &j
->async_queue
);
6696 static struct file_operations ixj_fops
=
6698 .owner
= THIS_MODULE
,
6699 .read
= ixj_enhanced_read
,
6700 .write
= ixj_enhanced_write
,
6703 .release
= ixj_release
,
6704 .fasync
= ixj_fasync
6707 static int ixj_linetest(IXJ
*j
)
6709 unsigned long jifwait
;
6711 j
->flags
.pstncheck
= 1; /* Testing */
6712 j
->flags
.pstn_present
= 0; /* Assume the line is not there */
6714 daa_int_read(j
); /*Clear DAA Interrupt flags */
6716 /* Hold all relays in the normally de-energized position. */
6719 j
->pld_slicw
.bits
.rly1
= 0;
6720 j
->pld_slicw
.bits
.rly2
= 0;
6721 j
->pld_slicw
.bits
.rly3
= 0;
6722 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6723 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6725 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6726 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
6727 if (j
->pld_slicr
.bits
.potspstn
) {
6728 j
->flags
.pots_pstn
= 1;
6729 j
->flags
.pots_correct
= 0;
6730 LED_SetState(0x4, j
);
6732 j
->flags
.pots_pstn
= 0;
6733 j
->pld_slicw
.bits
.rly1
= 0;
6734 j
->pld_slicw
.bits
.rly2
= 0;
6735 j
->pld_slicw
.bits
.rly3
= 1;
6736 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6737 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6739 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6740 daa_set_mode(j
, SOP_PU_CONVERSATION
);
6741 jifwait
= jiffies
+ hertz
;
6742 while (time_before(jiffies
, jifwait
)) {
6743 set_current_state(TASK_INTERRUPTIBLE
);
6744 schedule_timeout(1);
6747 daa_set_mode(j
, SOP_PU_RESET
);
6748 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
6749 j
->flags
.pots_correct
= 0; /* Should not be line voltage on POTS port. */
6750 LED_SetState(0x4, j
);
6751 j
->pld_slicw
.bits
.rly3
= 0;
6752 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6754 j
->flags
.pots_correct
= 1;
6755 LED_SetState(0x8, j
);
6756 j
->pld_slicw
.bits
.rly1
= 1;
6757 j
->pld_slicw
.bits
.rly2
= 0;
6758 j
->pld_slicw
.bits
.rly3
= 0;
6759 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6762 j
->pld_slicw
.bits
.rly3
= 0;
6763 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6764 daa_set_mode(j
, SOP_PU_CONVERSATION
);
6765 jifwait
= jiffies
+ hertz
;
6766 while (time_before(jiffies
, jifwait
)) {
6767 set_current_state(TASK_INTERRUPTIBLE
);
6768 schedule_timeout(1);
6771 daa_set_mode(j
, SOP_PU_RESET
);
6772 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
6773 j
->pstn_sleeptil
= jiffies
+ (hertz
/ 4);
6774 j
->flags
.pstn_present
= 1;
6776 j
->flags
.pstn_present
= 0;
6778 if (j
->flags
.pstn_present
) {
6779 if (j
->flags
.pots_correct
) {
6780 LED_SetState(0xA, j
);
6782 LED_SetState(0x6, j
);
6785 if (j
->flags
.pots_correct
) {
6786 LED_SetState(0x9, j
);
6788 LED_SetState(0x5, j
);
6791 j
->flags
.pstncheck
= 0; /* Testing */
6792 return j
->flags
.pstn_present
;
6795 static int ixj_selfprobe(IXJ
*j
)
6802 init_waitqueue_head(&j
->poll_q
);
6803 init_waitqueue_head(&j
->read_q
);
6804 init_waitqueue_head(&j
->write_q
);
6806 while(atomic_read(&j
->DSPWrite
) > 0)
6807 atomic_dec(&j
->DSPWrite
);
6808 if (ixjdebug
& 0x0002)
6809 printk(KERN_INFO
"Write IDLE to Software Control Register\n");
6810 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
6812 if (ixj_WriteDSPCommand(0x0000, j
)) /* Write IDLE to Software Control Register */
6814 /* The read values of the SSR should be 0x00 for the IDLE command */
6815 if (j
->ssr
.low
|| j
->ssr
.high
)
6817 if (ixjdebug
& 0x0002)
6818 printk(KERN_INFO
"Get Device ID Code\n");
6819 if (ixj_WriteDSPCommand(0x3400, j
)) /* Get Device ID Code */
6821 j
->dsp
.low
= j
->ssr
.low
;
6822 j
->dsp
.high
= j
->ssr
.high
;
6823 if (ixjdebug
& 0x0002)
6824 printk(KERN_INFO
"Get Device Version Code\n");
6825 if (ixj_WriteDSPCommand(0x3800, j
)) /* Get Device Version Code */
6827 j
->ver
.low
= j
->ssr
.low
;
6828 j
->ver
.high
= j
->ssr
.high
;
6830 if (j
->dsp
.low
== 0x21) {
6831 bytes
.high
= bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
6832 outb_p(bytes
.low
^ 0xFF, j
->XILINXbase
+ 0x02);
6833 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6834 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
6835 if (bytes
.low
== bytes
.high
) /* Register is read only on */
6836 /* Internet PhoneJack Lite */
6838 j
->cardtype
= QTI_PHONEJACK_LITE
;
6839 if (!request_region(j
->XILINXbase
, 4, "ixj control")) {
6840 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6843 j
->pld_slicw
.pcib
.e1
= 1;
6844 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6846 j
->cardtype
= QTI_LINEJACK
;
6848 if (!request_region(j
->XILINXbase
, 8, "ixj control")) {
6849 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6853 } else if (j
->dsp
.low
== 0x22) {
6854 j
->cardtype
= QTI_PHONEJACK_PCI
;
6855 request_region(j
->XILINXbase
, 4, "ixj control");
6856 j
->pld_slicw
.pcib
.e1
= 1;
6857 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6859 j
->cardtype
= QTI_PHONEJACK
;
6861 switch (j
->cardtype
) {
6863 if (!j
->dsp
.low
!= 0x20) {
6866 ixj_WriteDSPCommand(0x3800, j
);
6867 j
->ver
.low
= j
->ssr
.low
;
6868 j
->ver
.high
= j
->ssr
.high
;
6872 if (!request_region(j
->XILINXbase
, 8, "ixj control")) {
6873 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6877 case QTI_PHONEJACK_LITE
:
6878 case QTI_PHONEJACK_PCI
:
6879 if (!request_region(j
->XILINXbase
, 4, "ixj control")) {
6880 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6883 j
->pld_slicw
.pcib
.e1
= 1;
6884 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6890 if (j
->dsp
.low
== 0x20 || j
->cardtype
== QTI_PHONEJACK_LITE
|| j
->cardtype
== QTI_PHONEJACK_PCI
) {
6891 if (ixjdebug
& 0x0002)
6892 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
6893 if (ixj_WriteDSPCommand(0xC462, j
)) /* Write CODEC config to Software Control Register */
6895 if (ixjdebug
& 0x0002)
6896 printk(KERN_INFO
"Write CODEC timing to Software Control Register\n");
6897 if (j
->cardtype
== QTI_PHONEJACK
) {
6902 if (ixj_WriteDSPCommand(cmd
, j
)) /* Write CODEC timing to Software Control Register */
6905 if (set_base_frame(j
, 30) != 30)
6907 if (ixjdebug
& 0x0002)
6908 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
6909 if (j
->cardtype
== QTI_PHONECARD
) {
6910 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to Software Control Register */
6913 if (j
->cardtype
== QTI_LINEJACK
) {
6914 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to Software Control Register */
6916 if (ixjdebug
& 0x0002)
6917 printk(KERN_INFO
"Turn on the PLD Clock at 8Khz\n");
6918 j
->pld_clock
.byte
= 0;
6919 outb_p(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
6923 if (j
->dsp
.low
== 0x20) {
6924 if (ixjdebug
& 0x0002)
6925 printk(KERN_INFO
"Configure GPIO pins\n");
6926 j
->gpio
.bytes
.high
= 0x09;
6927 /* bytes.low = 0xEF; 0xF7 */
6928 j
->gpio
.bits
.gpio1
= 1;
6929 j
->gpio
.bits
.gpio2
= 1;
6930 j
->gpio
.bits
.gpio3
= 0;
6931 j
->gpio
.bits
.gpio4
= 1;
6932 j
->gpio
.bits
.gpio5
= 1;
6933 j
->gpio
.bits
.gpio6
= 1;
6934 j
->gpio
.bits
.gpio7
= 1;
6935 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* Set GPIO pin directions */
6936 if (ixjdebug
& 0x0002)
6937 printk(KERN_INFO
"Enable SLIC\n");
6938 j
->gpio
.bytes
.high
= 0x0B;
6939 j
->gpio
.bytes
.low
= 0x00;
6940 j
->gpio
.bits
.gpio1
= 0;
6941 j
->gpio
.bits
.gpio2
= 1;
6942 j
->gpio
.bits
.gpio5
= 0;
6943 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* send the ring stop signal */
6944 j
->port
= PORT_POTS
;
6946 if (j
->cardtype
== QTI_LINEJACK
) {
6947 LED_SetState(0x1, j
);
6948 jif
= jiffies
+ (hertz
/ 10);
6949 while (time_before(jiffies
, jif
)) {
6950 set_current_state(TASK_INTERRUPTIBLE
);
6951 schedule_timeout(1);
6953 LED_SetState(0x2, j
);
6954 jif
= jiffies
+ (hertz
/ 10);
6955 while (time_before(jiffies
, jif
)) {
6956 set_current_state(TASK_INTERRUPTIBLE
);
6957 schedule_timeout(1);
6959 LED_SetState(0x4, j
);
6960 jif
= jiffies
+ (hertz
/ 10);
6961 while (time_before(jiffies
, jif
)) {
6962 set_current_state(TASK_INTERRUPTIBLE
);
6963 schedule_timeout(1);
6965 LED_SetState(0x8, j
);
6966 jif
= jiffies
+ (hertz
/ 10);
6967 while (time_before(jiffies
, jif
)) {
6968 set_current_state(TASK_INTERRUPTIBLE
);
6969 schedule_timeout(1);
6971 LED_SetState(0x0, j
);
6973 if (ixjdebug
& 0x0002)
6974 printk("Loading DAA Coefficients\n");
6976 if (!ixj_daa_write(j
)) {
6977 printk("DAA write failed on board %d\n", j
->board
);
6980 if(!ixj_daa_cid_reset(j
)) {
6981 printk("DAA CID reset failed on board %d\n", j
->board
);
6984 j
->flags
.pots_correct
= 0;
6985 j
->flags
.pstn_present
= 0;
6987 if (j
->flags
.pots_correct
) {
6988 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6990 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6991 j
->pld_slicw
.bits
.rly1
= 1;
6992 j
->pld_slicw
.bits
.spken
= 1;
6993 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6994 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
6995 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6996 j
->port
= PORT_POTS
;
6998 ixj_set_port(j
, PORT_PSTN
);
7000 if (ixjdebug
& 0x0002)
7001 printk(KERN_INFO
"Enable Mixer\n");
7002 ixj_mixer(0x0000, j
); /*Master Volume Left unmute 0db */
7003 ixj_mixer(0x0100, j
); /*Master Volume Right unmute 0db */
7005 ixj_mixer(0x0203, j
); /*Voice Left Volume unmute 6db */
7006 ixj_mixer(0x0303, j
); /*Voice Right Volume unmute 6db */
7008 ixj_mixer(0x0480, j
); /*FM Left mute */
7009 ixj_mixer(0x0580, j
); /*FM Right mute */
7011 ixj_mixer(0x0680, j
); /*CD Left mute */
7012 ixj_mixer(0x0780, j
); /*CD Right mute */
7014 ixj_mixer(0x0880, j
); /*Line Left mute */
7015 ixj_mixer(0x0980, j
); /*Line Right mute */
7017 ixj_mixer(0x0A80, j
); /*Aux left mute */
7018 ixj_mixer(0x0B80, j
); /*Aux right mute */
7020 ixj_mixer(0x0C00, j
); /*Mono1 unmute 12db */
7021 ixj_mixer(0x0D80, j
); /*Mono2 mute */
7023 ixj_mixer(0x0E80, j
); /*Mic mute */
7025 ixj_mixer(0x0F00, j
); /*Mono Out Volume unmute 0db */
7027 ixj_mixer(0x1000, j
); /*Voice Left and Right out only */
7028 ixj_mixer(0x110C, j
);
7031 ixj_mixer(0x1200, j
); /*Mono1 switch on mixer left */
7032 ixj_mixer(0x1401, j
);
7034 ixj_mixer(0x1300, j
); /*Mono1 switch on mixer right */
7035 ixj_mixer(0x1501, j
);
7037 ixj_mixer(0x1700, j
); /*Clock select */
7039 ixj_mixer(0x1800, j
); /*ADC input from mixer */
7041 ixj_mixer(0x1901, j
); /*Mic gain 30db */
7043 if (ixjdebug
& 0x0002)
7044 printk(KERN_INFO
"Setting Default US Ring Cadence Detection\n");
7045 j
->cadence_f
[4].state
= 0;
7046 j
->cadence_f
[4].on1
= 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7047 j
->cadence_f
[4].off1
= 0;
7048 j
->cadence_f
[4].on2
= 0;
7049 j
->cadence_f
[4].off2
= 0;
7050 j
->cadence_f
[4].on3
= 0;
7051 j
->cadence_f
[4].off3
= 0; /* These should represent standard US ring pulse. */
7052 j
->pstn_last_rmr
= jiffies
;
7055 if (j
->cardtype
== QTI_PHONECARD
) {
7056 ixj_WriteDSPCommand(0xCF07, j
);
7057 ixj_WriteDSPCommand(0x00B0, j
);
7058 ixj_set_port(j
, PORT_SPEAKER
);
7060 ixj_set_port(j
, PORT_POTS
);
7061 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
7062 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7068 j
->framesread
= j
->frameswritten
= 0;
7069 j
->read_wait
= j
->write_wait
= 0;
7070 j
->rxreadycheck
= j
->txreadycheck
= 0;
7072 /* initialise the DTMF prescale to a sensible value */
7073 if (j
->cardtype
== QTI_LINEJACK
) {
7074 set_dtmf_prescale(j
, 0x10);
7076 set_dtmf_prescale(j
, 0x40);
7078 set_play_volume(j
, 0x100);
7079 set_rec_volume(j
, 0x100);
7081 if (ixj_WriteDSPCommand(0x0000, j
)) /* Write IDLE to Software Control Register */
7083 /* The read values of the SSR should be 0x00 for the IDLE command */
7084 if (j
->ssr
.low
|| j
->ssr
.high
)
7087 if (ixjdebug
& 0x0002)
7088 printk(KERN_INFO
"Enable Line Monitor\n");
7090 if (ixjdebug
& 0x0002)
7091 printk(KERN_INFO
"Set Line Monitor to Asyncronous Mode\n");
7093 if (ixj_WriteDSPCommand(0x7E01, j
)) /* Asynchronous Line Monitor */
7096 if (ixjdebug
& 0x002)
7097 printk(KERN_INFO
"Enable DTMF Detectors\n");
7099 if (ixj_WriteDSPCommand(0x5151, j
)) /* Enable DTMF detection */
7102 if (ixj_WriteDSPCommand(0x6E01, j
)) /* Set Asyncronous Tone Generation */
7105 set_rec_depth(j
, 2); /* Set Record Channel Limit to 2 frames */
7107 set_play_depth(j
, 2); /* Set Playback Channel Limit to 2 frames */
7109 j
->ex
.bits
.dtmf_ready
= 0;
7111 j
->dtmf_wp
= j
->dtmf_rp
= 0;
7112 j
->rec_mode
= j
->play_mode
= -1;
7113 j
->flags
.ringing
= 0;
7114 j
->maxrings
= MAXRINGS
;
7115 j
->ring_cadence
= USA_RING_CADENCE
;
7118 j
->flags
.dtmf_oob
= 0;
7119 for (cnt
= 0; cnt
< 4; cnt
++)
7120 j
->cadence_f
[cnt
].enable
= 0;
7121 /* must be a device on the specified address */
7122 ixj_WriteDSPCommand(0x0FE3, j
); /* Put the DSP in 1/5 power mode. */
7124 /* Set up the default signals for events */
7125 for (cnt
= 0; cnt
< 35; cnt
++)
7126 j
->ixj_signals
[cnt
] = SIGIO
;
7128 /* Set the excetion signal enable flags */
7129 j
->ex_sig
.bits
.dtmf_ready
= j
->ex_sig
.bits
.hookstate
= j
->ex_sig
.bits
.flash
= j
->ex_sig
.bits
.pstn_ring
=
7130 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
=
7131 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;
7132 #ifdef IXJ_DYN_ALLOC
7138 /* Register with the Telephony for Linux subsystem */
7139 j
->p
.f_op
= &ixj_fops
;
7140 j
->p
.open
= ixj_open
;
7141 j
->p
.board
= j
->board
;
7142 phone_register_device(&j
->p
, PHONE_UNIT_ANY
);
7150 * Exported service for pcmcia card handling
7153 IXJ
*ixj_pcmcia_probe(unsigned long dsp
, unsigned long xilinx
)
7155 IXJ
*j
= ixj_alloc();
7160 j
->XILINXbase
= xilinx
;
7161 j
->cardtype
= QTI_PHONECARD
;
7166 EXPORT_SYMBOL(ixj_pcmcia_probe
); /* Fpr PCMCIA */
7168 static int ixj_get_status_proc(char *buf
)
7174 len
+= sprintf(buf
+ len
, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR
, IXJ_VER_MINOR
, IXJ_BLD_VER
);
7175 len
+= sprintf(buf
+ len
, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ
));
7176 len
+= sprintf(buf
+ len
, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS
));
7177 len
+= sprintf(buf
+ len
, "\nUsing old telephony API");
7178 len
+= sprintf(buf
+ len
, "\nDebug Level %d\n", ixjdebug
);
7180 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
7185 len
+= sprintf(buf
+ len
, "\nCard Num %d", cnt
);
7186 len
+= sprintf(buf
+ len
, "\nDSP Base Address 0x%4.4x", j
->DSPbase
);
7187 if (j
->cardtype
!= QTI_PHONEJACK
)
7188 len
+= sprintf(buf
+ len
, "\nXILINX Base Address 0x%4.4x", j
->XILINXbase
);
7189 len
+= sprintf(buf
+ len
, "\nDSP Type %2.2x%2.2x", j
->dsp
.high
, j
->dsp
.low
);
7190 len
+= sprintf(buf
+ len
, "\nDSP Version %2.2x.%2.2x", j
->ver
.high
, j
->ver
.low
);
7191 len
+= sprintf(buf
+ len
, "\nSerial Number %8.8x", j
->serial
);
7192 switch (j
->cardtype
) {
7193 case (QTI_PHONEJACK
):
7194 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK");
7196 case (QTI_LINEJACK
):
7197 len
+= sprintf(buf
+ len
, "\nCard Type = Internet LineJACK");
7198 if (j
->flags
.g729_loaded
)
7199 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7200 len
+= sprintf(buf
+ len
, " Country = %d", j
->daa_country
);
7202 case (QTI_PHONEJACK_LITE
):
7203 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK Lite");
7204 if (j
->flags
.g729_loaded
)
7205 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7207 case (QTI_PHONEJACK_PCI
):
7208 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK PCI");
7209 if (j
->flags
.g729_loaded
)
7210 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7212 case (QTI_PHONECARD
):
7213 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneCARD");
7214 if (j
->flags
.g729_loaded
)
7215 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7216 len
+= sprintf(buf
+ len
, "\nSmart Cable %spresent", j
->pccr1
.bits
.drf
? "not " : "");
7217 if (!j
->pccr1
.bits
.drf
)
7218 len
+= sprintf(buf
+ len
, "\nSmart Cable type %d", j
->flags
.pcmciasct
);
7219 len
+= sprintf(buf
+ len
, "\nSmart Cable state %d", j
->flags
.pcmciastate
);
7222 len
+= sprintf(buf
+ len
, "\nCard Type = %d", j
->cardtype
);
7225 len
+= sprintf(buf
+ len
, "\nReaders %d", j
->readers
);
7226 len
+= sprintf(buf
+ len
, "\nWriters %d", j
->writers
);
7228 len
+= sprintf(buf
+ len
, "\nCapabilities %d", j
->caps
);
7229 if (j
->dsp
.low
!= 0x20)
7230 len
+= sprintf(buf
+ len
, "\nDSP Processor load %d", j
->proc_load
);
7231 if (j
->flags
.cidsent
)
7232 len
+= sprintf(buf
+ len
, "\nCaller ID data sent");
7234 len
+= sprintf(buf
+ len
, "\nCaller ID data not sent");
7236 len
+= sprintf(buf
+ len
, "\nPlay CODEC ");
7237 switch (j
->play_codec
) {
7239 len
+= sprintf(buf
+ len
, "G.723.1 6.3");
7242 len
+= sprintf(buf
+ len
, "G.723.1 5.3");
7245 len
+= sprintf(buf
+ len
, "TrueSpeech 8.5");
7248 len
+= sprintf(buf
+ len
, "TrueSpeech 4.8");
7251 len
+= sprintf(buf
+ len
, "TrueSpeech 4.1");
7254 len
+= sprintf(buf
+ len
, "G.728");
7257 len
+= sprintf(buf
+ len
, "G.729");
7260 len
+= sprintf(buf
+ len
, "G.729B");
7263 len
+= sprintf(buf
+ len
, "uLaw");
7266 len
+= sprintf(buf
+ len
, "aLaw");
7269 len
+= sprintf(buf
+ len
, "16 bit Linear");
7272 len
+= sprintf(buf
+ len
, "8 bit Linear");
7275 len
+= sprintf(buf
+ len
, "Windows Sound System");
7278 len
+= sprintf(buf
+ len
, "NO CODEC CHOSEN");
7281 len
+= sprintf(buf
+ len
, "\nRecord CODEC ");
7282 switch (j
->rec_codec
) {
7284 len
+= sprintf(buf
+ len
, "G.723.1 6.3");
7287 len
+= sprintf(buf
+ len
, "G.723.1 5.3");
7290 len
+= sprintf(buf
+ len
, "TrueSpeech 8.5");
7293 len
+= sprintf(buf
+ len
, "TrueSpeech 4.8");
7296 len
+= sprintf(buf
+ len
, "TrueSpeech 4.1");
7299 len
+= sprintf(buf
+ len
, "G.728");
7302 len
+= sprintf(buf
+ len
, "G.729");
7305 len
+= sprintf(buf
+ len
, "G.729B");
7308 len
+= sprintf(buf
+ len
, "uLaw");
7311 len
+= sprintf(buf
+ len
, "aLaw");
7314 len
+= sprintf(buf
+ len
, "16 bit Linear");
7317 len
+= sprintf(buf
+ len
, "8 bit Linear");
7320 len
+= sprintf(buf
+ len
, "Windows Sound System");
7323 len
+= sprintf(buf
+ len
, "NO CODEC CHOSEN");
7326 len
+= sprintf(buf
+ len
, "\nAEC ");
7327 switch (j
->aec_level
) {
7329 len
+= sprintf(buf
+ len
, "Off");
7332 len
+= sprintf(buf
+ len
, "Low");
7335 len
+= sprintf(buf
+ len
, "Med");
7338 len
+= sprintf(buf
+ len
, "High");
7341 len
+= sprintf(buf
+ len
, "Auto");
7344 len
+= sprintf(buf
+ len
, "AEC/AGC");
7347 len
+= sprintf(buf
+ len
, "unknown(%i)", j
->aec_level
);
7351 len
+= sprintf(buf
+ len
, "\nRec volume 0x%x", get_rec_volume(j
));
7352 len
+= sprintf(buf
+ len
, "\nPlay volume 0x%x", get_play_volume(j
));
7353 len
+= sprintf(buf
+ len
, "\nDTMF prescale 0x%x", get_dtmf_prescale(j
));
7355 len
+= sprintf(buf
+ len
, "\nHook state %d", j
->hookstate
); /* j->r_hook); */
7357 if (j
->cardtype
== QTI_LINEJACK
) {
7358 len
+= sprintf(buf
+ len
, "\nPOTS Correct %d", j
->flags
.pots_correct
);
7359 len
+= sprintf(buf
+ len
, "\nPSTN Present %d", j
->flags
.pstn_present
);
7360 len
+= sprintf(buf
+ len
, "\nPSTN Check %d", j
->flags
.pstncheck
);
7361 len
+= sprintf(buf
+ len
, "\nPOTS to PSTN %d", j
->flags
.pots_pstn
);
7362 switch (j
->daa_mode
) {
7364 len
+= sprintf(buf
+ len
, "\nDAA PSTN On Hook");
7366 case SOP_PU_RINGING
:
7367 len
+= sprintf(buf
+ len
, "\nDAA PSTN Ringing");
7368 len
+= sprintf(buf
+ len
, "\nRinging state = %d", j
->cadence_f
[4].state
);
7370 case SOP_PU_CONVERSATION
:
7371 len
+= sprintf(buf
+ len
, "\nDAA PSTN Off Hook");
7373 case SOP_PU_PULSEDIALING
:
7374 len
+= sprintf(buf
+ len
, "\nDAA PSTN Pulse Dialing");
7377 len
+= sprintf(buf
+ len
, "\nDAA RMR = %d", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
);
7378 len
+= sprintf(buf
+ len
, "\nDAA VDD OK = %d", j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
);
7379 len
+= sprintf(buf
+ len
, "\nDAA CR0 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
);
7380 len
+= sprintf(buf
+ len
, "\nDAA CR1 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
);
7381 len
+= sprintf(buf
+ len
, "\nDAA CR2 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
);
7382 len
+= sprintf(buf
+ len
, "\nDAA CR3 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
);
7383 len
+= sprintf(buf
+ len
, "\nDAA CR4 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
);
7384 len
+= sprintf(buf
+ len
, "\nDAA CR5 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
);
7385 len
+= sprintf(buf
+ len
, "\nDAA XR0 = 0x%02x", j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
);
7386 len
+= sprintf(buf
+ len
, "\nDAA ringstop %ld - jiffies %ld", j
->pstn_ring_stop
, jiffies
);
7390 len
+= sprintf(buf
+ len
, "\nPort POTS");
7393 len
+= sprintf(buf
+ len
, "\nPort PSTN");
7396 len
+= sprintf(buf
+ len
, "\nPort SPEAKER/MIC");
7399 len
+= sprintf(buf
+ len
, "\nPort HANDSET");
7402 if (j
->dsp
.low
== 0x21 || j
->dsp
.low
== 0x22) {
7403 len
+= sprintf(buf
+ len
, "\nSLIC state ");
7404 switch (SLIC_GetState(j
)) {
7405 case PLD_SLIC_STATE_OC
:
7406 len
+= sprintf(buf
+ len
, "OC");
7408 case PLD_SLIC_STATE_RINGING
:
7409 len
+= sprintf(buf
+ len
, "RINGING");
7411 case PLD_SLIC_STATE_ACTIVE
:
7412 len
+= sprintf(buf
+ len
, "ACTIVE");
7414 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
7415 len
+= sprintf(buf
+ len
, "OHT");
7417 case PLD_SLIC_STATE_TIPOPEN
:
7418 len
+= sprintf(buf
+ len
, "TIPOPEN");
7420 case PLD_SLIC_STATE_STANDBY
:
7421 len
+= sprintf(buf
+ len
, "STANDBY");
7423 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
7424 len
+= sprintf(buf
+ len
, "APR");
7426 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
7427 len
+= sprintf(buf
+ len
, "OHTPR");
7430 len
+= sprintf(buf
+ len
, "%d", SLIC_GetState(j
));
7434 len
+= sprintf(buf
+ len
, "\nBase Frame %2.2x.%2.2x", j
->baseframe
.high
, j
->baseframe
.low
);
7435 len
+= sprintf(buf
+ len
, "\nCID Base Frame %2d", j
->cid_base_frame_size
);
7436 #ifdef PERFMON_STATS
7437 len
+= sprintf(buf
+ len
, "\nTimer Checks %ld", j
->timerchecks
);
7438 len
+= sprintf(buf
+ len
, "\nRX Ready Checks %ld", j
->rxreadycheck
);
7439 len
+= sprintf(buf
+ len
, "\nTX Ready Checks %ld", j
->txreadycheck
);
7440 len
+= sprintf(buf
+ len
, "\nFrames Read %ld", j
->framesread
);
7441 len
+= sprintf(buf
+ len
, "\nFrames Written %ld", j
->frameswritten
);
7442 len
+= sprintf(buf
+ len
, "\nDry Buffer %ld", j
->drybuffer
);
7443 len
+= sprintf(buf
+ len
, "\nRead Waits %ld", j
->read_wait
);
7444 len
+= sprintf(buf
+ len
, "\nWrite Waits %ld", j
->write_wait
);
7445 len
+= sprintf(buf
+ len
, "\nStatus Waits %ld", j
->statuswait
);
7446 len
+= sprintf(buf
+ len
, "\nStatus Wait Fails %ld", j
->statuswaitfail
);
7447 len
+= sprintf(buf
+ len
, "\nPControl Waits %ld", j
->pcontrolwait
);
7448 len
+= sprintf(buf
+ len
, "\nPControl Wait Fails %ld", j
->pcontrolwaitfail
);
7449 len
+= sprintf(buf
+ len
, "\nIs Control Ready Checks %ld", j
->iscontrolready
);
7450 len
+= sprintf(buf
+ len
, "\nIs Control Ready Check failures %ld", j
->iscontrolreadyfail
);
7453 len
+= sprintf(buf
+ len
, "\n");
7459 static int ixj_read_proc(char *page
, char **start
, off_t off
,
7460 int count
, int *eof
, void *data
)
7462 int len
= ixj_get_status_proc(page
);
7463 if (len
<= off
+count
) *eof
= 1;
7464 *start
= page
+ off
;
7466 if (len
>count
) len
= count
;
7472 static void cleanup(void)
7477 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
7479 if(j
!= NULL
&& j
->DSPbase
) {
7480 if (ixjdebug
& 0x0002)
7481 printk(KERN_INFO
"IXJ: Deleting timer for /dev/phone%d\n", cnt
);
7482 del_timer(&j
->timer
);
7483 if (j
->cardtype
== QTI_LINEJACK
) {
7484 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
7486 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
7487 j
->pld_slicw
.bits
.rly1
= 0;
7488 j
->pld_slicw
.bits
.rly2
= 0;
7489 j
->pld_slicw
.bits
.rly3
= 0;
7490 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
7491 LED_SetState(0x0, j
);
7492 if (ixjdebug
& 0x0002)
7493 printk(KERN_INFO
"IXJ: Releasing XILINX address for /dev/phone%d\n", cnt
);
7494 release_region(j
->XILINXbase
, 8);
7495 } else if (j
->cardtype
== QTI_PHONEJACK_LITE
|| j
->cardtype
== QTI_PHONEJACK_PCI
) {
7496 if (ixjdebug
& 0x0002)
7497 printk(KERN_INFO
"IXJ: Releasing XILINX address for /dev/phone%d\n", cnt
);
7498 release_region(j
->XILINXbase
, 4);
7501 kfree(j
->read_buffer
);
7502 if (j
->write_buffer
)
7503 kfree(j
->write_buffer
);
7505 pnp_device_detach(j
->dev
);
7506 if (ixjdebug
& 0x0002)
7507 printk(KERN_INFO
"IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt
);
7508 phone_unregister_device(&j
->p
);
7509 if (ixjdebug
& 0x0002)
7510 printk(KERN_INFO
"IXJ: Releasing DSP address for /dev/phone%d\n", cnt
);
7511 release_region(j
->DSPbase
, 16);
7512 #ifdef IXJ_DYN_ALLOC
7513 if (ixjdebug
& 0x0002)
7514 printk(KERN_INFO
"IXJ: Freeing memory for /dev/phone%d\n", cnt
);
7520 if (ixjdebug
& 0x0002)
7521 printk(KERN_INFO
"IXJ: Removing /proc/ixj\n");
7522 remove_proc_entry ("ixj", NULL
);
7531 static void PCIEE_WriteBit(WORD wEEPROMAddress
, BYTE lastLCC
, BYTE byData
)
7533 lastLCC
= lastLCC
& 0xfb;
7534 lastLCC
= lastLCC
| (byData
? 4 : 0);
7535 outb(lastLCC
, wEEPROMAddress
); /*set data out bit as appropriate */
7538 lastLCC
= lastLCC
| 0x01;
7539 outb(lastLCC
, wEEPROMAddress
); /*SK rising edge */
7541 byData
= byData
<< 1;
7542 lastLCC
= lastLCC
& 0xfe;
7544 outb(lastLCC
, wEEPROMAddress
); /*after delay, SK falling edge */
7548 static BYTE
PCIEE_ReadBit(WORD wEEPROMAddress
, BYTE lastLCC
)
7551 lastLCC
= lastLCC
| 0x01;
7552 outb(lastLCC
, wEEPROMAddress
); /*SK rising edge */
7554 lastLCC
= lastLCC
& 0xfe;
7556 outb(lastLCC
, wEEPROMAddress
); /*after delay, SK falling edge */
7558 return ((inb(wEEPROMAddress
) >> 3) & 1);
7561 static BOOL
PCIEE_ReadWord(WORD wAddress
, WORD wLoc
, WORD
* pwResult
)
7564 WORD wEEPROMAddress
= wAddress
+ 3;
7568 lastLCC
= inb(wEEPROMAddress
);
7569 lastLCC
= lastLCC
| 0x02;
7570 lastLCC
= lastLCC
& 0xfe;
7571 outb(lastLCC
, wEEPROMAddress
); /* CS hi, SK lo */
7573 mdelay(1); /* delay */
7575 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
7576 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
7577 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 0);
7578 for (i
= 0; i
< 8; i
++) {
7579 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, wLoc
& 0x80 ? 1 : 0);
7583 for (i
= 0; i
< 16; i
++) {
7584 byResult
= PCIEE_ReadBit(wEEPROMAddress
, lastLCC
);
7585 *pwResult
= (*pwResult
<< 1) | byResult
;
7588 mdelay(1); /* another delay */
7590 lastLCC
= lastLCC
& 0xfd;
7591 outb(lastLCC
, wEEPROMAddress
); /* negate CS */
7596 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
)
7599 if (PCIEE_ReadWord(wAddress
, 62, &wLo
))
7601 if (PCIEE_ReadWord(wAddress
, 63, &wHi
))
7603 return (((DWORD
) wHi
<< 16) | wLo
);
7606 static int dspio
[IXJMAX
+ 1] =
7610 static int xio
[IXJMAX
+ 1] =
7615 module_param_array(dspio
, int, NULL
, 0);
7616 module_param_array(xio
, int, NULL
, 0);
7617 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7618 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7619 MODULE_LICENSE("GPL");
7621 static void __exit
ixj_exit(void)
7626 static IXJ
*new_ixj(unsigned long port
)
7629 if (!request_region(port
, 16, "ixj DSP")) {
7630 printk(KERN_INFO
"ixj: can't get I/O address 0x%lx\n", port
);
7635 release_region(port
, 16);
7636 printk(KERN_INFO
"ixj: out of memory\n");
7639 res
->DSPbase
= port
;
7643 static int __init
ixj_probe_isapnp(int *cnt
)
7647 struct pnp_dev
*dev
= NULL
, *old_dev
= NULL
;
7655 dev
= pnp_find_dev(NULL
, ISAPNP_VENDOR('Q', 'T', 'I'),
7656 ISAPNP_FUNCTION(func
), old_dev
);
7657 if (!dev
|| !dev
->card
)
7659 result
= pnp_device_attach(dev
);
7661 printk("pnp attach failed %d \n", result
);
7664 if (pnp_activate_dev(dev
) < 0) {
7665 printk("pnp activate failed (out of resources?)\n");
7666 pnp_device_detach(dev
);
7670 if (!pnp_port_valid(dev
, 0)) {
7671 pnp_device_detach(dev
);
7675 j
= new_ixj(pnp_port_start(dev
, 0));
7680 j
->XILINXbase
= pnp_port_start(dev
, 1); /* get real port */
7684 j
->cardtype
= QTI_PHONEJACK
;
7687 j
->cardtype
= QTI_LINEJACK
;
7690 j
->cardtype
= QTI_PHONEJACK_LITE
;
7694 probe
= ixj_selfprobe(j
);
7696 j
->serial
= dev
->card
->serial
;
7700 printk(KERN_INFO
"ixj: found Internet PhoneJACK at 0x%x\n", j
->DSPbase
);
7703 printk(KERN_INFO
"ixj: found Internet LineJACK at 0x%x\n", j
->DSPbase
);
7706 printk(KERN_INFO
"ixj: found Internet PhoneJACK Lite at 0x%x\n", j
->DSPbase
);
7723 static int __init
ixj_probe_isa(int *cnt
)
7727 /* Use passed parameters for older kernels without PnP */
7728 for (i
= 0; i
< IXJMAX
; i
++) {
7730 IXJ
*j
= new_ixj(dspio
[i
]);
7735 j
->XILINXbase
= xio
[i
];
7739 probe
= ixj_selfprobe(j
);
7747 static int __init
ixj_probe_pci(int *cnt
)
7749 struct pci_dev
*pci
= NULL
;
7753 for (i
= 0; i
< IXJMAX
- *cnt
; i
++) {
7754 pci
= pci_find_device(0x15E2, 0x0500, pci
);
7758 if (pci_enable_device(pci
))
7760 j
= new_ixj(pci_resource_start(pci
, 0));
7764 j
->serial
= (PCIEE_GetSerialNumber
)pci_resource_start(pci
, 2);
7765 j
->XILINXbase
= j
->DSPbase
+ 0x10;
7766 j
->cardtype
= QTI_PHONEJACK_PCI
;
7768 probe
= ixj_selfprobe(j
);
7770 printk(KERN_INFO
"ixj: found Internet PhoneJACK PCI at 0x%x\n", j
->DSPbase
);
7776 static int __init
ixj_init(void)
7783 /* These might be no-ops, see above. */
7784 if ((probe
= ixj_probe_isapnp(&cnt
)) < 0) {
7787 if ((probe
= ixj_probe_isa(&cnt
)) < 0) {
7790 if ((probe
= ixj_probe_pci(&cnt
)) < 0) {
7793 printk(KERN_INFO
"ixj driver initialized.\n");
7794 create_proc_read_entry ("ixj", 0, NULL
, ixj_read_proc
, NULL
);
7798 module_init(ixj_init
);
7799 module_exit(ixj_exit
);
7801 static void DAA_Coeff_US(IXJ
*j
)
7805 j
->daa_country
= DAA_US
;
7806 /*----------------------------------------------- */
7808 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
7809 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
7812 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7813 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x03;
7814 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0x4B;
7815 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0x5D;
7816 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xCD;
7817 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0x24;
7818 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xC5;
7819 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
7820 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
7821 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7822 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x71;
7823 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x1A;
7824 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
7825 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0A;
7826 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xB5;
7827 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
7828 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
7829 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
7830 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7831 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x05;
7832 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0xA3;
7833 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x72;
7834 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
7835 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x3F;
7836 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x3B;
7837 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x30;
7838 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
7839 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7840 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x05;
7841 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x87;
7842 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF9;
7843 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x3E;
7844 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x32;
7845 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xDA;
7846 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
7847 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
7848 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7849 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x41;
7850 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xB5;
7851 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
7852 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
7853 /* Bytes for AR-filter (09): 52,D3,11,42 */
7854 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x25;
7855 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xC7;
7856 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
7857 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
7858 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7859 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
7860 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
7861 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
7862 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
7863 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xA5;
7864 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
7865 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
7866 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
7867 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7868 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
7869 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xA2;
7870 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2B;
7871 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xB0;
7872 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0xE8;
7873 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAB;
7874 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x81;
7875 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xCC;
7876 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7877 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
7878 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
7879 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xD2;
7880 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x24;
7881 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xBA;
7882 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xA9;
7883 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x3B;
7884 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xA6;
7885 /* ; (10K, 0.68uF) */
7887 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7888 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
7889 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
7890 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
7891 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
7892 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
7893 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
7894 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
7895 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
7896 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7897 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
7898 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
7899 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
7900 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
7901 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
7902 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
7903 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
7904 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
7906 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7907 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
7908 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
7909 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
7910 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
7912 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7913 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7914 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7915 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7916 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7917 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7918 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7919 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7920 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7921 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7922 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7923 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7924 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7925 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7926 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7927 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7928 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7929 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7931 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7932 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7933 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7934 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7935 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7937 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7938 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
7939 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
7940 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
7941 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
7942 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
7943 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
7944 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
7945 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
7946 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7947 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
7948 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
7949 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
7950 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
7951 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
7952 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
7953 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
7954 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
7957 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7958 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
7959 /* Config. Reg. 1 (dialing) (cr1):05 */
7960 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
7961 /* Config. Reg. 2 (caller ID) (cr2):04 */
7962 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
7963 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7964 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
7965 /* Config. Reg. 4 (analog gain) (cr4):02 */
7966 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
7967 /* Config. Reg. 5 (Version) (cr5):02 */
7968 /* Config. Reg. 6 (Reserved) (cr6):00 */
7969 /* Config. Reg. 7 (Reserved) (cr7):00 */
7972 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7974 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
7975 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7977 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x3C;
7978 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7979 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
7980 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7981 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x3B; /*0x32; */
7982 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7984 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
7985 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7986 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
7987 /* Ext. Reg. 6 (Power State) (xr6):00 */
7988 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
7989 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7990 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
7992 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7993 /* 12,33,5A,C3 ; 770 Hz */
7994 /* 13,3C,5B,32 ; 852 Hz */
7995 /* 1D,1B,5C,CC ; 941 Hz */
7997 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
7998 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
7999 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8000 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8001 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8002 /* EC,1D,52,22 ; 1336 Hz */
8003 /* AA,AC,51,D2 ; 1477 Hz */
8004 /* 9B,3B,51,25 ; 1633 Hz */
8005 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8006 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8007 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8008 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8011 static void DAA_Coeff_UK(IXJ
*j
)
8015 j
->daa_country
= DAA_UK
;
8016 /*----------------------------------------------- */
8018 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8019 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8022 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
8023 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
8024 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xC2;
8025 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
8026 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xA8;
8027 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xCB;
8028 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
8029 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
8030 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8031 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
8032 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x40;
8033 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x00;
8034 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8035 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0A;
8036 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xA4;
8037 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
8038 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
8039 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8040 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
8041 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8042 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9B;
8043 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xED;
8044 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x24;
8045 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0xB2;
8046 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0xA2;
8047 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xA0;
8048 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8049 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8050 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
8051 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x92;
8052 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF2;
8053 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0xB2;
8054 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
8055 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xD2;
8056 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x30;
8057 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8058 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8059 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x1B;
8060 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xA5;
8061 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8062 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8063 /* Bytes for AR-filter (09): E2,27,10,D6 */
8064 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
8065 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x27;
8066 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8067 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8068 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8069 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8070 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x2D;
8071 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x38;
8072 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x8B;
8073 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xD0;
8074 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x00;
8075 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8076 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8077 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8078 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8079 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x5A;
8080 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x53;
8081 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xF0;
8082 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x0B;
8083 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5F;
8084 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x84;
8085 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xD4;
8086 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8087 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8088 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8089 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x6A;
8090 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA4;
8091 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x8F;
8092 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x52;
8093 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xF5;
8094 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x32;
8096 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8097 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8098 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8099 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8100 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8101 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8102 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8103 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8104 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8105 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8106 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8107 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8108 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8109 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8110 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8111 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8112 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8113 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8114 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8115 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
8116 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
8117 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8118 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8119 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8120 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8121 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8122 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8123 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8124 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8125 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8126 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8127 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8128 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8129 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8130 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8131 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8132 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8133 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8134 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8135 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8136 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8138 /* Config. Reg. 0 (filters) (cr0):FF */
8139 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8140 /* Config. Reg. 1 (dialing) (cr1):05 */
8141 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8142 /* Config. Reg. 2 (caller ID) (cr2):04 */
8143 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8144 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8145 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8146 /* Config. Reg. 4 (analog gain) (cr4):02 */
8147 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8148 /* Config. Reg. 5 (Version) (cr5):02 */
8149 /* Config. Reg. 6 (Reserved) (cr6):00 */
8150 /* Config. Reg. 7 (Reserved) (cr7):00 */
8152 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8154 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8155 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8157 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8158 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8160 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8161 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8162 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
8163 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8164 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8165 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8166 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8167 /* Ext. Reg. 6 (Power State) (xr6):00 */
8168 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8169 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8170 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; /* 0x46 ??? Should it be 0x00? */
8171 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8172 /* 12,33,5A,C3 ; 770 Hz */
8173 /* 13,3C,5B,32 ; 852 Hz */
8174 /* 1D,1B,5C,CC ; 941 Hz */
8176 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8177 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8178 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8179 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8180 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8181 /* EC,1D,52,22 ; 1336 Hz */
8182 /* AA,AC,51,D2 ; 1477 Hz */
8183 /* 9B,3B,51,25 ; 1633 Hz */
8184 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8185 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8186 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8187 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8191 static void DAA_Coeff_France(IXJ
*j
)
8195 j
->daa_country
= DAA_FRANCE
;
8196 /*----------------------------------------------- */
8198 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8199 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8202 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8203 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x02;
8204 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA2;
8205 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0x43;
8206 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2C;
8207 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0x22;
8208 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xAF;
8209 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
8210 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8211 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8212 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x67;
8213 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xCE;
8214 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8215 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x2C;
8216 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x22;
8217 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
8218 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
8219 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8220 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8221 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8222 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9A;
8223 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x28;
8224 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0xF6;
8225 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x23;
8226 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x4A;
8227 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xB0;
8228 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8229 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8230 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
8231 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
8232 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF9;
8233 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
8234 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9E;
8235 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xFA;
8236 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
8237 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8238 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8239 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x16;
8240 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xB5;
8241 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8242 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8243 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8244 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
8245 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xC7;
8246 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8247 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8248 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8249 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
8250 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
8251 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8252 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8253 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xA6;
8254 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8255 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8256 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8257 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8258 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8259 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAC;
8260 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
8261 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x30;
8262 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x78;
8263 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAC;
8264 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x8A;
8265 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x2C;
8266 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8267 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8268 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8269 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
8270 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA5;
8271 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x22;
8272 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xBA;
8273 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x2C;
8274 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x45;
8276 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8277 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8278 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8279 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8280 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8281 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8282 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8283 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8284 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8285 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8286 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8287 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8288 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8289 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8290 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8291 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8292 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8293 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8294 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8295 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
8296 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8297 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
8298 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
8299 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8300 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8301 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8302 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8303 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8304 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8305 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8306 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8307 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8308 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8309 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8310 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8311 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8312 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8313 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8314 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8315 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8316 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8318 /* Config. Reg. 0 (filters) (cr0):FF */
8319 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8320 /* Config. Reg. 1 (dialing) (cr1):05 */
8321 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8322 /* Config. Reg. 2 (caller ID) (cr2):04 */
8323 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8324 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8325 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8326 /* Config. Reg. 4 (analog gain) (cr4):02 */
8327 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8328 /* Config. Reg. 5 (Version) (cr5):02 */
8329 /* Config. Reg. 6 (Reserved) (cr6):00 */
8330 /* Config. Reg. 7 (Reserved) (cr7):00 */
8332 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8334 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8335 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8337 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8338 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8340 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8341 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8342 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
8343 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8344 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8345 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8346 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8347 /* Ext. Reg. 6 (Power State) (xr6):00 */
8348 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8349 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8350 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; /* 0x46 ??? Should it be 0x00? */
8351 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8352 /* 12,33,5A,C3 ; 770 Hz */
8353 /* 13,3C,5B,32 ; 852 Hz */
8354 /* 1D,1B,5C,CC ; 941 Hz */
8356 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8357 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8358 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8359 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8360 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8361 /* EC,1D,52,22 ; 1336 Hz */
8362 /* AA,AC,51,D2 ; 1477 Hz */
8363 /* 9B,3B,51,25 ; 1633 Hz */
8364 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8365 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8366 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8367 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8371 static void DAA_Coeff_Germany(IXJ
*j
)
8375 j
->daa_country
= DAA_GERMANY
;
8376 /*----------------------------------------------- */
8378 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8379 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8382 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8383 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
8384 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xCE;
8385 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
8386 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xB8;
8387 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xD2;
8388 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
8389 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xB0;
8390 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8391 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8392 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x45;
8393 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x8F;
8394 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8395 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0C;
8396 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xD2;
8397 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x3A;
8398 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xD0;
8399 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8400 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8401 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8402 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0xAA;
8403 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
8404 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
8405 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x24;
8406 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x89;
8407 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x20;
8408 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8409 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8410 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x02;
8411 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x87;
8412 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xFA;
8413 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x37;
8414 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9A;
8415 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCA;
8416 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
8417 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8418 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8419 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x72;
8420 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xD5;
8421 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8422 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8423 /* Bytes for AR-filter (09): 72,42,13,4B */
8424 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x72;
8425 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x42;
8426 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x13;
8427 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0x4B;
8428 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8429 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8430 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
8431 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8432 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8433 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAD;
8434 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8435 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8436 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8437 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8438 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8439 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x42;
8440 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x5A;
8441 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
8442 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0xE8;
8443 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x1A;
8444 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x81;
8445 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x27;
8446 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8447 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8448 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8449 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x63;
8450 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x26;
8451 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xBD;
8452 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x4B;
8453 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xA3;
8454 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xC2;
8455 /* ; (10K, 0.68uF) */
8456 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8457 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8458 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3B;
8459 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x9B;
8460 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0xBA;
8461 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0xD4;
8462 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x1C;
8463 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xB3;
8464 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8465 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8466 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x13;
8467 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0x42;
8468 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8469 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8470 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0xD4;
8471 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x73;
8472 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0xCA;
8473 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8474 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8475 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xB2;
8476 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8477 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8478 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8479 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8480 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8481 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8482 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8483 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8484 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8485 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8486 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8487 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8488 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8489 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8490 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8491 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8492 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8493 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8494 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8495 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8496 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8498 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8499 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8500 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8501 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8502 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8503 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8504 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8505 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8506 /* Config. Reg. 4 (analog gain) (cr4):02 */
8507 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8508 /* Config. Reg. 5 (Version) (cr5):02 */
8509 /* Config. Reg. 6 (Reserved) (cr6):00 */
8510 /* Config. Reg. 7 (Reserved) (cr7):00 */
8512 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8514 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8515 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8517 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8518 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8520 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8521 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8522 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x32;
8523 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8524 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8525 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8526 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8527 /* Ext. Reg. 6 (Power State) (xr6):00 */
8528 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8529 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8530 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8531 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8532 /* 12,33,5A,C3 ; 770 Hz */
8533 /* 13,3C,5B,32 ; 852 Hz */
8534 /* 1D,1B,5C,CC ; 941 Hz */
8536 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8537 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8538 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8539 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8540 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8541 /* EC,1D,52,22 ; 1336 Hz */
8542 /* AA,AC,51,D2 ; 1477 Hz */
8543 /* 9B,3B,51,25 ; 1633 Hz */
8544 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8545 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8546 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8547 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8551 static void DAA_Coeff_Australia(IXJ
*j
)
8555 j
->daa_country
= DAA_AUSTRALIA
;
8556 /*----------------------------------------------- */
8558 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8559 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8562 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8563 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
8564 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA3;
8565 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xAA;
8566 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x28;
8567 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xB3;
8568 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x82;
8569 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xD0;
8570 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8571 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8572 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x70;
8573 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x96;
8574 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8575 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x09;
8576 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x32;
8577 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x6B;
8578 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xC0;
8579 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8580 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8581 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8582 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x96;
8583 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
8584 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
8585 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x32;
8586 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x9B;
8587 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x30;
8588 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8589 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8590 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
8591 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x9A;
8592 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xE9;
8593 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
8594 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x22;
8595 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCC;
8596 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xA0;
8597 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8598 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8599 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0xCB;
8600 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0x45;
8601 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8602 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8603 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8604 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x1B;
8605 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x67;
8606 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8607 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8608 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8609 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8610 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
8611 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8612 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8613 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAF;
8614 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8615 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8616 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8617 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8618 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8619 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xDB;
8620 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x52;
8621 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xB0;
8622 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x38;
8623 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x01;
8624 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x82;
8625 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xAC;
8626 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8627 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8628 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8629 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x4A;
8630 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x3E;
8631 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x2C;
8632 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x3B;
8633 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x24;
8634 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x46;
8636 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8637 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8638 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8639 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8640 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8641 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8642 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8643 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8644 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8645 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8646 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8647 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8648 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8649 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8650 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8651 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8652 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8653 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8654 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8655 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
8656 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8657 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
8658 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
8659 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8660 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8661 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8662 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8663 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8664 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8665 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8666 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8667 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8668 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8669 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8670 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8671 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8672 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8673 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8674 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8675 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8676 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8678 /* Config. Reg. 0 (filters) (cr0):FF */
8679 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8680 /* Config. Reg. 1 (dialing) (cr1):05 */
8681 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8682 /* Config. Reg. 2 (caller ID) (cr2):04 */
8683 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8684 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8685 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8686 /* Config. Reg. 4 (analog gain) (cr4):02 */
8687 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8688 /* Config. Reg. 5 (Version) (cr5):02 */
8689 /* Config. Reg. 6 (Reserved) (cr6):00 */
8690 /* Config. Reg. 7 (Reserved) (cr7):00 */
8692 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8694 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8695 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8697 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8698 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8700 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8701 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8702 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x2B;
8703 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8704 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8705 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8706 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8707 /* Ext. Reg. 6 (Power State) (xr6):00 */
8708 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8709 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8710 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8712 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8713 /* 12,33,5A,C3 ; 770 Hz */
8714 /* 13,3C,5B,32 ; 852 Hz */
8715 /* 1D,1B,5C,CC ; 941 Hz */
8716 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8717 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8718 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8719 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8721 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8722 /* EC,1D,52,22 ; 1336 Hz */
8723 /* AA,AC,51,D2 ; 1477 Hz */
8724 /* 9B,3B,51,25 ; 1633 Hz */
8725 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8726 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8727 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8728 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8731 static void DAA_Coeff_Japan(IXJ
*j
)
8735 j
->daa_country
= DAA_JAPAN
;
8736 /*----------------------------------------------- */
8738 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8739 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8742 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8743 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x06;
8744 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xBD;
8745 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xE2;
8746 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2D;
8747 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xBA;
8748 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xF9;
8749 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
8750 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8751 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8752 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x6F;
8753 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xF7;
8754 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8755 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0E;
8756 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x34;
8757 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
8758 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
8759 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8760 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8761 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x02;
8762 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x8F;
8763 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x68;
8764 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x77;
8765 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x9C;
8766 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x58;
8767 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xF0;
8768 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8769 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8770 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
8771 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
8772 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0x38;
8773 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x73;
8774 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
8775 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xEA;
8776 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
8777 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8778 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8779 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x51;
8780 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xC5;
8781 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8782 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8783 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8784 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x25;
8785 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xA7;
8786 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8787 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8788 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8789 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
8790 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
8791 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8792 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8793 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAE;
8794 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8795 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8796 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8797 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8798 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8799 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAB;
8800 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
8801 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
8802 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x99;
8803 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5B;
8804 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x89;
8805 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x28;
8806 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8807 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8808 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8809 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
8810 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x25;
8811 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x34;
8812 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xC5;
8813 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x4C;
8814 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xBA;
8816 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8817 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8818 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8819 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8820 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8821 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8822 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8823 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8824 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8825 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8826 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8827 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8828 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8829 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8830 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8831 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8832 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8833 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8834 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8835 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
8836 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
8837 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8838 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8839 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8840 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8841 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8842 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8843 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8844 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8845 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8846 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8847 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8848 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8849 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8850 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8851 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8852 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8853 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8854 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8855 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8856 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8858 /* Config. Reg. 0 (filters) (cr0):FF */
8859 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8860 /* Config. Reg. 1 (dialing) (cr1):05 */
8861 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8862 /* Config. Reg. 2 (caller ID) (cr2):04 */
8863 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8864 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8865 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8866 /* Config. Reg. 4 (analog gain) (cr4):02 */
8867 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8868 /* Config. Reg. 5 (Version) (cr5):02 */
8869 /* Config. Reg. 6 (Reserved) (cr6):00 */
8870 /* Config. Reg. 7 (Reserved) (cr7):00 */
8872 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8874 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8875 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8877 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8878 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8880 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8881 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8882 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x22;
8883 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8884 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8885 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8886 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8887 /* Ext. Reg. 6 (Power State) (xr6):00 */
8888 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8889 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8890 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8891 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8892 /* 12,33,5A,C3 ; 770 Hz */
8893 /* 13,3C,5B,32 ; 852 Hz */
8894 /* 1D,1B,5C,CC ; 941 Hz */
8896 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8897 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8898 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8899 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8900 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8901 /* EC,1D,52,22 ; 1336 Hz */
8902 /* AA,AC,51,D2 ; 1477 Hz */
8903 /* 9B,3B,51,25 ; 1633 Hz */
8904 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8905 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8906 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8907 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8910 static s16 tone_table
[][19] =
8913 32538, /* A1 = 1.985962 */
8914 -32325, /* A2 = -0.986511 */
8915 -343, /* B2 = -0.010493 */
8917 343, /* B0 = 0.010493 */
8918 32619, /* A1 = 1.990906 */
8919 -32520, /* A2 = -0.992462 */
8920 19179, /* B2 = 0.585327 */
8921 -19178, /* B1 = -1.170593 */
8922 19179, /* B0 = 0.585327 */
8923 32723, /* A1 = 1.997314 */
8924 -32686, /* A2 = -0.997528 */
8925 9973, /* B2 = 0.304352 */
8926 -9955, /* B1 = -0.607605 */
8927 9973, /* B0 = 0.304352 */
8928 7, /* Internal filter scaling */
8929 159, /* Minimum in-band energy threshold */
8930 21, /* 21/32 in-band to broad-band ratio */
8931 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8933 { /* f133_200[] 12 */
8934 32072, /* A1 = 1.95752 */
8935 -31896, /* A2 = -0.973419 */
8936 -435, /* B2 = -0.013294 */
8938 435, /* B0 = 0.013294 */
8939 32188, /* A1 = 1.9646 */
8940 -32400, /* A2 = -0.98877 */
8941 15139, /* B2 = 0.462036 */
8942 -14882, /* B1 = -0.908356 */
8943 15139, /* B0 = 0.462036 */
8944 32473, /* A1 = 1.981995 */
8945 -32524, /* A2 = -0.992584 */
8946 23200, /* B2 = 0.708008 */
8947 -23113, /* B1 = -1.410706 */
8948 23200, /* B0 = 0.708008 */
8949 7, /* Internal filter scaling */
8950 159, /* Minimum in-band energy threshold */
8951 21, /* 21/32 in-band to broad-band ratio */
8952 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8955 31769, /* A1 = -1.939026 */
8956 -32584, /* A2 = 0.994385 */
8957 -475, /* B2 = -0.014522 */
8958 0, /* B1 = 0.000000 */
8959 475, /* B0 = 0.014522 */
8960 31789, /* A1 = -1.940247 */
8961 -32679, /* A2 = 0.997284 */
8962 17280, /* B2 = 0.527344 */
8963 -16865, /* B1 = -1.029358 */
8964 17280, /* B0 = 0.527344 */
8965 31841, /* A1 = -1.943481 */
8966 -32681, /* A2 = 0.997345 */
8967 543, /* B2 = 0.016579 */
8968 -525, /* B1 = -0.032097 */
8969 543, /* B0 = 0.016579 */
8970 5, /* Internal filter scaling */
8971 159, /* Minimum in-band energy threshold */
8972 21, /* 21/32 in-band to broad-band ratio */
8973 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8975 { /* f300_420[] 14 */
8976 30750, /* A1 = 1.876892 */
8977 -31212, /* A2 = -0.952515 */
8978 -804, /* B2 = -0.024541 */
8980 804, /* B0 = 0.024541 */
8981 30686, /* A1 = 1.872925 */
8982 -32145, /* A2 = -0.980988 */
8983 14747, /* B2 = 0.450043 */
8984 -13703, /* B1 = -0.836395 */
8985 14747, /* B0 = 0.450043 */
8986 31651, /* A1 = 1.931824 */
8987 -32321, /* A2 = -0.986389 */
8988 24425, /* B2 = 0.745422 */
8989 -23914, /* B1 = -1.459595 */
8990 24427, /* B0 = 0.745483 */
8991 7, /* Internal filter scaling */
8992 159, /* Minimum in-band energy threshold */
8993 21, /* 21/32 in-band to broad-band ratio */
8994 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8997 31613, /* A1 = -1.929565 */
8998 -32646, /* A2 = 0.996277 */
8999 -185, /* B2 = -0.005657 */
9000 0, /* B1 = 0.000000 */
9001 185, /* B0 = 0.005657 */
9002 31620, /* A1 = -1.929932 */
9003 -32713, /* A2 = 0.998352 */
9004 19253, /* B2 = 0.587585 */
9005 -18566, /* B1 = -1.133179 */
9006 19253, /* B0 = 0.587585 */
9007 31674, /* A1 = -1.933228 */
9008 -32715, /* A2 = 0.998413 */
9009 2575, /* B2 = 0.078590 */
9010 -2495, /* B1 = -0.152283 */
9011 2575, /* B0 = 0.078590 */
9012 5, /* Internal filter scaling */
9013 159, /* Minimum in-band energy threshold */
9014 21, /* 21/32 in-band to broad-band ratio */
9015 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9017 { /* f300_425[] 16 */
9018 30741, /* A1 = 1.876282 */
9019 -31475, /* A2 = -0.960541 */
9020 -703, /* B2 = -0.021484 */
9022 703, /* B0 = 0.021484 */
9023 30688, /* A1 = 1.873047 */
9024 -32248, /* A2 = -0.984161 */
9025 14542, /* B2 = 0.443787 */
9026 -13523, /* B1 = -0.825439 */
9027 14542, /* B0 = 0.443817 */
9028 31494, /* A1 = 1.922302 */
9029 -32366, /* A2 = -0.987762 */
9030 21577, /* B2 = 0.658508 */
9031 -21013, /* B1 = -1.282532 */
9032 21577, /* B0 = 0.658508 */
9033 7, /* Internal filter scaling */
9034 159, /* Minimum in-band energy threshold */
9035 21, /* 21/32 in-band to broad-band ratio */
9036 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9038 { /* f330_440[] 17 */
9039 30627, /* A1 = 1.869324 */
9040 -31338, /* A2 = -0.95636 */
9041 -843, /* B2 = -0.025749 */
9043 843, /* B0 = 0.025749 */
9044 30550, /* A1 = 1.864685 */
9045 -32221, /* A2 = -0.983337 */
9046 13594, /* B2 = 0.414886 */
9047 -12589, /* B1 = -0.768402 */
9048 13594, /* B0 = 0.414886 */
9049 31488, /* A1 = 1.921936 */
9050 -32358, /* A2 = -0.987518 */
9051 24684, /* B2 = 0.753296 */
9052 -24029, /* B1 = -1.466614 */
9053 24684, /* B0 = 0.753296 */
9054 7, /* Internal filter scaling */
9055 159, /* Minimum in-band energy threshold */
9056 21, /* 21/32 in-band to broad-band ratio */
9057 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9060 31546, /* A1 = -1.925476 */
9061 -32646, /* A2 = 0.996277 */
9062 -445, /* B2 = -0.013588 */
9063 0, /* B1 = 0.000000 */
9064 445, /* B0 = 0.013588 */
9065 31551, /* A1 = -1.925781 */
9066 -32713, /* A2 = 0.998352 */
9067 23884, /* B2 = 0.728882 */
9068 -22979, /* B1 = -1.402527 */
9069 23884, /* B0 = 0.728882 */
9070 31606, /* A1 = -1.929138 */
9071 -32715, /* A2 = 0.998413 */
9072 863, /* B2 = 0.026367 */
9073 -835, /* B1 = -0.050985 */
9074 863, /* B0 = 0.026367 */
9075 5, /* Internal filter scaling */
9076 159, /* Minimum in-band energy threshold */
9077 21, /* 21/32 in-band to broad-band ratio */
9078 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9080 { /* f350_400[] 19 */
9081 31006, /* A1 = 1.892517 */
9082 -32029, /* A2 = -0.977448 */
9083 -461, /* B2 = -0.014096 */
9085 461, /* B0 = 0.014096 */
9086 30999, /* A1 = 1.892029 */
9087 -32487, /* A2 = -0.991455 */
9088 11325, /* B2 = 0.345612 */
9089 -10682, /* B1 = -0.651978 */
9090 11325, /* B0 = 0.345612 */
9091 31441, /* A1 = 1.919067 */
9092 -32526, /* A2 = -0.992615 */
9093 24324, /* B2 = 0.74231 */
9094 -23535, /* B1 = -1.436523 */
9095 24324, /* B0 = 0.74231 */
9096 7, /* Internal filter scaling */
9097 159, /* Minimum in-band energy threshold */
9098 21, /* 21/32 in-band to broad-band ratio */
9099 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9102 30634, /* A1 = 1.869751 */
9103 -31533, /* A2 = -0.962341 */
9104 -680, /* B2 = -0.020782 */
9106 680, /* B0 = 0.020782 */
9107 30571, /* A1 = 1.865906 */
9108 -32277, /* A2 = -0.985016 */
9109 12894, /* B2 = 0.393524 */
9110 -11945, /* B1 = -0.729065 */
9111 12894, /* B0 = 0.393524 */
9112 31367, /* A1 = 1.91449 */
9113 -32379, /* A2 = -0.988129 */
9114 23820, /* B2 = 0.726929 */
9115 -23104, /* B1 = -1.410217 */
9116 23820, /* B0 = 0.726929 */
9117 7, /* Internal filter scaling */
9118 159, /* Minimum in-band energy threshold */
9119 21, /* 21/32 in-band to broad-band ratio */
9120 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9123 30552, /* A1 = 1.864807 */
9124 -31434, /* A2 = -0.95929 */
9125 -690, /* B2 = -0.021066 */
9127 690, /* B0 = 0.021066 */
9128 30472, /* A1 = 1.859924 */
9129 -32248, /* A2 = -0.984161 */
9130 13385, /* B2 = 0.408478 */
9131 -12357, /* B1 = -0.754242 */
9132 13385, /* B0 = 0.408478 */
9133 31358, /* A1 = 1.914001 */
9134 -32366, /* A2 = -0.987732 */
9135 26488, /* B2 = 0.80835 */
9136 -25692, /* B1 = -1.568176 */
9137 26490, /* B0 = 0.808411 */
9138 7, /* Internal filter scaling */
9139 159, /* Minimum in-band energy threshold */
9140 21, /* 21/32 in-band to broad-band ratio */
9141 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9144 31397, /* A1 = -1.916321 */
9145 -32623, /* A2 = 0.995605 */
9146 -117, /* B2 = -0.003598 */
9147 0, /* B1 = 0.000000 */
9148 117, /* B0 = 0.003598 */
9149 31403, /* A1 = -1.916687 */
9150 -32700, /* A2 = 0.997925 */
9151 3388, /* B2 = 0.103401 */
9152 -3240, /* B1 = -0.197784 */
9153 3388, /* B0 = 0.103401 */
9154 31463, /* A1 = -1.920410 */
9155 -32702, /* A2 = 0.997986 */
9156 13346, /* B2 = 0.407288 */
9157 -12863, /* B1 = -0.785126 */
9158 13346, /* B0 = 0.407288 */
9159 5, /* Internal filter scaling */
9160 159, /* Minimum in-band energy threshold */
9161 21, /* 21/32 in-band to broad-band ratio */
9162 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9165 30831, /* A1 = 1.881775 */
9166 -32064, /* A2 = -0.978546 */
9167 -367, /* B2 = -0.01122 */
9169 367, /* B0 = 0.01122 */
9170 30813, /* A1 = 1.880737 */
9171 -32456, /* A2 = -0.990509 */
9172 11068, /* B2 = 0.337769 */
9173 -10338, /* B1 = -0.631042 */
9174 11068, /* B0 = 0.337769 */
9175 31214, /* A1 = 1.905212 */
9176 -32491, /* A2 = -0.991577 */
9177 16374, /* B2 = 0.499695 */
9178 -15781, /* B1 = -0.963196 */
9179 16374, /* B0 = 0.499695 */
9180 7, /* Internal filter scaling */
9181 159, /* Minimum in-band energy threshold */
9182 21, /* 21/32 in-band to broad-band ratio */
9183 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9186 31152, /* A1 = -1.901428 */
9187 -32613, /* A2 = 0.995300 */
9188 -314, /* B2 = -0.009605 */
9189 0, /* B1 = 0.000000 */
9190 314, /* B0 = 0.009605 */
9191 31156, /* A1 = -1.901672 */
9192 -32694, /* A2 = 0.997742 */
9193 28847, /* B2 = 0.880371 */
9194 -2734, /* B1 = -0.166901 */
9195 28847, /* B0 = 0.880371 */
9196 31225, /* A1 = -1.905823 */
9197 -32696, /* A2 = 0.997803 */
9198 462, /* B2 = 0.014108 */
9199 -442, /* B1 = -0.027019 */
9200 462, /* B0 = 0.014108 */
9201 5, /* Internal filter scaling */
9202 159, /* Minimum in-band energy threshold */
9203 21, /* 21/32 in-band to broad-band ratio */
9204 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9207 30836, /* A1 = 1.882141 */
9208 -32296, /* A2 = -0.985596 */
9209 -324, /* B2 = -0.009903 */
9211 324, /* B0 = 0.009903 */
9212 30825, /* A1 = 1.881409 */
9213 -32570, /* A2 = -0.993958 */
9214 16847, /* B2 = 0.51416 */
9215 -15792, /* B1 = -0.963898 */
9216 16847, /* B0 = 0.51416 */
9217 31106, /* A1 = 1.89856 */
9218 -32584, /* A2 = -0.994415 */
9219 9579, /* B2 = 0.292328 */
9220 -9164, /* B1 = -0.559357 */
9221 9579, /* B0 = 0.292328 */
9222 7, /* Internal filter scaling */
9223 159, /* Minimum in-band energy threshold */
9224 21, /* 21/32 in-band to broad-band ratio */
9225 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9228 30702, /* A1 = 1.873962 */
9229 -32134, /* A2 = -0.980682 */
9230 -517, /* B2 = -0.015793 */
9232 517, /* B0 = 0.015793 */
9233 30676, /* A1 = 1.872375 */
9234 -32520, /* A2 = -0.992462 */
9235 8144, /* B2 = 0.24855 */
9236 -7596, /* B1 = -0.463684 */
9237 8144, /* B0 = 0.24855 */
9238 31084, /* A1 = 1.897217 */
9239 -32547, /* A2 = -0.993256 */
9240 22713, /* B2 = 0.693176 */
9241 -21734, /* B1 = -1.326599 */
9242 22713, /* B0 = 0.693176 */
9243 7, /* Internal filter scaling */
9244 159, /* Minimum in-band energy threshold */
9245 21, /* 21/32 in-band to broad-band ratio */
9246 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9249 30613, /* A1 = 1.86853 */
9250 -32031, /* A2 = -0.977509 */
9251 -618, /* B2 = -0.018866 */
9253 618, /* B0 = 0.018866 */
9254 30577, /* A1 = 1.866272 */
9255 -32491, /* A2 = -0.991577 */
9256 9612, /* B2 = 0.293335 */
9257 -8935, /* B1 = -0.54541 */
9258 9612, /* B0 = 0.293335 */
9259 31071, /* A1 = 1.896484 */
9260 -32524, /* A2 = -0.992584 */
9261 21596, /* B2 = 0.659058 */
9262 -20667, /* B1 = -1.261414 */
9263 21596, /* B0 = 0.659058 */
9264 7, /* Internal filter scaling */
9265 159, /* Minimum in-band energy threshold */
9266 21, /* 21/32 in-band to broad-band ratio */
9267 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9270 30914, /* A1 = -1.886841 */
9271 -32584, /* A2 = 0.994385 */
9272 -426, /* B2 = -0.013020 */
9273 0, /* B1 = 0.000000 */
9274 426, /* B0 = 0.013020 */
9275 30914, /* A1 = -1.886841 */
9276 -32679, /* A2 = 0.997314 */
9277 17520, /* B2 = 0.534668 */
9278 -16471, /* B1 = -1.005310 */
9279 17520, /* B0 = 0.534668 */
9280 31004, /* A1 = -1.892334 */
9281 -32683, /* A2 = 0.997406 */
9282 819, /* B2 = 0.025023 */
9283 -780, /* B1 = -0.047619 */
9284 819, /* B0 = 0.025023 */
9285 5, /* Internal filter scaling */
9286 159, /* Minimum in-band energy threshold */
9287 21, /* 21/32 in-band to broad-band ratio */
9288 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9292 30881, /* A1 = -1.884827 */
9293 -32603, /* A2 = 0.994965 */
9294 -496, /* B2 = -0.015144 */
9295 0, /* B1 = 0.000000 */
9296 496, /* B0 = 0.015144 */
9297 30880, /* A1 = -1.884766 */
9298 -32692, /* A2 = 0.997711 */
9299 24767, /* B2 = 0.755859 */
9300 -23290, /* B1 = -1.421509 */
9301 24767, /* B0 = 0.755859 */
9302 30967, /* A1 = -1.890076 */
9303 -32694, /* A2 = 0.997772 */
9304 728, /* B2 = 0.022232 */
9305 -691, /* B1 = -0.042194 */
9306 728, /* B0 = 0.022232 */
9307 5, /* Internal filter scaling */
9308 159, /* Minimum in-band energy threshold */
9309 21, /* 21/32 in-band to broad-band ratio */
9310 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9336 30646, /* A1 = 1.870544 */
9337 -32327, /* A2 = -0.986572 */
9338 -287, /* B2 = -0.008769 */
9340 287, /* B0 = 0.008769 */
9341 30627, /* A1 = 1.869324 */
9342 -32607, /* A2 = -0.995087 */
9343 13269, /* B2 = 0.404968 */
9344 -12376, /* B1 = -0.755432 */
9345 13269, /* B0 = 0.404968 */
9346 30924, /* A1 = 1.887512 */
9347 -32619, /* A2 = -0.995453 */
9348 19950, /* B2 = 0.608826 */
9349 -18940, /* B1 = -1.156006 */
9350 19950, /* B0 = 0.608826 */
9351 7, /* Internal filter scaling */
9352 159, /* Minimum in-band energy threshold */
9353 21, /* 21/32 in-band to broad-band ratio */
9354 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9357 30396, /* A1 = 1.855225 */
9358 -32014, /* A2 = -0.97699 */
9359 -395, /* B2 = -0.012055 */
9361 395, /* B0 = 0.012055 */
9362 30343, /* A1 = 1.85199 */
9363 -32482, /* A2 = -0.991302 */
9364 17823, /* B2 = 0.543945 */
9365 -16431, /* B1 = -1.002869 */
9366 17823, /* B0 = 0.543945 */
9367 30872, /* A1 = 1.884338 */
9368 -32516, /* A2 = -0.99231 */
9369 18124, /* B2 = 0.553101 */
9370 -17246, /* B1 = -1.052673 */
9371 18124, /* B0 = 0.553101 */
9372 7, /* Internal filter scaling */
9373 159, /* Minimum in-band energy threshold */
9374 21, /* 21/32 in-band to broad-band ratio */
9375 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9378 30796, /* A1 = -1.879639 */
9379 -32603, /* A2 = 0.994965 */
9380 -254, /* B2 = -0.007762 */
9381 0, /* B1 = 0.000000 */
9382 254, /* B0 = 0.007762 */
9383 30793, /* A1 = -1.879456 */
9384 -32692, /* A2 = 0.997711 */
9385 18934, /* B2 = 0.577820 */
9386 -17751, /* B1 = -1.083496 */
9387 18934, /* B0 = 0.577820 */
9388 30882, /* A1 = -1.884888 */
9389 -32694, /* A2 = 0.997772 */
9390 1858, /* B2 = 0.056713 */
9391 -1758, /* B1 = -0.107357 */
9392 1858, /* B0 = 0.056713 */
9393 5, /* Internal filter scaling */
9394 159, /* Minimum in-band energy threshold */
9395 21, /* 21/32 in-band to broad-band ratio */
9396 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9399 30641, /* A1 = 1.870239 */
9400 -32458, /* A2 = -0.99057 */
9401 -155, /* B2 = -0.004735 */
9403 155, /* B0 = 0.004735 */
9404 30631, /* A1 = 1.869568 */
9405 -32630, /* A2 = -0.995789 */
9406 11453, /* B2 = 0.349548 */
9407 -10666, /* B1 = -0.651001 */
9408 11453, /* B0 = 0.349548 */
9409 30810, /* A1 = 1.880554 */
9410 -32634, /* A2 = -0.995941 */
9411 12237, /* B2 = 0.373474 */
9412 -11588, /* B1 = -0.707336 */
9413 12237, /* B0 = 0.373474 */
9414 7, /* Internal filter scaling */
9415 159, /* Minimum in-band energy threshold */
9416 21, /* 21/32 in-band to broad-band ratio */
9417 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9420 30367, /* A1 = 1.853455 */
9421 -32147, /* A2 = -0.981079 */
9422 -495, /* B2 = -0.015113 */
9424 495, /* B0 = 0.015113 */
9425 30322, /* A1 = 1.850769 */
9426 -32543, /* A2 = -0.993134 */
9427 10031, /* B2 = 0.306152 */
9428 -9252, /* B1 = -0.564728 */
9429 10031, /* B0 = 0.306152 */
9430 30770, /* A1 = 1.878052 */
9431 -32563, /* A2 = -0.993774 */
9432 22674, /* B2 = 0.691956 */
9433 -21465, /* B1 = -1.31012 */
9434 22674, /* B0 = 0.691956 */
9435 7, /* Internal filter scaling */
9436 159, /* Minimum in-band energy threshold */
9437 21, /* 21/32 in-band to broad-band ratio */
9438 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9441 30709, /* A1 = -1.874329 */
9442 -32603, /* A2 = 0.994965 */
9443 -83, /* B2 = -0.002545 */
9444 0, /* B1 = 0.000000 */
9445 83, /* B0 = 0.002545 */
9446 30704, /* A1 = -1.874084 */
9447 -32692, /* A2 = 0.997711 */
9448 10641, /* B2 = 0.324738 */
9449 -9947, /* B1 = -0.607147 */
9450 10641, /* B0 = 0.324738 */
9451 30796, /* A1 = -1.879639 */
9452 -32694, /* A2 = 0.997772 */
9453 10079, /* B2 = 0.307587 */
9454 9513, /* B1 = 0.580688 */
9455 10079, /* B0 = 0.307587 */
9456 5, /* Internal filter scaling */
9457 159, /* Minimum in-band energy threshold */
9458 21, /* 21/32 in-band to broad-band ratio */
9459 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9462 30664, /* A1 = -1.871643 */
9463 -32603, /* A2 = 0.994965 */
9464 -164, /* B2 = -0.005029 */
9465 0, /* B1 = 0.000000 */
9466 164, /* B0 = 0.005029 */
9467 30661, /* A1 = -1.871399 */
9468 -32692, /* A2 = 0.997711 */
9469 15294, /* B2 = 0.466736 */
9470 -14275, /* B1 = -0.871307 */
9471 15294, /* B0 = 0.466736 */
9472 30751, /* A1 = -1.876953 */
9473 -32694, /* A2 = 0.997772 */
9474 3548, /* B2 = 0.108284 */
9475 -3344, /* B1 = -0.204155 */
9476 3548, /* B0 = 0.108284 */
9477 5, /* Internal filter scaling */
9478 159, /* Minimum in-band energy threshold */
9479 21, /* 21/32 in-band to broad-band ratio */
9480 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9483 30653, /* A1 = -1.870911 */
9484 -32615, /* A2 = 0.995361 */
9485 -209, /* B2 = -0.006382 */
9486 0, /* B1 = 0.000000 */
9487 209, /* B0 = 0.006382 */
9488 30647, /* A1 = -1.870605 */
9489 -32702, /* A2 = 0.997986 */
9490 18971, /* B2 = 0.578979 */
9491 -17716, /* B1 = -1.081299 */
9492 18971, /* B0 = 0.578979 */
9493 30738, /* A1 = -1.876099 */
9494 -32702, /* A2 = 0.998016 */
9495 2967, /* B2 = 0.090561 */
9496 -2793, /* B1 = -0.170502 */
9497 2967, /* B0 = 0.090561 */
9498 5, /* Internal filter scaling */
9499 159, /* Minimum in-band energy threshold */
9500 21, /* 21/32 in-band to broad-band ratio */
9501 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9504 30437, /* A1 = -1.857727 */
9505 -32603, /* A2 = 0.994965 */
9506 -264, /* B2 = -0.008062 */
9507 0, /* B1 = 0.000000 */
9508 264, /* B0 = 0.008062 */
9509 30430, /* A1 = -1.857300 */
9510 -32692, /* A2 = 0.997711 */
9511 21681, /* B2 = 0.661682 */
9512 -20082, /* B1 = -1.225708 */
9513 21681, /* B0 = 0.661682 */
9514 30526, /* A1 = -1.863220 */
9515 -32694, /* A2 = 0.997742 */
9516 1559, /* B2 = 0.047600 */
9517 -1459, /* B1 = -0.089096 */
9518 1559, /* B0 = 0.047600 */
9519 5, /* Internal filter scaling */
9520 159, /* Minimum in-band energy threshold */
9521 21, /* 21/32 in-band to broad-band ratio */
9522 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9525 28975, /* A1 = 1.768494 */
9526 -30955, /* A2 = -0.944672 */
9527 -1026, /* B2 = -0.03133 */
9529 1026, /* B0 = 0.03133 */
9530 28613, /* A1 = 1.746399 */
9531 -32089, /* A2 = -0.979309 */
9532 14214, /* B2 = 0.433807 */
9533 -12202, /* B1 = -0.744812 */
9534 14214, /* B0 = 0.433807 */
9535 30243, /* A1 = 1.845947 */
9536 -32238, /* A2 = -0.983856 */
9537 24825, /* B2 = 0.757629 */
9538 -23402, /* B1 = -1.428345 */
9539 24825, /* B0 = 0.757629 */
9540 7, /* Internal filter scaling */
9541 159, /* Minimum in-band energy threshold */
9542 21, /* 21/32 in-band to broad-band ratio */
9543 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9546 30257, /* A1 = -1.846741 */
9547 -32605, /* A2 = 0.995056 */
9548 -249, /* B2 = -0.007625 */
9549 0, /* B1 = 0.000000 */
9550 249, /* B0 = 0.007625 */
9551 30247, /* A1 = -1.846191 */
9552 -32694, /* A2 = 0.997772 */
9553 18088, /* B2 = 0.552002 */
9554 -16652, /* B1 = -1.016418 */
9555 18088, /* B0 = 0.552002 */
9556 30348, /* A1 = -1.852295 */
9557 -32696, /* A2 = 0.997803 */
9558 2099, /* B2 = 0.064064 */
9559 -1953, /* B1 = -0.119202 */
9560 2099, /* B0 = 0.064064 */
9561 5, /* Internal filter scaling */
9562 159, /* Minimum in-band energy threshold */
9563 21, /* 21/32 in-band to broad-band ratio */
9564 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9567 30202, /* A1 = -1.843431 */
9568 -32624, /* A2 = 0.995622 */
9569 -413, /* B2 = -0.012622 */
9570 0, /* B1 = 0.000000 */
9571 413, /* B0 = 0.012622 */
9572 30191, /* A1 = -1.842721 */
9573 -32714, /* A2 = 0.998364 */
9574 25954, /* B2 = 0.792057 */
9575 -23890, /* B1 = -1.458131 */
9576 25954, /* B0 = 0.792057 */
9577 30296, /* A1 = -1.849172 */
9578 -32715, /* A2 = 0.998397 */
9579 2007, /* B2 = 0.061264 */
9580 -1860, /* B1 = -0.113568 */
9581 2007, /* B0 = 0.061264 */
9582 5, /* Internal filter scaling */
9583 159, /* Minimum in-band energy threshold */
9584 21, /* 21/32 in-band to broad-band ratio */
9585 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9588 30001, /* A1 = -1.831116 */
9589 -32613, /* A2 = 0.995270 */
9590 -155, /* B2 = -0.004750 */
9591 0, /* B1 = 0.000000 */
9592 155, /* B0 = 0.004750 */
9593 29985, /* A1 = -1.830200 */
9594 -32710, /* A2 = 0.998260 */
9595 6584, /* B2 = 0.200928 */
9596 -6018, /* B1 = -0.367355 */
9597 6584, /* B0 = 0.200928 */
9598 30105, /* A1 = -1.837524 */
9599 -32712, /* A2 = 0.998291 */
9600 23812, /* B2 = 0.726685 */
9601 -21936, /* B1 = -1.338928 */
9602 23812, /* B0 = 0.726685 */
9603 5, /* Internal filter scaling */
9604 159, /* Minimum in-band energy threshold */
9605 21, /* 21/32 in-band to broad-band ratio */
9606 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9609 29964, /* A1 = -1.828918 */
9610 -32601, /* A2 = 0.994904 */
9611 -101, /* B2 = -0.003110 */
9612 0, /* B1 = 0.000000 */
9613 101, /* B0 = 0.003110 */
9614 29949, /* A1 = -1.827942 */
9615 -32700, /* A2 = 0.997925 */
9616 11041, /* B2 = 0.336975 */
9617 -10075, /* B1 = -0.614960 */
9618 11041, /* B0 = 0.336975 */
9619 30070, /* A1 = -1.835388 */
9620 -32702, /* A2 = 0.997986 */
9621 16762, /* B2 = 0.511536 */
9622 -15437, /* B1 = -0.942230 */
9623 16762, /* B0 = 0.511536 */
9624 5, /* Internal filter scaling */
9625 159, /* Minimum in-band energy threshold */
9626 21, /* 21/32 in-band to broad-band ratio */
9627 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9630 29936, /* A1 = -1.827209 */
9631 -32584, /* A2 = 0.994415 */
9632 -91, /* B2 = -0.002806 */
9633 0, /* B1 = 0.000000 */
9634 91, /* B0 = 0.002806 */
9635 29921, /* A1 = -1.826233 */
9636 -32688, /* A2 = 0.997559 */
9637 11449, /* B2 = 0.349396 */
9638 -10426, /* B1 = -0.636383 */
9639 11449, /* B0 = 0.349396 */
9640 30045, /* A1 = -1.833862 */
9641 -32688, /* A2 = 0.997589 */
9642 13055, /* B2 = 0.398407 */
9643 -12028, /* B1 = -0.734161 */
9644 13055, /* B0 = 0.398407 */
9645 5, /* Internal filter scaling */
9646 159, /* Minimum in-band energy threshold */
9647 21, /* 21/32 in-band to broad-band ratio */
9648 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9651 28499, /* A1 = 1.739441 */
9652 -31129, /* A2 = -0.949982 */
9653 -849, /* B2 = -0.025922 */
9655 849, /* B0 = 0.025922 */
9656 28128, /* A1 = 1.716797 */
9657 -32130, /* A2 = -0.98056 */
9658 14556, /* B2 = 0.444214 */
9659 -12251, /* B1 = -0.747772 */
9660 14556, /* B0 = 0.444244 */
9661 29667, /* A1 = 1.81073 */
9662 -32244, /* A2 = -0.984039 */
9663 23038, /* B2 = 0.703064 */
9664 -21358, /* B1 = -1.303589 */
9665 23040, /* B0 = 0.703125 */
9666 7, /* Internal filter scaling */
9667 159, /* Minimum in-band energy threshold */
9668 21, /* 21/32 in-band to broad-band ratio */
9669 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9672 29271, /* A1 = -1.786560 */
9673 -32599, /* A2 = 0.994873 */
9674 -490, /* B2 = -0.014957 */
9675 0, /* B1 = 0.000000 */
9676 490, /* B0 = 0.014957 */
9677 29246, /* A1 = -1.785095 */
9678 -32700, /* A2 = 0.997925 */
9679 28961, /* B2 = 0.883850 */
9680 -25796, /* B1 = -1.574463 */
9681 28961, /* B0 = 0.883850 */
9682 29383, /* A1 = -1.793396 */
9683 -32700, /* A2 = 0.997955 */
9684 1299, /* B2 = 0.039650 */
9685 -1169, /* B1 = -0.071396 */
9686 1299, /* B0 = 0.039650 */
9687 5, /* Internal filter scaling */
9688 159, /* Minimum in-band energy threshold */
9689 21, /* 21/32 in-band to broad-band ratio */
9690 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9693 29230, /* A1 = -1.784058 */
9694 -32584, /* A2 = 0.994415 */
9695 -418, /* B2 = -0.012757 */
9696 0, /* B1 = 0.000000 */
9697 418, /* B0 = 0.012757 */
9698 29206, /* A1 = -1.782593 */
9699 -32688, /* A2 = 0.997559 */
9700 36556, /* B2 = 1.115601 */
9701 -32478, /* B1 = -1.982300 */
9702 36556, /* B0 = 1.115601 */
9703 29345, /* A1 = -1.791077 */
9704 -32688, /* A2 = 0.997589 */
9705 897, /* B2 = 0.027397 */
9706 -808, /* B1 = -0.049334 */
9707 897, /* B0 = 0.027397 */
9708 5, /* Internal filter scaling */
9709 159, /* Minimum in-band energy threshold */
9710 21, /* 21/32 in-band to broad-band ratio */
9711 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9714 29116, /* A1 = -1.777100 */
9715 -32603, /* A2 = 0.994965 */
9716 -165, /* B2 = -0.005039 */
9717 0, /* B1 = 0.000000 */
9718 165, /* B0 = 0.005039 */
9719 29089, /* A1 = -1.775452 */
9720 -32708, /* A2 = 0.998199 */
9721 6963, /* B2 = 0.212494 */
9722 -6172, /* B1 = -0.376770 */
9723 6963, /* B0 = 0.212494 */
9724 29237, /* A1 = -1.784485 */
9725 -32710, /* A2 = 0.998230 */
9726 24197, /* B2 = 0.738464 */
9727 -21657, /* B1 = -1.321899 */
9728 24197, /* B0 = 0.738464 */
9729 5, /* Internal filter scaling */
9730 159, /* Minimum in-band energy threshold */
9731 21, /* 21/32 in-band to broad-band ratio */
9732 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9735 28376, /* A1 = -1.731934 */
9736 -32567, /* A2 = 0.993896 */
9737 -363, /* B2 = -0.011102 */
9738 0, /* B1 = 0.000000 */
9739 363, /* B0 = 0.011102 */
9740 28337, /* A1 = -1.729614 */
9741 -32683, /* A2 = 0.997434 */
9742 21766, /* B2 = 0.664246 */
9743 -18761, /* B1 = -1.145081 */
9744 21766, /* B0 = 0.664246 */
9745 28513, /* A1 = -1.740356 */
9746 -32686, /* A2 = 0.997498 */
9747 2509, /* B2 = 0.076584 */
9748 -2196, /* B1 = -0.134041 */
9749 2509, /* B0 = 0.076584 */
9750 5, /* Internal filter scaling */
9751 159, /* Minimum in-band energy threshold */
9752 21, /* 21/32 in-band to broad-band ratio */
9753 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9756 27844, /* A1 = -1.699463 */
9757 -32563, /* A2 = 0.993744 */
9758 -366, /* B2 = -0.011187 */
9759 0, /* B1 = 0.000000 */
9760 366, /* B0 = 0.011187 */
9761 27797, /* A1 = -1.696655 */
9762 -32686, /* A2 = 0.997498 */
9763 22748, /* B2 = 0.694214 */
9764 -19235, /* B1 = -1.174072 */
9765 22748, /* B0 = 0.694214 */
9766 27995, /* A1 = -1.708740 */
9767 -32688, /* A2 = 0.997559 */
9768 2964, /* B2 = 0.090477 */
9769 -2546, /* B1 = -0.155449 */
9770 2964, /* B0 = 0.090477 */
9771 5, /* Internal filter scaling */
9772 159, /* Minimum in-band energy threshold */
9773 21, /* 21/32 in-band to broad-band ratio */
9774 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9777 27297, /* A1 = -1.666077 */
9778 -32551, /* A2 = 0.993408 */
9779 -345, /* B2 = -0.010540 */
9780 0, /* B1 = 0.000000 */
9781 345, /* B0 = 0.010540 */
9782 27240, /* A1 = -1.662598 */
9783 -32683, /* A2 = 0.997406 */
9784 22560, /* B2 = 0.688477 */
9785 -18688, /* B1 = -1.140625 */
9786 22560, /* B0 = 0.688477 */
9787 27461, /* A1 = -1.676147 */
9788 -32684, /* A2 = 0.997467 */
9789 3541, /* B2 = 0.108086 */
9790 -2985, /* B1 = -0.182220 */
9791 3541, /* B0 = 0.108086 */
9792 5, /* Internal filter scaling */
9793 159, /* Minimum in-band energy threshold */
9794 21, /* 21/32 in-band to broad-band ratio */
9795 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9798 27155, /* A1 = -1.657410 */
9799 -32551, /* A2 = 0.993408 */
9800 -462, /* B2 = -0.014117 */
9801 0, /* B1 = 0.000000 */
9802 462, /* B0 = 0.014117 */
9803 27097, /* A1 = -1.653870 */
9804 -32683, /* A2 = 0.997406 */
9805 32495, /* B2 = 0.991699 */
9806 -26776, /* B1 = -1.634338 */
9807 32495, /* B0 = 0.991699 */
9808 27321, /* A1 = -1.667542 */
9809 -32684, /* A2 = 0.997467 */
9810 1835, /* B2 = 0.056007 */
9811 -1539, /* B1 = -0.093948 */
9812 1835, /* B0 = 0.056007 */
9813 5, /* Internal filter scaling */
9814 159, /* Minimum in-band energy threshold */
9815 21, /* 21/32 in-band to broad-band ratio */
9816 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9819 19298, /* A1 = 1.177917 */
9820 -24471, /* A2 = -0.746796 */
9821 -4152, /* B2 = -0.126709 */
9823 4152, /* B0 = 0.126709 */
9824 12902, /* A1 = 0.787476 */
9825 -29091, /* A2 = -0.887817 */
9826 12491, /* B2 = 0.38121 */
9827 -1794, /* B1 = -0.109528 */
9828 12494, /* B0 = 0.381317 */
9829 26291, /* A1 = 1.604736 */
9830 -30470, /* A2 = -0.929901 */
9831 28859, /* B2 = 0.880737 */
9832 -26084, /* B1 = -1.592102 */
9833 28861, /* B0 = 0.880798 */
9834 7, /* Internal filter scaling */
9835 159, /* Minimum in-band energy threshold */
9836 21, /* 21/32 in-band to broad-band ratio */
9837 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9840 26867, /* A1 = -1.639832 */
9841 -32551, /* A2 = 0.993408 */
9842 -123, /* B2 = -0.003755 */
9843 0, /* B1 = 0.000000 */
9844 123, /* B0 = 0.003755 */
9845 26805, /* A1 = -1.636108 */
9846 -32683, /* A2 = 0.997406 */
9847 17297, /* B2 = 0.527863 */
9848 -14096, /* B1 = -0.860382 */
9849 17297, /* B0 = 0.527863 */
9850 27034, /* A1 = -1.650085 */
9851 -32684, /* A2 = 0.997467 */
9852 12958, /* B2 = 0.395477 */
9853 -10756, /* B1 = -0.656525 */
9854 12958, /* B0 = 0.395477 */
9855 5, /* Internal filter scaling */
9856 159, /* Minimum in-band energy threshold */
9857 21, /* 21/32 in-band to broad-band ratio */
9858 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9861 26413, /* A1 = -1.612122 */
9862 -32547, /* A2 = 0.993286 */
9863 -223, /* B2 = -0.006825 */
9864 0, /* B1 = 0.000000 */
9865 223, /* B0 = 0.006825 */
9866 26342, /* A1 = -1.607849 */
9867 -32686, /* A2 = 0.997498 */
9868 6391, /* B2 = 0.195053 */
9869 -5120, /* B1 = -0.312531 */
9870 6391, /* B0 = 0.195053 */
9871 26593, /* A1 = -1.623108 */
9872 -32688, /* A2 = 0.997559 */
9873 23681, /* B2 = 0.722717 */
9874 -19328, /* B1 = -1.179688 */
9875 23681, /* B0 = 0.722717 */
9876 5, /* Internal filter scaling */
9877 159, /* Minimum in-band energy threshold */
9878 21, /* 21/32 in-band to broad-band ratio */
9879 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9882 26168, /* A1 = -1.597209 */
9883 -32528, /* A2 = 0.992706 */
9884 -235, /* B2 = -0.007182 */
9885 0, /* B1 = 0.000000 */
9886 235, /* B0 = 0.007182 */
9887 26092, /* A1 = -1.592590 */
9888 -32675, /* A2 = 0.997192 */
9889 20823, /* B2 = 0.635498 */
9890 -16510, /* B1 = -1.007751 */
9891 20823, /* B0 = 0.635498 */
9892 26363, /* A1 = -1.609070 */
9893 -32677, /* A2 = 0.997253 */
9894 6739, /* B2 = 0.205688 */
9895 -5459, /* B1 = -0.333206 */
9896 6739, /* B0 = 0.205688 */
9897 5, /* Internal filter scaling */
9898 159, /* Minimum in-band energy threshold */
9899 21, /* 21/32 in-band to broad-band ratio */
9900 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9903 25641, /* A1 = -1.565063 */
9904 -32536, /* A2 = 0.992950 */
9905 -121, /* B2 = -0.003707 */
9906 0, /* B1 = 0.000000 */
9907 121, /* B0 = 0.003707 */
9908 25560, /* A1 = -1.560059 */
9909 -32684, /* A2 = 0.997437 */
9910 18341, /* B2 = 0.559753 */
9911 -14252, /* B1 = -0.869904 */
9912 18341, /* B0 = 0.559753 */
9913 25837, /* A1 = -1.577026 */
9914 -32684, /* A2 = 0.997467 */
9915 16679, /* B2 = 0.509003 */
9916 -13232, /* B1 = -0.807648 */
9917 16679, /* B0 = 0.509003 */
9918 5, /* Internal filter scaling */
9919 159, /* Minimum in-band energy threshold */
9920 21, /* 21/32 in-band to broad-band ratio */
9921 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9924 16415, /* A1 = 1.001953 */
9925 -23669, /* A2 = -0.722321 */
9926 -4549, /* B2 = -0.138847 */
9928 4549, /* B0 = 0.138847 */
9929 8456, /* A1 = 0.516174 */
9930 -28996, /* A2 = -0.884918 */
9931 13753, /* B2 = 0.419724 */
9932 -12, /* B1 = -0.000763 */
9933 13757, /* B0 = 0.419846 */
9934 24632, /* A1 = 1.503418 */
9935 -30271, /* A2 = -0.923828 */
9936 29070, /* B2 = 0.887146 */
9937 -25265, /* B1 = -1.542114 */
9938 29073, /* B0 = 0.887268 */
9939 7, /* Internal filter scaling */
9940 159, /* Minimum in-band energy threshold */
9941 21, /* 21/32 in-band to broad-band ratio */
9942 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9945 24806, /* A1 = -1.514099 */
9946 -32501, /* A2 = 0.991852 */
9947 -326, /* B2 = -0.009969 */
9948 0, /* B1 = 0.000000 */
9949 326, /* B0 = 0.009969 */
9950 24709, /* A1 = -1.508118 */
9951 -32659, /* A2 = 0.996674 */
9952 20277, /* B2 = 0.618835 */
9953 -15182, /* B1 = -0.926636 */
9954 20277, /* B0 = 0.618835 */
9955 25022, /* A1 = -1.527222 */
9956 -32661, /* A2 = 0.996735 */
9957 4320, /* B2 = 0.131836 */
9958 -3331, /* B1 = -0.203339 */
9959 4320, /* B0 = 0.131836 */
9960 5, /* Internal filter scaling */
9961 159, /* Minimum in-band energy threshold */
9962 21, /* 21/32 in-band to broad-band ratio */
9963 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9966 19776, /* A1 = 1.207092 */
9967 -27437, /* A2 = -0.837341 */
9968 -2666, /* B2 = -0.081371 */
9970 2666, /* B0 = 0.081371 */
9971 16302, /* A1 = 0.995026 */
9972 -30354, /* A2 = -0.926361 */
9973 10389, /* B2 = 0.317062 */
9974 -3327, /* B1 = -0.203064 */
9975 10389, /* B0 = 0.317062 */
9976 24299, /* A1 = 1.483154 */
9977 -30930, /* A2 = -0.943909 */
9978 25016, /* B2 = 0.763428 */
9979 -21171, /* B1 = -1.292236 */
9980 25016, /* B0 = 0.763428 */
9981 7, /* Internal filter scaling */
9982 159, /* Minimum in-band energy threshold */
9983 21, /* 21/32 in-band to broad-band ratio */
9984 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9987 20554, /* A1 = 1.254517 */
9988 -28764, /* A2 = -0.877838 */
9989 -2048, /* B2 = -0.062515 */
9991 2048, /* B0 = 0.062515 */
9992 18209, /* A1 = 1.11145 */
9993 -30951, /* A2 = -0.94458 */
9994 9390, /* B2 = 0.286575 */
9995 -3955, /* B1 = -0.241455 */
9996 9390, /* B0 = 0.286575 */
9997 23902, /* A1 = 1.458923 */
9998 -31286, /* A2 = -0.954803 */
9999 23252, /* B2 = 0.709595 */
10000 -19132, /* B1 = -1.167725 */
10001 23252, /* B0 = 0.709595 */
10002 7, /* Internal filter scaling */
10003 159, /* Minimum in-band energy threshold */
10004 21, /* 21/32 in-band to broad-band ratio */
10005 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10007 { /* f941_1477[] */
10008 17543, /* A1 = 1.07074 */
10009 -26220, /* A2 = -0.800201 */
10010 -3298, /* B2 = -0.100647 */
10012 3298, /* B0 = 0.100647 */
10013 12423, /* A1 = 0.75827 */
10014 -30036, /* A2 = -0.916626 */
10015 12651, /* B2 = 0.386078 */
10016 -2444, /* B1 = -0.14917 */
10017 12653, /* B0 = 0.386154 */
10018 23518, /* A1 = 1.435425 */
10019 -30745, /* A2 = -0.938293 */
10020 27282, /* B2 = 0.832581 */
10021 -22529, /* B1 = -1.375122 */
10022 27286, /* B0 = 0.832703 */
10023 7, /* Internal filter scaling */
10024 159, /* Minimum in-band energy threshold */
10025 21, /* 21/32 in-band to broad-band ratio */
10026 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10029 24104, /* A1 = -1.471252 */
10030 -32507, /* A2 = 0.992065 */
10031 -351, /* B2 = -0.010722 */
10032 0, /* B1 = 0.000000 */
10033 351, /* B0 = 0.010722 */
10034 23996, /* A1 = -1.464600 */
10035 -32671, /* A2 = 0.997040 */
10036 22848, /* B2 = 0.697266 */
10037 -16639, /* B1 = -1.015564 */
10038 22848, /* B0 = 0.697266 */
10039 24332, /* A1 = -1.485168 */
10040 -32673, /* A2 = 0.997101 */
10041 4906, /* B2 = 0.149727 */
10042 -3672, /* B1 = -0.224174 */
10043 4906, /* B0 = 0.149727 */
10044 5, /* Internal filter scaling */
10045 159, /* Minimum in-band energy threshold */
10046 21, /* 21/32 in-band to broad-band ratio */
10047 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10050 23967, /* A1 = -1.462830 */
10051 -32507, /* A2 = 0.992065 */
10052 -518, /* B2 = -0.015821 */
10053 0, /* B1 = 0.000000 */
10054 518, /* B0 = 0.015821 */
10055 23856, /* A1 = -1.456055 */
10056 -32671, /* A2 = 0.997040 */
10057 26287, /* B2 = 0.802246 */
10058 -19031, /* B1 = -1.161560 */
10059 26287, /* B0 = 0.802246 */
10060 24195, /* A1 = -1.476746 */
10061 -32673, /* A2 = 0.997101 */
10062 2890, /* B2 = 0.088196 */
10063 -2151, /* B1 = -0.131317 */
10064 2890, /* B0 = 0.088196 */
10065 5, /* Internal filter scaling */
10066 159, /* Minimum in-band energy threshold */
10067 21, /* 21/32 in-band to broad-band ratio */
10068 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10070 { /* f950_1400[] */
10071 18294, /* A1 = 1.116638 */
10072 -26962, /* A2 = -0.822845 */
10073 -2914, /* B2 = -0.088936 */
10075 2914, /* B0 = 0.088936 */
10076 14119, /* A1 = 0.861786 */
10077 -30227, /* A2 = -0.922455 */
10078 11466, /* B2 = 0.349945 */
10079 -2833, /* B1 = -0.172943 */
10080 11466, /* B0 = 0.349945 */
10081 23431, /* A1 = 1.430115 */
10082 -30828, /* A2 = -0.940796 */
10083 25331, /* B2 = 0.773071 */
10084 -20911, /* B1 = -1.276367 */
10085 25331, /* B0 = 0.773071 */
10086 7, /* Internal filter scaling */
10087 159, /* Minimum in-band energy threshold */
10088 21, /* 21/32 in-band to broad-band ratio */
10089 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10092 23521, /* A1 = -1.435608 */
10093 -32489, /* A2 = 0.991516 */
10094 -193, /* B2 = -0.005915 */
10095 0, /* B1 = 0.000000 */
10096 193, /* B0 = 0.005915 */
10097 23404, /* A1 = -1.428467 */
10098 -32655, /* A2 = 0.996582 */
10099 17740, /* B2 = 0.541412 */
10100 -12567, /* B1 = -0.767029 */
10101 17740, /* B0 = 0.541412 */
10102 23753, /* A1 = -1.449829 */
10103 -32657, /* A2 = 0.996613 */
10104 9090, /* B2 = 0.277405 */
10105 -6662, /* B1 = -0.406647 */
10106 9090, /* B0 = 0.277405 */
10107 5, /* Internal filter scaling */
10108 159, /* Minimum in-band energy threshold */
10109 21, /* 21/32 in-band to broad-band ratio */
10110 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10113 23071, /* A1 = -1.408203 */
10114 -32489, /* A2 = 0.991516 */
10115 -293, /* B2 = -0.008965 */
10116 0, /* B1 = 0.000000 */
10117 293, /* B0 = 0.008965 */
10118 22951, /* A1 = -1.400818 */
10119 -32655, /* A2 = 0.996582 */
10120 5689, /* B2 = 0.173645 */
10121 -3951, /* B1 = -0.241150 */
10122 5689, /* B0 = 0.173645 */
10123 23307, /* A1 = -1.422607 */
10124 -32657, /* A2 = 0.996613 */
10125 18692, /* B2 = 0.570435 */
10126 -13447, /* B1 = -0.820770 */
10127 18692, /* B0 = 0.570435 */
10128 5, /* Internal filter scaling */
10129 159, /* Minimum in-band energy threshold */
10130 21, /* 21/32 in-band to broad-band ratio */
10131 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10134 22701, /* A1 = -1.385620 */
10135 -32474, /* A2 = 0.991058 */
10136 -292, /* B2 = -0.008933 */
10137 0, /*163840 , B1 = 10.000000 */
10138 292, /* B0 = 0.008933 */
10139 22564, /* A1 = -1.377258 */
10140 -32655, /* A2 = 0.996552 */
10141 20756, /* B2 = 0.633423 */
10142 -14176, /* B1 = -0.865295 */
10143 20756, /* B0 = 0.633423 */
10144 22960, /* A1 = -1.401428 */
10145 -32657, /* A2 = 0.996613 */
10146 6520, /* B2 = 0.198990 */
10147 -4619, /* B1 = -0.281937 */
10148 6520, /* B0 = 0.198990 */
10149 5, /* Internal filter scaling */
10150 159, /* Minimum in-band energy threshold */
10151 21, /* 21/32 in-band to broad-band ratio */
10152 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10155 22142, /* A1 = -1.351501 */
10156 -32474, /* A2 = 0.991058 */
10157 -147, /* B2 = -0.004493 */
10158 0, /* B1 = 0.000000 */
10159 147, /* B0 = 0.004493 */
10160 22000, /* A1 = -1.342834 */
10161 -32655, /* A2 = 0.996552 */
10162 15379, /* B2 = 0.469360 */
10163 -10237, /* B1 = -0.624847 */
10164 15379, /* B0 = 0.469360 */
10165 22406, /* A1 = -1.367554 */
10166 -32657, /* A2 = 0.996613 */
10167 17491, /* B2 = 0.533783 */
10168 -12096, /* B1 = -0.738312 */
10169 17491, /* B0 = 0.533783 */
10170 5, /* Internal filter scaling */
10171 159, /* Minimum in-band energy threshold */
10172 21, /* 21/32 in-band to broad-band ratio */
10173 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10175 { /* f1100_1750[] */
10176 12973, /* A1 = 0.79184 */
10177 -24916, /* A2 = -0.760376 */
10178 6655, /* B2 = 0.203102 */
10179 367, /* B1 = 0.0224 */
10180 6657, /* B0 = 0.203171 */
10181 5915, /* A1 = 0.361053 */
10182 -29560, /* A2 = -0.90213 */
10183 -7777, /* B2 = -0.23735 */
10185 7777, /* B0 = 0.23735 */
10186 20510, /* A1 = 1.251892 */
10187 -30260, /* A2 = -0.923462 */
10188 26662, /* B2 = 0.81366 */
10189 -20573, /* B1 = -1.255737 */
10190 26668, /* B0 = 0.813843 */
10191 7, /* Internal filter scaling */
10192 159, /* Minimum in-band energy threshold */
10193 21, /* 21/32 in-band to broad-band ratio */
10194 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10197 20392, /* A1 = -1.244629 */
10198 -32460, /* A2 = 0.990601 */
10199 -270, /* B2 = -0.008240 */
10200 0, /* B1 = 0.000000 */
10201 270, /* B0 = 0.008240 */
10202 20218, /* A1 = -1.234009 */
10203 -32655, /* A2 = 0.996582 */
10204 21337, /* B2 = 0.651154 */
10205 -13044, /* B1 = -0.796143 */
10206 21337, /* B0 = 0.651154 */
10207 20684, /* A1 = -1.262512 */
10208 -32657, /* A2 = 0.996643 */
10209 8572, /* B2 = 0.261612 */
10210 -5476, /* B1 = -0.334244 */
10211 8572, /* B0 = 0.261612 */
10212 5, /* Internal filter scaling */
10213 159, /* Minimum in-band energy threshold */
10214 21, /* 21/32 in-band to broad-band ratio */
10215 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10218 19159, /* A1 = -1.169373 */
10219 -32456, /* A2 = 0.990509 */
10220 -335, /* B2 = -0.010252 */
10221 0, /* B1 = 0.000000 */
10222 335, /* B0 = 0.010252 */
10223 18966, /* A1 = -1.157593 */
10224 -32661, /* A2 = 0.996735 */
10225 6802, /* B2 = 0.207588 */
10226 -3900, /* B1 = -0.238098 */
10227 6802, /* B0 = 0.207588 */
10228 19467, /* A1 = -1.188232 */
10229 -32661, /* A2 = 0.996765 */
10230 25035, /* B2 = 0.764008 */
10231 -15049, /* B1 = -0.918579 */
10232 25035, /* B0 = 0.764008 */
10233 5, /* Internal filter scaling */
10234 159, /* Minimum in-band energy threshold */
10235 21, /* 21/32 in-band to broad-band ratio */
10236 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10239 18976, /* A1 = -1.158264 */
10240 -32439, /* A2 = 0.989990 */
10241 -183, /* B2 = -0.005588 */
10242 0, /* B1 = 0.000000 */
10243 183, /* B0 = 0.005588 */
10244 18774, /* A1 = -1.145874 */
10245 -32650, /* A2 = 0.996429 */
10246 15468, /* B2 = 0.472076 */
10247 -8768, /* B1 = -0.535217 */
10248 15468, /* B0 = 0.472076 */
10249 19300, /* A1 = -1.177979 */
10250 -32652, /* A2 = 0.996490 */
10251 19840, /* B2 = 0.605499 */
10252 -11842, /* B1 = -0.722809 */
10253 19840, /* B0 = 0.605499 */
10254 5, /* Internal filter scaling */
10255 159, /* Minimum in-band energy threshold */
10256 21, /* 21/32 in-band to broad-band ratio */
10257 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10260 16357, /* A1 = -0.998413 */
10261 -32368, /* A2 = 0.987793 */
10262 -217, /* B2 = -0.006652 */
10263 0, /* B1 = 0.000000 */
10264 217, /* B0 = 0.006652 */
10265 16107, /* A1 = -0.983126 */
10266 -32601, /* A2 = 0.994904 */
10267 11602, /* B2 = 0.354065 */
10268 -5555, /* B1 = -0.339111 */
10269 11602, /* B0 = 0.354065 */
10270 16722, /* A1 = -1.020630 */
10271 -32603, /* A2 = 0.994965 */
10272 15574, /* B2 = 0.475311 */
10273 -8176, /* B1 = -0.499069 */
10274 15574, /* B0 = 0.475311 */
10275 5, /* Internal filter scaling */
10276 159, /* Minimum in-band energy threshold */
10277 21, /* 21/32 in-band to broad-band ratio */
10278 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10281 16234, /* A1 = -0.990875 */
10282 32404, /* A2 = -0.988922 */
10283 -193, /* B2 = -0.005908 */
10284 0, /* B1 = 0.000000 */
10285 193, /* B0 = 0.005908 */
10286 15986, /* A1 = -0.975769 */
10287 -32632, /* A2 = 0.995880 */
10288 18051, /* B2 = 0.550903 */
10289 -8658, /* B1 = -0.528473 */
10290 18051, /* B0 = 0.550903 */
10291 16591, /* A1 = -1.012695 */
10292 -32634, /* A2 = 0.995941 */
10293 15736, /* B2 = 0.480240 */
10294 -8125, /* B1 = -0.495926 */
10295 15736, /* B0 = 0.480240 */
10296 5, /* Internal filter scaling */
10297 159, /* Minimum in-band energy threshold */
10298 21, /* 21/32 in-band to broad-band ratio */
10299 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10302 15564, /* A1 = -0.949982 */
10303 -32404, /* A2 = 0.988922 */
10304 -269, /* B2 = -0.008216 */
10305 0, /* B1 = 0.000000 */
10306 269, /* B0 = 0.008216 */
10307 15310, /* A1 = -0.934479 */
10308 -32632, /* A2 = 0.995880 */
10309 10815, /* B2 = 0.330063 */
10310 -4962, /* B1 = -0.302887 */
10311 10815, /* B0 = 0.330063 */
10312 15924, /* A1 = -0.971924 */
10313 -32634, /* A2 = 0.995941 */
10314 18880, /* B2 = 0.576172 */
10315 -9364, /* B1 = -0.571594 */
10316 18880, /* B0 = 0.576172 */
10317 5, /* Internal filter scaling */
10318 159, /* Minimum in-band energy threshold */
10319 21, /* 21/32 in-band to broad-band ratio */
10320 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10323 15247, /* A1 = -0.930603 */
10324 -32397, /* A2 = 0.988708 */
10325 -244, /* B2 = -0.007451 */
10326 0, /* B1 = 0.000000 */
10327 244, /* B0 = 0.007451 */
10328 14989, /* A1 = -0.914886 */
10329 -32627, /* A2 = 0.995697 */
10330 18961, /* B2 = 0.578644 */
10331 -8498, /* B1 = -0.518707 */
10332 18961, /* B0 = 0.578644 */
10333 15608, /* A1 = -0.952667 */
10334 -32628, /* A2 = 0.995758 */
10335 11145, /* B2 = 0.340134 */
10336 -5430, /* B1 = -0.331467 */
10337 11145, /* B0 = 0.340134 */
10338 5, /* Internal filter scaling */
10339 159, /* Minimum in-band energy threshold */
10340 21, /* 21/32 in-band to broad-band ratio */
10341 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10344 14780, /* A1 = -0.902130 */
10345 -32393, /* A2 = 0.988586 */
10346 -396, /* B2 = -0.012086 */
10347 0, /* B1 = 0.000000 */
10348 396, /* B0 = 0.012086 */
10349 14510, /* A1 = -0.885651 */
10350 -32630, /* A2 = 0.995819 */
10351 6326, /* B2 = 0.193069 */
10352 -2747, /* B1 = -0.167671 */
10353 6326, /* B0 = 0.193069 */
10354 15154, /* A1 = -0.924957 */
10355 -32632, /* A2 = 0.995850 */
10356 23235, /* B2 = 0.709076 */
10357 -10983, /* B1 = -0.670380 */
10358 23235, /* B0 = 0.709076 */
10359 5, /* Internal filter scaling */
10360 159, /* Minimum in-band energy threshold */
10361 21, /* 21/32 in-band to broad-band ratio */
10362 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10365 13005, /* A1 = -0.793793 */
10366 -32368, /* A2 = 0.987823 */
10367 -500, /* B2 = -0.015265 */
10368 0, /* B1 = 0.000000 */
10369 500, /* B0 = 0.015265 */
10370 12708, /* A1 = -0.775665 */
10371 -32615, /* A2 = 0.995331 */
10372 11420, /* B2 = 0.348526 */
10373 -4306, /* B1 = -0.262833 */
10374 11420, /* B0 = 0.348526 */
10375 13397, /* A1 = -0.817688 */
10376 -32615, /* A2 = 0.995361 */
10377 9454, /* B2 = 0.288528 */
10378 -3981, /* B1 = -0.243027 */
10379 9454, /* B0 = 0.288528 */
10380 5, /* Internal filter scaling */
10381 159, /* Minimum in-band energy threshold */
10382 21, /* 21/32 in-band to broad-band ratio */
10383 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10386 10046, /* A1 = -0.613190 */
10387 -32331, /* A2 = 0.986694 */
10388 -455, /* B2 = -0.013915 */
10389 0, /* B1 = 0.000000 */
10390 455, /* B0 = 0.013915 */
10391 9694, /* A1 = -0.591705 */
10392 -32601, /* A2 = 0.994934 */
10393 6023, /* B2 = 0.183815 */
10394 -1708, /* B1 = -0.104279 */
10395 6023, /* B0 = 0.183815 */
10396 10478, /* A1 = -0.639587 */
10397 -32603, /* A2 = 0.994965 */
10398 22031, /* B2 = 0.672333 */
10399 -7342, /* B1 = -0.448151 */
10400 22031, /* B0 = 0.672333 */
10401 5, /* Internal filter scaling */
10402 159, /* Minimum in-band energy threshold */
10403 21, /* 21/32 in-band to broad-band ratio */
10404 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10406 { /* f1633_1638[] */
10407 9181, /* A1 = 0.560394 */
10408 -32256, /* A2 = -0.984375 */
10409 -556, /* B2 = -0.016975 */
10411 556, /* B0 = 0.016975 */
10412 8757, /* A1 = 0.534515 */
10413 -32574, /* A2 = -0.99408 */
10414 8443, /* B2 = 0.25769 */
10415 -2135, /* B1 = -0.130341 */
10416 8443, /* B0 = 0.25769 */
10417 9691, /* A1 = 0.591522 */
10418 -32574, /* A2 = -0.99411 */
10419 15446, /* B2 = 0.471375 */
10420 -4809, /* B1 = -0.293579 */
10421 15446, /* B0 = 0.471375 */
10422 7, /* Internal filter scaling */
10423 159, /* Minimum in-band energy threshold */
10424 21, /* 21/32 in-band to broad-band ratio */
10425 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10428 5076, /* A1 = -0.309875 */
10429 -32304, /* A2 = 0.985840 */
10430 -508, /* B2 = -0.015503 */
10431 0, /* B1 = 0.000000 */
10432 508, /* B0 = 0.015503 */
10433 4646, /* A1 = -0.283600 */
10434 -32605, /* A2 = 0.995026 */
10435 6742, /* B2 = 0.205780 */
10436 -878, /* B1 = -0.053635 */
10437 6742, /* B0 = 0.205780 */
10438 5552, /* A1 = -0.338928 */
10439 -32605, /* A2 = 0.995056 */
10440 23667, /* B2 = 0.722260 */
10441 -4297, /* B1 = -0.262329 */
10442 23667, /* B0 = 0.722260 */
10443 5, /* Internal filter scaling */
10444 159, /* Minimum in-band energy threshold */
10445 21, /* 21/32 in-band to broad-band ratio */
10446 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10449 3569, /* A1 = -0.217865 */
10450 -32292, /* A2 = 0.985504 */
10451 -239, /* B2 = -0.007322 */
10452 0, /* B1 = 0.000000 */
10453 239, /* B0 = 0.007322 */
10454 3117, /* A1 = -0.190277 */
10455 -32603, /* A2 = 0.994965 */
10456 18658, /* B2 = 0.569427 */
10457 -1557, /* B1 = -0.095032 */
10458 18658, /* B0 = 0.569427 */
10459 4054, /* A1 = -0.247437 */
10460 -32603, /* A2 = 0.994965 */
10461 18886, /* B2 = 0.576385 */
10462 -2566, /* B1 = -0.156647 */
10463 18886, /* B0 = 0.576385 */
10464 5, /* Internal filter scaling */
10465 159, /* Minimum in-band energy threshold */
10466 21, /* 21/32 in-band to broad-band ratio */
10467 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10470 static int ixj_init_filter(IXJ
*j
, IXJ_FILTER
* jf
)
10472 unsigned short cmd
;
10475 if (jf
->filter
> 3) {
10478 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, j
)) /* Select Filter */
10482 if (ixj_WriteDSPCommand(0x5152, j
)) /* Disable Filter */
10488 if (ixj_WriteDSPCommand(0x5153, j
)) /* Enable Filter */
10491 /* Select the filter (f0 - f3) to use. */
10492 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, j
))
10495 if (jf
->freq
< 12 && jf
->freq
> 3) {
10496 /* Select the frequency for the selected filter. */
10497 if (ixj_WriteDSPCommand(0x5170 + jf
->freq
, j
))
10499 } else if (jf
->freq
> 11) {
10500 /* We need to load a programmable filter set for undefined */
10501 /* frequencies. So we will point the filter to a programmable set. */
10502 /* Since there are only 4 filters and 4 programmable sets, we will */
10503 /* just point the filter to the same number set and program it for the */
10504 /* frequency we want. */
10505 if (ixj_WriteDSPCommand(0x5170 + jf
->filter
, j
))
10507 if (j
->ver
.low
!= 0x12) {
10514 if (ixj_WriteDSPCommand(cmd
, j
))
10516 for (cnt
= 0; cnt
< max
; cnt
++) {
10517 if (ixj_WriteDSPCommand(tone_table
[jf
->freq
- 12][cnt
], j
))
10521 j
->filter_en
[jf
->filter
] = jf
->enable
;
10525 static int ixj_init_filter_raw(IXJ
*j
, IXJ_FILTER_RAW
* jfr
)
10527 unsigned short cmd
;
10529 if (jfr
->filter
> 3) {
10532 if (ixj_WriteDSPCommand(0x5154 + jfr
->filter
, j
)) /* Select Filter */
10535 if (!jfr
->enable
) {
10536 if (ixj_WriteDSPCommand(0x5152, j
)) /* Disable Filter */
10541 if (ixj_WriteDSPCommand(0x5153, j
)) /* Enable Filter */
10543 /* Select the filter (f0 - f3) to use. */
10544 if (ixj_WriteDSPCommand(0x5154 + jfr
->filter
, j
))
10547 /* We need to load a programmable filter set for undefined */
10548 /* frequencies. So we will point the filter to a programmable set. */
10549 /* Since there are only 4 filters and 4 programmable sets, we will */
10550 /* just point the filter to the same number set and program it for the */
10551 /* frequency we want. */
10552 if (ixj_WriteDSPCommand(0x5170 + jfr
->filter
, j
))
10554 if (j
->ver
.low
!= 0x12) {
10561 if (ixj_WriteDSPCommand(cmd
, j
))
10563 for (cnt
= 0; cnt
< max
; cnt
++) {
10564 if (ixj_WriteDSPCommand(jfr
->coeff
[cnt
], j
))
10567 j
->filter_en
[jfr
->filter
] = jfr
->enable
;
10571 static int ixj_init_tone(IXJ
*j
, IXJ_TONE
* ti
)
10574 unsigned short data
;
10587 if(ti
->tone_index
> 12 && ti
->tone_index
< 28)
10589 if (ixj_WriteDSPCommand(0x6800 + ti
->tone_index
, j
))
10591 if (ixj_WriteDSPCommand(0x6000 + (ti
->gain1
<< 4) + ti
->gain0
, j
))
10594 if (ixj_WriteDSPCommand(data
, j
))
10597 if (ixj_WriteDSPCommand(data
, j
))