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 ***************************************************************************/
45 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
46 * Audit some copy_*_user and minor cleanup.
48 * Revision 4.7 2001/08/13 06:19:33 craigs
49 * Added additional changes from Alan Cox and John Anderson for
50 * 2.2 to 2.4 cleanup and bounds checking
52 * Revision 4.6 2001/08/13 01:05:05 craigs
53 * Really fixed PHONE_QUERY_CODEC problem this time
55 * Revision 4.5 2001/08/13 00:11:03 craigs
56 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
58 * Revision 4.4 2001/08/07 07:58:12 craigs
59 * Changed back to three digit version numbers
60 * Added tagbuild target to allow automatic and easy tagging of versions
62 * Revision 4.3 2001/08/07 07:24:47 craigs
63 * Added ixj-ver.h to allow easy configuration management of driver
64 * Added display of version number in /prox/ixj
66 * Revision 4.2 2001/08/06 07:07:19 craigs
67 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
68 * behaviour of returning int rather than short *
70 * Revision 4.1 2001/08/05 00:17:37 craigs
71 * More changes for correct PCMCIA installation
72 * Start of changes for backward Linux compatibility
74 * Revision 4.0 2001/08/04 12:33:12 craigs
75 * New version using GNU autoconf
77 * Revision 3.105 2001/07/20 23:14:32 eokerson
78 * More work on CallerID generation when using ring cadences.
80 * Revision 3.104 2001/07/06 01:33:55 eokerson
81 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
83 * Revision 3.103 2001/07/05 19:20:16 eokerson
85 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
87 * Revision 3.102 2001/07/03 23:51:21 eokerson
88 * Un-mute mic on Internet LineJACK when in speakerphone mode.
90 * Revision 3.101 2001/07/02 19:26:56 eokerson
91 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
93 * Revision 3.100 2001/07/02 19:18:27 eokerson
94 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
95 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
96 * Fixed speaker mode on Internet LineJACK.
98 * Revision 3.99 2001/05/09 14:11:16 eokerson
99 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
101 * Revision 3.98 2001/05/08 19:55:33 eokerson
102 * Fixed POTS hookstate detection while it is connected to PSTN port.
104 * Revision 3.97 2001/05/08 00:01:04 eokerson
105 * Fixed kernel oops when sending caller ID data.
107 * Revision 3.96 2001/05/04 23:09:30 eokerson
108 * Now uses one kernel timer for each card, instead of one for the entire driver.
110 * Revision 3.95 2001/04/25 22:06:47 eokerson
111 * Fixed squawking at beginning of some G.723.1 calls.
113 * Revision 3.94 2001/04/03 23:42:00 eokerson
114 * Added linear volume ioctls
115 * Added raw filter load ioctl
117 * Revision 3.93 2001/02/27 01:00:06 eokerson
118 * Fixed blocking in CallerID.
119 * Reduced size of ixj structure for smaller driver footprint.
121 * Revision 3.92 2001/02/20 22:02:59 eokerson
122 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
123 * Improved PSTN ring detection.
124 * Fixed wink generation on POTS ports.
126 * Revision 3.91 2001/02/13 00:55:44 eokerson
127 * Turn AEC back on after changing frame sizes.
129 * Revision 3.90 2001/02/12 16:42:00 eokerson
130 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
132 * Revision 3.89 2001/02/12 15:41:16 eokerson
133 * Fix from Artis Kugevics - Tone gains were not being set correctly.
135 * Revision 3.88 2001/02/05 23:25:42 eokerson
136 * Fixed lockup bugs with deregister.
138 * Revision 3.87 2001/01/29 21:00:39 eokerson
139 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
140 * Updated copyright date.
142 * Revision 3.86 2001/01/23 23:53:46 eokerson
143 * Fixes to G.729 compatibility.
145 * Revision 3.85 2001/01/23 21:30:36 eokerson
146 * Added verbage about cards supported.
147 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
149 * Revision 3.84 2001/01/22 23:32:10 eokerson
150 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
152 * Revision 3.83 2001/01/19 14:51:41 eokerson
153 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
155 * Revision 3.82 2001/01/19 00:34:49 eokerson
156 * Added verbosity to write overlap errors.
158 * Revision 3.81 2001/01/18 23:56:54 eokerson
159 * Fixed PSTN line test functions.
161 * Revision 3.80 2001/01/18 22:29:27 eokerson
162 * Updated AEC/AGC values for different cards.
164 * Revision 3.79 2001/01/17 02:58:54 eokerson
165 * Fixed AEC reset after Caller ID.
166 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
168 * Revision 3.78 2001/01/16 19:43:09 eokerson
169 * Added support for Linux 2.4.x kernels.
171 * Revision 3.77 2001/01/09 04:00:52 eokerson
172 * Linetest will now test the line, even if it has previously succeded.
174 * Revision 3.76 2001/01/08 19:27:00 eokerson
175 * Fixed problem with standard cable on Internet PhoneCARD.
177 * Revision 3.75 2000/12/22 16:52:14 eokerson
178 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
180 * Revision 3.74 2000/12/08 22:41:50 eokerson
181 * Added capability for G729B.
183 * Revision 3.73 2000/12/07 23:35:16 eokerson
184 * Added capability to have different ring pattern before CallerID data.
185 * Added hookstate checks in CallerID routines to stop FSK.
187 * Revision 3.72 2000/12/06 19:31:31 eokerson
188 * Modified signal behavior to only send one signal per event.
190 * Revision 3.71 2000/12/06 03:23:08 eokerson
191 * Fixed CallerID on Call Waiting.
193 * Revision 3.70 2000/12/04 21:29:37 eokerson
194 * Added checking to Smart Cable gain functions.
196 * Revision 3.69 2000/12/04 21:05:20 eokerson
197 * Changed ixjdebug levels.
198 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
200 * Revision 3.68 2000/12/04 00:17:21 craigs
201 * Changed mixer voice gain to +6dB rather than 0dB
203 * Revision 3.67 2000/11/30 21:25:51 eokerson
204 * Fixed write signal errors.
206 * Revision 3.66 2000/11/29 22:42:44 eokerson
207 * Fixed PSTN ring detect problems.
209 * Revision 3.65 2000/11/29 07:31:55 craigs
210 * Added new 425Hz filter co-efficients
211 * Added card-specific DTMF prescaler initialisation
213 * Revision 3.64 2000/11/28 14:03:32 craigs
214 * Changed certain mixer initialisations to be 0dB rather than 12dB
215 * Added additional information to /proc/ixj
217 * Revision 3.63 2000/11/28 11:38:41 craigs
218 * Added display of AEC modes in AUTO and AGC mode
220 * Revision 3.62 2000/11/28 04:05:44 eokerson
221 * Improved PSTN ring detection routine.
223 * Revision 3.61 2000/11/27 21:53:12 eokerson
224 * Fixed flash detection.
226 * Revision 3.60 2000/11/27 15:57:29 eokerson
227 * More work on G.729 load routines.
229 * Revision 3.59 2000/11/25 21:55:12 eokerson
230 * Fixed errors in G.729 load routine.
232 * Revision 3.58 2000/11/25 04:08:29 eokerson
233 * Added board locks around G.729 and TS85 load routines.
235 * Revision 3.57 2000/11/24 05:35:17 craigs
236 * Added ability to retrieve mixer values on LineJACK
237 * Added complete initialisation of all mixer values at startup
238 * Fixed spelling mistake
240 * Revision 3.56 2000/11/23 02:52:11 robertj
241 * Added cvs change log keyword.
242 * Fixed bug in capabilities list when using G.729 module.
248 #define PERFMON_STATS
252 #include <linux/module.h>
254 #include <linux/init.h>
255 #include <linux/sched.h>
256 #include <linux/kernel.h> /* printk() */
257 #include <linux/fs.h> /* everything... */
258 #include <linux/errno.h> /* error codes */
259 #include <linux/slab.h>
260 #include <linux/smp_lock.h>
261 #include <linux/mm.h>
262 #include <linux/ioport.h>
263 #include <linux/interrupt.h>
264 #include <linux/proc_fs.h>
265 #include <linux/poll.h>
266 #include <linux/timer.h>
267 #include <linux/delay.h>
268 #include <linux/pci.h>
271 #include <asm/uaccess.h>
273 #include <linux/isapnp.h>
277 #define TYPE(inode) (iminor(inode) >> 4)
278 #define NUM(inode) (iminor(inode) & 0xf)
281 static int hertz
= HZ
;
282 static int samplerate
= 100;
284 module_param(ixjdebug
, int, 0);
286 static struct pci_device_id ixj_pci_tbl
[] __devinitdata
= {
287 { PCI_VENDOR_ID_QUICKNET
, PCI_DEVICE_ID_QUICKNET_XJ
,
288 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
292 MODULE_DEVICE_TABLE(pci
, ixj_pci_tbl
);
294 /************************************************************************
296 * ixjdebug meanings are now bit mapped instead of level based
297 * Values can be or'ed together to turn on multiple messages
299 * bit 0 (0x0001) = any failure
300 * bit 1 (0x0002) = general messages
301 * bit 2 (0x0004) = POTS ringing related
302 * bit 3 (0x0008) = PSTN events
303 * bit 4 (0x0010) = PSTN Cadence state details
304 * bit 5 (0x0020) = Tone detection triggers
305 * bit 6 (0x0040) = Tone detection cadence details
306 * bit 7 (0x0080) = ioctl tracking
307 * bit 8 (0x0100) = signal tracking
308 * bit 9 (0x0200) = CallerID generation details
310 ************************************************************************/
314 static IXJ
*ixj
[IXJMAX
];
315 #define get_ixj(b) ixj[(b)]
318 * Allocate a free IXJ device
321 static IXJ
*ixj_alloc()
323 for(cnt
=0; cnt
<IXJMAX
; cnt
++)
325 if(ixj
[cnt
] == NULL
|| !ixj
[cnt
]->DSPbase
)
327 j
= kmalloc(sizeof(IXJ
), GFP_KERNEL
);
337 static void ixj_fsk_free(IXJ
*j
)
343 static void ixj_fsk_alloc(IXJ
*j
)
346 j
->fskdata
= kmalloc(8000, GFP_KERNEL
);
348 if(ixjdebug
& 0x0200) {
349 printk("IXJ phone%d - allocate failed\n", j
->board
);
354 if(ixjdebug
& 0x0200) {
355 printk("IXJ phone%d - allocate succeded\n", j
->board
);
363 static IXJ ixj
[IXJMAX
];
364 #define get_ixj(b) (&ixj[(b)])
367 * Allocate a free IXJ device
370 static IXJ
*ixj_alloc(void)
373 for(cnt
=0; cnt
<IXJMAX
; cnt
++) {
374 if(!ixj
[cnt
].DSPbase
)
380 static inline void ixj_fsk_free(IXJ
*j
) {;}
382 static inline void ixj_fsk_alloc(IXJ
*j
)
390 #define ixj_perfmon(x) ((x)++)
392 #define ixj_perfmon(x) do { } while(0)
395 static int ixj_convert_loaded
;
397 static int ixj_WriteDSPCommand(unsigned short, IXJ
*j
);
399 /************************************************************************
401 * These are function definitions to allow external modules to register
402 * enhanced functionality call backs.
404 ************************************************************************/
406 static int Stub(IXJ
* J
, unsigned long arg
)
411 static IXJ_REGFUNC ixj_PreRead
= &Stub
;
412 static IXJ_REGFUNC ixj_PostRead
= &Stub
;
413 static IXJ_REGFUNC ixj_PreWrite
= &Stub
;
414 static IXJ_REGFUNC ixj_PostWrite
= &Stub
;
416 static void ixj_read_frame(IXJ
*j
);
417 static void ixj_write_frame(IXJ
*j
);
418 static void ixj_init_timer(IXJ
*j
);
419 static void ixj_add_timer(IXJ
* j
);
420 static void ixj_timeout(unsigned long ptr
);
421 static int read_filters(IXJ
*j
);
422 static int LineMonitor(IXJ
*j
);
423 static int ixj_fasync(int fd
, struct file
*, int mode
);
424 static int ixj_set_port(IXJ
*j
, int arg
);
425 static int ixj_set_pots(IXJ
*j
, int arg
);
426 static int ixj_hookstate(IXJ
*j
);
427 static int ixj_record_start(IXJ
*j
);
428 static void ixj_record_stop(IXJ
*j
);
429 static void set_rec_volume(IXJ
*j
, int volume
);
430 static int get_rec_volume(IXJ
*j
);
431 static int set_rec_codec(IXJ
*j
, int rate
);
432 static void ixj_vad(IXJ
*j
, int arg
);
433 static int ixj_play_start(IXJ
*j
);
434 static void ixj_play_stop(IXJ
*j
);
435 static int ixj_set_tone_on(unsigned short arg
, IXJ
*j
);
436 static int ixj_set_tone_off(unsigned short, IXJ
*j
);
437 static int ixj_play_tone(IXJ
*j
, char tone
);
438 static void ixj_aec_start(IXJ
*j
, int level
);
439 static int idle(IXJ
*j
);
440 static void ixj_ring_on(IXJ
*j
);
441 static void ixj_ring_off(IXJ
*j
);
442 static void aec_stop(IXJ
*j
);
443 static void ixj_ringback(IXJ
*j
);
444 static void ixj_busytone(IXJ
*j
);
445 static void ixj_dialtone(IXJ
*j
);
446 static void ixj_cpt_stop(IXJ
*j
);
447 static char daa_int_read(IXJ
*j
);
448 static char daa_CR_read(IXJ
*j
, int cr
);
449 static int daa_set_mode(IXJ
*j
, int mode
);
450 static int ixj_linetest(IXJ
*j
);
451 static int ixj_daa_write(IXJ
*j
);
452 static int ixj_daa_cid_read(IXJ
*j
);
453 static void DAA_Coeff_US(IXJ
*j
);
454 static void DAA_Coeff_UK(IXJ
*j
);
455 static void DAA_Coeff_France(IXJ
*j
);
456 static void DAA_Coeff_Germany(IXJ
*j
);
457 static void DAA_Coeff_Australia(IXJ
*j
);
458 static void DAA_Coeff_Japan(IXJ
*j
);
459 static int ixj_init_filter(IXJ
*j
, IXJ_FILTER
* jf
);
460 static int ixj_init_filter_raw(IXJ
*j
, IXJ_FILTER_RAW
* jfr
);
461 static int ixj_init_tone(IXJ
*j
, IXJ_TONE
* ti
);
462 static int ixj_build_cadence(IXJ
*j
, IXJ_CADENCE __user
* cp
);
463 static int ixj_build_filter_cadence(IXJ
*j
, IXJ_FILTER_CADENCE __user
* cp
);
464 /* Serial Control Interface funtions */
465 static int SCI_Control(IXJ
*j
, int control
);
466 static int SCI_Prepare(IXJ
*j
);
467 static int SCI_WaitHighSCI(IXJ
*j
);
468 static int SCI_WaitLowSCI(IXJ
*j
);
469 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
);
470 static int ixj_PCcontrol_wait(IXJ
*j
);
471 static void ixj_pre_cid(IXJ
*j
);
472 static void ixj_write_cid(IXJ
*j
);
473 static void ixj_write_cid_bit(IXJ
*j
, int bit
);
474 static int set_base_frame(IXJ
*j
, int size
);
475 static int set_play_codec(IXJ
*j
, int rate
);
476 static void set_rec_depth(IXJ
*j
, int depth
);
477 static int ixj_mixer(long val
, IXJ
*j
);
479 /************************************************************************
480 CT8020/CT8021 Host Programmers Model
481 Host address Function Access
483 0-1 Aux Software Status Register (reserved) Read Only
484 2-3 Software Status Register Read Only
485 4-5 Aux Software Control Register (reserved) Read Write
486 6-7 Software Control Register Read Write
487 8-9 Hardware Status Register Read Only
488 A-B Hardware Control Register Read Write
489 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
490 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
491 ************************************************************************/
493 static inline void ixj_read_HSR(IXJ
*j
)
495 j
->hsr
.bytes
.low
= inb_p(j
->DSPbase
+ 8);
496 j
->hsr
.bytes
.high
= inb_p(j
->DSPbase
+ 9);
499 static inline int IsControlReady(IXJ
*j
)
502 return j
->hsr
.bits
.controlrdy
? 1 : 0;
505 static inline int IsPCControlReady(IXJ
*j
)
507 j
->pccr1
.byte
= inb_p(j
->XILINXbase
+ 3);
508 return j
->pccr1
.bits
.crr
? 1 : 0;
511 static inline int IsStatusReady(IXJ
*j
)
514 return j
->hsr
.bits
.statusrdy
? 1 : 0;
517 static inline int IsRxReady(IXJ
*j
)
520 ixj_perfmon(j
->rxreadycheck
);
521 return j
->hsr
.bits
.rxrdy
? 1 : 0;
524 static inline int IsTxReady(IXJ
*j
)
527 ixj_perfmon(j
->txreadycheck
);
528 return j
->hsr
.bits
.txrdy
? 1 : 0;
531 static inline void set_play_volume(IXJ
*j
, int volume
)
533 if (ixjdebug
& 0x0002)
534 printk(KERN_INFO
"IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j
->board
, volume
);
535 ixj_WriteDSPCommand(0xCF02, j
);
536 ixj_WriteDSPCommand(volume
, j
);
539 static int set_play_volume_linear(IXJ
*j
, int volume
)
541 int newvolume
, dspplaymax
;
543 if (ixjdebug
& 0x0002)
544 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j
->board
, volume
);
545 if(volume
> 100 || volume
< 0) {
549 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
550 switch (j
->cardtype
) {
555 if(j
->port
== PORT_PSTN
) {
561 case QTI_PHONEJACK_LITE
:
564 case QTI_PHONEJACK_PCI
:
573 newvolume
= (dspplaymax
* volume
) / 100;
574 set_play_volume(j
, newvolume
);
578 static inline void set_play_depth(IXJ
*j
, int depth
)
584 ixj_WriteDSPCommand(0x5280 + depth
, j
);
587 static inline int get_play_volume(IXJ
*j
)
589 ixj_WriteDSPCommand(0xCF00, j
);
590 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
593 static int get_play_volume_linear(IXJ
*j
)
595 int volume
, newvolume
, dspplaymax
;
597 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
598 switch (j
->cardtype
) {
603 if(j
->port
== PORT_PSTN
) {
609 case QTI_PHONEJACK_LITE
:
612 case QTI_PHONEJACK_PCI
:
621 volume
= get_play_volume(j
);
622 newvolume
= (volume
* 100) / dspplaymax
;
628 static inline BYTE
SLIC_GetState(IXJ
*j
)
630 if (j
->cardtype
== QTI_PHONECARD
) {
632 j
->psccr
.bits
.dev
= 3;
633 j
->psccr
.bits
.rw
= 1;
634 outw_p(j
->psccr
.byte
<< 8, j
->XILINXbase
+ 0x00);
635 ixj_PCcontrol_wait(j
);
636 j
->pslic
.byte
= inw_p(j
->XILINXbase
+ 0x00) & 0xFF;
637 ixj_PCcontrol_wait(j
);
638 if (j
->pslic
.bits
.powerdown
)
639 return PLD_SLIC_STATE_OC
;
640 else if (!j
->pslic
.bits
.ring0
&& !j
->pslic
.bits
.ring1
)
641 return PLD_SLIC_STATE_ACTIVE
;
643 return PLD_SLIC_STATE_RINGING
;
645 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
647 return j
->pld_slicr
.bits
.state
;
650 static bool SLIC_SetState(BYTE byState
, IXJ
*j
)
652 bool fRetVal
= false;
654 if (j
->cardtype
== QTI_PHONECARD
) {
655 if (j
->flags
.pcmciasct
) {
657 case PLD_SLIC_STATE_TIPOPEN
:
658 case PLD_SLIC_STATE_OC
:
659 j
->pslic
.bits
.powerdown
= 1;
660 j
->pslic
.bits
.ring0
= j
->pslic
.bits
.ring1
= 0;
663 case PLD_SLIC_STATE_RINGING
:
664 if (j
->readers
|| j
->writers
) {
665 j
->pslic
.bits
.powerdown
= 0;
666 j
->pslic
.bits
.ring0
= 1;
667 j
->pslic
.bits
.ring1
= 0;
671 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
673 case PLD_SLIC_STATE_STANDBY
:
674 case PLD_SLIC_STATE_ACTIVE
:
675 if (j
->readers
|| j
->writers
) {
676 j
->pslic
.bits
.powerdown
= 0;
678 j
->pslic
.bits
.powerdown
= 1;
680 j
->pslic
.bits
.ring0
= j
->pslic
.bits
.ring1
= 0;
683 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
685 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
691 j
->psccr
.bits
.dev
= 3;
692 j
->psccr
.bits
.rw
= 0;
693 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
694 ixj_PCcontrol_wait(j
);
697 /* Set the C1, C2, C3 & B2EN signals. */
699 case PLD_SLIC_STATE_OC
:
700 j
->pld_slicw
.bits
.c1
= 0;
701 j
->pld_slicw
.bits
.c2
= 0;
702 j
->pld_slicw
.bits
.c3
= 0;
703 j
->pld_slicw
.bits
.b2en
= 0;
704 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
707 case PLD_SLIC_STATE_RINGING
:
708 j
->pld_slicw
.bits
.c1
= 1;
709 j
->pld_slicw
.bits
.c2
= 0;
710 j
->pld_slicw
.bits
.c3
= 0;
711 j
->pld_slicw
.bits
.b2en
= 1;
712 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
715 case PLD_SLIC_STATE_ACTIVE
:
716 j
->pld_slicw
.bits
.c1
= 0;
717 j
->pld_slicw
.bits
.c2
= 1;
718 j
->pld_slicw
.bits
.c3
= 0;
719 j
->pld_slicw
.bits
.b2en
= 0;
720 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
723 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
725 j
->pld_slicw
.bits
.c1
= 1;
726 j
->pld_slicw
.bits
.c2
= 1;
727 j
->pld_slicw
.bits
.c3
= 0;
728 j
->pld_slicw
.bits
.b2en
= 0;
729 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
732 case PLD_SLIC_STATE_TIPOPEN
:
733 j
->pld_slicw
.bits
.c1
= 0;
734 j
->pld_slicw
.bits
.c2
= 0;
735 j
->pld_slicw
.bits
.c3
= 1;
736 j
->pld_slicw
.bits
.b2en
= 0;
737 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
740 case PLD_SLIC_STATE_STANDBY
:
741 j
->pld_slicw
.bits
.c1
= 1;
742 j
->pld_slicw
.bits
.c2
= 0;
743 j
->pld_slicw
.bits
.c3
= 1;
744 j
->pld_slicw
.bits
.b2en
= 1;
745 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
748 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
750 j
->pld_slicw
.bits
.c1
= 0;
751 j
->pld_slicw
.bits
.c2
= 1;
752 j
->pld_slicw
.bits
.c3
= 1;
753 j
->pld_slicw
.bits
.b2en
= 0;
754 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
757 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
759 j
->pld_slicw
.bits
.c1
= 1;
760 j
->pld_slicw
.bits
.c2
= 1;
761 j
->pld_slicw
.bits
.c3
= 1;
762 j
->pld_slicw
.bits
.b2en
= 0;
763 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
775 static int ixj_wink(IXJ
*j
)
779 slicnow
= SLIC_GetState(j
);
781 j
->pots_winkstart
= jiffies
;
782 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
784 msleep(jiffies_to_msecs(j
->winktime
));
786 SLIC_SetState(slicnow
, j
);
790 static void ixj_init_timer(IXJ
*j
)
792 init_timer(&j
->timer
);
793 j
->timer
.function
= ixj_timeout
;
794 j
->timer
.data
= (unsigned long)j
;
797 static void ixj_add_timer(IXJ
*j
)
799 j
->timer
.expires
= jiffies
+ (hertz
/ samplerate
);
800 add_timer(&j
->timer
);
803 static void ixj_tone_timeout(IXJ
*j
)
808 if (j
->tone_state
== 3) {
811 j
->tone_cadence_state
++;
812 if (j
->tone_cadence_state
>= j
->cadence_t
->elements_used
) {
813 switch (j
->cadence_t
->termination
) {
817 case REPEAT_LAST_ELEMENT
:
818 j
->tone_cadence_state
--;
819 ixj_play_tone(j
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
822 j
->tone_cadence_state
= 0;
823 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
) {
824 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
825 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
826 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
827 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
828 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
829 ixj_init_tone(j
, &ti
);
831 ixj_set_tone_on(j
->cadence_t
->ce
[0].tone_on_time
, j
);
832 ixj_set_tone_off(j
->cadence_t
->ce
[0].tone_off_time
, j
);
833 ixj_play_tone(j
, j
->cadence_t
->ce
[0].index
);
837 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
) {
838 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
839 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
840 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
841 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
842 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
843 ixj_init_tone(j
, &ti
);
845 ixj_set_tone_on(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_on_time
, j
);
846 ixj_set_tone_off(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_off_time
, j
);
847 ixj_play_tone(j
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
853 static inline void ixj_kill_fasync(IXJ
*j
, IXJ_SIGEVENT event
, int dir
)
855 if(j
->ixj_signals
[event
]) {
856 if(ixjdebug
& 0x0100)
857 printk("Sending signal for event %d\n", event
);
858 /* Send apps notice of change */
859 /* see config.h for macro definition */
860 kill_fasync(&(j
->async_queue
), j
->ixj_signals
[event
], dir
);
864 static void ixj_pstn_state(IXJ
*j
)
867 union XOPXR0 XR0
, daaint
;
871 XR0
.reg
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
;
873 XR0
.bitreg
.RMR
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
;
875 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
876 if (j
->pld_scrr
.bits
.daaflag
) {
878 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.RING
) {
879 if(time_after(jiffies
, j
->pstn_sleeptil
) && !(j
->flags
.pots_pstn
&& j
->hookstate
)) {
880 daaint
.bitreg
.RING
= 1;
881 if(ixjdebug
& 0x0008) {
882 printk(KERN_INFO
"IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
885 daa_set_mode(j
, SOP_PU_RESET
);
888 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Caller_ID
) {
889 daaint
.bitreg
.Caller_ID
= 1;
890 j
->pstn_cid_intr
= 1;
891 j
->pstn_cid_received
= jiffies
;
892 if(ixjdebug
& 0x0008) {
893 printk(KERN_INFO
"IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
896 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Cadence
) {
897 daaint
.bitreg
.Cadence
= 1;
898 if(ixjdebug
& 0x0008) {
899 printk(KERN_INFO
"IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j
->board
, jiffies
);
902 if(j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
!= XR0
.bitreg
.VDD_OK
) {
903 daaint
.bitreg
.VDD_OK
= 1;
904 daaint
.bitreg
.SI_0
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
;
908 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
)) {
909 daaint
.bitreg
.RMR
= 1;
910 daaint
.bitreg
.SI_1
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
;
911 if(ixjdebug
& 0x0008) {
912 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
);
914 j
->pstn_prev_rmr
= j
->pstn_last_rmr
;
915 j
->pstn_last_rmr
= jiffies
;
917 switch(j
->daa_mode
) {
919 if (daaint
.bitreg
.RING
) {
920 if (!j
->flags
.pstn_ringing
) {
921 if (j
->daa_mode
!= SOP_PU_RINGING
) {
922 j
->pstn_ring_int
= jiffies
;
923 daa_set_mode(j
, SOP_PU_RINGING
);
929 if (daaint
.bitreg
.RMR
) {
930 if (ixjdebug
& 0x0008) {
931 printk(KERN_INFO
"IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j
->cadence_f
[4].state
, j
->board
, jiffies
);
933 if (daaint
.bitreg
.SI_1
) { /* Rising edge of RMR */
934 j
->flags
.pstn_rmr
= 1;
935 j
->pstn_ring_start
= jiffies
;
936 j
->pstn_ring_stop
= 0;
937 j
->ex
.bits
.pstn_ring
= 0;
938 if (j
->cadence_f
[4].state
== 0) {
939 j
->cadence_f
[4].state
= 1;
940 j
->cadence_f
[4].on1min
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100 - var
)) / 10000);
941 j
->cadence_f
[4].on1dot
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100)) / 10000);
942 j
->cadence_f
[4].on1max
= jiffies
+ (long)((j
->cadence_f
[4].on1
* hertz
* (100 + var
)) / 10000);
943 } else if (j
->cadence_f
[4].state
== 2) {
944 if((time_after(jiffies
, j
->cadence_f
[4].off1min
) &&
945 time_before(jiffies
, j
->cadence_f
[4].off1max
))) {
946 if (j
->cadence_f
[4].on2
) {
947 j
->cadence_f
[4].state
= 3;
948 j
->cadence_f
[4].on2min
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100 - var
)) / 10000));
949 j
->cadence_f
[4].on2dot
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100)) / 10000));
950 j
->cadence_f
[4].on2max
= jiffies
+ (long)((j
->cadence_f
[4].on2
* (hertz
* (100 + var
)) / 10000));
952 j
->cadence_f
[4].state
= 7;
955 if (ixjdebug
& 0x0008) {
956 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
957 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
958 j
->cadence_f
[4].off1
);
960 j
->cadence_f
[4].state
= 0;
962 } else if (j
->cadence_f
[4].state
== 4) {
963 if((time_after(jiffies
, j
->cadence_f
[4].off2min
) &&
964 time_before(jiffies
, j
->cadence_f
[4].off2max
))) {
965 if (j
->cadence_f
[4].on3
) {
966 j
->cadence_f
[4].state
= 5;
967 j
->cadence_f
[4].on3min
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100 - var
)) / 10000));
968 j
->cadence_f
[4].on3dot
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100)) / 10000));
969 j
->cadence_f
[4].on3max
= jiffies
+ (long)((j
->cadence_f
[4].on3
* (hertz
* (100 + var
)) / 10000));
971 j
->cadence_f
[4].state
= 7;
974 if (ixjdebug
& 0x0008) {
975 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
976 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
977 j
->cadence_f
[4].off2
);
979 j
->cadence_f
[4].state
= 0;
981 } else if (j
->cadence_f
[4].state
== 6) {
982 if((time_after(jiffies
, j
->cadence_f
[4].off3min
) &&
983 time_before(jiffies
, j
->cadence_f
[4].off3max
))) {
984 j
->cadence_f
[4].state
= 7;
986 if (ixjdebug
& 0x0008) {
987 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
988 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
989 j
->cadence_f
[4].off3
);
991 j
->cadence_f
[4].state
= 0;
994 j
->cadence_f
[4].state
= 0;
996 } else { /* Falling edge of RMR */
997 j
->pstn_ring_start
= 0;
998 j
->pstn_ring_stop
= jiffies
;
999 if (j
->cadence_f
[4].state
== 1) {
1000 if(!j
->cadence_f
[4].on1
) {
1001 j
->cadence_f
[4].state
= 7;
1002 } else if((time_after(jiffies
, j
->cadence_f
[4].on1min
) &&
1003 time_before(jiffies
, j
->cadence_f
[4].on1max
))) {
1004 if (j
->cadence_f
[4].off1
) {
1005 j
->cadence_f
[4].state
= 2;
1006 j
->cadence_f
[4].off1min
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100 - var
)) / 10000));
1007 j
->cadence_f
[4].off1dot
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100)) / 10000));
1008 j
->cadence_f
[4].off1max
= jiffies
+ (long)((j
->cadence_f
[4].off1
* (hertz
* (100 + var
)) / 10000));
1010 j
->cadence_f
[4].state
= 7;
1013 if (ixjdebug
& 0x0008) {
1014 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1015 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1016 j
->cadence_f
[4].on1
);
1018 j
->cadence_f
[4].state
= 0;
1020 } else if (j
->cadence_f
[4].state
== 3) {
1021 if((time_after(jiffies
, j
->cadence_f
[4].on2min
) &&
1022 time_before(jiffies
, j
->cadence_f
[4].on2max
))) {
1023 if (j
->cadence_f
[4].off2
) {
1024 j
->cadence_f
[4].state
= 4;
1025 j
->cadence_f
[4].off2min
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100 - var
)) / 10000));
1026 j
->cadence_f
[4].off2dot
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100)) / 10000));
1027 j
->cadence_f
[4].off2max
= jiffies
+ (long)((j
->cadence_f
[4].off2
* (hertz
* (100 + var
)) / 10000));
1029 j
->cadence_f
[4].state
= 7;
1032 if (ixjdebug
& 0x0008) {
1033 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1034 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1035 j
->cadence_f
[4].on2
);
1037 j
->cadence_f
[4].state
= 0;
1039 } else if (j
->cadence_f
[4].state
== 5) {
1040 if((time_after(jiffies
, j
->cadence_f
[4].on3min
) &&
1041 time_before(jiffies
, j
->cadence_f
[4].on3max
))) {
1042 if (j
->cadence_f
[4].off3
) {
1043 j
->cadence_f
[4].state
= 6;
1044 j
->cadence_f
[4].off3min
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100 - var
)) / 10000));
1045 j
->cadence_f
[4].off3dot
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100)) / 10000));
1046 j
->cadence_f
[4].off3max
= jiffies
+ (long)((j
->cadence_f
[4].off3
* (hertz
* (100 + var
)) / 10000));
1048 j
->cadence_f
[4].state
= 7;
1051 j
->cadence_f
[4].state
= 0;
1054 if (ixjdebug
& 0x0008) {
1055 printk(KERN_INFO
"IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1056 j
->cadence_f
[4].state
, j
->board
, jiffies
- j
->pstn_prev_rmr
,
1057 j
->cadence_f
[4].on3
);
1059 j
->cadence_f
[4].state
= 0;
1062 if (ixjdebug
& 0x0010) {
1063 printk(KERN_INFO
"IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j
->cadence_f
[4].state
, j
->board
, jiffies
);
1065 if (ixjdebug
& 0x0010) {
1066 switch(j
->cadence_f
[4].state
) {
1068 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1069 j
->cadence_f
[4].on1
, j
->cadence_f
[4].on1min
, j
->cadence_f
[4].on1dot
, j
->cadence_f
[4].on1max
);
1072 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1073 j
->cadence_f
[4].off1
, j
->cadence_f
[4].off1min
, j
->cadence_f
[4].off1dot
, j
->cadence_f
[4].off1max
);
1076 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1077 j
->cadence_f
[4].on2
, j
->cadence_f
[4].on2min
, j
->cadence_f
[4].on2dot
, j
->cadence_f
[4].on2max
);
1080 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1081 j
->cadence_f
[4].off2
, j
->cadence_f
[4].off2min
, j
->cadence_f
[4].off2dot
, j
->cadence_f
[4].off2max
);
1084 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1085 j
->cadence_f
[4].on3
, j
->cadence_f
[4].on3min
, j
->cadence_f
[4].on3dot
, j
->cadence_f
[4].on3max
);
1088 printk(KERN_INFO
"IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j
->board
,
1089 j
->cadence_f
[4].off3
, j
->cadence_f
[4].off3min
, j
->cadence_f
[4].off3dot
, j
->cadence_f
[4].off3max
);
1094 if (j
->cadence_f
[4].state
== 7) {
1095 j
->cadence_f
[4].state
= 0;
1096 j
->pstn_ring_stop
= jiffies
;
1097 j
->ex
.bits
.pstn_ring
= 1;
1098 ixj_kill_fasync(j
, SIG_PSTN_RING
, POLL_IN
);
1099 if(ixjdebug
& 0x0008) {
1100 printk(KERN_INFO
"IXJ Ring int set /dev/phone%d at %ld\n", j
->board
, jiffies
);
1103 if((j
->pstn_ring_int
!= 0 && time_after(jiffies
, j
->pstn_ring_int
+ (hertz
* 5)) && !j
->flags
.pstn_rmr
) ||
1104 (j
->pstn_ring_stop
!= 0 && time_after(jiffies
, j
->pstn_ring_stop
+ (hertz
* 5)))) {
1105 if(ixjdebug
& 0x0008) {
1106 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j
->board
, jiffies
);
1107 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j
->board
, j
->pstn_ring_int
);
1108 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j
->board
, j
->pstn_ring_stop
);
1110 j
->pstn_ring_stop
= j
->pstn_ring_int
= 0;
1111 daa_set_mode(j
, SOP_PU_SLEEP
);
1113 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
1114 if (j
->pstn_cid_intr
&& time_after(jiffies
, j
->pstn_cid_received
+ hertz
)) {
1115 ixj_daa_cid_read(j
);
1116 j
->ex
.bits
.caller_id
= 1;
1117 ixj_kill_fasync(j
, SIG_CALLER_ID
, POLL_IN
);
1118 j
->pstn_cid_intr
= 0;
1120 if (daaint
.bitreg
.Cadence
) {
1121 if(ixjdebug
& 0x0008) {
1122 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j
->board
);
1124 daa_set_mode(j
, SOP_PU_SLEEP
);
1125 j
->ex
.bits
.pstn_ring
= 0;
1128 case SOP_PU_CONVERSATION
:
1129 if (daaint
.bitreg
.VDD_OK
) {
1130 if(!daaint
.bitreg
.SI_0
) {
1131 if (!j
->pstn_winkstart
) {
1132 if(ixjdebug
& 0x0008) {
1133 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j
->board
, jiffies
);
1135 j
->pstn_winkstart
= jiffies
;
1138 if (j
->pstn_winkstart
) {
1139 if(ixjdebug
& 0x0008) {
1140 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j
->board
, jiffies
);
1142 j
->pstn_winkstart
= 0;
1146 if (j
->pstn_winkstart
&& time_after(jiffies
, j
->pstn_winkstart
+ ((hertz
* j
->winktime
) / 1000))) {
1147 if(ixjdebug
& 0x0008) {
1148 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j
->board
, jiffies
);
1150 daa_set_mode(j
, SOP_PU_SLEEP
);
1151 j
->pstn_winkstart
= 0;
1152 j
->ex
.bits
.pstn_wink
= 1;
1153 ixj_kill_fasync(j
, SIG_PSTN_WINK
, POLL_IN
);
1159 static void ixj_timeout(unsigned long ptr
)
1162 unsigned long jifon
;
1163 IXJ
*j
= (IXJ
*)ptr
;
1166 if (j
->DSPbase
&& atomic_read(&j
->DSPWrite
) == 0 && test_and_set_bit(board
, (void *)&j
->busyflags
) == 0) {
1167 ixj_perfmon(j
->timerchecks
);
1168 j
->hookstate
= ixj_hookstate(j
);
1169 if (j
->tone_state
) {
1170 if (!(j
->hookstate
)) {
1174 j
->ex
.bits
.hookstate
= 1;
1175 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1177 clear_bit(board
, &j
->busyflags
);
1181 if (j
->tone_state
== 1)
1182 jifon
= ((hertz
* j
->tone_on_time
) * 25 / 100000);
1184 jifon
= ((hertz
* j
->tone_on_time
) * 25 / 100000) + ((hertz
* j
->tone_off_time
) * 25 / 100000);
1185 if (time_before(jiffies
, j
->tone_start_jif
+ jifon
)) {
1186 if (j
->tone_state
== 1) {
1187 ixj_play_tone(j
, j
->tone_index
);
1188 if (j
->dsp
.low
== 0x20) {
1189 clear_bit(board
, &j
->busyflags
);
1194 ixj_play_tone(j
, 0);
1195 if (j
->dsp
.low
== 0x20) {
1196 clear_bit(board
, &j
->busyflags
);
1202 ixj_tone_timeout(j
);
1203 if (j
->flags
.dialtone
) {
1206 if (j
->flags
.busytone
) {
1208 if (j
->dsp
.low
== 0x20) {
1209 clear_bit(board
, &j
->busyflags
);
1214 if (j
->flags
.ringback
) {
1216 if (j
->dsp
.low
== 0x20) {
1217 clear_bit(board
, &j
->busyflags
);
1222 if (!j
->tone_state
) {
1227 if (!(j
->tone_state
&& j
->dsp
.low
== 0x20)) {
1235 if (j
->flags
.cringing
) {
1236 if (j
->hookstate
& 1) {
1237 j
->flags
.cringing
= 0;
1239 } else if(j
->cadence_f
[5].enable
&& ((!j
->cadence_f
[5].en_filter
) || (j
->cadence_f
[5].en_filter
&& j
->flags
.firstring
))) {
1240 switch(j
->cadence_f
[5].state
) {
1242 j
->cadence_f
[5].on1dot
= jiffies
+ (long)((j
->cadence_f
[5].on1
* (hertz
* 100) / 10000));
1243 if (time_before(jiffies
, j
->cadence_f
[5].on1dot
)) {
1244 if(ixjdebug
& 0x0004) {
1245 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1249 j
->cadence_f
[5].state
= 1;
1252 if (time_after(jiffies
, j
->cadence_f
[5].on1dot
)) {
1253 j
->cadence_f
[5].off1dot
= jiffies
+ (long)((j
->cadence_f
[5].off1
* (hertz
* 100) / 10000));
1254 if(ixjdebug
& 0x0004) {
1255 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1258 j
->cadence_f
[5].state
= 2;
1262 if (time_after(jiffies
, j
->cadence_f
[5].off1dot
)) {
1263 if(ixjdebug
& 0x0004) {
1264 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1267 if (j
->cadence_f
[5].on2
) {
1268 j
->cadence_f
[5].on2dot
= jiffies
+ (long)((j
->cadence_f
[5].on2
* (hertz
* 100) / 10000));
1269 j
->cadence_f
[5].state
= 3;
1271 j
->cadence_f
[5].state
= 7;
1276 if (time_after(jiffies
, j
->cadence_f
[5].on2dot
)) {
1277 if(ixjdebug
& 0x0004) {
1278 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1281 if (j
->cadence_f
[5].off2
) {
1282 j
->cadence_f
[5].off2dot
= jiffies
+ (long)((j
->cadence_f
[5].off2
* (hertz
* 100) / 10000));
1283 j
->cadence_f
[5].state
= 4;
1285 j
->cadence_f
[5].state
= 7;
1290 if (time_after(jiffies
, j
->cadence_f
[5].off2dot
)) {
1291 if(ixjdebug
& 0x0004) {
1292 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1295 if (j
->cadence_f
[5].on3
) {
1296 j
->cadence_f
[5].on3dot
= jiffies
+ (long)((j
->cadence_f
[5].on3
* (hertz
* 100) / 10000));
1297 j
->cadence_f
[5].state
= 5;
1299 j
->cadence_f
[5].state
= 7;
1304 if (time_after(jiffies
, j
->cadence_f
[5].on3dot
)) {
1305 if(ixjdebug
& 0x0004) {
1306 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1309 if (j
->cadence_f
[5].off3
) {
1310 j
->cadence_f
[5].off3dot
= jiffies
+ (long)((j
->cadence_f
[5].off3
* (hertz
* 100) / 10000));
1311 j
->cadence_f
[5].state
= 6;
1313 j
->cadence_f
[5].state
= 7;
1318 if (time_after(jiffies
, j
->cadence_f
[5].off3dot
)) {
1319 if(ixjdebug
& 0x0004) {
1320 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1322 j
->cadence_f
[5].state
= 7;
1326 if(ixjdebug
& 0x0004) {
1327 printk("Ringing cadence state = %d - %ld\n", j
->cadence_f
[5].state
, jiffies
);
1329 j
->flags
.cidring
= 1;
1330 j
->cadence_f
[5].state
= 0;
1333 if (j
->flags
.cidring
&& !j
->flags
.cidsent
) {
1334 j
->flags
.cidsent
= 1;
1336 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
1339 j
->flags
.cidring
= 0;
1341 clear_bit(board
, &j
->busyflags
);
1345 if (time_after(jiffies
, j
->ring_cadence_jif
+ (hertz
/ 2))) {
1346 if (j
->flags
.cidring
&& !j
->flags
.cidsent
) {
1347 j
->flags
.cidsent
= 1;
1349 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
1352 j
->flags
.cidring
= 0;
1354 j
->ring_cadence_t
--;
1355 if (j
->ring_cadence_t
== -1)
1356 j
->ring_cadence_t
= 15;
1357 j
->ring_cadence_jif
= jiffies
;
1359 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
1360 if(j
->flags
.cidsent
&& j
->cadence_f
[5].en_filter
)
1361 j
->flags
.firstring
= 1;
1366 if(!j
->flags
.cidsent
)
1367 j
->flags
.cidring
= 1;
1370 clear_bit(board
, &j
->busyflags
);
1375 if (!j
->flags
.ringing
) {
1376 if (j
->hookstate
) { /* & 1) { */
1377 if (j
->dsp
.low
!= 0x20 &&
1378 SLIC_GetState(j
) != PLD_SLIC_STATE_ACTIVE
) {
1379 SLIC_SetState(PLD_SLIC_STATE_ACTIVE
, j
);
1383 ixj_WriteDSPCommand(0x511B, j
);
1384 j
->proc_load
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
1385 if (!j
->m_hook
&& (j
->hookstate
& 1)) {
1386 j
->m_hook
= j
->ex
.bits
.hookstate
= 1;
1387 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1390 if (j
->ex
.bits
.dtmf_ready
) {
1391 j
->dtmf_wp
= j
->dtmf_rp
= j
->ex
.bits
.dtmf_ready
= 0;
1395 j
->ex
.bits
.hookstate
= 1;
1396 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1400 if (j
->cardtype
== QTI_LINEJACK
&& !j
->flags
.pstncheck
&& j
->flags
.pstn_present
) {
1404 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
1406 clear_bit(board
, &j
->busyflags
);
1411 static int ixj_status_wait(IXJ
*j
)
1415 jif
= jiffies
+ ((60 * hertz
) / 100);
1416 while (!IsStatusReady(j
)) {
1417 ixj_perfmon(j
->statuswait
);
1418 if (time_after(jiffies
, jif
)) {
1419 ixj_perfmon(j
->statuswaitfail
);
1426 static int ixj_PCcontrol_wait(IXJ
*j
)
1430 jif
= jiffies
+ ((60 * hertz
) / 100);
1431 while (!IsPCControlReady(j
)) {
1432 ixj_perfmon(j
->pcontrolwait
);
1433 if (time_after(jiffies
, jif
)) {
1434 ixj_perfmon(j
->pcontrolwaitfail
);
1441 static int ixj_WriteDSPCommand(unsigned short cmd
, IXJ
*j
)
1446 atomic_inc(&j
->DSPWrite
);
1447 if(atomic_read(&j
->DSPWrite
) > 1) {
1448 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j
->board
, cmd
);
1451 bytes
.high
= (cmd
& 0xFF00) >> 8;
1452 bytes
.low
= cmd
& 0x00FF;
1453 jif
= jiffies
+ ((60 * hertz
) / 100);
1454 while (!IsControlReady(j
)) {
1455 ixj_perfmon(j
->iscontrolready
);
1456 if (time_after(jiffies
, jif
)) {
1457 ixj_perfmon(j
->iscontrolreadyfail
);
1458 atomic_dec(&j
->DSPWrite
);
1459 if(atomic_read(&j
->DSPWrite
) > 0) {
1460 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j
->board
, cmd
);
1461 while(atomic_read(&j
->DSPWrite
) > 0) {
1462 atomic_dec(&j
->DSPWrite
);
1468 outb(bytes
.low
, j
->DSPbase
+ 6);
1469 outb(bytes
.high
, j
->DSPbase
+ 7);
1471 if (ixj_status_wait(j
)) {
1474 atomic_dec(&j
->DSPWrite
);
1475 if(atomic_read(&j
->DSPWrite
) > 0) {
1476 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j
->board
, cmd
);
1477 while(atomic_read(&j
->DSPWrite
) > 0) {
1478 atomic_dec(&j
->DSPWrite
);
1483 /* Read Software Status Register */
1484 j
->ssr
.low
= inb_p(j
->DSPbase
+ 2);
1485 j
->ssr
.high
= inb_p(j
->DSPbase
+ 3);
1486 atomic_dec(&j
->DSPWrite
);
1487 if(atomic_read(&j
->DSPWrite
) > 0) {
1488 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j
->board
, cmd
);
1489 while(atomic_read(&j
->DSPWrite
) > 0) {
1490 atomic_dec(&j
->DSPWrite
);
1496 /***************************************************************************
1498 * General Purpose IO Register read routine
1500 ***************************************************************************/
1501 static inline int ixj_gpio_read(IXJ
*j
)
1503 if (ixj_WriteDSPCommand(0x5143, j
))
1506 j
->gpio
.bytes
.low
= j
->ssr
.low
;
1507 j
->gpio
.bytes
.high
= j
->ssr
.high
;
1512 static inline void LED_SetState(int state
, IXJ
*j
)
1514 if (j
->cardtype
== QTI_LINEJACK
) {
1515 j
->pld_scrw
.bits
.led1
= state
& 0x1 ? 1 : 0;
1516 j
->pld_scrw
.bits
.led2
= state
& 0x2 ? 1 : 0;
1517 j
->pld_scrw
.bits
.led3
= state
& 0x4 ? 1 : 0;
1518 j
->pld_scrw
.bits
.led4
= state
& 0x8 ? 1 : 0;
1520 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1524 /*********************************************************************
1525 * GPIO Pins are configured as follows on the Quicknet Internet
1526 * PhoneJACK Telephony Cards
1528 * POTS Select GPIO_6=0 GPIO_7=0
1529 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1530 * Handset Select GPIO_6=1 GPIO_7=0
1532 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1533 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1534 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1536 * Hook Switch changes reported on GPIO_3
1537 *********************************************************************/
1538 static int ixj_set_port(IXJ
*j
, int arg
)
1540 if (j
->cardtype
== QTI_PHONEJACK_LITE
) {
1541 if (arg
!= PORT_POTS
)
1548 j
->port
= PORT_POTS
;
1549 switch (j
->cardtype
) {
1551 if (j
->flags
.pcmciasct
== 1)
1552 SLIC_SetState(PLD_SLIC_STATE_ACTIVE
, j
);
1556 case QTI_PHONEJACK_PCI
:
1557 j
->pld_slicw
.pcib
.mic
= 0;
1558 j
->pld_slicw
.pcib
.spk
= 0;
1559 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1562 ixj_set_pots(j
, 0); /* Disconnect POTS/PSTN relay */
1563 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to
1564 Software Control Register */
1566 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
1568 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1569 j
->pld_clock
.byte
= 0;
1570 outb(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
1571 j
->pld_slicw
.bits
.rly1
= 1;
1572 j
->pld_slicw
.bits
.spken
= 0;
1573 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1574 ixj_mixer(0x1200, j
); /* Turn Off MIC switch on mixer left */
1575 ixj_mixer(0x1401, j
); /* Turn On Mono1 switch on mixer left */
1576 ixj_mixer(0x1300, j
); /* Turn Off MIC switch on mixer right */
1577 ixj_mixer(0x1501, j
); /* Turn On Mono1 switch on mixer right */
1578 ixj_mixer(0x0E80, j
); /*Mic mute */
1579 ixj_mixer(0x0F00, j
); /* Set mono out (SLIC) to 0dB */
1580 ixj_mixer(0x0080, j
); /* Mute Master Left volume */
1581 ixj_mixer(0x0180, j
); /* Mute Master Right volume */
1582 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
1583 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1586 j
->gpio
.bytes
.high
= 0x0B;
1587 j
->gpio
.bits
.gpio6
= 0;
1588 j
->gpio
.bits
.gpio7
= 0;
1589 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1594 if (j
->cardtype
== QTI_LINEJACK
) {
1595 ixj_WriteDSPCommand(0xC534, j
); /* Write CODEC config to Software Control Register */
1597 j
->pld_slicw
.bits
.rly3
= 0;
1598 j
->pld_slicw
.bits
.rly1
= 1;
1599 j
->pld_slicw
.bits
.spken
= 0;
1600 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1601 j
->port
= PORT_PSTN
;
1607 j
->port
= PORT_SPEAKER
;
1608 switch (j
->cardtype
) {
1610 if (j
->flags
.pcmciasct
) {
1611 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
1614 case QTI_PHONEJACK_PCI
:
1615 j
->pld_slicw
.pcib
.mic
= 1;
1616 j
->pld_slicw
.pcib
.spk
= 1;
1617 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1620 ixj_set_pots(j
, 0); /* Disconnect POTS/PSTN relay */
1621 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to
1622 Software Control Register */
1624 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
1626 outb(j
->pld_scrw
.byte
, j
->XILINXbase
);
1627 j
->pld_clock
.byte
= 0;
1628 outb(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
1629 j
->pld_slicw
.bits
.rly1
= 1;
1630 j
->pld_slicw
.bits
.spken
= 1;
1631 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1632 ixj_mixer(0x1201, j
); /* Turn On MIC switch on mixer left */
1633 ixj_mixer(0x1400, j
); /* Turn Off Mono1 switch on mixer left */
1634 ixj_mixer(0x1301, j
); /* Turn On MIC switch on mixer right */
1635 ixj_mixer(0x1500, j
); /* Turn Off Mono1 switch on mixer right */
1636 ixj_mixer(0x0E06, j
); /*Mic un-mute 0dB */
1637 ixj_mixer(0x0F80, j
); /* Mute mono out (SLIC) */
1638 ixj_mixer(0x0000, j
); /* Set Master Left volume to 0dB */
1639 ixj_mixer(0x0100, j
); /* Set Master Right volume to 0dB */
1642 j
->gpio
.bytes
.high
= 0x0B;
1643 j
->gpio
.bits
.gpio6
= 0;
1644 j
->gpio
.bits
.gpio7
= 1;
1645 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1650 if (j
->cardtype
!= QTI_PHONEJACK
) {
1653 j
->gpio
.bytes
.high
= 0x0B;
1654 j
->gpio
.bits
.gpio6
= 1;
1655 j
->gpio
.bits
.gpio7
= 0;
1656 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
1657 j
->port
= PORT_HANDSET
;
1667 static int ixj_set_pots(IXJ
*j
, int arg
)
1669 if (j
->cardtype
== QTI_LINEJACK
) {
1671 if (j
->port
== PORT_PSTN
) {
1672 j
->pld_slicw
.bits
.rly1
= 0;
1673 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1674 j
->flags
.pots_pstn
= 1;
1677 j
->flags
.pots_pstn
= 0;
1681 j
->pld_slicw
.bits
.rly1
= 1;
1682 outb(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
1683 j
->flags
.pots_pstn
= 0;
1691 static void ixj_ring_on(IXJ
*j
)
1693 if (j
->dsp
.low
== 0x20) /* Internet PhoneJACK */
1695 if (ixjdebug
& 0x0004)
1696 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", j
->board
);
1698 j
->gpio
.bytes
.high
= 0x0B;
1699 j
->gpio
.bytes
.low
= 0x00;
1700 j
->gpio
.bits
.gpio1
= 1;
1701 j
->gpio
.bits
.gpio2
= 1;
1702 j
->gpio
.bits
.gpio5
= 0;
1703 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* send the ring signal */
1704 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1706 if (ixjdebug
& 0x0004)
1707 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", j
->board
);
1709 SLIC_SetState(PLD_SLIC_STATE_RINGING
, j
);
1713 static int ixj_siadc(IXJ
*j
, int val
)
1715 if(j
->cardtype
== QTI_PHONECARD
){
1716 if(j
->flags
.pcmciascp
){
1718 return j
->siadc
.bits
.rxg
;
1720 if(val
< 0 || val
> 0x1F)
1723 j
->siadc
.bits
.hom
= 0; /* Handset Out Mute */
1724 j
->siadc
.bits
.lom
= 0; /* Line Out Mute */
1725 j
->siadc
.bits
.rxg
= val
; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1726 j
->psccr
.bits
.addr
= 6; /* R/W Smart Cable Register Address */
1727 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1728 j
->psccr
.bits
.dev
= 0;
1729 outb(j
->siadc
.byte
, j
->XILINXbase
+ 0x00);
1730 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1731 ixj_PCcontrol_wait(j
);
1732 return j
->siadc
.bits
.rxg
;
1738 static int ixj_sidac(IXJ
*j
, int val
)
1740 if(j
->cardtype
== QTI_PHONECARD
){
1741 if(j
->flags
.pcmciascp
){
1743 return j
->sidac
.bits
.txg
;
1745 if(val
< 0 || val
> 0x1F)
1748 j
->sidac
.bits
.srm
= 1; /* Speaker Right Mute */
1749 j
->sidac
.bits
.slm
= 1; /* Speaker Left Mute */
1750 j
->sidac
.bits
.txg
= val
; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1751 j
->psccr
.bits
.addr
= 7; /* R/W Smart Cable Register Address */
1752 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1753 j
->psccr
.bits
.dev
= 0;
1754 outb(j
->sidac
.byte
, j
->XILINXbase
+ 0x00);
1755 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1756 ixj_PCcontrol_wait(j
);
1757 return j
->sidac
.bits
.txg
;
1763 static int ixj_pcmcia_cable_check(IXJ
*j
)
1765 j
->pccr1
.byte
= inb_p(j
->XILINXbase
+ 0x03);
1766 if (!j
->flags
.pcmciastate
) {
1767 j
->pccr2
.byte
= inb_p(j
->XILINXbase
+ 0x02);
1768 if (j
->pccr1
.bits
.drf
|| j
->pccr2
.bits
.rstc
) {
1769 j
->flags
.pcmciastate
= 4;
1772 if (j
->pccr1
.bits
.ed
) {
1773 j
->pccr1
.bits
.ed
= 0;
1774 j
->psccr
.bits
.dev
= 3;
1775 j
->psccr
.bits
.rw
= 1;
1776 outw_p(j
->psccr
.byte
<< 8, j
->XILINXbase
+ 0x00);
1777 ixj_PCcontrol_wait(j
);
1778 j
->pslic
.byte
= inw_p(j
->XILINXbase
+ 0x00) & 0xFF;
1779 j
->pslic
.bits
.led2
= j
->pslic
.bits
.det
? 1 : 0;
1780 j
->psccr
.bits
.dev
= 3;
1781 j
->psccr
.bits
.rw
= 0;
1782 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
1783 ixj_PCcontrol_wait(j
);
1784 return j
->pslic
.bits
.led2
? 1 : 0;
1785 } else if (j
->flags
.pcmciasct
) {
1790 } else if (j
->flags
.pcmciastate
== 4) {
1791 if (!j
->pccr1
.bits
.drf
) {
1792 j
->flags
.pcmciastate
= 3;
1795 } else if (j
->flags
.pcmciastate
== 3) {
1796 j
->pccr2
.bits
.pwr
= 0;
1797 j
->pccr2
.bits
.rstc
= 1;
1798 outb(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1799 j
->checkwait
= jiffies
+ (hertz
* 2);
1800 j
->flags
.incheck
= 1;
1801 j
->flags
.pcmciastate
= 2;
1803 } else if (j
->flags
.pcmciastate
== 2) {
1804 if (j
->flags
.incheck
) {
1805 if (time_before(jiffies
, j
->checkwait
)) {
1808 j
->flags
.incheck
= 0;
1811 j
->pccr2
.bits
.pwr
= 0;
1812 j
->pccr2
.bits
.rstc
= 0;
1813 outb_p(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1814 j
->flags
.pcmciastate
= 1;
1816 } else if (j
->flags
.pcmciastate
== 1) {
1817 j
->flags
.pcmciastate
= 0;
1818 if (!j
->pccr1
.bits
.drf
) {
1819 j
->psccr
.bits
.dev
= 3;
1820 j
->psccr
.bits
.rw
= 1;
1821 outb_p(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1822 ixj_PCcontrol_wait(j
);
1823 j
->flags
.pcmciascp
= 1; /* Set Cable Present Flag */
1825 j
->flags
.pcmciasct
= (inw_p(j
->XILINXbase
+ 0x00) >> 8) & 0x03; /* Get Cable Type */
1827 if (j
->flags
.pcmciasct
== 3) {
1828 j
->flags
.pcmciastate
= 4;
1830 } else if (j
->flags
.pcmciasct
== 0) {
1831 j
->pccr2
.bits
.pwr
= 1;
1832 j
->pccr2
.bits
.rstc
= 0;
1833 outb_p(j
->pccr2
.byte
, j
->XILINXbase
+ 0x02);
1834 j
->port
= PORT_SPEAKER
;
1836 j
->port
= PORT_POTS
;
1838 j
->sic1
.bits
.cpd
= 0; /* Chip Power Down */
1839 j
->sic1
.bits
.mpd
= 0; /* MIC Bias Power Down */
1840 j
->sic1
.bits
.hpd
= 0; /* Handset Bias Power Down */
1841 j
->sic1
.bits
.lpd
= 0; /* Line Bias Power Down */
1842 j
->sic1
.bits
.spd
= 1; /* Speaker Drive Power Down */
1843 j
->psccr
.bits
.addr
= 1; /* R/W Smart Cable Register Address */
1844 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1845 j
->psccr
.bits
.dev
= 0;
1846 outb(j
->sic1
.byte
, j
->XILINXbase
+ 0x00);
1847 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1848 ixj_PCcontrol_wait(j
);
1850 j
->sic2
.bits
.al
= 0; /* Analog Loopback DAC analog -> ADC analog */
1851 j
->sic2
.bits
.dl2
= 0; /* Digital Loopback DAC -> ADC one bit */
1852 j
->sic2
.bits
.dl1
= 0; /* Digital Loopback ADC -> DAC one bit */
1853 j
->sic2
.bits
.pll
= 0; /* 1 = div 10, 0 = div 5 */
1854 j
->sic2
.bits
.hpd
= 0; /* HPF disable */
1855 j
->psccr
.bits
.addr
= 2; /* R/W Smart Cable Register Address */
1856 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1857 j
->psccr
.bits
.dev
= 0;
1858 outb(j
->sic2
.byte
, j
->XILINXbase
+ 0x00);
1859 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1860 ixj_PCcontrol_wait(j
);
1862 j
->psccr
.bits
.addr
= 3; /* R/W Smart Cable Register Address */
1863 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1864 j
->psccr
.bits
.dev
= 0;
1865 outb(0x00, j
->XILINXbase
+ 0x00); /* PLL Divide N1 */
1866 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1867 ixj_PCcontrol_wait(j
);
1869 j
->psccr
.bits
.addr
= 4; /* R/W Smart Cable Register Address */
1870 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1871 j
->psccr
.bits
.dev
= 0;
1872 outb(0x09, j
->XILINXbase
+ 0x00); /* PLL Multiply M1 */
1873 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1874 ixj_PCcontrol_wait(j
);
1876 j
->sirxg
.bits
.lig
= 1; /* Line In Gain */
1877 j
->sirxg
.bits
.lim
= 1; /* Line In Mute */
1878 j
->sirxg
.bits
.mcg
= 0; /* MIC In Gain was 3 */
1879 j
->sirxg
.bits
.mcm
= 0; /* MIC In Mute */
1880 j
->sirxg
.bits
.him
= 0; /* Handset In Mute */
1881 j
->sirxg
.bits
.iir
= 1; /* IIR */
1882 j
->psccr
.bits
.addr
= 5; /* R/W Smart Cable Register Address */
1883 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1884 j
->psccr
.bits
.dev
= 0;
1885 outb(j
->sirxg
.byte
, j
->XILINXbase
+ 0x00);
1886 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1887 ixj_PCcontrol_wait(j
);
1892 j
->siaatt
.bits
.sot
= 0;
1893 j
->psccr
.bits
.addr
= 9; /* R/W Smart Cable Register Address */
1894 j
->psccr
.bits
.rw
= 0; /* Read / Write flag */
1895 j
->psccr
.bits
.dev
= 0;
1896 outb(j
->siaatt
.byte
, j
->XILINXbase
+ 0x00);
1897 outb(j
->psccr
.byte
, j
->XILINXbase
+ 0x01);
1898 ixj_PCcontrol_wait(j
);
1900 if (j
->flags
.pcmciasct
== 1 && !j
->readers
&& !j
->writers
) {
1901 j
->psccr
.byte
= j
->pslic
.byte
= 0;
1902 j
->pslic
.bits
.powerdown
= 1;
1903 j
->psccr
.bits
.dev
= 3;
1904 j
->psccr
.bits
.rw
= 0;
1905 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
1906 ixj_PCcontrol_wait(j
);
1911 j
->flags
.pcmciascp
= 0;
1917 static int ixj_hookstate(IXJ
*j
)
1921 switch (j
->cardtype
) {
1924 fOffHook
= j
->gpio
.bits
.gpio3read
? 1 : 0;
1927 case QTI_PHONEJACK_LITE
:
1928 case QTI_PHONEJACK_PCI
:
1930 if(j
->cardtype
== QTI_LINEJACK
&& j
->flags
.pots_pstn
== 1 && (j
->readers
|| j
->writers
)) {
1931 fOffHook
= j
->pld_slicr
.bits
.potspstn
? 1 : 0;
1932 if(fOffHook
!= j
->p_hook
) {
1934 j
->checkwait
= jiffies
;
1936 if(time_before(jiffies
, j
->checkwait
+ 2)) {
1941 j
->p_hook
= fOffHook
;
1942 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j
->board
, fOffHook
, jiffies
);
1945 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_ACTIVE
||
1946 j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_STANDBY
) {
1947 if (j
->flags
.ringing
|| j
->flags
.cringing
) {
1948 if (!in_interrupt()) {
1952 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_RINGING
) {
1956 if (j
->cardtype
== QTI_PHONEJACK_PCI
) {
1957 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
1958 fOffHook
= j
->pld_scrr
.pcib
.det
? 1 : 0;
1960 fOffHook
= j
->pld_slicr
.bits
.det
? 1 : 0;
1965 fOffHook
= ixj_pcmcia_cable_check(j
);
1968 if (j
->r_hook
!= fOffHook
) {
1969 j
->r_hook
= fOffHook
;
1970 if (j
->port
== PORT_SPEAKER
|| j
->port
== PORT_HANDSET
) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1971 j
->ex
.bits
.hookstate
= 1;
1972 ixj_kill_fasync(j
, SIG_HOOKSTATE
, POLL_IN
);
1973 } else if (!fOffHook
) {
1974 j
->flash_end
= jiffies
+ ((60 * hertz
) / 100);
1978 if(time_before(jiffies
, j
->flash_end
)) {
1979 j
->ex
.bits
.flash
= 1;
1981 ixj_kill_fasync(j
, SIG_FLASH
, POLL_IN
);
1984 if(time_before(jiffies
, j
->flash_end
)) {
1989 if (j
->port
== PORT_PSTN
&& j
->daa_mode
== SOP_PU_CONVERSATION
)
1992 if (j
->port
== PORT_SPEAKER
) {
1993 if(j
->cardtype
== QTI_PHONECARD
) {
1994 if(j
->flags
.pcmciascp
&& j
->flags
.pcmciasct
) {
2002 if (j
->port
== PORT_HANDSET
)
2008 static void ixj_ring_off(IXJ
*j
)
2010 if (j
->dsp
.low
== 0x20) /* Internet PhoneJACK */
2012 if (ixjdebug
& 0x0004)
2013 printk(KERN_INFO
"IXJ Ring Off\n");
2014 j
->gpio
.bytes
.high
= 0x0B;
2015 j
->gpio
.bytes
.low
= 0x00;
2016 j
->gpio
.bits
.gpio1
= 0;
2017 j
->gpio
.bits
.gpio2
= 1;
2018 j
->gpio
.bits
.gpio5
= 0;
2019 ixj_WriteDSPCommand(j
->gpio
.word
, j
);
2020 } else /* Internet LineJACK */
2022 if (ixjdebug
& 0x0004)
2023 printk(KERN_INFO
"IXJ Ring Off\n");
2025 if(!j
->flags
.cidplay
)
2026 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
2032 static void ixj_ring_start(IXJ
*j
)
2034 j
->flags
.cringing
= 1;
2035 if (ixjdebug
& 0x0004)
2036 printk(KERN_INFO
"IXJ Cadence Ringing Start /dev/phone%d\n", j
->board
);
2037 if (ixj_hookstate(j
) & 1) {
2038 if (j
->port
== PORT_POTS
)
2040 j
->flags
.cringing
= 0;
2041 if (ixjdebug
& 0x0004)
2042 printk(KERN_INFO
"IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j
->board
);
2043 } else if(j
->cadence_f
[5].enable
&& (!j
->cadence_f
[5].en_filter
)) {
2044 j
->ring_cadence_jif
= jiffies
;
2045 j
->flags
.cidsent
= j
->flags
.cidring
= 0;
2046 j
->cadence_f
[5].state
= 0;
2047 if(j
->cadence_f
[5].on1
)
2050 j
->ring_cadence_jif
= jiffies
;
2051 j
->ring_cadence_t
= 15;
2052 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
2057 j
->flags
.cidsent
= j
->flags
.cidring
= j
->flags
.firstring
= 0;
2061 static int ixj_ring(IXJ
*j
)
2066 j
->flags
.ringing
= 1;
2067 if (ixj_hookstate(j
) & 1) {
2069 j
->flags
.ringing
= 0;
2072 for (cntr
= 0; cntr
< j
->maxrings
; cntr
++) {
2073 jif
= jiffies
+ (1 * hertz
);
2075 while (time_before(jiffies
, jif
)) {
2076 if (ixj_hookstate(j
) & 1) {
2078 j
->flags
.ringing
= 0;
2081 schedule_timeout_interruptible(1);
2082 if (signal_pending(current
))
2085 jif
= jiffies
+ (3 * hertz
);
2087 while (time_before(jiffies
, jif
)) {
2088 if (ixj_hookstate(j
) & 1) {
2090 if (ixj_hookstate(j
) & 1) {
2091 j
->flags
.ringing
= 0;
2095 schedule_timeout_interruptible(1);
2096 if (signal_pending(current
))
2101 j
->flags
.ringing
= 0;
2105 static int ixj_open(struct phone_device
*p
, struct file
*file_p
)
2107 IXJ
*j
= get_ixj(p
->board
);
2108 file_p
->private_data
= j
;
2113 if (file_p
->f_mode
& FMODE_READ
) {
2121 if (file_p
->f_mode
& FMODE_WRITE
) {
2125 if (file_p
->f_mode
& FMODE_READ
){
2132 if (j
->cardtype
== QTI_PHONECARD
) {
2133 j
->pslic
.bits
.powerdown
= 0;
2134 j
->psccr
.bits
.dev
= 3;
2135 j
->psccr
.bits
.rw
= 0;
2136 outw_p(j
->psccr
.byte
<< 8 | j
->pslic
.byte
, j
->XILINXbase
+ 0x00);
2137 ixj_PCcontrol_wait(j
);
2140 j
->flags
.cidplay
= 0;
2141 j
->flags
.cidcw_ack
= 0;
2143 if (ixjdebug
& 0x0002)
2144 printk(KERN_INFO
"Opening board %d\n", p
->board
);
2146 j
->framesread
= j
->frameswritten
= 0;
2150 static int ixj_release(struct inode
*inode
, struct file
*file_p
)
2154 IXJ
*j
= file_p
->private_data
;
2155 int board
= j
->p
.board
;
2158 * Set up locks to ensure that only one process is talking to the DSP at a time.
2159 * This is necessary to keep the DSP from locking up.
2161 while(test_and_set_bit(board
, (void *)&j
->busyflags
) != 0)
2162 schedule_timeout_interruptible(1);
2163 if (ixjdebug
& 0x0002)
2164 printk(KERN_INFO
"Closing board %d\n", NUM(inode
));
2166 if (j
->cardtype
== QTI_PHONECARD
)
2167 ixj_set_port(j
, PORT_SPEAKER
);
2169 ixj_set_port(j
, PORT_POTS
);
2174 set_play_volume(j
, 0x100);
2175 set_rec_volume(j
, 0x100);
2178 /* Restore the tone table to default settings. */
2184 ixj_init_tone(j
, &ti
);
2190 ixj_init_tone(j
, &ti
);
2196 ixj_init_tone(j
, &ti
);
2202 ixj_init_tone(j
, &ti
);
2208 ixj_init_tone(j
, &ti
);
2214 ixj_init_tone(j
, &ti
);
2220 ixj_init_tone(j
, &ti
);
2226 ixj_init_tone(j
, &ti
);
2232 ixj_init_tone(j
, &ti
);
2238 ixj_init_tone(j
, &ti
);
2244 ixj_init_tone(j
, &ti
);
2250 ixj_init_tone(j
, &ti
);
2256 ixj_init_tone(j
, &ti
);
2262 ixj_init_tone(j
, &ti
);
2268 ixj_init_tone(j
, &ti
);
2274 ixj_init_tone(j
, &ti
);
2280 ixj_init_tone(j
, &ti
);
2286 ixj_init_tone(j
, &ti
);
2288 set_rec_depth(j
, 2); /* Set Record Channel Limit to 2 frames */
2290 set_play_depth(j
, 2); /* Set Playback Channel Limit to 2 frames */
2292 j
->ex
.bits
.dtmf_ready
= 0;
2294 j
->dtmf_wp
= j
->dtmf_rp
= 0;
2295 j
->rec_mode
= j
->play_mode
= -1;
2296 j
->flags
.ringing
= 0;
2297 j
->maxrings
= MAXRINGS
;
2298 j
->ring_cadence
= USA_RING_CADENCE
;
2299 if(j
->cadence_f
[5].enable
) {
2300 j
->cadence_f
[5].enable
= j
->cadence_f
[5].en_filter
= j
->cadence_f
[5].state
= 0;
2304 j
->flags
.dtmf_oob
= 0;
2305 for (cnt
= 0; cnt
< 4; cnt
++)
2306 j
->cadence_f
[cnt
].enable
= 0;
2310 if(j
->cardtype
== QTI_PHONECARD
) {
2311 SLIC_SetState(PLD_SLIC_STATE_OC
, j
);
2314 if (file_p
->f_mode
& FMODE_READ
)
2316 if (file_p
->f_mode
& FMODE_WRITE
)
2319 if (j
->read_buffer
&& !j
->readers
) {
2320 kfree(j
->read_buffer
);
2321 j
->read_buffer
= NULL
;
2322 j
->read_buffer_size
= 0;
2324 if (j
->write_buffer
&& !j
->writers
) {
2325 kfree(j
->write_buffer
);
2326 j
->write_buffer
= NULL
;
2327 j
->write_buffer_size
= 0;
2329 j
->rec_codec
= j
->play_codec
= 0;
2330 j
->rec_frame_size
= j
->play_frame_size
= 0;
2331 j
->flags
.cidsent
= j
->flags
.cidring
= 0;
2333 if(j
->cardtype
== QTI_LINEJACK
&& !j
->readers
&& !j
->writers
) {
2334 ixj_set_port(j
, PORT_PSTN
);
2335 daa_set_mode(j
, SOP_PU_SLEEP
);
2338 ixj_WriteDSPCommand(0x0FE3, j
); /* Put the DSP in 1/5 power mode. */
2340 /* Set up the default signals for events */
2341 for (cnt
= 0; cnt
< 35; cnt
++)
2342 j
->ixj_signals
[cnt
] = SIGIO
;
2344 /* Set the excetion signal enable flags */
2345 j
->ex_sig
.bits
.dtmf_ready
= j
->ex_sig
.bits
.hookstate
= j
->ex_sig
.bits
.flash
= j
->ex_sig
.bits
.pstn_ring
=
2346 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
=
2347 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;
2349 file_p
->private_data
= NULL
;
2350 clear_bit(board
, &j
->busyflags
);
2354 static int read_filters(IXJ
*j
)
2356 unsigned short fc
, cnt
, trg
;
2360 if (ixj_WriteDSPCommand(0x5144, j
)) {
2361 if(ixjdebug
& 0x0001) {
2362 printk(KERN_INFO
"Read Frame Counter failed!\n");
2366 fc
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
2367 if (fc
== j
->frame_count
)
2370 j
->frame_count
= fc
;
2377 for (cnt
= 0; cnt
< 4; cnt
++) {
2378 if (ixj_WriteDSPCommand(0x5154 + cnt
, j
)) {
2379 if(ixjdebug
& 0x0001) {
2380 printk(KERN_INFO
"Select Filter %d failed!\n", cnt
);
2384 if (ixj_WriteDSPCommand(0x515C, j
)) {
2385 if(ixjdebug
& 0x0001) {
2386 printk(KERN_INFO
"Read Filter History %d failed!\n", cnt
);
2390 j
->filter_hist
[cnt
] = j
->ssr
.high
<< 8 | j
->ssr
.low
;
2392 if (j
->cadence_f
[cnt
].enable
) {
2393 if (j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12)) {
2394 if (j
->cadence_f
[cnt
].state
== 0) {
2395 j
->cadence_f
[cnt
].state
= 1;
2396 j
->cadence_f
[cnt
].on1min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100 - var
)) / 10000));
2397 j
->cadence_f
[cnt
].on1dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100)) / 10000));
2398 j
->cadence_f
[cnt
].on1max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on1
* (hertz
* (100 + var
)) / 10000));
2399 } else if (j
->cadence_f
[cnt
].state
== 2 &&
2400 (time_after(jiffies
, j
->cadence_f
[cnt
].off1min
) &&
2401 time_before(jiffies
, j
->cadence_f
[cnt
].off1max
))) {
2402 if (j
->cadence_f
[cnt
].on2
) {
2403 j
->cadence_f
[cnt
].state
= 3;
2404 j
->cadence_f
[cnt
].on2min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100 - var
)) / 10000));
2405 j
->cadence_f
[cnt
].on2dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100)) / 10000));
2406 j
->cadence_f
[cnt
].on2max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on2
* (hertz
* (100 + var
)) / 10000));
2408 j
->cadence_f
[cnt
].state
= 7;
2410 } else if (j
->cadence_f
[cnt
].state
== 4 &&
2411 (time_after(jiffies
, j
->cadence_f
[cnt
].off2min
) &&
2412 time_before(jiffies
, j
->cadence_f
[cnt
].off2max
))) {
2413 if (j
->cadence_f
[cnt
].on3
) {
2414 j
->cadence_f
[cnt
].state
= 5;
2415 j
->cadence_f
[cnt
].on3min
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100 - var
)) / 10000));
2416 j
->cadence_f
[cnt
].on3dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100)) / 10000));
2417 j
->cadence_f
[cnt
].on3max
= jiffies
+ (long)((j
->cadence_f
[cnt
].on3
* (hertz
* (100 + var
)) / 10000));
2419 j
->cadence_f
[cnt
].state
= 7;
2422 j
->cadence_f
[cnt
].state
= 0;
2424 } else if (j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3)) {
2425 if (j
->cadence_f
[cnt
].state
== 1) {
2426 if(!j
->cadence_f
[cnt
].on1
) {
2427 j
->cadence_f
[cnt
].state
= 7;
2428 } else if((time_after(jiffies
, j
->cadence_f
[cnt
].on1min
) &&
2429 time_before(jiffies
, j
->cadence_f
[cnt
].on1max
))) {
2430 if(j
->cadence_f
[cnt
].off1
) {
2431 j
->cadence_f
[cnt
].state
= 2;
2432 j
->cadence_f
[cnt
].off1min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100 - var
)) / 10000));
2433 j
->cadence_f
[cnt
].off1dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100)) / 10000));
2434 j
->cadence_f
[cnt
].off1max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off1
* (hertz
* (100 + var
)) / 10000));
2436 j
->cadence_f
[cnt
].state
= 7;
2439 j
->cadence_f
[cnt
].state
= 0;
2441 } else if (j
->cadence_f
[cnt
].state
== 3) {
2442 if((time_after(jiffies
, j
->cadence_f
[cnt
].on2min
) &&
2443 time_before(jiffies
, j
->cadence_f
[cnt
].on2max
))) {
2444 if(j
->cadence_f
[cnt
].off2
) {
2445 j
->cadence_f
[cnt
].state
= 4;
2446 j
->cadence_f
[cnt
].off2min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100 - var
)) / 10000));
2447 j
->cadence_f
[cnt
].off2dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100)) / 10000));
2448 j
->cadence_f
[cnt
].off2max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off2
* (hertz
* (100 + var
)) / 10000));
2450 j
->cadence_f
[cnt
].state
= 7;
2453 j
->cadence_f
[cnt
].state
= 0;
2455 } else if (j
->cadence_f
[cnt
].state
== 5) {
2456 if ((time_after(jiffies
, j
->cadence_f
[cnt
].on3min
) &&
2457 time_before(jiffies
, j
->cadence_f
[cnt
].on3max
))) {
2458 if(j
->cadence_f
[cnt
].off3
) {
2459 j
->cadence_f
[cnt
].state
= 6;
2460 j
->cadence_f
[cnt
].off3min
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100 - var
)) / 10000));
2461 j
->cadence_f
[cnt
].off3dot
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100)) / 10000));
2462 j
->cadence_f
[cnt
].off3max
= jiffies
+ (long)((j
->cadence_f
[cnt
].off3
* (hertz
* (100 + var
)) / 10000));
2464 j
->cadence_f
[cnt
].state
= 7;
2467 j
->cadence_f
[cnt
].state
= 0;
2470 j
->cadence_f
[cnt
].state
= 0;
2473 switch(j
->cadence_f
[cnt
].state
) {
2475 if(time_after(jiffies
, j
->cadence_f
[cnt
].on1dot
) &&
2476 !j
->cadence_f
[cnt
].off1
&&
2477 !j
->cadence_f
[cnt
].on2
&& !j
->cadence_f
[cnt
].off2
&&
2478 !j
->cadence_f
[cnt
].on3
&& !j
->cadence_f
[cnt
].off3
) {
2479 j
->cadence_f
[cnt
].state
= 7;
2483 if(time_after(jiffies
, j
->cadence_f
[cnt
].on2dot
) &&
2484 !j
->cadence_f
[cnt
].off2
&&
2485 !j
->cadence_f
[cnt
].on3
&& !j
->cadence_f
[cnt
].off3
) {
2486 j
->cadence_f
[cnt
].state
= 7;
2490 if(time_after(jiffies
, j
->cadence_f
[cnt
].on3dot
) &&
2491 !j
->cadence_f
[cnt
].off3
) {
2492 j
->cadence_f
[cnt
].state
= 7;
2498 if (ixjdebug
& 0x0040) {
2499 printk(KERN_INFO
"IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j
->cadence_f
[cnt
].state
, j
->board
, jiffies
);
2500 switch(j
->cadence_f
[cnt
].state
) {
2502 printk(KERN_INFO
"IXJ /dev/phone%d No Tone detected\n", j
->board
);
2505 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j
->board
,
2506 j
->cadence_f
[cnt
].on1
, j
->cadence_f
[cnt
].on1min
, j
->cadence_f
[cnt
].on1dot
, j
->cadence_f
[cnt
].on1max
);
2509 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off1min
,
2510 j
->cadence_f
[cnt
].off1max
);
2513 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].on2min
,
2514 j
->cadence_f
[cnt
].on2max
);
2517 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off2min
,
2518 j
->cadence_f
[cnt
].off2max
);
2521 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].on3min
,
2522 j
->cadence_f
[cnt
].on3max
);
2525 printk(KERN_INFO
"IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j
->board
, j
->cadence_f
[cnt
].off3min
,
2526 j
->cadence_f
[cnt
].off3max
);
2531 if (j
->cadence_f
[cnt
].state
== 7) {
2532 j
->cadence_f
[cnt
].state
= 0;
2533 if (j
->cadence_f
[cnt
].enable
== 1)
2534 j
->cadence_f
[cnt
].enable
= 0;
2537 if(ixjdebug
& 0x0020) {
2538 printk(KERN_INFO
"Filter Cadence 0 triggered %ld\n", jiffies
);
2541 ixj_kill_fasync(j
, SIG_FC0
, POLL_IN
);
2544 if(ixjdebug
& 0x0020) {
2545 printk(KERN_INFO
"Filter Cadence 1 triggered %ld\n", jiffies
);
2548 ixj_kill_fasync(j
, SIG_FC1
, POLL_IN
);
2551 if(ixjdebug
& 0x0020) {
2552 printk(KERN_INFO
"Filter Cadence 2 triggered %ld\n", jiffies
);
2555 ixj_kill_fasync(j
, SIG_FC2
, POLL_IN
);
2558 if(ixjdebug
& 0x0020) {
2559 printk(KERN_INFO
"Filter Cadence 3 triggered %ld\n", jiffies
);
2562 ixj_kill_fasync(j
, SIG_FC3
, POLL_IN
);
2566 if (j
->filter_en
[cnt
] && ((j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12)) ||
2567 (j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3)))) {
2568 if((j
->filter_hist
[cnt
] & 3 && !(j
->filter_hist
[cnt
] & 12))) {
2570 } else if((j
->filter_hist
[cnt
] & 12 && !(j
->filter_hist
[cnt
] & 3))) {
2575 if(ixjdebug
& 0x0020) {
2576 printk(KERN_INFO
"Filter 0 triggered %d at %ld\n", trg
, jiffies
);
2579 ixj_kill_fasync(j
, SIG_F0
, POLL_IN
);
2582 if(ixjdebug
& 0x0020) {
2583 printk(KERN_INFO
"Filter 1 triggered %d at %ld\n", trg
, jiffies
);
2586 ixj_kill_fasync(j
, SIG_F1
, POLL_IN
);
2589 if(ixjdebug
& 0x0020) {
2590 printk(KERN_INFO
"Filter 2 triggered %d at %ld\n", trg
, jiffies
);
2593 ixj_kill_fasync(j
, SIG_F2
, POLL_IN
);
2596 if(ixjdebug
& 0x0020) {
2597 printk(KERN_INFO
"Filter 3 triggered %d at %ld\n", trg
, jiffies
);
2600 ixj_kill_fasync(j
, SIG_F3
, POLL_IN
);
2608 static int LineMonitor(IXJ
*j
)
2615 if (ixj_WriteDSPCommand(0x7000, j
)) /* Line Monitor */
2618 j
->dtmf
.bytes
.high
= j
->ssr
.high
;
2619 j
->dtmf
.bytes
.low
= j
->ssr
.low
;
2620 if (!j
->dtmf_state
&& j
->dtmf
.bits
.dtmf_valid
) {
2622 j
->dtmf_current
= j
->dtmf
.bits
.digit
;
2624 if (j
->dtmf_state
&& !j
->dtmf
.bits
.dtmf_valid
) /* && j->dtmf_wp != j->dtmf_rp) */
2626 if(!j
->cidcw_wait
) {
2627 j
->dtmfbuffer
[j
->dtmf_wp
] = j
->dtmf_current
;
2629 if (j
->dtmf_wp
== 79)
2631 j
->ex
.bits
.dtmf_ready
= 1;
2632 if(j
->ex_sig
.bits
.dtmf_ready
) {
2633 ixj_kill_fasync(j
, SIG_DTMF_READY
, POLL_IN
);
2636 else if(j
->dtmf_current
== 0x00 || j
->dtmf_current
== 0x0D) {
2637 if(ixjdebug
& 0x0020) {
2638 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j
->board
, j
->dtmf_current
, jiffies
);
2640 j
->flags
.cidcw_ack
= 1;
2649 /************************************************************************
2651 * Functions to allow alaw <-> ulaw conversions.
2653 ************************************************************************/
2655 static void ulaw2alaw(unsigned char *buff
, unsigned long len
)
2657 static unsigned char table_ulaw2alaw
[] =
2659 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2660 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2661 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2662 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2663 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2664 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2665 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2666 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2667 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2668 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2669 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2670 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2671 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2672 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2673 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2674 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2675 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2676 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2677 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2678 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2679 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2680 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2681 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2682 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2683 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2684 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2685 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2686 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2687 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2688 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2689 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2690 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2695 *buff
= table_ulaw2alaw
[*(unsigned char *)buff
];
2700 static void alaw2ulaw(unsigned char *buff
, unsigned long len
)
2702 static unsigned char table_alaw2ulaw
[] =
2704 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2705 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2706 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2707 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2708 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2709 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2710 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2711 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2712 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2713 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2714 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2715 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2716 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2717 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2718 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2719 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2720 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2721 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2722 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2723 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2724 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2725 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2726 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2727 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2728 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2729 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2730 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2731 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2732 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2733 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2734 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2735 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2740 *buff
= table_alaw2ulaw
[*(unsigned char *)buff
];
2745 static ssize_t
ixj_read(struct file
* file_p
, char __user
*buf
, size_t length
, loff_t
* ppos
)
2747 unsigned long i
= *ppos
;
2748 IXJ
* j
= get_ixj(NUM(file_p
->f_path
.dentry
->d_inode
));
2750 DECLARE_WAITQUEUE(wait
, current
);
2752 if (j
->flags
.inread
)
2755 j
->flags
.inread
= 1;
2757 add_wait_queue(&j
->read_q
, &wait
);
2758 set_current_state(TASK_INTERRUPTIBLE
);
2761 while (!j
->read_buffer_ready
|| (j
->dtmf_state
&& j
->flags
.dtmf_oob
)) {
2763 if (file_p
->f_flags
& O_NONBLOCK
) {
2764 set_current_state(TASK_RUNNING
);
2765 remove_wait_queue(&j
->read_q
, &wait
);
2766 j
->flags
.inread
= 0;
2769 if (!ixj_hookstate(j
)) {
2770 set_current_state(TASK_RUNNING
);
2771 remove_wait_queue(&j
->read_q
, &wait
);
2772 j
->flags
.inread
= 0;
2775 interruptible_sleep_on(&j
->read_q
);
2776 if (signal_pending(current
)) {
2777 set_current_state(TASK_RUNNING
);
2778 remove_wait_queue(&j
->read_q
, &wait
);
2779 j
->flags
.inread
= 0;
2784 remove_wait_queue(&j
->read_q
, &wait
);
2785 set_current_state(TASK_RUNNING
);
2786 /* Don't ever copy more than the user asks */
2787 if(j
->rec_codec
== ALAW
)
2788 ulaw2alaw(j
->read_buffer
, min(length
, j
->read_buffer_size
));
2789 i
= copy_to_user(buf
, j
->read_buffer
, min(length
, j
->read_buffer_size
));
2790 j
->read_buffer_ready
= 0;
2792 j
->flags
.inread
= 0;
2795 j
->flags
.inread
= 0;
2796 return min(length
, j
->read_buffer_size
);
2800 static ssize_t
ixj_enhanced_read(struct file
* file_p
, char __user
*buf
, size_t length
,
2804 ssize_t read_retval
= 0;
2805 IXJ
*j
= get_ixj(NUM(file_p
->f_path
.dentry
->d_inode
));
2807 pre_retval
= ixj_PreRead(j
, 0L);
2808 switch (pre_retval
) {
2810 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
2811 ixj_PostRead(j
, 0L);
2814 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
2817 ixj_PostRead(j
, 0L);
2820 read_retval
= pre_retval
;
2825 static ssize_t
ixj_write(struct file
*file_p
, const char __user
*buf
, size_t count
, loff_t
* ppos
)
2827 unsigned long i
= *ppos
;
2828 IXJ
*j
= file_p
->private_data
;
2830 DECLARE_WAITQUEUE(wait
, current
);
2832 if (j
->flags
.inwrite
)
2835 j
->flags
.inwrite
= 1;
2837 add_wait_queue(&j
->write_q
, &wait
);
2838 set_current_state(TASK_INTERRUPTIBLE
);
2842 while (!j
->write_buffers_empty
) {
2844 if (file_p
->f_flags
& O_NONBLOCK
) {
2845 set_current_state(TASK_RUNNING
);
2846 remove_wait_queue(&j
->write_q
, &wait
);
2847 j
->flags
.inwrite
= 0;
2850 if (!ixj_hookstate(j
)) {
2851 set_current_state(TASK_RUNNING
);
2852 remove_wait_queue(&j
->write_q
, &wait
);
2853 j
->flags
.inwrite
= 0;
2856 interruptible_sleep_on(&j
->write_q
);
2857 if (signal_pending(current
)) {
2858 set_current_state(TASK_RUNNING
);
2859 remove_wait_queue(&j
->write_q
, &wait
);
2860 j
->flags
.inwrite
= 0;
2864 set_current_state(TASK_RUNNING
);
2865 remove_wait_queue(&j
->write_q
, &wait
);
2866 if (j
->write_buffer_wp
+ count
>= j
->write_buffer_end
)
2867 j
->write_buffer_wp
= j
->write_buffer
;
2868 i
= copy_from_user(j
->write_buffer_wp
, buf
, min(count
, j
->write_buffer_size
));
2870 j
->flags
.inwrite
= 0;
2873 if(j
->play_codec
== ALAW
)
2874 alaw2ulaw(j
->write_buffer_wp
, min(count
, j
->write_buffer_size
));
2875 j
->flags
.inwrite
= 0;
2876 return min(count
, j
->write_buffer_size
);
2879 static ssize_t
ixj_enhanced_write(struct file
* file_p
, const char __user
*buf
, size_t count
, loff_t
* ppos
)
2882 ssize_t write_retval
= 0;
2884 IXJ
*j
= get_ixj(NUM(file_p
->f_path
.dentry
->d_inode
));
2886 pre_retval
= ixj_PreWrite(j
, 0L);
2887 switch (pre_retval
) {
2889 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
2890 if (write_retval
> 0) {
2891 ixj_PostWrite(j
, 0L);
2892 j
->write_buffer_wp
+= write_retval
;
2893 j
->write_buffers_empty
--;
2897 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
2898 if (write_retval
> 0) {
2899 j
->write_buffer_wp
+= write_retval
;
2900 j
->write_buffers_empty
--;
2904 ixj_PostWrite(j
, 0L);
2907 write_retval
= pre_retval
;
2909 return write_retval
;
2912 static void ixj_read_frame(IXJ
*j
)
2916 if (j
->read_buffer
) {
2917 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
2918 if (!(cnt
% 16) && !IsRxReady(j
)) {
2920 while (!IsRxReady(j
)) {
2928 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2929 if (j
->rec_codec
== G729
&& (cnt
== 0 || cnt
== 10 || cnt
== 20)) {
2930 inb_p(j
->DSPbase
+ 0x0E);
2931 inb_p(j
->DSPbase
+ 0x0F);
2933 *(j
->read_buffer
+ cnt
) = inb_p(j
->DSPbase
+ 0x0E);
2934 *(j
->read_buffer
+ cnt
+ 1) = inb_p(j
->DSPbase
+ 0x0F);
2937 if (j
->intercom
!= -1) {
2938 if (IsTxReady(get_ixj(j
->intercom
))) {
2939 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
2940 if (!(cnt
% 16) && !IsTxReady(j
)) {
2942 while (!IsTxReady(j
)) {
2950 outb_p(*(j
->read_buffer
+ cnt
), get_ixj(j
->intercom
)->DSPbase
+ 0x0C);
2951 outb_p(*(j
->read_buffer
+ cnt
+ 1), get_ixj(j
->intercom
)->DSPbase
+ 0x0D);
2953 get_ixj(j
->intercom
)->frameswritten
++;
2956 j
->read_buffer_ready
= 1;
2957 wake_up_interruptible(&j
->read_q
); /* Wake any blocked readers */
2959 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
2961 if(j
->ixj_signals
[SIG_READ_READY
])
2962 ixj_kill_fasync(j
, SIG_READ_READY
, POLL_OUT
);
2967 static short fsk
[][6][20] =
2971 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2972 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2975 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2976 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2979 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2980 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2983 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2984 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2987 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2988 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2991 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2992 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2997 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
2998 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3001 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3002 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3005 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3006 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3009 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3010 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3013 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3014 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3017 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3018 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3024 static void ixj_write_cid_bit(IXJ
*j
, int bit
)
3026 while (j
->fskcnt
< 20) {
3027 if(j
->fskdcnt
< (j
->fsksize
- 1))
3028 j
->fskdata
[j
->fskdcnt
++] = fsk
[bit
][j
->fskz
][j
->fskcnt
];
3041 static void ixj_write_cid_byte(IXJ
*j
, char byte
)
3046 ixj_write_cid_bit(j
, 0);
3047 ixj_write_cid_bit(j
, cb
.cbits
.b0
? 1 : 0);
3048 ixj_write_cid_bit(j
, cb
.cbits
.b1
? 1 : 0);
3049 ixj_write_cid_bit(j
, cb
.cbits
.b2
? 1 : 0);
3050 ixj_write_cid_bit(j
, cb
.cbits
.b3
? 1 : 0);
3051 ixj_write_cid_bit(j
, cb
.cbits
.b4
? 1 : 0);
3052 ixj_write_cid_bit(j
, cb
.cbits
.b5
? 1 : 0);
3053 ixj_write_cid_bit(j
, cb
.cbits
.b6
? 1 : 0);
3054 ixj_write_cid_bit(j
, cb
.cbits
.b7
? 1 : 0);
3055 ixj_write_cid_bit(j
, 1);
3058 static void ixj_write_cid_seize(IXJ
*j
)
3062 for (cnt
= 0; cnt
< 150; cnt
++) {
3063 ixj_write_cid_bit(j
, 0);
3064 ixj_write_cid_bit(j
, 1);
3066 for (cnt
= 0; cnt
< 180; cnt
++) {
3067 ixj_write_cid_bit(j
, 1);
3071 static void ixj_write_cidcw_seize(IXJ
*j
)
3075 for (cnt
= 0; cnt
< 80; cnt
++) {
3076 ixj_write_cid_bit(j
, 1);
3080 static int ixj_write_cid_string(IXJ
*j
, char *s
, int checksum
)
3084 for (cnt
= 0; cnt
< strlen(s
); cnt
++) {
3085 ixj_write_cid_byte(j
, s
[cnt
]);
3086 checksum
= (checksum
+ s
[cnt
]);
3091 static void ixj_pad_fsk(IXJ
*j
, int pad
)
3095 for (cnt
= 0; cnt
< pad
; cnt
++) {
3096 if(j
->fskdcnt
< (j
->fsksize
- 1))
3097 j
->fskdata
[j
->fskdcnt
++] = 0x0000;
3099 for (cnt
= 0; cnt
< 720; cnt
++) {
3100 if(j
->fskdcnt
< (j
->fsksize
- 1))
3101 j
->fskdata
[j
->fskdcnt
++] = 0x0000;
3105 static void ixj_pre_cid(IXJ
*j
)
3107 j
->cid_play_codec
= j
->play_codec
;
3108 j
->cid_play_frame_size
= j
->play_frame_size
;
3109 j
->cid_play_volume
= get_play_volume(j
);
3110 j
->cid_play_flag
= j
->flags
.playing
;
3112 j
->cid_rec_codec
= j
->rec_codec
;
3113 j
->cid_rec_volume
= get_rec_volume(j
);
3114 j
->cid_rec_flag
= j
->flags
.recording
;
3116 j
->cid_play_aec_level
= j
->aec_level
;
3118 switch(j
->baseframe
.low
) {
3120 j
->cid_base_frame_size
= 20;
3123 j
->cid_base_frame_size
= 10;
3126 j
->cid_base_frame_size
= 30;
3133 j
->flags
.cidplay
= 1;
3135 set_base_frame(j
, 30);
3136 set_play_codec(j
, LINEAR16
);
3137 set_play_volume(j
, 0x1B);
3141 static void ixj_post_cid(IXJ
*j
)
3145 if(j
->cidsize
> 5000) {
3146 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
3148 j
->flags
.cidplay
= 0;
3149 if(ixjdebug
& 0x0200) {
3150 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j
->board
, jiffies
);
3156 set_base_frame(j
, j
->cid_base_frame_size
);
3157 set_play_codec(j
, j
->cid_play_codec
);
3158 ixj_aec_start(j
, j
->cid_play_aec_level
);
3159 set_play_volume(j
, j
->cid_play_volume
);
3161 set_rec_codec(j
, j
->cid_rec_codec
);
3162 set_rec_volume(j
, j
->cid_rec_volume
);
3165 ixj_record_start(j
);
3167 if(j
->cid_play_flag
)
3170 if(j
->cid_play_flag
) {
3171 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3175 static void ixj_write_cid(IXJ
*j
)
3180 char mdmflen
, len1
, len2
, len3
;
3185 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3188 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3189 j
->cidsize
= j
->cidcnt
= 0;
3193 strcpy(sdmf1
, j
->cid_send
.month
);
3194 strcat(sdmf1
, j
->cid_send
.day
);
3195 strcat(sdmf1
, j
->cid_send
.hour
);
3196 strcat(sdmf1
, j
->cid_send
.min
);
3197 strcpy(sdmf2
, j
->cid_send
.number
);
3198 strcpy(sdmf3
, j
->cid_send
.name
);
3200 len1
= strlen(sdmf1
);
3201 len2
= strlen(sdmf2
);
3202 len3
= strlen(sdmf3
);
3203 mdmflen
= len1
+ len2
+ len3
+ 6;
3206 ixj_write_cid_seize(j
);
3208 ixj_write_cid_byte(j
, 0x80);
3210 ixj_write_cid_byte(j
, mdmflen
);
3211 checksum
= checksum
+ mdmflen
;
3213 ixj_write_cid_byte(j
, 0x01);
3214 checksum
= checksum
+ 0x01;
3215 ixj_write_cid_byte(j
, len1
);
3216 checksum
= checksum
+ len1
;
3217 checksum
= ixj_write_cid_string(j
, sdmf1
, checksum
);
3218 if(ixj_hookstate(j
) & 1)
3221 ixj_write_cid_byte(j
, 0x02);
3222 checksum
= checksum
+ 0x02;
3223 ixj_write_cid_byte(j
, len2
);
3224 checksum
= checksum
+ len2
;
3225 checksum
= ixj_write_cid_string(j
, sdmf2
, checksum
);
3226 if(ixj_hookstate(j
) & 1)
3229 ixj_write_cid_byte(j
, 0x07);
3230 checksum
= checksum
+ 0x07;
3231 ixj_write_cid_byte(j
, len3
);
3232 checksum
= checksum
+ len3
;
3233 checksum
= ixj_write_cid_string(j
, sdmf3
, checksum
);
3234 if(ixj_hookstate(j
) & 1)
3241 ixj_write_cid_byte(j
, (char) checksum
);
3243 pad
= j
->fskdcnt
% 240;
3247 ixj_pad_fsk(j
, pad
);
3254 static void ixj_write_cidcw(IXJ
*j
)
3261 char mdmflen
, len1
, len2
, len3
;
3266 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3269 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3270 j
->cidsize
= j
->cidcnt
= 0;
3274 j
->flags
.cidcw_ack
= 0;
3281 ixj_init_tone(j
, &ti
);
3283 ixj_set_tone_on(1500, j
);
3284 ixj_set_tone_off(32, j
);
3285 if(ixjdebug
& 0x0200) {
3286 printk("IXJ cidcw phone%d first tone start at %ld\n", j
->board
, jiffies
);
3288 ixj_play_tone(j
, 23);
3290 clear_bit(j
->board
, &j
->busyflags
);
3291 while(j
->tone_state
)
3292 schedule_timeout_interruptible(1);
3293 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0)
3294 schedule_timeout_interruptible(1);
3295 if(ixjdebug
& 0x0200) {
3296 printk("IXJ cidcw phone%d first tone end at %ld\n", j
->board
, jiffies
);
3304 ixj_init_tone(j
, &ti
);
3306 ixj_set_tone_off(10, j
);
3307 ixj_set_tone_on(600, j
);
3308 if(ixjdebug
& 0x0200) {
3309 printk("IXJ cidcw phone%d second tone start at %ld\n", j
->board
, jiffies
);
3311 ixj_play_tone(j
, 24);
3313 clear_bit(j
->board
, &j
->busyflags
);
3314 while(j
->tone_state
)
3315 schedule_timeout_interruptible(1);
3316 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0)
3317 schedule_timeout_interruptible(1);
3318 if(ixjdebug
& 0x0200) {
3319 printk("IXJ cidcw phone%d sent second tone at %ld\n", j
->board
, jiffies
);
3322 j
->cidcw_wait
= jiffies
+ ((50 * hertz
) / 100);
3324 clear_bit(j
->board
, &j
->busyflags
);
3325 while(!j
->flags
.cidcw_ack
&& time_before(jiffies
, j
->cidcw_wait
))
3326 schedule_timeout_interruptible(1);
3327 while(test_and_set_bit(j
->board
, (void *)&j
->busyflags
) != 0)
3328 schedule_timeout_interruptible(1);
3330 if(!j
->flags
.cidcw_ack
) {
3331 if(ixjdebug
& 0x0200) {
3332 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j
->board
, jiffies
);
3335 if(j
->cid_play_flag
) {
3336 wake_up_interruptible(&j
->write_q
); /* Wake any blocked readers */
3342 j
->flags
.cidcw_ack
= 0;
3343 strcpy(sdmf1
, j
->cid_send
.month
);
3344 strcat(sdmf1
, j
->cid_send
.day
);
3345 strcat(sdmf1
, j
->cid_send
.hour
);
3346 strcat(sdmf1
, j
->cid_send
.min
);
3347 strcpy(sdmf2
, j
->cid_send
.number
);
3348 strcpy(sdmf3
, j
->cid_send
.name
);
3350 len1
= strlen(sdmf1
);
3351 len2
= strlen(sdmf2
);
3352 len3
= strlen(sdmf3
);
3353 mdmflen
= len1
+ len2
+ len3
+ 6;
3355 ixj_write_cidcw_seize(j
);
3357 ixj_write_cid_byte(j
, 0x80);
3359 ixj_write_cid_byte(j
, mdmflen
);
3360 checksum
= checksum
+ mdmflen
;
3362 ixj_write_cid_byte(j
, 0x01);
3363 checksum
= checksum
+ 0x01;
3364 ixj_write_cid_byte(j
, len1
);
3365 checksum
= checksum
+ len1
;
3366 checksum
= ixj_write_cid_string(j
, sdmf1
, checksum
);
3368 ixj_write_cid_byte(j
, 0x02);
3369 checksum
= checksum
+ 0x02;
3370 ixj_write_cid_byte(j
, len2
);
3371 checksum
= checksum
+ len2
;
3372 checksum
= ixj_write_cid_string(j
, sdmf2
, checksum
);
3374 ixj_write_cid_byte(j
, 0x07);
3375 checksum
= checksum
+ 0x07;
3376 ixj_write_cid_byte(j
, len3
);
3377 checksum
= checksum
+ len3
;
3378 checksum
= ixj_write_cid_string(j
, sdmf3
, checksum
);
3384 ixj_write_cid_byte(j
, (char) checksum
);
3386 pad
= j
->fskdcnt
% 240;
3390 ixj_pad_fsk(j
, pad
);
3391 if(ixjdebug
& 0x0200) {
3392 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j
->board
, jiffies
);
3396 static void ixj_write_vmwi(IXJ
*j
, int msg
)
3403 if (j
->dsp
.low
== 0x20 || j
->flags
.cidplay
)
3406 j
->fskz
= j
->fskphase
= j
->fskcnt
= j
->fskdcnt
= 0;
3407 j
->cidsize
= j
->cidcnt
= 0;
3413 if (j
->port
== PORT_POTS
)
3414 SLIC_SetState(PLD_SLIC_STATE_OHT
, j
);
3416 ixj_write_cid_seize(j
);
3418 ixj_write_cid_byte(j
, 0x82);
3420 ixj_write_cid_byte(j
, mdmflen
);
3421 checksum
= checksum
+ mdmflen
;
3423 ixj_write_cid_byte(j
, 0x0B);
3424 checksum
= checksum
+ 0x0B;
3425 ixj_write_cid_byte(j
, 1);
3426 checksum
= checksum
+ 1;
3429 ixj_write_cid_byte(j
, 0xFF);
3430 checksum
= checksum
+ 0xFF;
3433 ixj_write_cid_byte(j
, 0x00);
3434 checksum
= checksum
+ 0x00;
3441 ixj_write_cid_byte(j
, (char) checksum
);
3443 pad
= j
->fskdcnt
% 240;
3447 ixj_pad_fsk(j
, pad
);
3450 static void ixj_write_frame(IXJ
*j
)
3452 int cnt
, frame_count
, dly
;
3456 if(j
->flags
.cidplay
) {
3457 for(cnt
= 0; cnt
< 480; cnt
++) {
3458 if (!(cnt
% 16) && !IsTxReady(j
)) {
3460 while (!IsTxReady(j
)) {
3468 dat
.word
= j
->fskdata
[j
->cidcnt
++];
3469 outb_p(dat
.bytes
.low
, j
->DSPbase
+ 0x0C);
3470 outb_p(dat
.bytes
.high
, j
->DSPbase
+ 0x0D);
3473 if(j
->cidcnt
>= j
->fskdcnt
) {
3476 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3477 and there is real audio data in the buffer, we need to throw it away because
3478 we just used it's time slot */
3479 if (j
->write_buffer_rp
> j
->write_buffer_wp
) {
3480 j
->write_buffer_rp
+= j
->cid_play_frame_size
* 2;
3481 if (j
->write_buffer_rp
>= j
->write_buffer_end
) {
3482 j
->write_buffer_rp
= j
->write_buffer
;
3484 j
->write_buffers_empty
++;
3485 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3487 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
3489 } else if (j
->write_buffer
&& j
->write_buffers_empty
< 1) {
3490 if (j
->write_buffer_wp
> j
->write_buffer_rp
) {
3492 (j
->write_buffer_wp
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
3494 if (j
->write_buffer_rp
> j
->write_buffer_wp
) {
3496 (j
->write_buffer_wp
- j
->write_buffer
) / (j
->play_frame_size
* 2) +
3497 (j
->write_buffer_end
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
3499 if (frame_count
>= 1) {
3500 if (j
->ver
.low
== 0x12 && j
->play_mode
&& j
->flags
.play_first_frame
) {
3503 switch (j
->play_mode
) {
3504 case PLAYBACK_MODE_ULAW
:
3505 case PLAYBACK_MODE_ALAW
:
3506 blankword
.low
= blankword
.high
= 0xFF;
3508 case PLAYBACK_MODE_8LINEAR
:
3509 case PLAYBACK_MODE_16LINEAR
:
3511 blankword
.low
= blankword
.high
= 0x00;
3513 case PLAYBACK_MODE_8LINEAR_WSS
:
3514 blankword
.low
= blankword
.high
= 0x80;
3517 for (cnt
= 0; cnt
< 16; cnt
++) {
3518 if (!(cnt
% 16) && !IsTxReady(j
)) {
3520 while (!IsTxReady(j
)) {
3528 outb_p((blankword
.low
), j
->DSPbase
+ 0x0C);
3529 outb_p((blankword
.high
), j
->DSPbase
+ 0x0D);
3531 j
->flags
.play_first_frame
= 0;
3532 } else if (j
->play_codec
== G723_63
&& j
->flags
.play_first_frame
) {
3533 for (cnt
= 0; cnt
< 24; cnt
++) {
3537 blankword
.low
= 0x02;
3538 blankword
.high
= 0x00;
3541 blankword
.low
= blankword
.high
= 0x00;
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;
3558 for (cnt
= 0; cnt
< j
->play_frame_size
* 2; cnt
+= 2) {
3559 if (!(cnt
% 16) && !IsTxReady(j
)) {
3561 while (!IsTxReady(j
)) {
3569 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3570 if (j
->play_codec
== G729
&& (cnt
== 0 || cnt
== 10 || cnt
== 20)) {
3571 if (j
->write_buffer_rp
[cnt
] == 0 &&
3572 j
->write_buffer_rp
[cnt
+ 1] == 0 &&
3573 j
->write_buffer_rp
[cnt
+ 2] == 0 &&
3574 j
->write_buffer_rp
[cnt
+ 3] == 0 &&
3575 j
->write_buffer_rp
[cnt
+ 4] == 0 &&
3576 j
->write_buffer_rp
[cnt
+ 5] == 0 &&
3577 j
->write_buffer_rp
[cnt
+ 6] == 0 &&
3578 j
->write_buffer_rp
[cnt
+ 7] == 0 &&
3579 j
->write_buffer_rp
[cnt
+ 8] == 0 &&
3580 j
->write_buffer_rp
[cnt
+ 9] == 0) {
3581 /* someone is trying to write silence lets make this a type 0 frame. */
3582 outb_p(0x00, j
->DSPbase
+ 0x0C);
3583 outb_p(0x00, j
->DSPbase
+ 0x0D);
3585 /* so all other frames are type 1. */
3586 outb_p(0x01, j
->DSPbase
+ 0x0C);
3587 outb_p(0x00, j
->DSPbase
+ 0x0D);
3590 outb_p(*(j
->write_buffer_rp
+ cnt
), j
->DSPbase
+ 0x0C);
3591 outb_p(*(j
->write_buffer_rp
+ cnt
+ 1), j
->DSPbase
+ 0x0D);
3592 *(j
->write_buffer_rp
+ cnt
) = 0;
3593 *(j
->write_buffer_rp
+ cnt
+ 1) = 0;
3595 j
->write_buffer_rp
+= j
->play_frame_size
* 2;
3596 if (j
->write_buffer_rp
>= j
->write_buffer_end
) {
3597 j
->write_buffer_rp
= j
->write_buffer
;
3599 j
->write_buffers_empty
++;
3600 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
3602 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
3609 if(j
->ixj_signals
[SIG_WRITE_READY
]) {
3610 ixj_kill_fasync(j
, SIG_WRITE_READY
, POLL_OUT
);
3614 static int idle(IXJ
*j
)
3616 if (ixj_WriteDSPCommand(0x0000, j
)) /* DSP Idle */
3620 if (j
->ssr
.high
|| j
->ssr
.low
) {
3624 j
->flags
.playing
= 0;
3626 j
->flags
.recording
= 0;
3631 static int set_base_frame(IXJ
*j
, int size
)
3637 j
->cid_play_aec_level
= j
->aec_level
;
3639 for (cnt
= 0; cnt
< 10; cnt
++) {
3643 if (j
->ssr
.high
|| j
->ssr
.low
)
3645 if (j
->dsp
.low
!= 0x20) {
3649 /* Set Base Frame Size to 240 pg9-10 8021 */
3653 /* Set Base Frame Size to 160 pg9-10 8021 */
3657 /* Set Base Frame Size to 80 pg9-10 8021 */
3668 if (ixj_WriteDSPCommand(cmd
, j
)) {
3669 j
->baseframe
.high
= j
->baseframe
.low
= 0xFF;
3672 j
->baseframe
.high
= j
->ssr
.high
;
3673 j
->baseframe
.low
= j
->ssr
.low
;
3674 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3675 if(j
->baseframe
.high
== 0x00 && j
->baseframe
.low
== 0x00) {
3679 ixj_aec_start(j
, j
->cid_play_aec_level
);
3683 static int set_rec_codec(IXJ
*j
, int rate
)
3687 j
->rec_codec
= rate
;
3691 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3692 j
->rec_frame_size
= 12;
3699 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3700 j
->rec_frame_size
= 10;
3707 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
3708 j
->rec_frame_size
= 16;
3715 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3716 j
->rec_frame_size
= 9;
3723 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
3724 j
->rec_frame_size
= 8;
3731 if (j
->dsp
.low
!= 0x20) {
3732 j
->rec_frame_size
= 48;
3739 if (j
->dsp
.low
!= 0x20) {
3740 if (!j
->flags
.g729_loaded
) {
3744 switch (j
->baseframe
.low
) {
3746 j
->rec_frame_size
= 10;
3749 j
->rec_frame_size
= 5;
3752 j
->rec_frame_size
= 15;
3761 if (j
->dsp
.low
!= 0x20) {
3762 if (!j
->flags
.g729_loaded
) {
3766 switch (j
->baseframe
.low
) {
3768 j
->rec_frame_size
= 12;
3771 j
->rec_frame_size
= 6;
3774 j
->rec_frame_size
= 18;
3783 switch (j
->baseframe
.low
) {
3785 j
->rec_frame_size
= 80;
3788 j
->rec_frame_size
= 40;
3791 j
->rec_frame_size
= 120;
3797 switch (j
->baseframe
.low
) {
3799 j
->rec_frame_size
= 80;
3802 j
->rec_frame_size
= 40;
3805 j
->rec_frame_size
= 120;
3811 switch (j
->baseframe
.low
) {
3813 j
->rec_frame_size
= 160;
3816 j
->rec_frame_size
= 80;
3819 j
->rec_frame_size
= 240;
3825 switch (j
->baseframe
.low
) {
3827 j
->rec_frame_size
= 80;
3830 j
->rec_frame_size
= 40;
3833 j
->rec_frame_size
= 120;
3839 switch (j
->baseframe
.low
) {
3841 j
->rec_frame_size
= 80;
3844 j
->rec_frame_size
= 40;
3847 j
->rec_frame_size
= 120;
3853 kfree(j
->read_buffer
);
3854 j
->rec_frame_size
= 0;
3856 j
->read_buffer
= NULL
;
3857 j
->read_buffer_size
= 0;
3864 static int ixj_record_start(IXJ
*j
)
3866 unsigned short cmd
= 0x0000;
3868 if (j
->read_buffer
) {
3871 j
->flags
.recording
= 1;
3872 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
3874 if(ixjdebug
& 0x0002)
3875 printk("IXJ %d Starting Record Codec %d at %ld\n", j
->board
, j
->rec_codec
, jiffies
);
3878 switch (j
->rec_codec
) {
3886 cmd
= 0x5130; /* TrueSpeech 8.5 */
3890 cmd
= 0x5133; /* TrueSpeech 4.8 */
3894 cmd
= 0x5134; /* TrueSpeech 4.1 */
3907 if (ixj_WriteDSPCommand(cmd
, j
))
3910 if (!j
->read_buffer
) {
3911 if (!j
->read_buffer
)
3912 j
->read_buffer
= kmalloc(j
->rec_frame_size
* 2, GFP_ATOMIC
);
3913 if (!j
->read_buffer
) {
3914 printk("Read buffer allocation for ixj board %d failed!\n", j
->board
);
3918 j
->read_buffer_size
= j
->rec_frame_size
* 2;
3920 if (ixj_WriteDSPCommand(0x5102, j
)) /* Set Poll sync mode */
3924 switch (j
->rec_mode
) {
3926 cmd
= 0x1C03; /* Record C1 */
3930 if (j
->ver
.low
== 0x12) {
3931 cmd
= 0x1E03; /* Record C1 */
3934 cmd
= 0x1E01; /* Record C1 */
3939 if (j
->ver
.low
== 0x12) {
3940 cmd
= 0x1E83; /* Record C1 */
3943 cmd
= 0x1E81; /* Record C1 */
3948 if (j
->ver
.low
== 0x12) {
3949 cmd
= 0x1F03; /* Record C1 */
3952 cmd
= 0x1F01; /* Record C1 */
3957 if (j
->ver
.low
== 0x12) {
3958 cmd
= 0x1F83; /* Record C1 */
3960 cmd
= 0x1F81; /* Record C1 */
3964 if (ixj_WriteDSPCommand(cmd
, j
))
3967 if (j
->flags
.playing
) {
3968 ixj_aec_start(j
, j
->aec_level
);
3973 static void ixj_record_stop(IXJ
*j
)
3975 if (ixjdebug
& 0x0002)
3976 printk("IXJ %d Stopping Record Codec %d at %ld\n", j
->board
, j
->rec_codec
, jiffies
);
3978 kfree(j
->read_buffer
);
3979 j
->read_buffer
= NULL
;
3980 j
->read_buffer_size
= 0;
3981 if (j
->rec_mode
> -1) {
3982 ixj_WriteDSPCommand(0x5120, j
);
3985 j
->flags
.recording
= 0;
3987 static void ixj_vad(IXJ
*j
, int arg
)
3990 ixj_WriteDSPCommand(0x513F, j
);
3992 ixj_WriteDSPCommand(0x513E, j
);
3995 static void set_rec_depth(IXJ
*j
, int depth
)
4001 ixj_WriteDSPCommand(0x5180 + depth
, j
);
4004 static void set_dtmf_prescale(IXJ
*j
, int volume
)
4006 ixj_WriteDSPCommand(0xCF07, j
);
4007 ixj_WriteDSPCommand(volume
, j
);
4010 static int get_dtmf_prescale(IXJ
*j
)
4012 ixj_WriteDSPCommand(0xCF05, j
);
4013 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4016 static void set_rec_volume(IXJ
*j
, int volume
)
4018 if(j
->aec_level
== AEC_AGC
) {
4019 if (ixjdebug
& 0x0002)
4020 printk(KERN_INFO
"IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j
->board
, volume
);
4021 ixj_WriteDSPCommand(0xCF96, j
);
4022 ixj_WriteDSPCommand(volume
, j
);
4024 if (ixjdebug
& 0x0002)
4025 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j
->board
, volume
);
4026 ixj_WriteDSPCommand(0xCF03, j
);
4027 ixj_WriteDSPCommand(volume
, j
);
4031 static int set_rec_volume_linear(IXJ
*j
, int volume
)
4033 int newvolume
, dsprecmax
;
4035 if (ixjdebug
& 0x0002)
4036 printk(KERN_INFO
"IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j
->board
, volume
);
4037 if(volume
> 100 || volume
< 0) {
4041 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4042 switch (j
->cardtype
) {
4048 ixj_mixer(0x0203, j
); /*Voice Left Volume unmute 6db */
4049 ixj_mixer(0x0303, j
); /*Voice Right Volume unmute 6db */
4050 ixj_mixer(0x0C00, j
); /*Mono1 unmute 12db */
4052 case QTI_PHONEJACK_LITE
:
4055 case QTI_PHONEJACK_PCI
:
4064 newvolume
= (dsprecmax
* volume
) / 100;
4065 set_rec_volume(j
, newvolume
);
4069 static int get_rec_volume(IXJ
*j
)
4071 if(j
->aec_level
== AEC_AGC
) {
4072 if (ixjdebug
& 0x0002)
4073 printk(KERN_INFO
"Getting AGC Threshold\n");
4074 ixj_WriteDSPCommand(0xCF86, j
);
4075 if (ixjdebug
& 0x0002)
4076 printk(KERN_INFO
"AGC Threshold is 0x%2.2x%2.2x\n", j
->ssr
.high
, j
->ssr
.low
);
4077 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4079 if (ixjdebug
& 0x0002)
4080 printk(KERN_INFO
"Getting Record Volume\n");
4081 ixj_WriteDSPCommand(0xCF01, j
);
4082 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4086 static int get_rec_volume_linear(IXJ
*j
)
4088 int volume
, newvolume
, dsprecmax
;
4090 switch (j
->cardtype
) {
4097 case QTI_PHONEJACK_LITE
:
4100 case QTI_PHONEJACK_PCI
:
4109 volume
= get_rec_volume(j
);
4110 newvolume
= (volume
* 100) / dsprecmax
;
4116 static int get_rec_level(IXJ
*j
)
4120 ixj_WriteDSPCommand(0xCF88, j
);
4122 retval
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
4123 retval
= (retval
* 256) / 240;
4127 static void ixj_aec_start(IXJ
*j
, int level
)
4129 j
->aec_level
= level
;
4130 if (ixjdebug
& 0x0002)
4131 printk(KERN_INFO
"AGC set = 0x%2.2x\n", j
->aec_level
);
4135 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
|| j
->rec_codec
== G729B
|| j
->play_codec
== G729B
) {
4136 ixj_WriteDSPCommand(0xE022, j
); /* Move AEC filter buffer */
4138 ixj_WriteDSPCommand(0x0300, j
);
4140 ixj_WriteDSPCommand(0xB001, j
); /* AEC On */
4142 ixj_WriteDSPCommand(0xE013, j
); /* Advanced AEC C1 */
4146 ixj_WriteDSPCommand(0x0000, j
); /* Advanced AEC C2 = off */
4148 ixj_WriteDSPCommand(0xE011, j
);
4149 ixj_WriteDSPCommand(0xFFFF, j
);
4151 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4152 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4157 ixj_WriteDSPCommand(0x0600, j
); /* Advanced AEC C2 = on medium */
4159 ixj_WriteDSPCommand(0xE011, j
);
4160 ixj_WriteDSPCommand(0x0080, j
);
4162 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4163 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4168 ixj_WriteDSPCommand(0x0C00, j
); /* Advanced AEC C2 = on high */
4170 ixj_WriteDSPCommand(0xE011, j
);
4171 ixj_WriteDSPCommand(0x0080, j
);
4173 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4174 ixj_WriteDSPCommand(0x0000, j
); /* to off */
4179 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4180 ixj_WriteDSPCommand(0x0002, j
); /* Attenuation scaling factor of 2 */
4182 ixj_WriteDSPCommand(0xE011, j
);
4183 ixj_WriteDSPCommand(0x0100, j
); /* Higher Threshold Floor */
4185 ixj_WriteDSPCommand(0xE012, j
); /* Set Train and Lock */
4187 if(j
->cardtype
== QTI_LINEJACK
|| j
->cardtype
== QTI_PHONECARD
)
4188 ixj_WriteDSPCommand(0x0224, j
);
4190 ixj_WriteDSPCommand(0x1224, j
);
4192 ixj_WriteDSPCommand(0xE014, j
);
4193 ixj_WriteDSPCommand(0x0003, j
); /* Lock threshold at 3dB */
4195 ixj_WriteDSPCommand(0xE338, j
); /* Set Echo Suppresser Attenuation to 0dB */
4197 /* Now we can set the AGC initial parameters and turn it on */
4198 ixj_WriteDSPCommand(0xCF90, j
); /* Set AGC Minumum gain */
4199 ixj_WriteDSPCommand(0x0020, j
); /* to 0.125 (-18dB) */
4201 ixj_WriteDSPCommand(0xCF91, j
); /* Set AGC Maximum gain */
4202 ixj_WriteDSPCommand(0x1000, j
); /* to 16 (24dB) */
4204 ixj_WriteDSPCommand(0xCF92, j
); /* Set AGC start gain */
4205 ixj_WriteDSPCommand(0x0800, j
); /* to 8 (+18dB) */
4207 ixj_WriteDSPCommand(0xCF93, j
); /* Set AGC hold time */
4208 ixj_WriteDSPCommand(0x1F40, j
); /* to 2 seconds (units are 250us) */
4210 ixj_WriteDSPCommand(0xCF94, j
); /* Set AGC Attack Time Constant */
4211 ixj_WriteDSPCommand(0x0005, j
); /* to 8ms */
4213 ixj_WriteDSPCommand(0xCF95, j
); /* Set AGC Decay Time Constant */
4214 ixj_WriteDSPCommand(0x000D, j
); /* to 4096ms */
4216 ixj_WriteDSPCommand(0xCF96, j
); /* Set AGC Attack Threshold */
4217 ixj_WriteDSPCommand(0x1200, j
); /* to 25% */
4219 ixj_WriteDSPCommand(0xCF97, j
); /* Set AGC Enable */
4220 ixj_WriteDSPCommand(0x0001, j
); /* to on */
4225 ixj_WriteDSPCommand(0x0002, j
); /* Attenuation scaling factor of 2 */
4227 ixj_WriteDSPCommand(0xE011, j
);
4228 ixj_WriteDSPCommand(0x0100, j
); /* Higher Threshold Floor */
4230 ixj_WriteDSPCommand(0xE012, j
); /* Set Train and Lock */
4232 if(j
->cardtype
== QTI_LINEJACK
|| j
->cardtype
== QTI_PHONECARD
)
4233 ixj_WriteDSPCommand(0x0224, j
);
4235 ixj_WriteDSPCommand(0x1224, j
);
4237 ixj_WriteDSPCommand(0xE014, j
);
4238 ixj_WriteDSPCommand(0x0003, j
); /* Lock threshold at 3dB */
4240 ixj_WriteDSPCommand(0xE338, j
); /* Set Echo Suppresser Attenuation to 0dB */
4247 static void aec_stop(IXJ
*j
)
4249 j
->aec_level
= AEC_OFF
;
4250 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
|| j
->rec_codec
== G729B
|| j
->play_codec
== G729B
) {
4251 ixj_WriteDSPCommand(0xE022, j
); /* Move AEC filter buffer back */
4253 ixj_WriteDSPCommand(0x0700, j
);
4255 if (j
->play_mode
!= -1 && j
->rec_mode
!= -1)
4257 ixj_WriteDSPCommand(0xB002, j
); /* AEC Stop */
4261 static int set_play_codec(IXJ
*j
, int rate
)
4265 j
->play_codec
= rate
;
4269 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4270 j
->play_frame_size
= 12;
4277 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4278 j
->play_frame_size
= 10;
4285 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
4286 j
->play_frame_size
= 16;
4293 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4294 j
->play_frame_size
= 9;
4301 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
4302 j
->play_frame_size
= 8;
4309 if (j
->dsp
.low
!= 0x20) {
4310 j
->play_frame_size
= 48;
4317 if (j
->dsp
.low
!= 0x20) {
4318 if (!j
->flags
.g729_loaded
) {
4322 switch (j
->baseframe
.low
) {
4324 j
->play_frame_size
= 10;
4327 j
->play_frame_size
= 5;
4330 j
->play_frame_size
= 15;
4339 if (j
->dsp
.low
!= 0x20) {
4340 if (!j
->flags
.g729_loaded
) {
4344 switch (j
->baseframe
.low
) {
4346 j
->play_frame_size
= 12;
4349 j
->play_frame_size
= 6;
4352 j
->play_frame_size
= 18;
4361 switch (j
->baseframe
.low
) {
4363 j
->play_frame_size
= 80;
4366 j
->play_frame_size
= 40;
4369 j
->play_frame_size
= 120;
4375 switch (j
->baseframe
.low
) {
4377 j
->play_frame_size
= 80;
4380 j
->play_frame_size
= 40;
4383 j
->play_frame_size
= 120;
4389 switch (j
->baseframe
.low
) {
4391 j
->play_frame_size
= 160;
4394 j
->play_frame_size
= 80;
4397 j
->play_frame_size
= 240;
4403 switch (j
->baseframe
.low
) {
4405 j
->play_frame_size
= 80;
4408 j
->play_frame_size
= 40;
4411 j
->play_frame_size
= 120;
4417 switch (j
->baseframe
.low
) {
4419 j
->play_frame_size
= 80;
4422 j
->play_frame_size
= 40;
4425 j
->play_frame_size
= 120;
4431 kfree(j
->write_buffer
);
4432 j
->play_frame_size
= 0;
4434 j
->write_buffer
= NULL
;
4435 j
->write_buffer_size
= 0;
4442 static int ixj_play_start(IXJ
*j
)
4444 unsigned short cmd
= 0x0000;
4446 if (j
->write_buffer
) {
4450 if(ixjdebug
& 0x0002)
4451 printk("IXJ %d Starting Play Codec %d at %ld\n", j
->board
, j
->play_codec
, jiffies
);
4453 j
->flags
.playing
= 1;
4454 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
4456 j
->flags
.play_first_frame
= 1;
4459 if (!j
->play_mode
) {
4460 switch (j
->play_codec
) {
4468 cmd
= 0x5230; /* TrueSpeech 8.5 */
4472 cmd
= 0x5233; /* TrueSpeech 4.8 */
4476 cmd
= 0x5234; /* TrueSpeech 4.1 */
4489 if (ixj_WriteDSPCommand(cmd
, j
))
4492 j
->write_buffer
= kmalloc(j
->play_frame_size
* 2, GFP_ATOMIC
);
4493 if (!j
->write_buffer
) {
4494 printk("Write buffer allocation for ixj board %d failed!\n", j
->board
);
4497 /* j->write_buffers_empty = 2; */
4498 j
->write_buffers_empty
= 1;
4499 j
->write_buffer_size
= j
->play_frame_size
* 2;
4500 j
->write_buffer_end
= j
->write_buffer
+ j
->play_frame_size
* 2;
4501 j
->write_buffer_rp
= j
->write_buffer_wp
= j
->write_buffer
;
4503 if (ixj_WriteDSPCommand(0x5202, j
)) /* Set Poll sync mode */
4507 switch (j
->play_mode
) {
4512 if (j
->ver
.low
== 0x12) {
4519 if (j
->ver
.low
== 0x12) {
4526 if (j
->ver
.low
== 0x12) {
4533 if (j
->ver
.low
== 0x12) {
4540 if (ixj_WriteDSPCommand(cmd
, j
))
4543 if (ixj_WriteDSPCommand(0x2000, j
)) /* Playback C2 */
4546 if (ixj_WriteDSPCommand(0x2000 + j
->play_frame_size
, j
)) /* Playback C3 */
4549 if (j
->flags
.recording
) {
4550 ixj_aec_start(j
, j
->aec_level
);
4556 static void ixj_play_stop(IXJ
*j
)
4558 if (ixjdebug
& 0x0002)
4559 printk("IXJ %d Stopping Play Codec %d at %ld\n", j
->board
, j
->play_codec
, jiffies
);
4561 kfree(j
->write_buffer
);
4562 j
->write_buffer
= NULL
;
4563 j
->write_buffer_size
= 0;
4564 if (j
->play_mode
> -1) {
4565 ixj_WriteDSPCommand(0x5221, j
); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4569 j
->flags
.playing
= 0;
4572 static inline int get_play_level(IXJ
*j
)
4576 ixj_WriteDSPCommand(0xCF8F, j
); /* 8022 Reference page 9-38 */
4577 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
4578 retval
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
4579 retval
= (retval
* 256) / 240;
4583 static unsigned int ixj_poll(struct file
*file_p
, poll_table
* wait
)
4585 unsigned int mask
= 0;
4587 IXJ
*j
= get_ixj(NUM(file_p
->f_path
.dentry
->d_inode
));
4589 poll_wait(file_p
, &(j
->poll_q
), wait
);
4590 if (j
->read_buffer_ready
> 0)
4591 mask
|= POLLIN
| POLLRDNORM
; /* readable */
4592 if (j
->write_buffers_empty
> 0)
4593 mask
|= POLLOUT
| POLLWRNORM
; /* writable */
4599 static int ixj_play_tone(IXJ
*j
, char tone
)
4601 if (!j
->tone_state
) {
4602 if(ixjdebug
& 0x0002) {
4603 printk("IXJ %d starting tone %d at %ld\n", j
->board
, tone
, jiffies
);
4605 if (j
->dsp
.low
== 0x20) {
4608 j
->tone_start_jif
= jiffies
;
4613 j
->tone_index
= tone
;
4614 if (ixj_WriteDSPCommand(0x6000 + j
->tone_index
, j
))
4620 static int ixj_set_tone_on(unsigned short arg
, IXJ
*j
)
4622 j
->tone_on_time
= arg
;
4624 if (ixj_WriteDSPCommand(0x6E04, j
)) /* Set Tone On Period */
4628 if (ixj_WriteDSPCommand(arg
, j
))
4634 static int SCI_WaitHighSCI(IXJ
*j
)
4638 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4639 if (!j
->pld_scrr
.bits
.sci
) {
4640 for (cnt
= 0; cnt
< 10; cnt
++) {
4642 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4644 if ((j
->pld_scrr
.bits
.sci
))
4647 if (ixjdebug
& 0x0001)
4648 printk(KERN_INFO
"SCI Wait High failed %x\n", j
->pld_scrr
.byte
);
4654 static int SCI_WaitLowSCI(IXJ
*j
)
4658 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4659 if (j
->pld_scrr
.bits
.sci
) {
4660 for (cnt
= 0; cnt
< 10; cnt
++) {
4662 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
4664 if (!(j
->pld_scrr
.bits
.sci
))
4667 if (ixjdebug
& 0x0001)
4668 printk(KERN_INFO
"SCI Wait Low failed %x\n", j
->pld_scrr
.byte
);
4674 static int SCI_Control(IXJ
*j
, int control
)
4678 j
->pld_scrw
.bits
.c0
= 0; /* Set PLD Serial control interface */
4680 j
->pld_scrw
.bits
.c1
= 0; /* to no selection */
4683 case SCI_Enable_DAA
:
4684 j
->pld_scrw
.bits
.c0
= 1; /* Set PLD Serial control interface */
4686 j
->pld_scrw
.bits
.c1
= 0; /* to write to DAA */
4689 case SCI_Enable_Mixer
:
4690 j
->pld_scrw
.bits
.c0
= 0; /* Set PLD Serial control interface */
4692 j
->pld_scrw
.bits
.c1
= 1; /* to write to mixer */
4695 case SCI_Enable_EEPROM
:
4696 j
->pld_scrw
.bits
.c0
= 1; /* Set PLD Serial control interface */
4698 j
->pld_scrw
.bits
.c1
= 1; /* to write to EEPROM */
4705 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
4711 case SCI_Enable_DAA
:
4712 case SCI_Enable_Mixer
:
4713 case SCI_Enable_EEPROM
:
4714 if (!SCI_WaitHighSCI(j
))
4724 static int SCI_Prepare(IXJ
*j
)
4726 if (!SCI_Control(j
, SCI_End
))
4729 if (!SCI_WaitLowSCI(j
))
4735 static int ixj_get_mixer(long val
, IXJ
*j
)
4737 int reg
= (val
& 0x1F00) >> 8;
4738 return j
->mix
.vol
[reg
];
4741 static int ixj_mixer(long val
, IXJ
*j
)
4745 bytes
.high
= (val
& 0x1F00) >> 8;
4746 bytes
.low
= val
& 0x00FF;
4748 /* save mixer value so we can get back later on */
4749 j
->mix
.vol
[bytes
.high
] = bytes
.low
;
4751 outb_p(bytes
.high
& 0x1F, j
->XILINXbase
+ 0x03); /* Load Mixer Address */
4753 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02); /* Load Mixer Data */
4755 SCI_Control(j
, SCI_Enable_Mixer
);
4757 SCI_Control(j
, SCI_End
);
4762 static int daa_load(BYTES
* p_bytes
, IXJ
*j
)
4764 outb_p(p_bytes
->high
, j
->XILINXbase
+ 0x03);
4765 outb_p(p_bytes
->low
, j
->XILINXbase
+ 0x02);
4766 if (!SCI_Control(j
, SCI_Enable_DAA
))
4772 static int ixj_daa_cr4(IXJ
*j
, char reg
)
4776 switch (j
->daa_mode
) {
4780 case SOP_PU_RINGING
:
4783 case SOP_PU_CONVERSATION
:
4786 case SOP_PU_PULSEDIALING
:
4791 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= reg
;
4793 switch (j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGX
) {
4795 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 0;
4798 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 2;
4801 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 1;
4804 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 3;
4808 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
4810 if (!daa_load(&bytes
, j
))
4813 if (!SCI_Prepare(j
))
4819 static char daa_int_read(IXJ
*j
)
4823 if (!SCI_Prepare(j
))
4828 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4829 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4831 if (!SCI_Control(j
, SCI_Enable_DAA
))
4834 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4835 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4836 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
4837 if (ixjdebug
& 0x0001)
4838 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
4841 if (!SCI_Control(j
, SCI_Enable_DAA
))
4843 if (!SCI_Control(j
, SCI_End
))
4846 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4847 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4849 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
= bytes
.high
;
4854 static char daa_CR_read(IXJ
*j
, int cr
)
4859 if (!SCI_Prepare(j
))
4862 switch (j
->daa_mode
) {
4864 bytes
.high
= 0x30 + cr
;
4866 case SOP_PU_RINGING
:
4867 bytes
.high
= 0x70 + cr
;
4869 case SOP_PU_CONVERSATION
:
4870 bytes
.high
= 0xB0 + cr
;
4872 case SOP_PU_PULSEDIALING
:
4874 bytes
.high
= 0xF0 + cr
;
4880 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4881 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4883 if (!SCI_Control(j
, SCI_Enable_DAA
))
4886 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4887 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4888 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
4889 if (ixjdebug
& 0x0001)
4890 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
4893 if (!SCI_Control(j
, SCI_Enable_DAA
))
4895 if (!SCI_Control(j
, SCI_End
))
4898 wdata
.word
= inw_p(j
->XILINXbase
+ 0x02);
4902 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
= wdata
.bytes
.high
;
4905 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= wdata
.bytes
.high
;
4908 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= wdata
.bytes
.high
;
4911 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= wdata
.bytes
.high
;
4914 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= wdata
.bytes
.high
;
4917 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= wdata
.bytes
.high
;
4925 static int ixj_daa_cid_reset(IXJ
*j
)
4930 if (ixjdebug
& 0x0002)
4931 printk("DAA Clearing CID ram\n");
4933 if (!SCI_Prepare(j
))
4938 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4939 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4941 if (!SCI_Control(j
, SCI_Enable_DAA
))
4944 if (!SCI_WaitHighSCI(j
))
4947 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
- 1; i
+= 2) {
4948 bytes
.high
= bytes
.low
= 0x00;
4949 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4951 if (i
< ALISDAA_CALLERID_SIZE
- 1)
4952 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4954 if (!SCI_Control(j
, SCI_Enable_DAA
))
4957 if (!SCI_WaitHighSCI(j
))
4962 if (!SCI_Control(j
, SCI_End
))
4965 if (ixjdebug
& 0x0002)
4966 printk("DAA CID ram cleared\n");
4971 static int ixj_daa_cid_read(IXJ
*j
)
4975 char CID
[ALISDAA_CALLERID_SIZE
];
4979 if (!SCI_Prepare(j
))
4984 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
4985 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
4987 if (!SCI_Control(j
, SCI_Enable_DAA
))
4990 if (!SCI_WaitHighSCI(j
))
4993 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
4994 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4995 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
4996 if (ixjdebug
& 0x0001)
4997 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
5000 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
+= 2) {
5001 bytes
.high
= bytes
.low
= 0x00;
5002 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
5003 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
5005 if (!SCI_Control(j
, SCI_Enable_DAA
))
5008 if (!SCI_WaitHighSCI(j
))
5011 CID
[i
+ 0] = inb_p(j
->XILINXbase
+ 0x03);
5012 CID
[i
+ 1] = inb_p(j
->XILINXbase
+ 0x02);
5015 if (!SCI_Control(j
, SCI_End
))
5019 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
5022 if ((pIn
[1] & 0x03) == 0x01) {
5025 if ((pIn
[2] & 0x0c) == 0x04) {
5026 pOut
[1] = ((pIn
[2] & 0x03) << 6) | ((pIn
[1] & 0xfc) >> 2);
5028 if ((pIn
[3] & 0x30) == 0x10) {
5029 pOut
[2] = ((pIn
[3] & 0x0f) << 4) | ((pIn
[2] & 0xf0) >> 4);
5031 if ((pIn
[4] & 0xc0) == 0x40) {
5032 pOut
[3] = ((pIn
[4] & 0x3f) << 2) | ((pIn
[3] & 0xc0) >> 6);
5036 pIn
+= 5, pOut
+= 4;
5038 memset(&j
->cid
, 0, sizeof(PHONE_CID
));
5039 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
5041 strncpy(j
->cid
.month
, pOut
, 2);
5043 strncpy(j
->cid
.day
, pOut
, 2);
5045 strncpy(j
->cid
.hour
, pOut
, 2);
5047 strncpy(j
->cid
.min
, pOut
, 2);
5049 j
->cid
.numlen
= *pOut
;
5051 strncpy(j
->cid
.number
, pOut
, j
->cid
.numlen
);
5052 pOut
+= j
->cid
.numlen
+ 1;
5053 j
->cid
.namelen
= *pOut
;
5055 strncpy(j
->cid
.name
, pOut
, j
->cid
.namelen
);
5057 ixj_daa_cid_reset(j
);
5061 static char daa_get_version(IXJ
*j
)
5065 if (!SCI_Prepare(j
))
5070 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
5071 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
5073 if (!SCI_Control(j
, SCI_Enable_DAA
))
5076 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
5077 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
5078 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
5079 if (ixjdebug
& 0x0001)
5080 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
5083 if (!SCI_Control(j
, SCI_Enable_DAA
))
5086 if (!SCI_Control(j
, SCI_End
))
5089 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
5090 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
5091 if (ixjdebug
& 0x0002)
5092 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes
.high
, bytes
.low
);
5093 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
= bytes
.high
;
5097 static int daa_set_mode(IXJ
*j
, int mode
)
5100 The DAA *MUST* be in the conversation mode if the
5101 PSTN line is to be seized (PSTN line off-hook).
5102 Taking the PSTN line off-hook while the DAA is in
5103 a mode other than conversation mode will cause a
5104 hardware failure of the ALIS-A part.
5107 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5108 if the PSTN line is on-hook. Failure to have the PSTN line
5109 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5115 j
->flags
.pstn_rmr
= 0;
5117 if (!SCI_Prepare(j
))
5122 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5124 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5125 j
->pld_slicw
.bits
.rly2
= 0;
5126 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5128 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5129 daa_load(&bytes
, j
);
5130 if (!SCI_Prepare(j
))
5133 j
->daa_mode
= SOP_PU_SLEEP
;
5136 if(j
->daa_mode
== SOP_PU_SLEEP
)
5140 if (ixjdebug
& 0x0008)
5141 printk(KERN_INFO
"phone DAA: SOP_PU_SLEEP at %ld\n", jiffies
);
5142 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5144 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5146 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5147 j
->pld_slicw
.bits
.rly2
= 0;
5148 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5150 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5151 daa_load(&bytes
, j
);
5152 if (!SCI_Prepare(j
))
5155 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5157 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5158 j
->pld_slicw
.bits
.rly2
= 0;
5159 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5161 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5162 daa_load(&bytes
, j
);
5163 if (!SCI_Prepare(j
))
5166 j
->daa_mode
= SOP_PU_SLEEP
;
5167 j
->flags
.pstn_ringing
= 0;
5168 j
->ex
.bits
.pstn_ring
= 0;
5169 j
->pstn_sleeptil
= jiffies
+ (hertz
/ 4);
5170 wake_up_interruptible(&j
->read_q
); /* Wake any blocked readers */
5171 wake_up_interruptible(&j
->write_q
); /* Wake any blocked writers */
5172 wake_up_interruptible(&j
->poll_q
); /* Wake any blocked selects */
5174 case SOP_PU_RINGING
:
5175 if (ixjdebug
& 0x0008)
5176 printk(KERN_INFO
"phone DAA: SOP_PU_RINGING at %ld\n", jiffies
);
5177 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5179 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5180 j
->pld_slicw
.bits
.rly2
= 0;
5181 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5183 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5184 daa_load(&bytes
, j
);
5185 if (!SCI_Prepare(j
))
5187 j
->daa_mode
= SOP_PU_RINGING
;
5189 case SOP_PU_CONVERSATION
:
5190 if (ixjdebug
& 0x0008)
5191 printk(KERN_INFO
"phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies
);
5193 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5194 daa_load(&bytes
, j
);
5195 if (!SCI_Prepare(j
))
5197 j
->pld_slicw
.bits
.rly2
= 1;
5198 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5199 j
->pld_scrw
.bits
.daafsyncen
= 1; /* Turn on DAA Frame Sync */
5201 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5202 j
->daa_mode
= SOP_PU_CONVERSATION
;
5203 j
->flags
.pstn_ringing
= 0;
5204 j
->ex
.bits
.pstn_ring
= 0;
5205 j
->pstn_sleeptil
= jiffies
;
5206 j
->pstn_ring_start
= j
->pstn_ring_stop
= j
->pstn_ring_int
= 0;
5208 case SOP_PU_PULSEDIALING
:
5209 if (ixjdebug
& 0x0008)
5210 printk(KERN_INFO
"phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies
);
5211 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
5213 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5214 j
->pld_slicw
.bits
.rly2
= 0;
5215 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
5217 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5218 daa_load(&bytes
, j
);
5219 if (!SCI_Prepare(j
))
5221 j
->daa_mode
= SOP_PU_PULSEDIALING
;
5229 static int ixj_daa_write(IXJ
*j
)
5233 j
->flags
.pstncheck
= 1;
5235 daa_set_mode(j
, SOP_PU_SLEEP
);
5237 if (!SCI_Prepare(j
))
5240 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5243 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
5244 if (!daa_load(&bytes
, j
))
5247 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
;
5248 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
;
5249 if (!daa_load(&bytes
, j
))
5252 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
;
5253 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
5254 if (!daa_load(&bytes
, j
))
5257 if (!SCI_Prepare(j
))
5261 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
;
5262 if (!daa_load(&bytes
, j
))
5265 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
;
5266 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
;
5267 if (!daa_load(&bytes
, j
))
5270 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
;
5271 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
;
5272 if (!daa_load(&bytes
, j
))
5275 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
;
5276 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
;
5277 if (!daa_load(&bytes
, j
))
5280 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
;
5282 if (!daa_load(&bytes
, j
))
5285 if (!SCI_Prepare(j
))
5289 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7];
5290 if (!daa_load(&bytes
, j
))
5293 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6];
5294 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5];
5295 if (!daa_load(&bytes
, j
))
5298 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4];
5299 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3];
5300 if (!daa_load(&bytes
, j
))
5303 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2];
5304 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1];
5305 if (!daa_load(&bytes
, j
))
5308 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0];
5310 if (!daa_load(&bytes
, j
))
5313 if (!SCI_Control(j
, SCI_End
))
5315 if (!SCI_WaitLowSCI(j
))
5319 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7];
5320 if (!daa_load(&bytes
, j
))
5323 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6];
5324 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5];
5325 if (!daa_load(&bytes
, j
))
5328 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4];
5329 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3];
5330 if (!daa_load(&bytes
, j
))
5333 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2];
5334 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1];
5335 if (!daa_load(&bytes
, j
))
5338 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0];
5340 if (!daa_load(&bytes
, j
))
5343 if (!SCI_Control(j
, SCI_End
))
5345 if (!SCI_WaitLowSCI(j
))
5349 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7];
5350 if (!daa_load(&bytes
, j
))
5353 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6];
5354 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5];
5355 if (!daa_load(&bytes
, j
))
5358 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4];
5359 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3];
5360 if (!daa_load(&bytes
, j
))
5363 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2];
5364 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1];
5365 if (!daa_load(&bytes
, j
))
5368 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0];
5370 if (!daa_load(&bytes
, j
))
5373 if (!SCI_Control(j
, SCI_End
))
5375 if (!SCI_WaitLowSCI(j
))
5379 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7];
5380 if (!daa_load(&bytes
, j
))
5383 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6];
5384 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5];
5385 if (!daa_load(&bytes
, j
))
5388 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4];
5389 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3];
5390 if (!daa_load(&bytes
, j
))
5393 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2];
5394 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1];
5395 if (!daa_load(&bytes
, j
))
5398 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0];
5400 if (!daa_load(&bytes
, j
))
5403 if (!SCI_Control(j
, SCI_End
))
5405 if (!SCI_WaitLowSCI(j
))
5409 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7];
5410 if (!daa_load(&bytes
, j
))
5413 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6];
5414 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5];
5415 if (!daa_load(&bytes
, j
))
5418 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4];
5419 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3];
5420 if (!daa_load(&bytes
, j
))
5423 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2];
5424 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1];
5425 if (!daa_load(&bytes
, j
))
5428 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0];
5430 if (!daa_load(&bytes
, j
))
5433 if (!SCI_Control(j
, SCI_End
))
5435 if (!SCI_WaitLowSCI(j
))
5439 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7];
5440 if (!daa_load(&bytes
, j
))
5443 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6];
5444 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5];
5445 if (!daa_load(&bytes
, j
))
5448 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4];
5449 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3];
5450 if (!daa_load(&bytes
, j
))
5453 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2];
5454 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1];
5455 if (!daa_load(&bytes
, j
))
5458 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0];
5460 if (!daa_load(&bytes
, j
))
5463 if (!SCI_Control(j
, SCI_End
))
5465 if (!SCI_WaitLowSCI(j
))
5469 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7];
5470 if (!daa_load(&bytes
, j
))
5473 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6];
5474 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5];
5475 if (!daa_load(&bytes
, j
))
5478 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4];
5479 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3];
5480 if (!daa_load(&bytes
, j
))
5483 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2];
5484 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1];
5485 if (!daa_load(&bytes
, j
))
5488 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0];
5490 if (!daa_load(&bytes
, j
))
5493 if (!SCI_Control(j
, SCI_End
))
5495 if (!SCI_WaitLowSCI(j
))
5499 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7];
5500 if (!daa_load(&bytes
, j
))
5503 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6];
5504 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5];
5505 if (!daa_load(&bytes
, j
))
5508 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4];
5509 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3];
5510 if (!daa_load(&bytes
, j
))
5513 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2];
5514 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1];
5515 if (!daa_load(&bytes
, j
))
5518 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0];
5520 if (!daa_load(&bytes
, j
))
5523 if (!SCI_Control(j
, SCI_End
))
5525 if (!SCI_WaitLowSCI(j
))
5529 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7];
5530 if (!daa_load(&bytes
, j
))
5533 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6];
5534 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5];
5535 if (!daa_load(&bytes
, j
))
5538 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4];
5539 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3];
5540 if (!daa_load(&bytes
, j
))
5543 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2];
5544 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1];
5545 if (!daa_load(&bytes
, j
))
5548 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0];
5550 if (!daa_load(&bytes
, j
))
5553 if (!SCI_Control(j
, SCI_End
))
5555 if (!SCI_WaitLowSCI(j
))
5559 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3];
5560 if (!daa_load(&bytes
, j
))
5563 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2];
5564 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1];
5565 if (!daa_load(&bytes
, j
))
5568 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0];
5570 if (!daa_load(&bytes
, j
))
5573 if (!SCI_Control(j
, SCI_End
))
5575 if (!SCI_WaitLowSCI(j
))
5579 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3];
5580 if (!daa_load(&bytes
, j
))
5583 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2];
5584 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1];
5585 if (!daa_load(&bytes
, j
))
5588 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0];
5590 if (!daa_load(&bytes
, j
))
5593 if (!SCI_Control(j
, SCI_End
))
5595 if (!SCI_WaitLowSCI(j
))
5599 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3];
5600 if (!daa_load(&bytes
, j
))
5603 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2];
5604 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1];
5605 if (!daa_load(&bytes
, j
))
5608 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0];
5610 if (!daa_load(&bytes
, j
))
5613 if (!SCI_Control(j
, SCI_End
))
5615 if (!SCI_WaitLowSCI(j
))
5619 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3];
5620 if (!daa_load(&bytes
, j
))
5623 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2];
5624 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1];
5625 if (!daa_load(&bytes
, j
))
5628 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0];
5630 if (!daa_load(&bytes
, j
))
5633 if (!SCI_Control(j
, SCI_End
))
5635 if (!SCI_WaitLowSCI(j
))
5639 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3];
5640 if (!daa_load(&bytes
, j
))
5643 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2];
5644 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1];
5645 if (!daa_load(&bytes
, j
))
5648 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0];
5650 if (!daa_load(&bytes
, j
))
5653 if (!SCI_Control(j
, SCI_End
))
5655 if (!SCI_WaitLowSCI(j
))
5659 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7];
5660 if (!daa_load(&bytes
, j
))
5663 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6];
5664 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5];
5665 if (!daa_load(&bytes
, j
))
5668 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4];
5669 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3];
5670 if (!daa_load(&bytes
, j
))
5673 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2];
5674 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1];
5675 if (!daa_load(&bytes
, j
))
5678 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0];
5680 if (!daa_load(&bytes
, j
))
5683 if (!SCI_Control(j
, SCI_End
))
5685 if (!SCI_WaitLowSCI(j
))
5689 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7];
5690 if (!daa_load(&bytes
, j
))
5693 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6];
5694 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5];
5695 if (!daa_load(&bytes
, j
))
5698 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4];
5699 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3];
5700 if (!daa_load(&bytes
, j
))
5703 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2];
5704 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1];
5705 if (!daa_load(&bytes
, j
))
5708 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0];
5710 if (!daa_load(&bytes
, j
))
5714 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
5715 if (!SCI_Control(j
, SCI_End
))
5718 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
5720 if (ixjdebug
& 0x0002)
5721 printk("DAA Coefficients Loaded\n");
5723 j
->flags
.pstncheck
= 0;
5727 static int ixj_set_tone_off(unsigned short arg
, IXJ
*j
)
5729 j
->tone_off_time
= arg
;
5730 if (ixj_WriteDSPCommand(0x6E05, j
)) /* Set Tone Off Period */
5733 if (ixj_WriteDSPCommand(arg
, j
))
5738 static int ixj_get_tone_on(IXJ
*j
)
5740 if (ixj_WriteDSPCommand(0x6E06, j
)) /* Get Tone On Period */
5746 static int ixj_get_tone_off(IXJ
*j
)
5748 if (ixj_WriteDSPCommand(0x6E07, j
)) /* Get Tone Off Period */
5754 static void ixj_busytone(IXJ
*j
)
5756 j
->flags
.ringback
= 0;
5757 j
->flags
.dialtone
= 0;
5758 j
->flags
.busytone
= 1;
5759 ixj_set_tone_on(0x07D0, j
);
5760 ixj_set_tone_off(0x07D0, j
);
5761 ixj_play_tone(j
, 27);
5764 static void ixj_dialtone(IXJ
*j
)
5766 j
->flags
.ringback
= 0;
5767 j
->flags
.dialtone
= 1;
5768 j
->flags
.busytone
= 0;
5769 if (j
->dsp
.low
== 0x20) {
5772 ixj_set_tone_on(0xFFFF, j
);
5773 ixj_set_tone_off(0x0000, j
);
5774 ixj_play_tone(j
, 25);
5778 static void ixj_cpt_stop(IXJ
*j
)
5780 if(j
->tone_state
|| j
->tone_cadence_state
)
5782 j
->flags
.dialtone
= 0;
5783 j
->flags
.busytone
= 0;
5784 j
->flags
.ringback
= 0;
5785 ixj_set_tone_on(0x0001, j
);
5786 ixj_set_tone_off(0x0000, j
);
5787 ixj_play_tone(j
, 0);
5788 j
->tone_state
= j
->tone_cadence_state
= 0;
5790 kfree(j
->cadence_t
->ce
);
5791 kfree(j
->cadence_t
);
5792 j
->cadence_t
= NULL
;
5795 if (j
->play_mode
== -1 && j
->rec_mode
== -1)
5797 if (j
->play_mode
!= -1 && j
->dsp
.low
== 0x20)
5799 if (j
->rec_mode
!= -1 && j
->dsp
.low
== 0x20)
5800 ixj_record_start(j
);
5803 static void ixj_ringback(IXJ
*j
)
5805 j
->flags
.busytone
= 0;
5806 j
->flags
.dialtone
= 0;
5807 j
->flags
.ringback
= 1;
5808 ixj_set_tone_on(0x0FA0, j
);
5809 ixj_set_tone_off(0x2EE0, j
);
5810 ixj_play_tone(j
, 26);
5813 static void ixj_testram(IXJ
*j
)
5815 ixj_WriteDSPCommand(0x3001, j
); /* Test External SRAM */
5818 static int ixj_build_cadence(IXJ
*j
, IXJ_CADENCE __user
* cp
)
5821 IXJ_CADENCE_ELEMENT __user
*cep
;
5822 IXJ_CADENCE_ELEMENT
*lcep
;
5826 lcp
= kmalloc(sizeof(ixj_cadence
), GFP_KERNEL
);
5831 if (copy_from_user(&lcp
->elements_used
,
5832 &cp
->elements_used
, sizeof(int)))
5834 if (copy_from_user(&lcp
->termination
,
5835 &cp
->termination
, sizeof(IXJ_CADENCE_TERM
)))
5837 if (get_user(cep
, &cp
->ce
))
5841 if ((unsigned)lcp
->elements_used
>= ~0U/sizeof(IXJ_CADENCE_ELEMENT
))
5845 lcep
= kmalloc(sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
, GFP_KERNEL
);
5850 if (copy_from_user(lcep
, cep
, sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
))
5854 kfree(j
->cadence_t
->ce
);
5855 kfree(j
->cadence_t
);
5857 lcp
->ce
= (void *) lcep
;
5859 j
->tone_cadence_state
= 0;
5860 ixj_set_tone_on(lcp
->ce
[0].tone_on_time
, j
);
5861 ixj_set_tone_off(lcp
->ce
[0].tone_off_time
, j
);
5862 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
) {
5863 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
5864 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
5865 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
5866 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
5867 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
5868 ixj_init_tone(j
, &ti
);
5870 ixj_play_tone(j
, lcp
->ce
[0].index
);
5879 static int ixj_build_filter_cadence(IXJ
*j
, IXJ_FILTER_CADENCE __user
* cp
)
5881 IXJ_FILTER_CADENCE
*lcp
;
5882 lcp
= memdup_user(cp
, sizeof(IXJ_FILTER_CADENCE
));
5884 if(ixjdebug
& 0x0001) {
5885 printk(KERN_INFO
"Could not allocate memory for cadence or could not copy cadence to kernel\n");
5887 return PTR_ERR(lcp
);
5889 if (lcp
->filter
> 5) {
5890 if(ixjdebug
& 0x0001) {
5891 printk(KERN_INFO
"Cadence out of range\n");
5896 j
->cadence_f
[lcp
->filter
].state
= 0;
5897 j
->cadence_f
[lcp
->filter
].enable
= lcp
->enable
;
5898 j
->filter_en
[lcp
->filter
] = j
->cadence_f
[lcp
->filter
].en_filter
= lcp
->en_filter
;
5899 j
->cadence_f
[lcp
->filter
].on1
= lcp
->on1
;
5900 j
->cadence_f
[lcp
->filter
].on1min
= 0;
5901 j
->cadence_f
[lcp
->filter
].on1max
= 0;
5902 j
->cadence_f
[lcp
->filter
].off1
= lcp
->off1
;
5903 j
->cadence_f
[lcp
->filter
].off1min
= 0;
5904 j
->cadence_f
[lcp
->filter
].off1max
= 0;
5905 j
->cadence_f
[lcp
->filter
].on2
= lcp
->on2
;
5906 j
->cadence_f
[lcp
->filter
].on2min
= 0;
5907 j
->cadence_f
[lcp
->filter
].on2max
= 0;
5908 j
->cadence_f
[lcp
->filter
].off2
= lcp
->off2
;
5909 j
->cadence_f
[lcp
->filter
].off2min
= 0;
5910 j
->cadence_f
[lcp
->filter
].off2max
= 0;
5911 j
->cadence_f
[lcp
->filter
].on3
= lcp
->on3
;
5912 j
->cadence_f
[lcp
->filter
].on3min
= 0;
5913 j
->cadence_f
[lcp
->filter
].on3max
= 0;
5914 j
->cadence_f
[lcp
->filter
].off3
= lcp
->off3
;
5915 j
->cadence_f
[lcp
->filter
].off3min
= 0;
5916 j
->cadence_f
[lcp
->filter
].off3max
= 0;
5917 if(ixjdebug
& 0x0002) {
5918 printk(KERN_INFO
"Cadence %d loaded\n", lcp
->filter
);
5924 static void add_caps(IXJ
*j
)
5927 j
->caplist
[j
->caps
].cap
= PHONE_VENDOR_QUICKNET
;
5928 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Technologies, Inc. (www.quicknet.net)");
5929 j
->caplist
[j
->caps
].captype
= vendor
;
5930 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5931 j
->caplist
[j
->caps
].captype
= device
;
5932 switch (j
->cardtype
) {
5934 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK");
5937 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet LineJACK");
5939 case QTI_PHONEJACK_LITE
:
5940 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK Lite");
5942 case QTI_PHONEJACK_PCI
:
5943 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK PCI");
5946 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneCARD");
5949 j
->caplist
[j
->caps
].cap
= j
->cardtype
;
5950 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5951 strcpy(j
->caplist
[j
->caps
].desc
, "POTS");
5952 j
->caplist
[j
->caps
].captype
= port
;
5953 j
->caplist
[j
->caps
].cap
= pots
;
5954 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5956 /* add devices that can do speaker/mic */
5957 switch (j
->cardtype
) {
5960 case QTI_PHONEJACK_PCI
:
5962 strcpy(j
->caplist
[j
->caps
].desc
, "SPEAKER");
5963 j
->caplist
[j
->caps
].captype
= port
;
5964 j
->caplist
[j
->caps
].cap
= speaker
;
5965 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5970 /* add devices that can do handset */
5971 switch (j
->cardtype
) {
5973 strcpy(j
->caplist
[j
->caps
].desc
, "HANDSET");
5974 j
->caplist
[j
->caps
].captype
= port
;
5975 j
->caplist
[j
->caps
].cap
= handset
;
5976 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5982 /* add devices that can do PSTN */
5983 switch (j
->cardtype
) {
5985 strcpy(j
->caplist
[j
->caps
].desc
, "PSTN");
5986 j
->caplist
[j
->caps
].captype
= port
;
5987 j
->caplist
[j
->caps
].cap
= pstn
;
5988 j
->caplist
[j
->caps
].handle
= j
->caps
++;
5994 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
5995 strcpy(j
->caplist
[j
->caps
].desc
, "ULAW");
5996 j
->caplist
[j
->caps
].captype
= codec
;
5997 j
->caplist
[j
->caps
].cap
= ULAW
;
5998 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6000 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 16 bit");
6001 j
->caplist
[j
->caps
].captype
= codec
;
6002 j
->caplist
[j
->caps
].cap
= LINEAR16
;
6003 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6005 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 8 bit");
6006 j
->caplist
[j
->caps
].captype
= codec
;
6007 j
->caplist
[j
->caps
].cap
= LINEAR8
;
6008 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6010 strcpy(j
->caplist
[j
->caps
].desc
, "Windows Sound System");
6011 j
->caplist
[j
->caps
].captype
= codec
;
6012 j
->caplist
[j
->caps
].cap
= WSS
;
6013 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6015 /* software ALAW codec, made from ULAW */
6016 strcpy(j
->caplist
[j
->caps
].desc
, "ALAW");
6017 j
->caplist
[j
->caps
].captype
= codec
;
6018 j
->caplist
[j
->caps
].cap
= ALAW
;
6019 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6021 /* version 12 of the 8020 does the following codecs in a broken way */
6022 if (j
->dsp
.low
!= 0x20 || j
->ver
.low
!= 0x12) {
6023 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 6.3kbps");
6024 j
->caplist
[j
->caps
].captype
= codec
;
6025 j
->caplist
[j
->caps
].cap
= G723_63
;
6026 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6028 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 5.3kbps");
6029 j
->caplist
[j
->caps
].captype
= codec
;
6030 j
->caplist
[j
->caps
].cap
= G723_53
;
6031 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6033 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.8kbps");
6034 j
->caplist
[j
->caps
].captype
= codec
;
6035 j
->caplist
[j
->caps
].cap
= TS48
;
6036 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6038 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.1kbps");
6039 j
->caplist
[j
->caps
].captype
= codec
;
6040 j
->caplist
[j
->caps
].cap
= TS41
;
6041 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6044 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6045 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
6046 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 8.5kbps");
6047 j
->caplist
[j
->caps
].captype
= codec
;
6048 j
->caplist
[j
->caps
].cap
= TS85
;
6049 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6052 /* 8021 chips can do G728 */
6053 if (j
->dsp
.low
== 0x21) {
6054 strcpy(j
->caplist
[j
->caps
].desc
, "G.728 16kbps");
6055 j
->caplist
[j
->caps
].captype
= codec
;
6056 j
->caplist
[j
->caps
].cap
= G728
;
6057 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6060 /* 8021/8022 chips can do G729 if loaded */
6061 if (j
->dsp
.low
!= 0x20 && j
->flags
.g729_loaded
) {
6062 strcpy(j
->caplist
[j
->caps
].desc
, "G.729A 8kbps");
6063 j
->caplist
[j
->caps
].captype
= codec
;
6064 j
->caplist
[j
->caps
].cap
= G729
;
6065 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6067 if (j
->dsp
.low
!= 0x20 && j
->flags
.g729_loaded
) {
6068 strcpy(j
->caplist
[j
->caps
].desc
, "G.729B 8kbps");
6069 j
->caplist
[j
->caps
].captype
= codec
;
6070 j
->caplist
[j
->caps
].cap
= G729B
;
6071 j
->caplist
[j
->caps
].handle
= j
->caps
++;
6075 static int capabilities_check(IXJ
*j
, struct phone_capability
*pcreq
)
6079 for (cnt
= 0; cnt
< j
->caps
; cnt
++) {
6080 if (pcreq
->captype
== j
->caplist
[cnt
].captype
6081 && pcreq
->cap
== j
->caplist
[cnt
].cap
) {
6089 static long do_ixj_ioctl(struct file
*file_p
, unsigned int cmd
, unsigned long arg
)
6094 void __user
*argp
= (void __user
*)arg
;
6095 struct inode
*inode
= file_p
->f_path
.dentry
->d_inode
;
6096 unsigned int minor
= iminor(inode
);
6097 unsigned int raise
, mant
;
6098 int board
= NUM(inode
);
6100 IXJ
*j
= get_ixj(NUM(inode
));
6105 * Set up locks to ensure that only one process is talking to the DSP at a time.
6106 * This is necessary to keep the DSP from locking up.
6108 while(test_and_set_bit(board
, (void *)&j
->busyflags
) != 0)
6109 schedule_timeout_interruptible(1);
6110 if (ixjdebug
& 0x0040)
6111 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor
, cmd
, arg
);
6112 if (minor
>= IXJMAX
) {
6113 clear_bit(board
, &j
->busyflags
);
6117 * Check ioctls only root can use.
6119 if (!capable(CAP_SYS_ADMIN
)) {
6121 case IXJCTL_TESTRAM
:
6127 case IXJCTL_TESTRAM
:
6129 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6131 case IXJCTL_CARDTYPE
:
6132 retval
= j
->cardtype
;
6137 case IXJCTL_VERSION
:
6140 snprintf(arg_str
, sizeof(arg_str
),
6141 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR
,
6142 IXJ_VER_MINOR
, IXJ_BLD_VER
);
6143 if (copy_to_user(argp
, arg_str
, strlen(arg_str
)))
6147 case PHONE_RING_CADENCE
:
6148 j
->ring_cadence
= arg
;
6152 if (copy_from_user(&j
->cid_send
, argp
, sizeof(PHONE_CID
))) {
6157 memset(&j
->cid_send
, 0, sizeof(PHONE_CID
));
6161 /* Binary compatbility */
6162 case OLD_PHONE_RING_START
:
6165 case PHONE_RING_START
:
6167 if (copy_from_user(&j
->cid_send
, argp
, sizeof(PHONE_CID
))) {
6173 memset(&j
->cid_send
, 0, sizeof(PHONE_CID
));
6177 case PHONE_RING_STOP
:
6178 j
->flags
.cringing
= 0;
6179 if(j
->cadence_f
[5].enable
) {
6180 j
->cadence_f
[5].state
= 0;
6185 retval
= ixj_ring(j
);
6187 case PHONE_EXCEPTION
:
6188 retval
= j
->ex
.bytes
;
6189 if(j
->ex
.bits
.flash
) {
6191 j
->ex
.bits
.flash
= 0;
6193 j
->ex
.bits
.pstn_ring
= 0;
6194 j
->ex
.bits
.caller_id
= 0;
6195 j
->ex
.bits
.pstn_wink
= 0;
6204 j
->ex
.bits
.reserved
= 0;
6206 case PHONE_HOOKSTATE
:
6207 j
->ex
.bits
.hookstate
= 0;
6208 retval
= j
->hookstate
; //j->r_hook;
6210 case IXJCTL_SET_LED
:
6211 LED_SetState(arg
, j
);
6214 retval
= set_base_frame(j
, arg
);
6216 case PHONE_REC_CODEC
:
6217 retval
= set_rec_codec(j
, arg
);
6222 case PHONE_REC_START
:
6223 ixj_record_start(j
);
6225 case PHONE_REC_STOP
:
6228 case PHONE_REC_DEPTH
:
6229 set_rec_depth(j
, arg
);
6231 case PHONE_REC_VOLUME
:
6233 retval
= get_rec_volume(j
);
6236 set_rec_volume(j
, arg
);
6240 case PHONE_REC_VOLUME_LINEAR
:
6242 retval
= get_rec_volume_linear(j
);
6245 set_rec_volume_linear(j
, arg
);
6249 case IXJCTL_DTMF_PRESCALE
:
6251 retval
= get_dtmf_prescale(j
);
6254 set_dtmf_prescale(j
, arg
);
6258 case PHONE_REC_LEVEL
:
6259 retval
= get_rec_level(j
);
6262 retval
= ixj_siadc(j
, arg
);
6265 retval
= ixj_sidac(j
, arg
);
6267 case IXJCTL_AEC_START
:
6268 ixj_aec_start(j
, arg
);
6270 case IXJCTL_AEC_STOP
:
6273 case IXJCTL_AEC_GET_LEVEL
:
6274 retval
= j
->aec_level
;
6276 case PHONE_PLAY_CODEC
:
6277 retval
= set_play_codec(j
, arg
);
6279 case PHONE_PLAY_START
:
6280 retval
= ixj_play_start(j
);
6282 case PHONE_PLAY_STOP
:
6285 case PHONE_PLAY_DEPTH
:
6286 set_play_depth(j
, arg
);
6288 case PHONE_PLAY_VOLUME
:
6290 retval
= get_play_volume(j
);
6293 set_play_volume(j
, arg
);
6297 case PHONE_PLAY_VOLUME_LINEAR
:
6299 retval
= get_play_volume_linear(j
);
6302 set_play_volume_linear(j
, arg
);
6306 case PHONE_PLAY_LEVEL
:
6307 retval
= get_play_level(j
);
6309 case IXJCTL_DSP_TYPE
:
6310 retval
= (j
->dsp
.high
<< 8) + j
->dsp
.low
;
6312 case IXJCTL_DSP_VERSION
:
6313 retval
= (j
->ver
.high
<< 8) + j
->ver
.low
;
6324 case IXJCTL_DRYBUFFER_READ
:
6325 put_user(j
->drybuffer
, (unsigned long __user
*) argp
);
6327 case IXJCTL_DRYBUFFER_CLEAR
:
6330 case IXJCTL_FRAMES_READ
:
6331 put_user(j
->framesread
, (unsigned long __user
*) argp
);
6333 case IXJCTL_FRAMES_WRITTEN
:
6334 put_user(j
->frameswritten
, (unsigned long __user
*) argp
);
6336 case IXJCTL_READ_WAIT
:
6337 put_user(j
->read_wait
, (unsigned long __user
*) argp
);
6339 case IXJCTL_WRITE_WAIT
:
6340 put_user(j
->write_wait
, (unsigned long __user
*) argp
);
6342 case PHONE_MAXRINGS
:
6345 case PHONE_SET_TONE_ON_TIME
:
6346 ixj_set_tone_on(arg
, j
);
6348 case PHONE_SET_TONE_OFF_TIME
:
6349 ixj_set_tone_off(arg
, j
);
6351 case PHONE_GET_TONE_ON_TIME
:
6352 if (ixj_get_tone_on(j
)) {
6355 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6358 case PHONE_GET_TONE_OFF_TIME
:
6359 if (ixj_get_tone_off(j
)) {
6362 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
6365 case PHONE_PLAY_TONE
:
6367 retval
= ixj_play_tone(j
, arg
);
6371 case PHONE_GET_TONE_STATE
:
6372 retval
= j
->tone_state
;
6374 case PHONE_DTMF_READY
:
6375 retval
= j
->ex
.bits
.dtmf_ready
;
6377 case PHONE_GET_DTMF
:
6378 if (ixj_hookstate(j
)) {
6379 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
6380 retval
= j
->dtmfbuffer
[j
->dtmf_rp
];
6382 if (j
->dtmf_rp
== 79)
6384 if (j
->dtmf_rp
== j
->dtmf_wp
) {
6385 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
6390 case PHONE_GET_DTMF_ASCII
:
6391 if (ixj_hookstate(j
)) {
6392 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
6393 switch (j
->dtmfbuffer
[j
->dtmf_rp
]) {
6395 retval
= 42; /* '*'; */
6399 retval
= 48; /*'0'; */
6403 retval
= 35; /*'#'; */
6407 retval
= 65; /*'A'; */
6411 retval
= 66; /*'B'; */
6415 retval
= 67; /*'C'; */
6419 retval
= 68; /*'D'; */
6423 retval
= 48 + j
->dtmfbuffer
[j
->dtmf_rp
];
6427 if (j
->dtmf_rp
== 79)
6429 if(j
->dtmf_rp
== j
->dtmf_wp
)
6431 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
6436 case PHONE_DTMF_OOB
:
6437 j
->flags
.dtmf_oob
= arg
;
6439 case PHONE_DIALTONE
:
6445 case PHONE_RINGBACK
:
6449 if(j
->cardtype
== QTI_PHONEJACK
)
6452 retval
= ixj_wink(j
);
6454 case PHONE_CPT_STOP
:
6457 case PHONE_QUERY_CODEC
:
6459 struct phone_codec_data pd
;
6461 int proto_size
[] = {
6463 12, 10, 16, 9, 8, 48, 5,
6464 40, 40, 80, 40, 40, 6
6466 if(copy_from_user(&pd
, argp
, sizeof(pd
))) {
6470 if(pd
.type
<1 || pd
.type
>13) {
6471 retval
= -EPROTONOSUPPORT
;
6475 val
=proto_size
[pd
.type
];
6476 else switch(j
->baseframe
.low
)
6478 case 0xA0:val
=2*proto_size
[pd
.type
];break;
6479 case 0x50:val
=proto_size
[pd
.type
];break;
6480 default:val
=proto_size
[pd
.type
]*3;break;
6482 pd
.buf_min
=pd
.buf_max
=pd
.buf_opt
=val
;
6483 if(copy_to_user(argp
, &pd
, sizeof(pd
)))
6487 case IXJCTL_DSP_IDLE
:
6491 if ((arg
& 0xff) == 0xff)
6492 retval
= ixj_get_mixer(arg
, j
);
6496 case IXJCTL_DAA_COEFF_SET
:
6500 retval
= ixj_daa_write(j
);
6504 retval
= ixj_daa_write(j
);
6507 DAA_Coeff_France(j
);
6508 retval
= ixj_daa_write(j
);
6511 DAA_Coeff_Germany(j
);
6512 retval
= ixj_daa_write(j
);
6515 DAA_Coeff_Australia(j
);
6516 retval
= ixj_daa_write(j
);
6520 retval
= ixj_daa_write(j
);
6527 case IXJCTL_DAA_AGAIN
:
6528 ixj_daa_cr4(j
, arg
| 0x02);
6530 case IXJCTL_PSTN_LINETEST
:
6531 retval
= ixj_linetest(j
);
6534 ixj_write_vmwi(j
, arg
);
6537 if (copy_to_user(argp
, &j
->cid
, sizeof(PHONE_CID
)))
6539 j
->ex
.bits
.caller_id
= 0;
6541 case IXJCTL_WINK_DURATION
:
6546 retval
= ixj_set_port(j
, arg
);
6550 case IXJCTL_POTS_PSTN
:
6551 retval
= ixj_set_pots(j
, arg
);
6553 case PHONE_CAPABILITIES
:
6557 case PHONE_CAPABILITIES_LIST
:
6559 if (copy_to_user(argp
, j
->caplist
, sizeof(struct phone_capability
) * j
->caps
))
6562 case PHONE_CAPABILITIES_CHECK
:
6564 struct phone_capability cap
;
6565 if (copy_from_user(&cap
, argp
, sizeof(cap
)))
6569 retval
= capabilities_check(j
, &cap
);
6573 case PHONE_PSTN_SET_STATE
:
6574 daa_set_mode(j
, arg
);
6576 case PHONE_PSTN_GET_STATE
:
6577 retval
= j
->daa_mode
;
6578 j
->ex
.bits
.pstn_ring
= 0;
6580 case IXJCTL_SET_FILTER
:
6581 if (copy_from_user(&jf
, argp
, sizeof(jf
)))
6583 retval
= ixj_init_filter(j
, &jf
);
6585 case IXJCTL_SET_FILTER_RAW
:
6586 if (copy_from_user(&jfr
, argp
, sizeof(jfr
)))
6589 retval
= ixj_init_filter_raw(j
, &jfr
);
6591 case IXJCTL_GET_FILTER_HIST
:
6595 retval
= j
->filter_hist
[arg
];
6597 case IXJCTL_INIT_TONE
:
6598 if (copy_from_user(&ti
, argp
, sizeof(ti
)))
6601 retval
= ixj_init_tone(j
, &ti
);
6603 case IXJCTL_TONE_CADENCE
:
6604 retval
= ixj_build_cadence(j
, argp
);
6606 case IXJCTL_FILTER_CADENCE
:
6607 retval
= ixj_build_filter_cadence(j
, argp
);
6610 if (copy_from_user(&j
->sigdef
, argp
, sizeof(IXJ_SIGDEF
))) {
6614 j
->ixj_signals
[j
->sigdef
.event
] = j
->sigdef
.signal
;
6615 if(j
->sigdef
.event
< 33) {
6617 for(mant
= 0; mant
< j
->sigdef
.event
; mant
++){
6620 if(j
->sigdef
.signal
)
6621 j
->ex_sig
.bytes
|= raise
;
6623 j
->ex_sig
.bytes
&= (raise
^0xffff);
6626 case IXJCTL_INTERCOM_STOP
:
6627 if(arg
< 0 || arg
>= IXJMAX
)
6633 get_ixj(arg
)->intercom
= -1;
6634 ixj_record_stop(get_ixj(arg
));
6635 ixj_play_stop(get_ixj(arg
));
6638 case IXJCTL_INTERCOM_START
:
6639 if(arg
< 0 || arg
>= IXJMAX
)
6642 ixj_record_start(j
);
6644 get_ixj(arg
)->intercom
= board
;
6645 ixj_play_start(get_ixj(arg
));
6646 ixj_record_start(get_ixj(arg
));
6649 if (ixjdebug
& 0x0040)
6650 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor
, cmd
, arg
);
6651 clear_bit(board
, &j
->busyflags
);
6655 static long ixj_ioctl(struct file
*file_p
, unsigned int cmd
, unsigned long arg
)
6659 ret
= do_ixj_ioctl(file_p
, cmd
, arg
);
6664 static int ixj_fasync(int fd
, struct file
*file_p
, int mode
)
6666 IXJ
*j
= get_ixj(NUM(file_p
->f_path
.dentry
->d_inode
));
6668 return fasync_helper(fd
, file_p
, mode
, &j
->async_queue
);
6671 static const struct file_operations ixj_fops
=
6673 .owner
= THIS_MODULE
,
6674 .read
= ixj_enhanced_read
,
6675 .write
= ixj_enhanced_write
,
6677 .unlocked_ioctl
= ixj_ioctl
,
6678 .release
= ixj_release
,
6679 .fasync
= ixj_fasync
6682 static int ixj_linetest(IXJ
*j
)
6684 j
->flags
.pstncheck
= 1; /* Testing */
6685 j
->flags
.pstn_present
= 0; /* Assume the line is not there */
6687 daa_int_read(j
); /*Clear DAA Interrupt flags */
6689 /* Hold all relays in the normally de-energized position. */
6692 j
->pld_slicw
.bits
.rly1
= 0;
6693 j
->pld_slicw
.bits
.rly2
= 0;
6694 j
->pld_slicw
.bits
.rly3
= 0;
6695 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6696 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6698 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6699 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
6700 if (j
->pld_slicr
.bits
.potspstn
) {
6701 j
->flags
.pots_pstn
= 1;
6702 j
->flags
.pots_correct
= 0;
6703 LED_SetState(0x4, j
);
6705 j
->flags
.pots_pstn
= 0;
6706 j
->pld_slicw
.bits
.rly1
= 0;
6707 j
->pld_slicw
.bits
.rly2
= 0;
6708 j
->pld_slicw
.bits
.rly3
= 1;
6709 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6710 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6712 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6713 daa_set_mode(j
, SOP_PU_CONVERSATION
);
6716 daa_set_mode(j
, SOP_PU_RESET
);
6717 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
6718 j
->flags
.pots_correct
= 0; /* Should not be line voltage on POTS port. */
6719 LED_SetState(0x4, j
);
6720 j
->pld_slicw
.bits
.rly3
= 0;
6721 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6723 j
->flags
.pots_correct
= 1;
6724 LED_SetState(0x8, j
);
6725 j
->pld_slicw
.bits
.rly1
= 1;
6726 j
->pld_slicw
.bits
.rly2
= 0;
6727 j
->pld_slicw
.bits
.rly3
= 0;
6728 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6731 j
->pld_slicw
.bits
.rly3
= 0;
6732 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6733 daa_set_mode(j
, SOP_PU_CONVERSATION
);
6736 daa_set_mode(j
, SOP_PU_RESET
);
6737 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
6738 j
->pstn_sleeptil
= jiffies
+ (hertz
/ 4);
6739 j
->flags
.pstn_present
= 1;
6741 j
->flags
.pstn_present
= 0;
6743 if (j
->flags
.pstn_present
) {
6744 if (j
->flags
.pots_correct
) {
6745 LED_SetState(0xA, j
);
6747 LED_SetState(0x6, j
);
6750 if (j
->flags
.pots_correct
) {
6751 LED_SetState(0x9, j
);
6753 LED_SetState(0x5, j
);
6756 j
->flags
.pstncheck
= 0; /* Testing */
6757 return j
->flags
.pstn_present
;
6760 static int ixj_selfprobe(IXJ
*j
)
6766 init_waitqueue_head(&j
->poll_q
);
6767 init_waitqueue_head(&j
->read_q
);
6768 init_waitqueue_head(&j
->write_q
);
6770 while(atomic_read(&j
->DSPWrite
) > 0)
6771 atomic_dec(&j
->DSPWrite
);
6772 if (ixjdebug
& 0x0002)
6773 printk(KERN_INFO
"Write IDLE to Software Control Register\n");
6774 ixj_WriteDSPCommand(0x0FE0, j
); /* Put the DSP in full power mode. */
6776 if (ixj_WriteDSPCommand(0x0000, j
)) /* Write IDLE to Software Control Register */
6778 /* The read values of the SSR should be 0x00 for the IDLE command */
6779 if (j
->ssr
.low
|| j
->ssr
.high
)
6781 if (ixjdebug
& 0x0002)
6782 printk(KERN_INFO
"Get Device ID Code\n");
6783 if (ixj_WriteDSPCommand(0x3400, j
)) /* Get Device ID Code */
6785 j
->dsp
.low
= j
->ssr
.low
;
6786 j
->dsp
.high
= j
->ssr
.high
;
6787 if (ixjdebug
& 0x0002)
6788 printk(KERN_INFO
"Get Device Version Code\n");
6789 if (ixj_WriteDSPCommand(0x3800, j
)) /* Get Device Version Code */
6791 j
->ver
.low
= j
->ssr
.low
;
6792 j
->ver
.high
= j
->ssr
.high
;
6794 if (j
->dsp
.low
== 0x21) {
6795 bytes
.high
= bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
6796 outb_p(bytes
.low
^ 0xFF, j
->XILINXbase
+ 0x02);
6797 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6798 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
6799 if (bytes
.low
== bytes
.high
) /* Register is read only on */
6800 /* Internet PhoneJack Lite */
6802 j
->cardtype
= QTI_PHONEJACK_LITE
;
6803 if (!request_region(j
->XILINXbase
, 4, "ixj control")) {
6804 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6807 j
->pld_slicw
.pcib
.e1
= 1;
6808 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6810 j
->cardtype
= QTI_LINEJACK
;
6812 if (!request_region(j
->XILINXbase
, 8, "ixj control")) {
6813 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6817 } else if (j
->dsp
.low
== 0x22) {
6818 j
->cardtype
= QTI_PHONEJACK_PCI
;
6819 request_region(j
->XILINXbase
, 4, "ixj control");
6820 j
->pld_slicw
.pcib
.e1
= 1;
6821 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6823 j
->cardtype
= QTI_PHONEJACK
;
6825 switch (j
->cardtype
) {
6827 if (!j
->dsp
.low
!= 0x20) {
6830 ixj_WriteDSPCommand(0x3800, j
);
6831 j
->ver
.low
= j
->ssr
.low
;
6832 j
->ver
.high
= j
->ssr
.high
;
6836 if (!request_region(j
->XILINXbase
, 8, "ixj control")) {
6837 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6841 case QTI_PHONEJACK_LITE
:
6842 case QTI_PHONEJACK_PCI
:
6843 if (!request_region(j
->XILINXbase
, 4, "ixj control")) {
6844 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
6847 j
->pld_slicw
.pcib
.e1
= 1;
6848 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
6854 if (j
->dsp
.low
== 0x20 || j
->cardtype
== QTI_PHONEJACK_LITE
|| j
->cardtype
== QTI_PHONEJACK_PCI
) {
6855 if (ixjdebug
& 0x0002)
6856 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
6857 if (ixj_WriteDSPCommand(0xC462, j
)) /* Write CODEC config to Software Control Register */
6859 if (ixjdebug
& 0x0002)
6860 printk(KERN_INFO
"Write CODEC timing to Software Control Register\n");
6861 if (j
->cardtype
== QTI_PHONEJACK
) {
6866 if (ixj_WriteDSPCommand(cmd
, j
)) /* Write CODEC timing to Software Control Register */
6869 if (set_base_frame(j
, 30) != 30)
6871 if (ixjdebug
& 0x0002)
6872 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
6873 if (j
->cardtype
== QTI_PHONECARD
) {
6874 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to Software Control Register */
6877 if (j
->cardtype
== QTI_LINEJACK
) {
6878 if (ixj_WriteDSPCommand(0xC528, j
)) /* Write CODEC config to Software Control Register */
6880 if (ixjdebug
& 0x0002)
6881 printk(KERN_INFO
"Turn on the PLD Clock at 8Khz\n");
6882 j
->pld_clock
.byte
= 0;
6883 outb_p(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
6887 if (j
->dsp
.low
== 0x20) {
6888 if (ixjdebug
& 0x0002)
6889 printk(KERN_INFO
"Configure GPIO pins\n");
6890 j
->gpio
.bytes
.high
= 0x09;
6891 /* bytes.low = 0xEF; 0xF7 */
6892 j
->gpio
.bits
.gpio1
= 1;
6893 j
->gpio
.bits
.gpio2
= 1;
6894 j
->gpio
.bits
.gpio3
= 0;
6895 j
->gpio
.bits
.gpio4
= 1;
6896 j
->gpio
.bits
.gpio5
= 1;
6897 j
->gpio
.bits
.gpio6
= 1;
6898 j
->gpio
.bits
.gpio7
= 1;
6899 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* Set GPIO pin directions */
6900 if (ixjdebug
& 0x0002)
6901 printk(KERN_INFO
"Enable SLIC\n");
6902 j
->gpio
.bytes
.high
= 0x0B;
6903 j
->gpio
.bytes
.low
= 0x00;
6904 j
->gpio
.bits
.gpio1
= 0;
6905 j
->gpio
.bits
.gpio2
= 1;
6906 j
->gpio
.bits
.gpio5
= 0;
6907 ixj_WriteDSPCommand(j
->gpio
.word
, j
); /* send the ring stop signal */
6908 j
->port
= PORT_POTS
;
6910 if (j
->cardtype
== QTI_LINEJACK
) {
6911 LED_SetState(0x1, j
);
6913 LED_SetState(0x2, j
);
6915 LED_SetState(0x4, j
);
6917 LED_SetState(0x8, j
);
6919 LED_SetState(0x0, j
);
6921 if (ixjdebug
& 0x0002)
6922 printk("Loading DAA Coefficients\n");
6924 if (!ixj_daa_write(j
)) {
6925 printk("DAA write failed on board %d\n", j
->board
);
6928 if(!ixj_daa_cid_reset(j
)) {
6929 printk("DAA CID reset failed on board %d\n", j
->board
);
6932 j
->flags
.pots_correct
= 0;
6933 j
->flags
.pstn_present
= 0;
6935 if (j
->flags
.pots_correct
) {
6936 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
6938 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
6939 j
->pld_slicw
.bits
.rly1
= 1;
6940 j
->pld_slicw
.bits
.spken
= 1;
6941 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
6942 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
6943 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6944 j
->port
= PORT_POTS
;
6946 ixj_set_port(j
, PORT_PSTN
);
6948 if (ixjdebug
& 0x0002)
6949 printk(KERN_INFO
"Enable Mixer\n");
6950 ixj_mixer(0x0000, j
); /*Master Volume Left unmute 0db */
6951 ixj_mixer(0x0100, j
); /*Master Volume Right unmute 0db */
6953 ixj_mixer(0x0203, j
); /*Voice Left Volume unmute 6db */
6954 ixj_mixer(0x0303, j
); /*Voice Right Volume unmute 6db */
6956 ixj_mixer(0x0480, j
); /*FM Left mute */
6957 ixj_mixer(0x0580, j
); /*FM Right mute */
6959 ixj_mixer(0x0680, j
); /*CD Left mute */
6960 ixj_mixer(0x0780, j
); /*CD Right mute */
6962 ixj_mixer(0x0880, j
); /*Line Left mute */
6963 ixj_mixer(0x0980, j
); /*Line Right mute */
6965 ixj_mixer(0x0A80, j
); /*Aux left mute */
6966 ixj_mixer(0x0B80, j
); /*Aux right mute */
6968 ixj_mixer(0x0C00, j
); /*Mono1 unmute 12db */
6969 ixj_mixer(0x0D80, j
); /*Mono2 mute */
6971 ixj_mixer(0x0E80, j
); /*Mic mute */
6973 ixj_mixer(0x0F00, j
); /*Mono Out Volume unmute 0db */
6975 ixj_mixer(0x1000, j
); /*Voice Left and Right out only */
6976 ixj_mixer(0x110C, j
);
6979 ixj_mixer(0x1200, j
); /*Mono1 switch on mixer left */
6980 ixj_mixer(0x1401, j
);
6982 ixj_mixer(0x1300, j
); /*Mono1 switch on mixer right */
6983 ixj_mixer(0x1501, j
);
6985 ixj_mixer(0x1700, j
); /*Clock select */
6987 ixj_mixer(0x1800, j
); /*ADC input from mixer */
6989 ixj_mixer(0x1901, j
); /*Mic gain 30db */
6991 if (ixjdebug
& 0x0002)
6992 printk(KERN_INFO
"Setting Default US Ring Cadence Detection\n");
6993 j
->cadence_f
[4].state
= 0;
6994 j
->cadence_f
[4].on1
= 0; /*Cadence Filter 4 is used for PSTN ring cadence */
6995 j
->cadence_f
[4].off1
= 0;
6996 j
->cadence_f
[4].on2
= 0;
6997 j
->cadence_f
[4].off2
= 0;
6998 j
->cadence_f
[4].on3
= 0;
6999 j
->cadence_f
[4].off3
= 0; /* These should represent standard US ring pulse. */
7000 j
->pstn_last_rmr
= jiffies
;
7003 if (j
->cardtype
== QTI_PHONECARD
) {
7004 ixj_WriteDSPCommand(0xCF07, j
);
7005 ixj_WriteDSPCommand(0x00B0, j
);
7006 ixj_set_port(j
, PORT_SPEAKER
);
7008 ixj_set_port(j
, PORT_POTS
);
7009 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, j
);
7010 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7016 j
->framesread
= j
->frameswritten
= 0;
7017 j
->read_wait
= j
->write_wait
= 0;
7018 j
->rxreadycheck
= j
->txreadycheck
= 0;
7020 /* initialise the DTMF prescale to a sensible value */
7021 if (j
->cardtype
== QTI_LINEJACK
) {
7022 set_dtmf_prescale(j
, 0x10);
7024 set_dtmf_prescale(j
, 0x40);
7026 set_play_volume(j
, 0x100);
7027 set_rec_volume(j
, 0x100);
7029 if (ixj_WriteDSPCommand(0x0000, j
)) /* Write IDLE to Software Control Register */
7031 /* The read values of the SSR should be 0x00 for the IDLE command */
7032 if (j
->ssr
.low
|| j
->ssr
.high
)
7035 if (ixjdebug
& 0x0002)
7036 printk(KERN_INFO
"Enable Line Monitor\n");
7038 if (ixjdebug
& 0x0002)
7039 printk(KERN_INFO
"Set Line Monitor to Asyncronous Mode\n");
7041 if (ixj_WriteDSPCommand(0x7E01, j
)) /* Asynchronous Line Monitor */
7044 if (ixjdebug
& 0x002)
7045 printk(KERN_INFO
"Enable DTMF Detectors\n");
7047 if (ixj_WriteDSPCommand(0x5151, j
)) /* Enable DTMF detection */
7050 if (ixj_WriteDSPCommand(0x6E01, j
)) /* Set Asyncronous Tone Generation */
7053 set_rec_depth(j
, 2); /* Set Record Channel Limit to 2 frames */
7055 set_play_depth(j
, 2); /* Set Playback Channel Limit to 2 frames */
7057 j
->ex
.bits
.dtmf_ready
= 0;
7059 j
->dtmf_wp
= j
->dtmf_rp
= 0;
7060 j
->rec_mode
= j
->play_mode
= -1;
7061 j
->flags
.ringing
= 0;
7062 j
->maxrings
= MAXRINGS
;
7063 j
->ring_cadence
= USA_RING_CADENCE
;
7066 j
->flags
.dtmf_oob
= 0;
7067 for (cnt
= 0; cnt
< 4; cnt
++)
7068 j
->cadence_f
[cnt
].enable
= 0;
7069 /* must be a device on the specified address */
7070 ixj_WriteDSPCommand(0x0FE3, j
); /* Put the DSP in 1/5 power mode. */
7072 /* Set up the default signals for events */
7073 for (cnt
= 0; cnt
< 35; cnt
++)
7074 j
->ixj_signals
[cnt
] = SIGIO
;
7076 /* Set the excetion signal enable flags */
7077 j
->ex_sig
.bits
.dtmf_ready
= j
->ex_sig
.bits
.hookstate
= j
->ex_sig
.bits
.flash
= j
->ex_sig
.bits
.pstn_ring
=
7078 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
=
7079 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;
7080 #ifdef IXJ_DYN_ALLOC
7086 /* Register with the Telephony for Linux subsystem */
7087 j
->p
.f_op
= &ixj_fops
;
7088 j
->p
.open
= ixj_open
;
7089 j
->p
.board
= j
->board
;
7090 phone_register_device(&j
->p
, PHONE_UNIT_ANY
);
7098 * Exported service for pcmcia card handling
7101 IXJ
*ixj_pcmcia_probe(unsigned long dsp
, unsigned long xilinx
)
7103 IXJ
*j
= ixj_alloc();
7108 j
->XILINXbase
= xilinx
;
7109 j
->cardtype
= QTI_PHONECARD
;
7114 EXPORT_SYMBOL(ixj_pcmcia_probe
); /* Fpr PCMCIA */
7116 static int ixj_get_status_proc(char *buf
)
7122 len
+= sprintf(buf
+ len
, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR
, IXJ_VER_MINOR
, IXJ_BLD_VER
);
7123 len
+= sprintf(buf
+ len
, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ
));
7124 len
+= sprintf(buf
+ len
, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS
));
7125 len
+= sprintf(buf
+ len
, "\nUsing old telephony API");
7126 len
+= sprintf(buf
+ len
, "\nDebug Level %d\n", ixjdebug
);
7128 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
7133 len
+= sprintf(buf
+ len
, "\nCard Num %d", cnt
);
7134 len
+= sprintf(buf
+ len
, "\nDSP Base Address 0x%4.4x", j
->DSPbase
);
7135 if (j
->cardtype
!= QTI_PHONEJACK
)
7136 len
+= sprintf(buf
+ len
, "\nXILINX Base Address 0x%4.4x", j
->XILINXbase
);
7137 len
+= sprintf(buf
+ len
, "\nDSP Type %2.2x%2.2x", j
->dsp
.high
, j
->dsp
.low
);
7138 len
+= sprintf(buf
+ len
, "\nDSP Version %2.2x.%2.2x", j
->ver
.high
, j
->ver
.low
);
7139 len
+= sprintf(buf
+ len
, "\nSerial Number %8.8x", j
->serial
);
7140 switch (j
->cardtype
) {
7141 case (QTI_PHONEJACK
):
7142 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK");
7144 case (QTI_LINEJACK
):
7145 len
+= sprintf(buf
+ len
, "\nCard Type = Internet LineJACK");
7146 if (j
->flags
.g729_loaded
)
7147 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7148 len
+= sprintf(buf
+ len
, " Country = %d", j
->daa_country
);
7150 case (QTI_PHONEJACK_LITE
):
7151 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK Lite");
7152 if (j
->flags
.g729_loaded
)
7153 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7155 case (QTI_PHONEJACK_PCI
):
7156 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneJACK PCI");
7157 if (j
->flags
.g729_loaded
)
7158 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7160 case (QTI_PHONECARD
):
7161 len
+= sprintf(buf
+ len
, "\nCard Type = Internet PhoneCARD");
7162 if (j
->flags
.g729_loaded
)
7163 len
+= sprintf(buf
+ len
, " w/G.729 A/B");
7164 len
+= sprintf(buf
+ len
, "\nSmart Cable %spresent", j
->pccr1
.bits
.drf
? "not " : "");
7165 if (!j
->pccr1
.bits
.drf
)
7166 len
+= sprintf(buf
+ len
, "\nSmart Cable type %d", j
->flags
.pcmciasct
);
7167 len
+= sprintf(buf
+ len
, "\nSmart Cable state %d", j
->flags
.pcmciastate
);
7170 len
+= sprintf(buf
+ len
, "\nCard Type = %d", j
->cardtype
);
7173 len
+= sprintf(buf
+ len
, "\nReaders %d", j
->readers
);
7174 len
+= sprintf(buf
+ len
, "\nWriters %d", j
->writers
);
7176 len
+= sprintf(buf
+ len
, "\nCapabilities %d", j
->caps
);
7177 if (j
->dsp
.low
!= 0x20)
7178 len
+= sprintf(buf
+ len
, "\nDSP Processor load %d", j
->proc_load
);
7179 if (j
->flags
.cidsent
)
7180 len
+= sprintf(buf
+ len
, "\nCaller ID data sent");
7182 len
+= sprintf(buf
+ len
, "\nCaller ID data not sent");
7184 len
+= sprintf(buf
+ len
, "\nPlay CODEC ");
7185 switch (j
->play_codec
) {
7187 len
+= sprintf(buf
+ len
, "G.723.1 6.3");
7190 len
+= sprintf(buf
+ len
, "G.723.1 5.3");
7193 len
+= sprintf(buf
+ len
, "TrueSpeech 8.5");
7196 len
+= sprintf(buf
+ len
, "TrueSpeech 4.8");
7199 len
+= sprintf(buf
+ len
, "TrueSpeech 4.1");
7202 len
+= sprintf(buf
+ len
, "G.728");
7205 len
+= sprintf(buf
+ len
, "G.729");
7208 len
+= sprintf(buf
+ len
, "G.729B");
7211 len
+= sprintf(buf
+ len
, "uLaw");
7214 len
+= sprintf(buf
+ len
, "aLaw");
7217 len
+= sprintf(buf
+ len
, "16 bit Linear");
7220 len
+= sprintf(buf
+ len
, "8 bit Linear");
7223 len
+= sprintf(buf
+ len
, "Windows Sound System");
7226 len
+= sprintf(buf
+ len
, "NO CODEC CHOSEN");
7229 len
+= sprintf(buf
+ len
, "\nRecord CODEC ");
7230 switch (j
->rec_codec
) {
7232 len
+= sprintf(buf
+ len
, "G.723.1 6.3");
7235 len
+= sprintf(buf
+ len
, "G.723.1 5.3");
7238 len
+= sprintf(buf
+ len
, "TrueSpeech 8.5");
7241 len
+= sprintf(buf
+ len
, "TrueSpeech 4.8");
7244 len
+= sprintf(buf
+ len
, "TrueSpeech 4.1");
7247 len
+= sprintf(buf
+ len
, "G.728");
7250 len
+= sprintf(buf
+ len
, "G.729");
7253 len
+= sprintf(buf
+ len
, "G.729B");
7256 len
+= sprintf(buf
+ len
, "uLaw");
7259 len
+= sprintf(buf
+ len
, "aLaw");
7262 len
+= sprintf(buf
+ len
, "16 bit Linear");
7265 len
+= sprintf(buf
+ len
, "8 bit Linear");
7268 len
+= sprintf(buf
+ len
, "Windows Sound System");
7271 len
+= sprintf(buf
+ len
, "NO CODEC CHOSEN");
7274 len
+= sprintf(buf
+ len
, "\nAEC ");
7275 switch (j
->aec_level
) {
7277 len
+= sprintf(buf
+ len
, "Off");
7280 len
+= sprintf(buf
+ len
, "Low");
7283 len
+= sprintf(buf
+ len
, "Med");
7286 len
+= sprintf(buf
+ len
, "High");
7289 len
+= sprintf(buf
+ len
, "Auto");
7292 len
+= sprintf(buf
+ len
, "AEC/AGC");
7295 len
+= sprintf(buf
+ len
, "unknown(%i)", j
->aec_level
);
7299 len
+= sprintf(buf
+ len
, "\nRec volume 0x%x", get_rec_volume(j
));
7300 len
+= sprintf(buf
+ len
, "\nPlay volume 0x%x", get_play_volume(j
));
7301 len
+= sprintf(buf
+ len
, "\nDTMF prescale 0x%x", get_dtmf_prescale(j
));
7303 len
+= sprintf(buf
+ len
, "\nHook state %d", j
->hookstate
); /* j->r_hook); */
7305 if (j
->cardtype
== QTI_LINEJACK
) {
7306 len
+= sprintf(buf
+ len
, "\nPOTS Correct %d", j
->flags
.pots_correct
);
7307 len
+= sprintf(buf
+ len
, "\nPSTN Present %d", j
->flags
.pstn_present
);
7308 len
+= sprintf(buf
+ len
, "\nPSTN Check %d", j
->flags
.pstncheck
);
7309 len
+= sprintf(buf
+ len
, "\nPOTS to PSTN %d", j
->flags
.pots_pstn
);
7310 switch (j
->daa_mode
) {
7312 len
+= sprintf(buf
+ len
, "\nDAA PSTN On Hook");
7314 case SOP_PU_RINGING
:
7315 len
+= sprintf(buf
+ len
, "\nDAA PSTN Ringing");
7316 len
+= sprintf(buf
+ len
, "\nRinging state = %d", j
->cadence_f
[4].state
);
7318 case SOP_PU_CONVERSATION
:
7319 len
+= sprintf(buf
+ len
, "\nDAA PSTN Off Hook");
7321 case SOP_PU_PULSEDIALING
:
7322 len
+= sprintf(buf
+ len
, "\nDAA PSTN Pulse Dialing");
7325 len
+= sprintf(buf
+ len
, "\nDAA RMR = %d", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.bitreg
.RMR
);
7326 len
+= sprintf(buf
+ len
, "\nDAA VDD OK = %d", j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
);
7327 len
+= sprintf(buf
+ len
, "\nDAA CR0 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
);
7328 len
+= sprintf(buf
+ len
, "\nDAA CR1 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
);
7329 len
+= sprintf(buf
+ len
, "\nDAA CR2 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
);
7330 len
+= sprintf(buf
+ len
, "\nDAA CR3 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
);
7331 len
+= sprintf(buf
+ len
, "\nDAA CR4 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
);
7332 len
+= sprintf(buf
+ len
, "\nDAA CR5 = 0x%02x", j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
);
7333 len
+= sprintf(buf
+ len
, "\nDAA XR0 = 0x%02x", j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
);
7334 len
+= sprintf(buf
+ len
, "\nDAA ringstop %ld - jiffies %ld", j
->pstn_ring_stop
, jiffies
);
7338 len
+= sprintf(buf
+ len
, "\nPort POTS");
7341 len
+= sprintf(buf
+ len
, "\nPort PSTN");
7344 len
+= sprintf(buf
+ len
, "\nPort SPEAKER/MIC");
7347 len
+= sprintf(buf
+ len
, "\nPort HANDSET");
7350 if (j
->dsp
.low
== 0x21 || j
->dsp
.low
== 0x22) {
7351 len
+= sprintf(buf
+ len
, "\nSLIC state ");
7352 switch (SLIC_GetState(j
)) {
7353 case PLD_SLIC_STATE_OC
:
7354 len
+= sprintf(buf
+ len
, "OC");
7356 case PLD_SLIC_STATE_RINGING
:
7357 len
+= sprintf(buf
+ len
, "RINGING");
7359 case PLD_SLIC_STATE_ACTIVE
:
7360 len
+= sprintf(buf
+ len
, "ACTIVE");
7362 case PLD_SLIC_STATE_OHT
: /* On-hook transmit */
7363 len
+= sprintf(buf
+ len
, "OHT");
7365 case PLD_SLIC_STATE_TIPOPEN
:
7366 len
+= sprintf(buf
+ len
, "TIPOPEN");
7368 case PLD_SLIC_STATE_STANDBY
:
7369 len
+= sprintf(buf
+ len
, "STANDBY");
7371 case PLD_SLIC_STATE_APR
: /* Active polarity reversal */
7372 len
+= sprintf(buf
+ len
, "APR");
7374 case PLD_SLIC_STATE_OHTPR
: /* OHT polarity reversal */
7375 len
+= sprintf(buf
+ len
, "OHTPR");
7378 len
+= sprintf(buf
+ len
, "%d", SLIC_GetState(j
));
7382 len
+= sprintf(buf
+ len
, "\nBase Frame %2.2x.%2.2x", j
->baseframe
.high
, j
->baseframe
.low
);
7383 len
+= sprintf(buf
+ len
, "\nCID Base Frame %2d", j
->cid_base_frame_size
);
7384 #ifdef PERFMON_STATS
7385 len
+= sprintf(buf
+ len
, "\nTimer Checks %ld", j
->timerchecks
);
7386 len
+= sprintf(buf
+ len
, "\nRX Ready Checks %ld", j
->rxreadycheck
);
7387 len
+= sprintf(buf
+ len
, "\nTX Ready Checks %ld", j
->txreadycheck
);
7388 len
+= sprintf(buf
+ len
, "\nFrames Read %ld", j
->framesread
);
7389 len
+= sprintf(buf
+ len
, "\nFrames Written %ld", j
->frameswritten
);
7390 len
+= sprintf(buf
+ len
, "\nDry Buffer %ld", j
->drybuffer
);
7391 len
+= sprintf(buf
+ len
, "\nRead Waits %ld", j
->read_wait
);
7392 len
+= sprintf(buf
+ len
, "\nWrite Waits %ld", j
->write_wait
);
7393 len
+= sprintf(buf
+ len
, "\nStatus Waits %ld", j
->statuswait
);
7394 len
+= sprintf(buf
+ len
, "\nStatus Wait Fails %ld", j
->statuswaitfail
);
7395 len
+= sprintf(buf
+ len
, "\nPControl Waits %ld", j
->pcontrolwait
);
7396 len
+= sprintf(buf
+ len
, "\nPControl Wait Fails %ld", j
->pcontrolwaitfail
);
7397 len
+= sprintf(buf
+ len
, "\nIs Control Ready Checks %ld", j
->iscontrolready
);
7398 len
+= sprintf(buf
+ len
, "\nIs Control Ready Check failures %ld", j
->iscontrolreadyfail
);
7401 len
+= sprintf(buf
+ len
, "\n");
7407 static int ixj_read_proc(char *page
, char **start
, off_t off
,
7408 int count
, int *eof
, void *data
)
7410 int len
= ixj_get_status_proc(page
);
7411 if (len
<= off
+count
) *eof
= 1;
7412 *start
= page
+ off
;
7414 if (len
>count
) len
= count
;
7420 static void cleanup(void)
7425 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
7427 if(j
!= NULL
&& j
->DSPbase
) {
7428 if (ixjdebug
& 0x0002)
7429 printk(KERN_INFO
"IXJ: Deleting timer for /dev/phone%d\n", cnt
);
7430 del_timer(&j
->timer
);
7431 if (j
->cardtype
== QTI_LINEJACK
) {
7432 j
->pld_scrw
.bits
.daafsyncen
= 0; /* Turn off DAA Frame Sync */
7434 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
7435 j
->pld_slicw
.bits
.rly1
= 0;
7436 j
->pld_slicw
.bits
.rly2
= 0;
7437 j
->pld_slicw
.bits
.rly3
= 0;
7438 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
7439 LED_SetState(0x0, j
);
7440 if (ixjdebug
& 0x0002)
7441 printk(KERN_INFO
"IXJ: Releasing XILINX address for /dev/phone%d\n", cnt
);
7442 release_region(j
->XILINXbase
, 8);
7443 } else if (j
->cardtype
== QTI_PHONEJACK_LITE
|| j
->cardtype
== QTI_PHONEJACK_PCI
) {
7444 if (ixjdebug
& 0x0002)
7445 printk(KERN_INFO
"IXJ: Releasing XILINX address for /dev/phone%d\n", cnt
);
7446 release_region(j
->XILINXbase
, 4);
7448 kfree(j
->read_buffer
);
7449 kfree(j
->write_buffer
);
7451 pnp_device_detach(j
->dev
);
7452 if (ixjdebug
& 0x0002)
7453 printk(KERN_INFO
"IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt
);
7454 phone_unregister_device(&j
->p
);
7455 if (ixjdebug
& 0x0002)
7456 printk(KERN_INFO
"IXJ: Releasing DSP address for /dev/phone%d\n", cnt
);
7457 release_region(j
->DSPbase
, 16);
7458 #ifdef IXJ_DYN_ALLOC
7459 if (ixjdebug
& 0x0002)
7460 printk(KERN_INFO
"IXJ: Freeing memory for /dev/phone%d\n", cnt
);
7466 if (ixjdebug
& 0x0002)
7467 printk(KERN_INFO
"IXJ: Removing /proc/ixj\n");
7468 remove_proc_entry ("ixj", NULL
);
7477 static void PCIEE_WriteBit(WORD wEEPROMAddress
, BYTE lastLCC
, BYTE byData
)
7479 lastLCC
= lastLCC
& 0xfb;
7480 lastLCC
= lastLCC
| (byData
? 4 : 0);
7481 outb(lastLCC
, wEEPROMAddress
); /*set data out bit as appropriate */
7484 lastLCC
= lastLCC
| 0x01;
7485 outb(lastLCC
, wEEPROMAddress
); /*SK rising edge */
7487 byData
= byData
<< 1;
7488 lastLCC
= lastLCC
& 0xfe;
7490 outb(lastLCC
, wEEPROMAddress
); /*after delay, SK falling edge */
7494 static BYTE
PCIEE_ReadBit(WORD wEEPROMAddress
, BYTE lastLCC
)
7497 lastLCC
= lastLCC
| 0x01;
7498 outb(lastLCC
, wEEPROMAddress
); /*SK rising edge */
7500 lastLCC
= lastLCC
& 0xfe;
7502 outb(lastLCC
, wEEPROMAddress
); /*after delay, SK falling edge */
7504 return ((inb(wEEPROMAddress
) >> 3) & 1);
7507 static bool PCIEE_ReadWord(WORD wAddress
, WORD wLoc
, WORD
* pwResult
)
7510 WORD wEEPROMAddress
= wAddress
+ 3;
7514 lastLCC
= inb(wEEPROMAddress
);
7515 lastLCC
= lastLCC
| 0x02;
7516 lastLCC
= lastLCC
& 0xfe;
7517 outb(lastLCC
, wEEPROMAddress
); /* CS hi, SK lo */
7519 mdelay(1); /* delay */
7521 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
7522 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
7523 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 0);
7524 for (i
= 0; i
< 8; i
++) {
7525 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, wLoc
& 0x80 ? 1 : 0);
7529 for (i
= 0; i
< 16; i
++) {
7530 byResult
= PCIEE_ReadBit(wEEPROMAddress
, lastLCC
);
7531 *pwResult
= (*pwResult
<< 1) | byResult
;
7534 mdelay(1); /* another delay */
7536 lastLCC
= lastLCC
& 0xfd;
7537 outb(lastLCC
, wEEPROMAddress
); /* negate CS */
7542 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
)
7545 if (PCIEE_ReadWord(wAddress
, 62, &wLo
))
7547 if (PCIEE_ReadWord(wAddress
, 63, &wHi
))
7549 return (((DWORD
) wHi
<< 16) | wLo
);
7552 static int dspio
[IXJMAX
+ 1] =
7556 static int xio
[IXJMAX
+ 1] =
7561 module_param_array(dspio
, int, NULL
, 0);
7562 module_param_array(xio
, int, NULL
, 0);
7563 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7564 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7565 MODULE_LICENSE("GPL");
7567 static void __exit
ixj_exit(void)
7572 static IXJ
*new_ixj(unsigned long port
)
7575 if (!request_region(port
, 16, "ixj DSP")) {
7576 printk(KERN_INFO
"ixj: can't get I/O address 0x%lx\n", port
);
7581 release_region(port
, 16);
7582 printk(KERN_INFO
"ixj: out of memory\n");
7585 res
->DSPbase
= port
;
7589 static int __init
ixj_probe_isapnp(int *cnt
)
7593 struct pnp_dev
*dev
= NULL
, *old_dev
= NULL
;
7601 dev
= pnp_find_dev(NULL
, ISAPNP_VENDOR('Q', 'T', 'I'),
7602 ISAPNP_FUNCTION(func
), old_dev
);
7603 if (!dev
|| !dev
->card
)
7605 result
= pnp_device_attach(dev
);
7607 printk("pnp attach failed %d \n", result
);
7610 if (pnp_activate_dev(dev
) < 0) {
7611 printk("pnp activate failed (out of resources?)\n");
7612 pnp_device_detach(dev
);
7616 if (!pnp_port_valid(dev
, 0)) {
7617 pnp_device_detach(dev
);
7621 j
= new_ixj(pnp_port_start(dev
, 0));
7626 j
->XILINXbase
= pnp_port_start(dev
, 1); /* get real port */
7630 j
->cardtype
= QTI_PHONEJACK
;
7633 j
->cardtype
= QTI_LINEJACK
;
7636 j
->cardtype
= QTI_PHONEJACK_LITE
;
7640 probe
= ixj_selfprobe(j
);
7642 j
->serial
= dev
->card
->serial
;
7646 printk(KERN_INFO
"ixj: found Internet PhoneJACK at 0x%x\n", j
->DSPbase
);
7649 printk(KERN_INFO
"ixj: found Internet LineJACK at 0x%x\n", j
->DSPbase
);
7652 printk(KERN_INFO
"ixj: found Internet PhoneJACK Lite at 0x%x\n", j
->DSPbase
);
7669 static int __init
ixj_probe_isa(int *cnt
)
7673 /* Use passed parameters for older kernels without PnP */
7674 for (i
= 0; i
< IXJMAX
; i
++) {
7676 IXJ
*j
= new_ixj(dspio
[i
]);
7681 j
->XILINXbase
= xio
[i
];
7685 probe
= ixj_selfprobe(j
);
7693 static int __init
ixj_probe_pci(int *cnt
)
7695 struct pci_dev
*pci
= NULL
;
7699 for (i
= 0; i
< IXJMAX
- *cnt
; i
++) {
7700 pci
= pci_get_device(PCI_VENDOR_ID_QUICKNET
,
7701 PCI_DEVICE_ID_QUICKNET_XJ
, pci
);
7705 if (pci_enable_device(pci
))
7707 j
= new_ixj(pci_resource_start(pci
, 0));
7711 j
->serial
= (PCIEE_GetSerialNumber
)pci_resource_start(pci
, 2);
7712 j
->XILINXbase
= j
->DSPbase
+ 0x10;
7713 j
->cardtype
= QTI_PHONEJACK_PCI
;
7715 probe
= ixj_selfprobe(j
);
7717 printk(KERN_INFO
"ixj: found Internet PhoneJACK PCI at 0x%x\n", j
->DSPbase
);
7724 static int __init
ixj_init(void)
7731 /* These might be no-ops, see above. */
7732 if ((probe
= ixj_probe_isapnp(&cnt
)) < 0) {
7735 if ((probe
= ixj_probe_isa(&cnt
)) < 0) {
7738 if ((probe
= ixj_probe_pci(&cnt
)) < 0) {
7741 printk(KERN_INFO
"ixj driver initialized.\n");
7742 create_proc_read_entry ("ixj", 0, NULL
, ixj_read_proc
, NULL
);
7746 module_init(ixj_init
);
7747 module_exit(ixj_exit
);
7749 static void DAA_Coeff_US(IXJ
*j
)
7753 j
->daa_country
= DAA_US
;
7754 /*----------------------------------------------- */
7756 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
7757 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
7760 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7761 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x03;
7762 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0x4B;
7763 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0x5D;
7764 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xCD;
7765 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0x24;
7766 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xC5;
7767 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
7768 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
7769 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7770 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x71;
7771 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x1A;
7772 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
7773 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0A;
7774 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xB5;
7775 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
7776 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
7777 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
7778 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7779 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x05;
7780 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0xA3;
7781 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x72;
7782 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
7783 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x3F;
7784 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x3B;
7785 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x30;
7786 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
7787 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7788 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x05;
7789 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x87;
7790 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF9;
7791 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x3E;
7792 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x32;
7793 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xDA;
7794 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
7795 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
7796 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7797 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x41;
7798 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xB5;
7799 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
7800 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
7801 /* Bytes for AR-filter (09): 52,D3,11,42 */
7802 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x25;
7803 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xC7;
7804 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
7805 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
7806 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7807 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
7808 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
7809 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
7810 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
7811 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xA5;
7812 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
7813 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
7814 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
7815 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7816 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
7817 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xA2;
7818 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2B;
7819 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xB0;
7820 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0xE8;
7821 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAB;
7822 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x81;
7823 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xCC;
7824 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7825 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
7826 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
7827 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xD2;
7828 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x24;
7829 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xBA;
7830 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xA9;
7831 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x3B;
7832 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xA6;
7833 /* ; (10K, 0.68uF) */
7835 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7836 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
7837 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
7838 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
7839 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
7840 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
7841 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
7842 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
7843 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
7844 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7845 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
7846 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
7847 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
7848 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
7849 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
7850 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
7851 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
7852 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
7854 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7855 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
7856 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
7857 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
7858 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
7860 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7861 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7862 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7863 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7864 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7865 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7866 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7867 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7868 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7869 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7870 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7871 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7872 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7873 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7874 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7875 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7876 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7877 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7879 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7880 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7881 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7882 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7883 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7885 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7886 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
7887 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
7888 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
7889 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
7890 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
7891 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
7892 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
7893 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
7894 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7895 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
7896 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
7897 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
7898 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
7899 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
7900 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
7901 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
7902 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
7905 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7906 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
7907 /* Config. Reg. 1 (dialing) (cr1):05 */
7908 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
7909 /* Config. Reg. 2 (caller ID) (cr2):04 */
7910 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
7911 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7912 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
7913 /* Config. Reg. 4 (analog gain) (cr4):02 */
7914 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
7915 /* Config. Reg. 5 (Version) (cr5):02 */
7916 /* Config. Reg. 6 (Reserved) (cr6):00 */
7917 /* Config. Reg. 7 (Reserved) (cr7):00 */
7920 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7922 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
7923 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7925 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x3C;
7926 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7927 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
7928 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7929 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x3B; /*0x32; */
7930 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7932 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
7933 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7934 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
7935 /* Ext. Reg. 6 (Power State) (xr6):00 */
7936 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
7937 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7938 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
7940 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7941 /* 12,33,5A,C3 ; 770 Hz */
7942 /* 13,3C,5B,32 ; 852 Hz */
7943 /* 1D,1B,5C,CC ; 941 Hz */
7945 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
7946 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
7947 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
7948 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
7949 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7950 /* EC,1D,52,22 ; 1336 Hz */
7951 /* AA,AC,51,D2 ; 1477 Hz */
7952 /* 9B,3B,51,25 ; 1633 Hz */
7953 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
7954 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
7955 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
7956 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
7959 static void DAA_Coeff_UK(IXJ
*j
)
7963 j
->daa_country
= DAA_UK
;
7964 /*----------------------------------------------- */
7966 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
7967 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
7970 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7971 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
7972 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xC2;
7973 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
7974 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xA8;
7975 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xCB;
7976 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
7977 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
7978 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
7979 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7980 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x40;
7981 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x00;
7982 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
7983 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0A;
7984 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xA4;
7985 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
7986 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
7987 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
7988 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7989 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
7990 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9B;
7991 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xED;
7992 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x24;
7993 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0xB2;
7994 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0xA2;
7995 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xA0;
7996 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
7997 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
7998 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
7999 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x92;
8000 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF2;
8001 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0xB2;
8002 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
8003 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xD2;
8004 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x30;
8005 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8006 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8007 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x1B;
8008 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xA5;
8009 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8010 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8011 /* Bytes for AR-filter (09): E2,27,10,D6 */
8012 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
8013 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x27;
8014 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8015 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8016 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8017 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8018 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x2D;
8019 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x38;
8020 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x8B;
8021 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xD0;
8022 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x00;
8023 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8024 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8025 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8026 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8027 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x5A;
8028 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x53;
8029 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xF0;
8030 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x0B;
8031 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5F;
8032 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x84;
8033 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xD4;
8034 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8035 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8036 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8037 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x6A;
8038 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA4;
8039 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x8F;
8040 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x52;
8041 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xF5;
8042 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x32;
8044 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8045 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8046 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8047 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8048 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8049 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8050 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8051 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8052 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8053 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8054 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8055 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8056 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8057 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8058 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8059 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8060 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8061 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8062 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8063 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
8064 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
8065 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8066 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8067 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8068 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8069 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8070 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8071 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8072 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8073 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8074 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8075 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8076 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8077 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8078 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8079 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8080 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8081 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8082 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8083 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8084 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8086 /* Config. Reg. 0 (filters) (cr0):FF */
8087 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8088 /* Config. Reg. 1 (dialing) (cr1):05 */
8089 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8090 /* Config. Reg. 2 (caller ID) (cr2):04 */
8091 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8092 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8093 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8094 /* Config. Reg. 4 (analog gain) (cr4):02 */
8095 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8096 /* Config. Reg. 5 (Version) (cr5):02 */
8097 /* Config. Reg. 6 (Reserved) (cr6):00 */
8098 /* Config. Reg. 7 (Reserved) (cr7):00 */
8100 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8102 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8103 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8105 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8106 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8108 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8109 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8110 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
8111 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8112 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8113 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8114 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8115 /* Ext. Reg. 6 (Power State) (xr6):00 */
8116 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8117 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8118 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; /* 0x46 ??? Should it be 0x00? */
8119 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8120 /* 12,33,5A,C3 ; 770 Hz */
8121 /* 13,3C,5B,32 ; 852 Hz */
8122 /* 1D,1B,5C,CC ; 941 Hz */
8124 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8125 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8126 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8127 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8128 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8129 /* EC,1D,52,22 ; 1336 Hz */
8130 /* AA,AC,51,D2 ; 1477 Hz */
8131 /* 9B,3B,51,25 ; 1633 Hz */
8132 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8133 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8134 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8135 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8139 static void DAA_Coeff_France(IXJ
*j
)
8143 j
->daa_country
= DAA_FRANCE
;
8144 /*----------------------------------------------- */
8146 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8147 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8150 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8151 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x02;
8152 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA2;
8153 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0x43;
8154 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2C;
8155 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0x22;
8156 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xAF;
8157 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
8158 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8159 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8160 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x67;
8161 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xCE;
8162 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8163 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x2C;
8164 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x22;
8165 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
8166 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
8167 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8168 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8169 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8170 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9A;
8171 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x28;
8172 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0xF6;
8173 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x23;
8174 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x4A;
8175 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xB0;
8176 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8177 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8178 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
8179 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
8180 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF9;
8181 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
8182 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9E;
8183 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xFA;
8184 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
8185 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8186 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8187 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x16;
8188 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xB5;
8189 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8190 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8191 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8192 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
8193 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xC7;
8194 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8195 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8196 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8197 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
8198 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
8199 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8200 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8201 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xA6;
8202 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8203 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8204 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8205 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8206 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8207 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAC;
8208 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
8209 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x30;
8210 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x78;
8211 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAC;
8212 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x8A;
8213 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x2C;
8214 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8215 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8216 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8217 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
8218 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA5;
8219 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x22;
8220 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xBA;
8221 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x2C;
8222 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x45;
8224 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8225 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8226 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8227 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8228 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8229 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8230 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8231 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8232 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8233 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8234 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8235 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8236 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8237 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8238 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8239 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8240 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8241 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8242 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8243 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
8244 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8245 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
8246 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
8247 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8248 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8249 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8250 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8251 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8252 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8253 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8254 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8255 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8256 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8257 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8258 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8259 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8260 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8261 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8262 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8263 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8264 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8266 /* Config. Reg. 0 (filters) (cr0):FF */
8267 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8268 /* Config. Reg. 1 (dialing) (cr1):05 */
8269 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8270 /* Config. Reg. 2 (caller ID) (cr2):04 */
8271 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8272 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8273 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8274 /* Config. Reg. 4 (analog gain) (cr4):02 */
8275 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8276 /* Config. Reg. 5 (Version) (cr5):02 */
8277 /* Config. Reg. 6 (Reserved) (cr6):00 */
8278 /* Config. Reg. 7 (Reserved) (cr7):00 */
8280 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8282 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8283 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8285 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8286 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8288 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8289 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8290 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
8291 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8292 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8293 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8294 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8295 /* Ext. Reg. 6 (Power State) (xr6):00 */
8296 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8297 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8298 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; /* 0x46 ??? Should it be 0x00? */
8299 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8300 /* 12,33,5A,C3 ; 770 Hz */
8301 /* 13,3C,5B,32 ; 852 Hz */
8302 /* 1D,1B,5C,CC ; 941 Hz */
8304 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8305 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8306 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8307 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8308 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8309 /* EC,1D,52,22 ; 1336 Hz */
8310 /* AA,AC,51,D2 ; 1477 Hz */
8311 /* 9B,3B,51,25 ; 1633 Hz */
8312 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8313 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8314 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8315 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8319 static void DAA_Coeff_Germany(IXJ
*j
)
8323 j
->daa_country
= DAA_GERMANY
;
8324 /*----------------------------------------------- */
8326 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8327 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8330 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8331 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
8332 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xCE;
8333 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
8334 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xB8;
8335 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xD2;
8336 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
8337 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xB0;
8338 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8339 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8340 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x45;
8341 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x8F;
8342 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8343 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0C;
8344 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xD2;
8345 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x3A;
8346 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xD0;
8347 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8348 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8349 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8350 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0xAA;
8351 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
8352 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
8353 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x24;
8354 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x89;
8355 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x20;
8356 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8357 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8358 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x02;
8359 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x87;
8360 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xFA;
8361 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x37;
8362 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9A;
8363 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCA;
8364 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
8365 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8366 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8367 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x72;
8368 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xD5;
8369 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8370 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8371 /* Bytes for AR-filter (09): 72,42,13,4B */
8372 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x72;
8373 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x42;
8374 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x13;
8375 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0x4B;
8376 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8377 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8378 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
8379 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8380 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8381 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAD;
8382 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8383 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8384 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8385 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8386 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8387 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x42;
8388 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x5A;
8389 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
8390 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0xE8;
8391 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x1A;
8392 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x81;
8393 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x27;
8394 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8395 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8396 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8397 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x63;
8398 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x26;
8399 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xBD;
8400 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x4B;
8401 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xA3;
8402 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xC2;
8403 /* ; (10K, 0.68uF) */
8404 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8405 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8406 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3B;
8407 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x9B;
8408 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0xBA;
8409 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0xD4;
8410 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x1C;
8411 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xB3;
8412 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8413 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8414 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x13;
8415 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0x42;
8416 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8417 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8418 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0xD4;
8419 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x73;
8420 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0xCA;
8421 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8422 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8423 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xB2;
8424 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8425 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8426 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8427 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8428 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8429 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8430 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8431 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8432 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8433 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8434 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8435 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8436 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8437 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8438 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8439 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8440 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8441 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8442 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8443 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8444 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8446 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8447 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8448 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8449 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8450 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8451 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8452 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8453 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8454 /* Config. Reg. 4 (analog gain) (cr4):02 */
8455 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8456 /* Config. Reg. 5 (Version) (cr5):02 */
8457 /* Config. Reg. 6 (Reserved) (cr6):00 */
8458 /* Config. Reg. 7 (Reserved) (cr7):00 */
8460 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8462 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8463 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8465 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8466 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8468 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8469 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8470 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x32;
8471 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8472 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8473 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8474 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8475 /* Ext. Reg. 6 (Power State) (xr6):00 */
8476 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8477 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8478 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8479 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8480 /* 12,33,5A,C3 ; 770 Hz */
8481 /* 13,3C,5B,32 ; 852 Hz */
8482 /* 1D,1B,5C,CC ; 941 Hz */
8484 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8485 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8486 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8487 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8488 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8489 /* EC,1D,52,22 ; 1336 Hz */
8490 /* AA,AC,51,D2 ; 1477 Hz */
8491 /* 9B,3B,51,25 ; 1633 Hz */
8492 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8493 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8494 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8495 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8499 static void DAA_Coeff_Australia(IXJ
*j
)
8503 j
->daa_country
= DAA_AUSTRALIA
;
8504 /*----------------------------------------------- */
8506 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8507 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8510 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8511 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
8512 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA3;
8513 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xAA;
8514 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x28;
8515 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xB3;
8516 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x82;
8517 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xD0;
8518 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8519 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8520 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x70;
8521 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x96;
8522 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8523 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x09;
8524 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x32;
8525 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x6B;
8526 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xC0;
8527 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8528 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8529 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
8530 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x96;
8531 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
8532 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
8533 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x32;
8534 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x9B;
8535 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x30;
8536 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8537 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8538 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
8539 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x9A;
8540 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xE9;
8541 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
8542 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x22;
8543 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCC;
8544 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xA0;
8545 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8546 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8547 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0xCB;
8548 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0x45;
8549 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8550 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8551 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8552 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x1B;
8553 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x67;
8554 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8555 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8556 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8557 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
8558 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
8559 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8560 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8561 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAF;
8562 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8563 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8564 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8565 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8566 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8567 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xDB;
8568 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x52;
8569 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xB0;
8570 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x38;
8571 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x01;
8572 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x82;
8573 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xAC;
8574 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8575 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8576 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8577 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x4A;
8578 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x3E;
8579 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x2C;
8580 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x3B;
8581 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x24;
8582 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x46;
8584 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8585 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8586 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8587 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8588 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8589 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8590 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8591 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8592 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8593 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8594 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8595 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8596 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8597 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8598 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8599 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8600 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8601 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8602 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8603 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
8604 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
8605 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
8606 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
8607 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8608 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8609 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8610 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8611 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8612 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8613 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8614 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8615 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8616 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8617 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8618 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8619 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8620 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8621 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8622 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8623 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8624 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8626 /* Config. Reg. 0 (filters) (cr0):FF */
8627 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8628 /* Config. Reg. 1 (dialing) (cr1):05 */
8629 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8630 /* Config. Reg. 2 (caller ID) (cr2):04 */
8631 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8632 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8633 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8634 /* Config. Reg. 4 (analog gain) (cr4):02 */
8635 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8636 /* Config. Reg. 5 (Version) (cr5):02 */
8637 /* Config. Reg. 6 (Reserved) (cr6):00 */
8638 /* Config. Reg. 7 (Reserved) (cr7):00 */
8640 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8642 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8643 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8645 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8646 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8648 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8649 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8650 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x2B;
8651 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8652 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8653 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8654 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8655 /* Ext. Reg. 6 (Power State) (xr6):00 */
8656 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8657 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8658 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8660 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8661 /* 12,33,5A,C3 ; 770 Hz */
8662 /* 13,3C,5B,32 ; 852 Hz */
8663 /* 1D,1B,5C,CC ; 941 Hz */
8664 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8665 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8666 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8667 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8669 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8670 /* EC,1D,52,22 ; 1336 Hz */
8671 /* AA,AC,51,D2 ; 1477 Hz */
8672 /* 9B,3B,51,25 ; 1633 Hz */
8673 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8674 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8675 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8676 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8679 static void DAA_Coeff_Japan(IXJ
*j
)
8683 j
->daa_country
= DAA_JAPAN
;
8684 /*----------------------------------------------- */
8686 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
8687 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
8690 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8691 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x06;
8692 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xBD;
8693 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xE2;
8694 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2D;
8695 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xBA;
8696 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xF9;
8697 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
8698 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
8699 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8700 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x6F;
8701 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xF7;
8702 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
8703 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0E;
8704 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x34;
8705 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
8706 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
8707 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
8708 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8709 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x02;
8710 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x8F;
8711 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x68;
8712 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x77;
8713 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x9C;
8714 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x58;
8715 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xF0;
8716 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
8717 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8718 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
8719 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
8720 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0x38;
8721 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x73;
8722 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
8723 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xEA;
8724 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
8725 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
8726 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8727 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x51;
8728 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xC5;
8729 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
8730 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
8731 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8732 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x25;
8733 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xA7;
8734 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
8735 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
8736 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8737 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
8738 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
8739 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
8740 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
8741 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAE;
8742 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
8743 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
8744 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
8745 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8746 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
8747 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAB;
8748 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
8749 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
8750 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x99;
8751 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5B;
8752 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x89;
8753 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x28;
8754 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8755 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
8756 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
8757 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
8758 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x25;
8759 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x34;
8760 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xC5;
8761 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x4C;
8762 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xBA;
8764 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8765 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
8766 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
8767 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
8768 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
8769 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
8770 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
8771 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
8772 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
8773 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8774 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
8775 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
8776 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
8777 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
8778 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
8779 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
8780 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
8781 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
8782 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8783 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
8784 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
8785 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
8786 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
8787 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8788 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
8789 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
8790 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
8791 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
8792 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
8793 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
8794 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
8795 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
8796 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8797 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
8798 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
8799 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
8800 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
8801 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
8802 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
8803 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
8804 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
8806 /* Config. Reg. 0 (filters) (cr0):FF */
8807 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
8808 /* Config. Reg. 1 (dialing) (cr1):05 */
8809 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
8810 /* Config. Reg. 2 (caller ID) (cr2):04 */
8811 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
8812 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8813 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
8814 /* Config. Reg. 4 (analog gain) (cr4):02 */
8815 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02;
8816 /* Config. Reg. 5 (Version) (cr5):02 */
8817 /* Config. Reg. 6 (Reserved) (cr6):00 */
8818 /* Config. Reg. 7 (Reserved) (cr7):00 */
8820 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8822 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; /* SO_1 set to '1' because it is inverted. */
8823 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8825 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; /* RING, Caller ID, VDD_OK */
8826 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8828 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
8829 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8830 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x22;
8831 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8832 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
8833 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8834 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
8835 /* Ext. Reg. 6 (Power State) (xr6):00 */
8836 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
8837 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8838 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; /* 0x40 ??? Should it be 0x00? */
8839 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8840 /* 12,33,5A,C3 ; 770 Hz */
8841 /* 13,3C,5B,32 ; 852 Hz */
8842 /* 1D,1B,5C,CC ; 941 Hz */
8844 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
8845 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
8846 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
8847 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
8848 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8849 /* EC,1D,52,22 ; 1336 Hz */
8850 /* AA,AC,51,D2 ; 1477 Hz */
8851 /* 9B,3B,51,25 ; 1633 Hz */
8852 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
8853 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
8854 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
8855 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
8858 static s16 tone_table
[][19] =
8861 32538, /* A1 = 1.985962 */
8862 -32325, /* A2 = -0.986511 */
8863 -343, /* B2 = -0.010493 */
8865 343, /* B0 = 0.010493 */
8866 32619, /* A1 = 1.990906 */
8867 -32520, /* A2 = -0.992462 */
8868 19179, /* B2 = 0.585327 */
8869 -19178, /* B1 = -1.170593 */
8870 19179, /* B0 = 0.585327 */
8871 32723, /* A1 = 1.997314 */
8872 -32686, /* A2 = -0.997528 */
8873 9973, /* B2 = 0.304352 */
8874 -9955, /* B1 = -0.607605 */
8875 9973, /* B0 = 0.304352 */
8876 7, /* Internal filter scaling */
8877 159, /* Minimum in-band energy threshold */
8878 21, /* 21/32 in-band to broad-band ratio */
8879 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8881 { /* f133_200[] 12 */
8882 32072, /* A1 = 1.95752 */
8883 -31896, /* A2 = -0.973419 */
8884 -435, /* B2 = -0.013294 */
8886 435, /* B0 = 0.013294 */
8887 32188, /* A1 = 1.9646 */
8888 -32400, /* A2 = -0.98877 */
8889 15139, /* B2 = 0.462036 */
8890 -14882, /* B1 = -0.908356 */
8891 15139, /* B0 = 0.462036 */
8892 32473, /* A1 = 1.981995 */
8893 -32524, /* A2 = -0.992584 */
8894 23200, /* B2 = 0.708008 */
8895 -23113, /* B1 = -1.410706 */
8896 23200, /* B0 = 0.708008 */
8897 7, /* Internal filter scaling */
8898 159, /* Minimum in-band energy threshold */
8899 21, /* 21/32 in-band to broad-band ratio */
8900 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8903 31769, /* A1 = -1.939026 */
8904 -32584, /* A2 = 0.994385 */
8905 -475, /* B2 = -0.014522 */
8906 0, /* B1 = 0.000000 */
8907 475, /* B0 = 0.014522 */
8908 31789, /* A1 = -1.940247 */
8909 -32679, /* A2 = 0.997284 */
8910 17280, /* B2 = 0.527344 */
8911 -16865, /* B1 = -1.029358 */
8912 17280, /* B0 = 0.527344 */
8913 31841, /* A1 = -1.943481 */
8914 -32681, /* A2 = 0.997345 */
8915 543, /* B2 = 0.016579 */
8916 -525, /* B1 = -0.032097 */
8917 543, /* B0 = 0.016579 */
8918 5, /* Internal filter scaling */
8919 159, /* Minimum in-band energy threshold */
8920 21, /* 21/32 in-band to broad-band ratio */
8921 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8923 { /* f300_420[] 14 */
8924 30750, /* A1 = 1.876892 */
8925 -31212, /* A2 = -0.952515 */
8926 -804, /* B2 = -0.024541 */
8928 804, /* B0 = 0.024541 */
8929 30686, /* A1 = 1.872925 */
8930 -32145, /* A2 = -0.980988 */
8931 14747, /* B2 = 0.450043 */
8932 -13703, /* B1 = -0.836395 */
8933 14747, /* B0 = 0.450043 */
8934 31651, /* A1 = 1.931824 */
8935 -32321, /* A2 = -0.986389 */
8936 24425, /* B2 = 0.745422 */
8937 -23914, /* B1 = -1.459595 */
8938 24427, /* B0 = 0.745483 */
8939 7, /* Internal filter scaling */
8940 159, /* Minimum in-band energy threshold */
8941 21, /* 21/32 in-band to broad-band ratio */
8942 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8945 31613, /* A1 = -1.929565 */
8946 -32646, /* A2 = 0.996277 */
8947 -185, /* B2 = -0.005657 */
8948 0, /* B1 = 0.000000 */
8949 185, /* B0 = 0.005657 */
8950 31620, /* A1 = -1.929932 */
8951 -32713, /* A2 = 0.998352 */
8952 19253, /* B2 = 0.587585 */
8953 -18566, /* B1 = -1.133179 */
8954 19253, /* B0 = 0.587585 */
8955 31674, /* A1 = -1.933228 */
8956 -32715, /* A2 = 0.998413 */
8957 2575, /* B2 = 0.078590 */
8958 -2495, /* B1 = -0.152283 */
8959 2575, /* B0 = 0.078590 */
8960 5, /* Internal filter scaling */
8961 159, /* Minimum in-band energy threshold */
8962 21, /* 21/32 in-band to broad-band ratio */
8963 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8965 { /* f300_425[] 16 */
8966 30741, /* A1 = 1.876282 */
8967 -31475, /* A2 = -0.960541 */
8968 -703, /* B2 = -0.021484 */
8970 703, /* B0 = 0.021484 */
8971 30688, /* A1 = 1.873047 */
8972 -32248, /* A2 = -0.984161 */
8973 14542, /* B2 = 0.443787 */
8974 -13523, /* B1 = -0.825439 */
8975 14542, /* B0 = 0.443817 */
8976 31494, /* A1 = 1.922302 */
8977 -32366, /* A2 = -0.987762 */
8978 21577, /* B2 = 0.658508 */
8979 -21013, /* B1 = -1.282532 */
8980 21577, /* B0 = 0.658508 */
8981 7, /* Internal filter scaling */
8982 159, /* Minimum in-band energy threshold */
8983 21, /* 21/32 in-band to broad-band ratio */
8984 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8986 { /* f330_440[] 17 */
8987 30627, /* A1 = 1.869324 */
8988 -31338, /* A2 = -0.95636 */
8989 -843, /* B2 = -0.025749 */
8991 843, /* B0 = 0.025749 */
8992 30550, /* A1 = 1.864685 */
8993 -32221, /* A2 = -0.983337 */
8994 13594, /* B2 = 0.414886 */
8995 -12589, /* B1 = -0.768402 */
8996 13594, /* B0 = 0.414886 */
8997 31488, /* A1 = 1.921936 */
8998 -32358, /* A2 = -0.987518 */
8999 24684, /* B2 = 0.753296 */
9000 -24029, /* B1 = -1.466614 */
9001 24684, /* B0 = 0.753296 */
9002 7, /* Internal filter scaling */
9003 159, /* Minimum in-band energy threshold */
9004 21, /* 21/32 in-band to broad-band ratio */
9005 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9008 31546, /* A1 = -1.925476 */
9009 -32646, /* A2 = 0.996277 */
9010 -445, /* B2 = -0.013588 */
9011 0, /* B1 = 0.000000 */
9012 445, /* B0 = 0.013588 */
9013 31551, /* A1 = -1.925781 */
9014 -32713, /* A2 = 0.998352 */
9015 23884, /* B2 = 0.728882 */
9016 -22979, /* B1 = -1.402527 */
9017 23884, /* B0 = 0.728882 */
9018 31606, /* A1 = -1.929138 */
9019 -32715, /* A2 = 0.998413 */
9020 863, /* B2 = 0.026367 */
9021 -835, /* B1 = -0.050985 */
9022 863, /* B0 = 0.026367 */
9023 5, /* Internal filter scaling */
9024 159, /* Minimum in-band energy threshold */
9025 21, /* 21/32 in-band to broad-band ratio */
9026 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9028 { /* f350_400[] 19 */
9029 31006, /* A1 = 1.892517 */
9030 -32029, /* A2 = -0.977448 */
9031 -461, /* B2 = -0.014096 */
9033 461, /* B0 = 0.014096 */
9034 30999, /* A1 = 1.892029 */
9035 -32487, /* A2 = -0.991455 */
9036 11325, /* B2 = 0.345612 */
9037 -10682, /* B1 = -0.651978 */
9038 11325, /* B0 = 0.345612 */
9039 31441, /* A1 = 1.919067 */
9040 -32526, /* A2 = -0.992615 */
9041 24324, /* B2 = 0.74231 */
9042 -23535, /* B1 = -1.436523 */
9043 24324, /* B0 = 0.74231 */
9044 7, /* Internal filter scaling */
9045 159, /* Minimum in-band energy threshold */
9046 21, /* 21/32 in-band to broad-band ratio */
9047 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9050 30634, /* A1 = 1.869751 */
9051 -31533, /* A2 = -0.962341 */
9052 -680, /* B2 = -0.020782 */
9054 680, /* B0 = 0.020782 */
9055 30571, /* A1 = 1.865906 */
9056 -32277, /* A2 = -0.985016 */
9057 12894, /* B2 = 0.393524 */
9058 -11945, /* B1 = -0.729065 */
9059 12894, /* B0 = 0.393524 */
9060 31367, /* A1 = 1.91449 */
9061 -32379, /* A2 = -0.988129 */
9062 23820, /* B2 = 0.726929 */
9063 -23104, /* B1 = -1.410217 */
9064 23820, /* B0 = 0.726929 */
9065 7, /* Internal filter scaling */
9066 159, /* Minimum in-band energy threshold */
9067 21, /* 21/32 in-band to broad-band ratio */
9068 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9071 30552, /* A1 = 1.864807 */
9072 -31434, /* A2 = -0.95929 */
9073 -690, /* B2 = -0.021066 */
9075 690, /* B0 = 0.021066 */
9076 30472, /* A1 = 1.859924 */
9077 -32248, /* A2 = -0.984161 */
9078 13385, /* B2 = 0.408478 */
9079 -12357, /* B1 = -0.754242 */
9080 13385, /* B0 = 0.408478 */
9081 31358, /* A1 = 1.914001 */
9082 -32366, /* A2 = -0.987732 */
9083 26488, /* B2 = 0.80835 */
9084 -25692, /* B1 = -1.568176 */
9085 26490, /* B0 = 0.808411 */
9086 7, /* Internal filter scaling */
9087 159, /* Minimum in-band energy threshold */
9088 21, /* 21/32 in-band to broad-band ratio */
9089 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9092 31397, /* A1 = -1.916321 */
9093 -32623, /* A2 = 0.995605 */
9094 -117, /* B2 = -0.003598 */
9095 0, /* B1 = 0.000000 */
9096 117, /* B0 = 0.003598 */
9097 31403, /* A1 = -1.916687 */
9098 -32700, /* A2 = 0.997925 */
9099 3388, /* B2 = 0.103401 */
9100 -3240, /* B1 = -0.197784 */
9101 3388, /* B0 = 0.103401 */
9102 31463, /* A1 = -1.920410 */
9103 -32702, /* A2 = 0.997986 */
9104 13346, /* B2 = 0.407288 */
9105 -12863, /* B1 = -0.785126 */
9106 13346, /* B0 = 0.407288 */
9107 5, /* Internal filter scaling */
9108 159, /* Minimum in-band energy threshold */
9109 21, /* 21/32 in-band to broad-band ratio */
9110 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9113 30831, /* A1 = 1.881775 */
9114 -32064, /* A2 = -0.978546 */
9115 -367, /* B2 = -0.01122 */
9117 367, /* B0 = 0.01122 */
9118 30813, /* A1 = 1.880737 */
9119 -32456, /* A2 = -0.990509 */
9120 11068, /* B2 = 0.337769 */
9121 -10338, /* B1 = -0.631042 */
9122 11068, /* B0 = 0.337769 */
9123 31214, /* A1 = 1.905212 */
9124 -32491, /* A2 = -0.991577 */
9125 16374, /* B2 = 0.499695 */
9126 -15781, /* B1 = -0.963196 */
9127 16374, /* B0 = 0.499695 */
9128 7, /* Internal filter scaling */
9129 159, /* Minimum in-band energy threshold */
9130 21, /* 21/32 in-band to broad-band ratio */
9131 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9134 31152, /* A1 = -1.901428 */
9135 -32613, /* A2 = 0.995300 */
9136 -314, /* B2 = -0.009605 */
9137 0, /* B1 = 0.000000 */
9138 314, /* B0 = 0.009605 */
9139 31156, /* A1 = -1.901672 */
9140 -32694, /* A2 = 0.997742 */
9141 28847, /* B2 = 0.880371 */
9142 -2734, /* B1 = -0.166901 */
9143 28847, /* B0 = 0.880371 */
9144 31225, /* A1 = -1.905823 */
9145 -32696, /* A2 = 0.997803 */
9146 462, /* B2 = 0.014108 */
9147 -442, /* B1 = -0.027019 */
9148 462, /* B0 = 0.014108 */
9149 5, /* Internal filter scaling */
9150 159, /* Minimum in-band energy threshold */
9151 21, /* 21/32 in-band to broad-band ratio */
9152 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9155 30836, /* A1 = 1.882141 */
9156 -32296, /* A2 = -0.985596 */
9157 -324, /* B2 = -0.009903 */
9159 324, /* B0 = 0.009903 */
9160 30825, /* A1 = 1.881409 */
9161 -32570, /* A2 = -0.993958 */
9162 16847, /* B2 = 0.51416 */
9163 -15792, /* B1 = -0.963898 */
9164 16847, /* B0 = 0.51416 */
9165 31106, /* A1 = 1.89856 */
9166 -32584, /* A2 = -0.994415 */
9167 9579, /* B2 = 0.292328 */
9168 -9164, /* B1 = -0.559357 */
9169 9579, /* B0 = 0.292328 */
9170 7, /* Internal filter scaling */
9171 159, /* Minimum in-band energy threshold */
9172 21, /* 21/32 in-band to broad-band ratio */
9173 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9176 30702, /* A1 = 1.873962 */
9177 -32134, /* A2 = -0.980682 */
9178 -517, /* B2 = -0.015793 */
9180 517, /* B0 = 0.015793 */
9181 30676, /* A1 = 1.872375 */
9182 -32520, /* A2 = -0.992462 */
9183 8144, /* B2 = 0.24855 */
9184 -7596, /* B1 = -0.463684 */
9185 8144, /* B0 = 0.24855 */
9186 31084, /* A1 = 1.897217 */
9187 -32547, /* A2 = -0.993256 */
9188 22713, /* B2 = 0.693176 */
9189 -21734, /* B1 = -1.326599 */
9190 22713, /* B0 = 0.693176 */
9191 7, /* Internal filter scaling */
9192 159, /* Minimum in-band energy threshold */
9193 21, /* 21/32 in-band to broad-band ratio */
9194 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9197 30613, /* A1 = 1.86853 */
9198 -32031, /* A2 = -0.977509 */
9199 -618, /* B2 = -0.018866 */
9201 618, /* B0 = 0.018866 */
9202 30577, /* A1 = 1.866272 */
9203 -32491, /* A2 = -0.991577 */
9204 9612, /* B2 = 0.293335 */
9205 -8935, /* B1 = -0.54541 */
9206 9612, /* B0 = 0.293335 */
9207 31071, /* A1 = 1.896484 */
9208 -32524, /* A2 = -0.992584 */
9209 21596, /* B2 = 0.659058 */
9210 -20667, /* B1 = -1.261414 */
9211 21596, /* B0 = 0.659058 */
9212 7, /* Internal filter scaling */
9213 159, /* Minimum in-band energy threshold */
9214 21, /* 21/32 in-band to broad-band ratio */
9215 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9218 30914, /* A1 = -1.886841 */
9219 -32584, /* A2 = 0.994385 */
9220 -426, /* B2 = -0.013020 */
9221 0, /* B1 = 0.000000 */
9222 426, /* B0 = 0.013020 */
9223 30914, /* A1 = -1.886841 */
9224 -32679, /* A2 = 0.997314 */
9225 17520, /* B2 = 0.534668 */
9226 -16471, /* B1 = -1.005310 */
9227 17520, /* B0 = 0.534668 */
9228 31004, /* A1 = -1.892334 */
9229 -32683, /* A2 = 0.997406 */
9230 819, /* B2 = 0.025023 */
9231 -780, /* B1 = -0.047619 */
9232 819, /* B0 = 0.025023 */
9233 5, /* Internal filter scaling */
9234 159, /* Minimum in-band energy threshold */
9235 21, /* 21/32 in-band to broad-band ratio */
9236 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9260 30646, /* A1 = 1.870544 */
9261 -32327, /* A2 = -0.986572 */
9262 -287, /* B2 = -0.008769 */
9264 287, /* B0 = 0.008769 */
9265 30627, /* A1 = 1.869324 */
9266 -32607, /* A2 = -0.995087 */
9267 13269, /* B2 = 0.404968 */
9268 -12376, /* B1 = -0.755432 */
9269 13269, /* B0 = 0.404968 */
9270 30924, /* A1 = 1.887512 */
9271 -32619, /* A2 = -0.995453 */
9272 19950, /* B2 = 0.608826 */
9273 -18940, /* B1 = -1.156006 */
9274 19950, /* B0 = 0.608826 */
9275 7, /* Internal filter scaling */
9276 159, /* Minimum in-band energy threshold */
9277 21, /* 21/32 in-band to broad-band ratio */
9278 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9281 30396, /* A1 = 1.855225 */
9282 -32014, /* A2 = -0.97699 */
9283 -395, /* B2 = -0.012055 */
9285 395, /* B0 = 0.012055 */
9286 30343, /* A1 = 1.85199 */
9287 -32482, /* A2 = -0.991302 */
9288 17823, /* B2 = 0.543945 */
9289 -16431, /* B1 = -1.002869 */
9290 17823, /* B0 = 0.543945 */
9291 30872, /* A1 = 1.884338 */
9292 -32516, /* A2 = -0.99231 */
9293 18124, /* B2 = 0.553101 */
9294 -17246, /* B1 = -1.052673 */
9295 18124, /* B0 = 0.553101 */
9296 7, /* Internal filter scaling */
9297 159, /* Minimum in-band energy threshold */
9298 21, /* 21/32 in-band to broad-band ratio */
9299 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9302 30796, /* A1 = -1.879639 */
9303 -32603, /* A2 = 0.994965 */
9304 -254, /* B2 = -0.007762 */
9305 0, /* B1 = 0.000000 */
9306 254, /* B0 = 0.007762 */
9307 30793, /* A1 = -1.879456 */
9308 -32692, /* A2 = 0.997711 */
9309 18934, /* B2 = 0.577820 */
9310 -17751, /* B1 = -1.083496 */
9311 18934, /* B0 = 0.577820 */
9312 30882, /* A1 = -1.884888 */
9313 -32694, /* A2 = 0.997772 */
9314 1858, /* B2 = 0.056713 */
9315 -1758, /* B1 = -0.107357 */
9316 1858, /* B0 = 0.056713 */
9317 5, /* Internal filter scaling */
9318 159, /* Minimum in-band energy threshold */
9319 21, /* 21/32 in-band to broad-band ratio */
9320 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9323 30641, /* A1 = 1.870239 */
9324 -32458, /* A2 = -0.99057 */
9325 -155, /* B2 = -0.004735 */
9327 155, /* B0 = 0.004735 */
9328 30631, /* A1 = 1.869568 */
9329 -32630, /* A2 = -0.995789 */
9330 11453, /* B2 = 0.349548 */
9331 -10666, /* B1 = -0.651001 */
9332 11453, /* B0 = 0.349548 */
9333 30810, /* A1 = 1.880554 */
9334 -32634, /* A2 = -0.995941 */
9335 12237, /* B2 = 0.373474 */
9336 -11588, /* B1 = -0.707336 */
9337 12237, /* B0 = 0.373474 */
9338 7, /* Internal filter scaling */
9339 159, /* Minimum in-band energy threshold */
9340 21, /* 21/32 in-band to broad-band ratio */
9341 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9344 30367, /* A1 = 1.853455 */
9345 -32147, /* A2 = -0.981079 */
9346 -495, /* B2 = -0.015113 */
9348 495, /* B0 = 0.015113 */
9349 30322, /* A1 = 1.850769 */
9350 -32543, /* A2 = -0.993134 */
9351 10031, /* B2 = 0.306152 */
9352 -9252, /* B1 = -0.564728 */
9353 10031, /* B0 = 0.306152 */
9354 30770, /* A1 = 1.878052 */
9355 -32563, /* A2 = -0.993774 */
9356 22674, /* B2 = 0.691956 */
9357 -21465, /* B1 = -1.31012 */
9358 22674, /* B0 = 0.691956 */
9359 7, /* Internal filter scaling */
9360 159, /* Minimum in-band energy threshold */
9361 21, /* 21/32 in-band to broad-band ratio */
9362 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9365 30709, /* A1 = -1.874329 */
9366 -32603, /* A2 = 0.994965 */
9367 -83, /* B2 = -0.002545 */
9368 0, /* B1 = 0.000000 */
9369 83, /* B0 = 0.002545 */
9370 30704, /* A1 = -1.874084 */
9371 -32692, /* A2 = 0.997711 */
9372 10641, /* B2 = 0.324738 */
9373 -9947, /* B1 = -0.607147 */
9374 10641, /* B0 = 0.324738 */
9375 30796, /* A1 = -1.879639 */
9376 -32694, /* A2 = 0.997772 */
9377 10079, /* B2 = 0.307587 */
9378 9513, /* B1 = 0.580688 */
9379 10079, /* B0 = 0.307587 */
9380 5, /* Internal filter scaling */
9381 159, /* Minimum in-band energy threshold */
9382 21, /* 21/32 in-band to broad-band ratio */
9383 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9386 30664, /* A1 = -1.871643 */
9387 -32603, /* A2 = 0.994965 */
9388 -164, /* B2 = -0.005029 */
9389 0, /* B1 = 0.000000 */
9390 164, /* B0 = 0.005029 */
9391 30661, /* A1 = -1.871399 */
9392 -32692, /* A2 = 0.997711 */
9393 15294, /* B2 = 0.466736 */
9394 -14275, /* B1 = -0.871307 */
9395 15294, /* B0 = 0.466736 */
9396 30751, /* A1 = -1.876953 */
9397 -32694, /* A2 = 0.997772 */
9398 3548, /* B2 = 0.108284 */
9399 -3344, /* B1 = -0.204155 */
9400 3548, /* B0 = 0.108284 */
9401 5, /* Internal filter scaling */
9402 159, /* Minimum in-band energy threshold */
9403 21, /* 21/32 in-band to broad-band ratio */
9404 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9407 30653, /* A1 = -1.870911 */
9408 -32615, /* A2 = 0.995361 */
9409 -209, /* B2 = -0.006382 */
9410 0, /* B1 = 0.000000 */
9411 209, /* B0 = 0.006382 */
9412 30647, /* A1 = -1.870605 */
9413 -32702, /* A2 = 0.997986 */
9414 18971, /* B2 = 0.578979 */
9415 -17716, /* B1 = -1.081299 */
9416 18971, /* B0 = 0.578979 */
9417 30738, /* A1 = -1.876099 */
9418 -32702, /* A2 = 0.998016 */
9419 2967, /* B2 = 0.090561 */
9420 -2793, /* B1 = -0.170502 */
9421 2967, /* B0 = 0.090561 */
9422 5, /* Internal filter scaling */
9423 159, /* Minimum in-band energy threshold */
9424 21, /* 21/32 in-band to broad-band ratio */
9425 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9428 30437, /* A1 = -1.857727 */
9429 -32603, /* A2 = 0.994965 */
9430 -264, /* B2 = -0.008062 */
9431 0, /* B1 = 0.000000 */
9432 264, /* B0 = 0.008062 */
9433 30430, /* A1 = -1.857300 */
9434 -32692, /* A2 = 0.997711 */
9435 21681, /* B2 = 0.661682 */
9436 -20082, /* B1 = -1.225708 */
9437 21681, /* B0 = 0.661682 */
9438 30526, /* A1 = -1.863220 */
9439 -32694, /* A2 = 0.997742 */
9440 1559, /* B2 = 0.047600 */
9441 -1459, /* B1 = -0.089096 */
9442 1559, /* B0 = 0.047600 */
9443 5, /* Internal filter scaling */
9444 159, /* Minimum in-band energy threshold */
9445 21, /* 21/32 in-band to broad-band ratio */
9446 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9449 28975, /* A1 = 1.768494 */
9450 -30955, /* A2 = -0.944672 */
9451 -1026, /* B2 = -0.03133 */
9453 1026, /* B0 = 0.03133 */
9454 28613, /* A1 = 1.746399 */
9455 -32089, /* A2 = -0.979309 */
9456 14214, /* B2 = 0.433807 */
9457 -12202, /* B1 = -0.744812 */
9458 14214, /* B0 = 0.433807 */
9459 30243, /* A1 = 1.845947 */
9460 -32238, /* A2 = -0.983856 */
9461 24825, /* B2 = 0.757629 */
9462 -23402, /* B1 = -1.428345 */
9463 24825, /* B0 = 0.757629 */
9464 7, /* Internal filter scaling */
9465 159, /* Minimum in-band energy threshold */
9466 21, /* 21/32 in-band to broad-band ratio */
9467 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9470 30257, /* A1 = -1.846741 */
9471 -32605, /* A2 = 0.995056 */
9472 -249, /* B2 = -0.007625 */
9473 0, /* B1 = 0.000000 */
9474 249, /* B0 = 0.007625 */
9475 30247, /* A1 = -1.846191 */
9476 -32694, /* A2 = 0.997772 */
9477 18088, /* B2 = 0.552002 */
9478 -16652, /* B1 = -1.016418 */
9479 18088, /* B0 = 0.552002 */
9480 30348, /* A1 = -1.852295 */
9481 -32696, /* A2 = 0.997803 */
9482 2099, /* B2 = 0.064064 */
9483 -1953, /* B1 = -0.119202 */
9484 2099, /* B0 = 0.064064 */
9485 5, /* Internal filter scaling */
9486 159, /* Minimum in-band energy threshold */
9487 21, /* 21/32 in-band to broad-band ratio */
9488 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9491 30202, /* A1 = -1.843431 */
9492 -32624, /* A2 = 0.995622 */
9493 -413, /* B2 = -0.012622 */
9494 0, /* B1 = 0.000000 */
9495 413, /* B0 = 0.012622 */
9496 30191, /* A1 = -1.842721 */
9497 -32714, /* A2 = 0.998364 */
9498 25954, /* B2 = 0.792057 */
9499 -23890, /* B1 = -1.458131 */
9500 25954, /* B0 = 0.792057 */
9501 30296, /* A1 = -1.849172 */
9502 -32715, /* A2 = 0.998397 */
9503 2007, /* B2 = 0.061264 */
9504 -1860, /* B1 = -0.113568 */
9505 2007, /* B0 = 0.061264 */
9506 5, /* Internal filter scaling */
9507 159, /* Minimum in-band energy threshold */
9508 21, /* 21/32 in-band to broad-band ratio */
9509 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9512 30001, /* A1 = -1.831116 */
9513 -32613, /* A2 = 0.995270 */
9514 -155, /* B2 = -0.004750 */
9515 0, /* B1 = 0.000000 */
9516 155, /* B0 = 0.004750 */
9517 29985, /* A1 = -1.830200 */
9518 -32710, /* A2 = 0.998260 */
9519 6584, /* B2 = 0.200928 */
9520 -6018, /* B1 = -0.367355 */
9521 6584, /* B0 = 0.200928 */
9522 30105, /* A1 = -1.837524 */
9523 -32712, /* A2 = 0.998291 */
9524 23812, /* B2 = 0.726685 */
9525 -21936, /* B1 = -1.338928 */
9526 23812, /* B0 = 0.726685 */
9527 5, /* Internal filter scaling */
9528 159, /* Minimum in-band energy threshold */
9529 21, /* 21/32 in-band to broad-band ratio */
9530 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9533 29964, /* A1 = -1.828918 */
9534 -32601, /* A2 = 0.994904 */
9535 -101, /* B2 = -0.003110 */
9536 0, /* B1 = 0.000000 */
9537 101, /* B0 = 0.003110 */
9538 29949, /* A1 = -1.827942 */
9539 -32700, /* A2 = 0.997925 */
9540 11041, /* B2 = 0.336975 */
9541 -10075, /* B1 = -0.614960 */
9542 11041, /* B0 = 0.336975 */
9543 30070, /* A1 = -1.835388 */
9544 -32702, /* A2 = 0.997986 */
9545 16762, /* B2 = 0.511536 */
9546 -15437, /* B1 = -0.942230 */
9547 16762, /* B0 = 0.511536 */
9548 5, /* Internal filter scaling */
9549 159, /* Minimum in-band energy threshold */
9550 21, /* 21/32 in-band to broad-band ratio */
9551 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9554 29936, /* A1 = -1.827209 */
9555 -32584, /* A2 = 0.994415 */
9556 -91, /* B2 = -0.002806 */
9557 0, /* B1 = 0.000000 */
9558 91, /* B0 = 0.002806 */
9559 29921, /* A1 = -1.826233 */
9560 -32688, /* A2 = 0.997559 */
9561 11449, /* B2 = 0.349396 */
9562 -10426, /* B1 = -0.636383 */
9563 11449, /* B0 = 0.349396 */
9564 30045, /* A1 = -1.833862 */
9565 -32688, /* A2 = 0.997589 */
9566 13055, /* B2 = 0.398407 */
9567 -12028, /* B1 = -0.734161 */
9568 13055, /* B0 = 0.398407 */
9569 5, /* Internal filter scaling */
9570 159, /* Minimum in-band energy threshold */
9571 21, /* 21/32 in-band to broad-band ratio */
9572 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9575 28499, /* A1 = 1.739441 */
9576 -31129, /* A2 = -0.949982 */
9577 -849, /* B2 = -0.025922 */
9579 849, /* B0 = 0.025922 */
9580 28128, /* A1 = 1.716797 */
9581 -32130, /* A2 = -0.98056 */
9582 14556, /* B2 = 0.444214 */
9583 -12251, /* B1 = -0.747772 */
9584 14556, /* B0 = 0.444244 */
9585 29667, /* A1 = 1.81073 */
9586 -32244, /* A2 = -0.984039 */
9587 23038, /* B2 = 0.703064 */
9588 -21358, /* B1 = -1.303589 */
9589 23040, /* B0 = 0.703125 */
9590 7, /* Internal filter scaling */
9591 159, /* Minimum in-band energy threshold */
9592 21, /* 21/32 in-band to broad-band ratio */
9593 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9596 29271, /* A1 = -1.786560 */
9597 -32599, /* A2 = 0.994873 */
9598 -490, /* B2 = -0.014957 */
9599 0, /* B1 = 0.000000 */
9600 490, /* B0 = 0.014957 */
9601 29246, /* A1 = -1.785095 */
9602 -32700, /* A2 = 0.997925 */
9603 28961, /* B2 = 0.883850 */
9604 -25796, /* B1 = -1.574463 */
9605 28961, /* B0 = 0.883850 */
9606 29383, /* A1 = -1.793396 */
9607 -32700, /* A2 = 0.997955 */
9608 1299, /* B2 = 0.039650 */
9609 -1169, /* B1 = -0.071396 */
9610 1299, /* B0 = 0.039650 */
9611 5, /* Internal filter scaling */
9612 159, /* Minimum in-band energy threshold */
9613 21, /* 21/32 in-band to broad-band ratio */
9614 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9617 29230, /* A1 = -1.784058 */
9618 -32584, /* A2 = 0.994415 */
9619 -418, /* B2 = -0.012757 */
9620 0, /* B1 = 0.000000 */
9621 418, /* B0 = 0.012757 */
9622 29206, /* A1 = -1.782593 */
9623 -32688, /* A2 = 0.997559 */
9624 36556, /* B2 = 1.115601 */
9625 -32478, /* B1 = -1.982300 */
9626 36556, /* B0 = 1.115601 */
9627 29345, /* A1 = -1.791077 */
9628 -32688, /* A2 = 0.997589 */
9629 897, /* B2 = 0.027397 */
9630 -808, /* B1 = -0.049334 */
9631 897, /* B0 = 0.027397 */
9632 5, /* Internal filter scaling */
9633 159, /* Minimum in-band energy threshold */
9634 21, /* 21/32 in-band to broad-band ratio */
9635 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9638 29116, /* A1 = -1.777100 */
9639 -32603, /* A2 = 0.994965 */
9640 -165, /* B2 = -0.005039 */
9641 0, /* B1 = 0.000000 */
9642 165, /* B0 = 0.005039 */
9643 29089, /* A1 = -1.775452 */
9644 -32708, /* A2 = 0.998199 */
9645 6963, /* B2 = 0.212494 */
9646 -6172, /* B1 = -0.376770 */
9647 6963, /* B0 = 0.212494 */
9648 29237, /* A1 = -1.784485 */
9649 -32710, /* A2 = 0.998230 */
9650 24197, /* B2 = 0.738464 */
9651 -21657, /* B1 = -1.321899 */
9652 24197, /* B0 = 0.738464 */
9653 5, /* Internal filter scaling */
9654 159, /* Minimum in-band energy threshold */
9655 21, /* 21/32 in-band to broad-band ratio */
9656 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9659 28376, /* A1 = -1.731934 */
9660 -32567, /* A2 = 0.993896 */
9661 -363, /* B2 = -0.011102 */
9662 0, /* B1 = 0.000000 */
9663 363, /* B0 = 0.011102 */
9664 28337, /* A1 = -1.729614 */
9665 -32683, /* A2 = 0.997434 */
9666 21766, /* B2 = 0.664246 */
9667 -18761, /* B1 = -1.145081 */
9668 21766, /* B0 = 0.664246 */
9669 28513, /* A1 = -1.740356 */
9670 -32686, /* A2 = 0.997498 */
9671 2509, /* B2 = 0.076584 */
9672 -2196, /* B1 = -0.134041 */
9673 2509, /* B0 = 0.076584 */
9674 5, /* Internal filter scaling */
9675 159, /* Minimum in-band energy threshold */
9676 21, /* 21/32 in-band to broad-band ratio */
9677 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9680 27844, /* A1 = -1.699463 */
9681 -32563, /* A2 = 0.993744 */
9682 -366, /* B2 = -0.011187 */
9683 0, /* B1 = 0.000000 */
9684 366, /* B0 = 0.011187 */
9685 27797, /* A1 = -1.696655 */
9686 -32686, /* A2 = 0.997498 */
9687 22748, /* B2 = 0.694214 */
9688 -19235, /* B1 = -1.174072 */
9689 22748, /* B0 = 0.694214 */
9690 27995, /* A1 = -1.708740 */
9691 -32688, /* A2 = 0.997559 */
9692 2964, /* B2 = 0.090477 */
9693 -2546, /* B1 = -0.155449 */
9694 2964, /* B0 = 0.090477 */
9695 5, /* Internal filter scaling */
9696 159, /* Minimum in-band energy threshold */
9697 21, /* 21/32 in-band to broad-band ratio */
9698 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9701 27297, /* A1 = -1.666077 */
9702 -32551, /* A2 = 0.993408 */
9703 -345, /* B2 = -0.010540 */
9704 0, /* B1 = 0.000000 */
9705 345, /* B0 = 0.010540 */
9706 27240, /* A1 = -1.662598 */
9707 -32683, /* A2 = 0.997406 */
9708 22560, /* B2 = 0.688477 */
9709 -18688, /* B1 = -1.140625 */
9710 22560, /* B0 = 0.688477 */
9711 27461, /* A1 = -1.676147 */
9712 -32684, /* A2 = 0.997467 */
9713 3541, /* B2 = 0.108086 */
9714 -2985, /* B1 = -0.182220 */
9715 3541, /* B0 = 0.108086 */
9716 5, /* Internal filter scaling */
9717 159, /* Minimum in-band energy threshold */
9718 21, /* 21/32 in-band to broad-band ratio */
9719 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9722 27155, /* A1 = -1.657410 */
9723 -32551, /* A2 = 0.993408 */
9724 -462, /* B2 = -0.014117 */
9725 0, /* B1 = 0.000000 */
9726 462, /* B0 = 0.014117 */
9727 27097, /* A1 = -1.653870 */
9728 -32683, /* A2 = 0.997406 */
9729 32495, /* B2 = 0.991699 */
9730 -26776, /* B1 = -1.634338 */
9731 32495, /* B0 = 0.991699 */
9732 27321, /* A1 = -1.667542 */
9733 -32684, /* A2 = 0.997467 */
9734 1835, /* B2 = 0.056007 */
9735 -1539, /* B1 = -0.093948 */
9736 1835, /* B0 = 0.056007 */
9737 5, /* Internal filter scaling */
9738 159, /* Minimum in-band energy threshold */
9739 21, /* 21/32 in-band to broad-band ratio */
9740 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9743 19298, /* A1 = 1.177917 */
9744 -24471, /* A2 = -0.746796 */
9745 -4152, /* B2 = -0.126709 */
9747 4152, /* B0 = 0.126709 */
9748 12902, /* A1 = 0.787476 */
9749 -29091, /* A2 = -0.887817 */
9750 12491, /* B2 = 0.38121 */
9751 -1794, /* B1 = -0.109528 */
9752 12494, /* B0 = 0.381317 */
9753 26291, /* A1 = 1.604736 */
9754 -30470, /* A2 = -0.929901 */
9755 28859, /* B2 = 0.880737 */
9756 -26084, /* B1 = -1.592102 */
9757 28861, /* B0 = 0.880798 */
9758 7, /* Internal filter scaling */
9759 159, /* Minimum in-band energy threshold */
9760 21, /* 21/32 in-band to broad-band ratio */
9761 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9764 26867, /* A1 = -1.639832 */
9765 -32551, /* A2 = 0.993408 */
9766 -123, /* B2 = -0.003755 */
9767 0, /* B1 = 0.000000 */
9768 123, /* B0 = 0.003755 */
9769 26805, /* A1 = -1.636108 */
9770 -32683, /* A2 = 0.997406 */
9771 17297, /* B2 = 0.527863 */
9772 -14096, /* B1 = -0.860382 */
9773 17297, /* B0 = 0.527863 */
9774 27034, /* A1 = -1.650085 */
9775 -32684, /* A2 = 0.997467 */
9776 12958, /* B2 = 0.395477 */
9777 -10756, /* B1 = -0.656525 */
9778 12958, /* B0 = 0.395477 */
9779 5, /* Internal filter scaling */
9780 159, /* Minimum in-band energy threshold */
9781 21, /* 21/32 in-band to broad-band ratio */
9782 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9785 26413, /* A1 = -1.612122 */
9786 -32547, /* A2 = 0.993286 */
9787 -223, /* B2 = -0.006825 */
9788 0, /* B1 = 0.000000 */
9789 223, /* B0 = 0.006825 */
9790 26342, /* A1 = -1.607849 */
9791 -32686, /* A2 = 0.997498 */
9792 6391, /* B2 = 0.195053 */
9793 -5120, /* B1 = -0.312531 */
9794 6391, /* B0 = 0.195053 */
9795 26593, /* A1 = -1.623108 */
9796 -32688, /* A2 = 0.997559 */
9797 23681, /* B2 = 0.722717 */
9798 -19328, /* B1 = -1.179688 */
9799 23681, /* B0 = 0.722717 */
9800 5, /* Internal filter scaling */
9801 159, /* Minimum in-band energy threshold */
9802 21, /* 21/32 in-band to broad-band ratio */
9803 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9806 26168, /* A1 = -1.597209 */
9807 -32528, /* A2 = 0.992706 */
9808 -235, /* B2 = -0.007182 */
9809 0, /* B1 = 0.000000 */
9810 235, /* B0 = 0.007182 */
9811 26092, /* A1 = -1.592590 */
9812 -32675, /* A2 = 0.997192 */
9813 20823, /* B2 = 0.635498 */
9814 -16510, /* B1 = -1.007751 */
9815 20823, /* B0 = 0.635498 */
9816 26363, /* A1 = -1.609070 */
9817 -32677, /* A2 = 0.997253 */
9818 6739, /* B2 = 0.205688 */
9819 -5459, /* B1 = -0.333206 */
9820 6739, /* B0 = 0.205688 */
9821 5, /* Internal filter scaling */
9822 159, /* Minimum in-band energy threshold */
9823 21, /* 21/32 in-band to broad-band ratio */
9824 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9827 25641, /* A1 = -1.565063 */
9828 -32536, /* A2 = 0.992950 */
9829 -121, /* B2 = -0.003707 */
9830 0, /* B1 = 0.000000 */
9831 121, /* B0 = 0.003707 */
9832 25560, /* A1 = -1.560059 */
9833 -32684, /* A2 = 0.997437 */
9834 18341, /* B2 = 0.559753 */
9835 -14252, /* B1 = -0.869904 */
9836 18341, /* B0 = 0.559753 */
9837 25837, /* A1 = -1.577026 */
9838 -32684, /* A2 = 0.997467 */
9839 16679, /* B2 = 0.509003 */
9840 -13232, /* B1 = -0.807648 */
9841 16679, /* B0 = 0.509003 */
9842 5, /* Internal filter scaling */
9843 159, /* Minimum in-band energy threshold */
9844 21, /* 21/32 in-band to broad-band ratio */
9845 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9848 16415, /* A1 = 1.001953 */
9849 -23669, /* A2 = -0.722321 */
9850 -4549, /* B2 = -0.138847 */
9852 4549, /* B0 = 0.138847 */
9853 8456, /* A1 = 0.516174 */
9854 -28996, /* A2 = -0.884918 */
9855 13753, /* B2 = 0.419724 */
9856 -12, /* B1 = -0.000763 */
9857 13757, /* B0 = 0.419846 */
9858 24632, /* A1 = 1.503418 */
9859 -30271, /* A2 = -0.923828 */
9860 29070, /* B2 = 0.887146 */
9861 -25265, /* B1 = -1.542114 */
9862 29073, /* B0 = 0.887268 */
9863 7, /* Internal filter scaling */
9864 159, /* Minimum in-band energy threshold */
9865 21, /* 21/32 in-band to broad-band ratio */
9866 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9869 24806, /* A1 = -1.514099 */
9870 -32501, /* A2 = 0.991852 */
9871 -326, /* B2 = -0.009969 */
9872 0, /* B1 = 0.000000 */
9873 326, /* B0 = 0.009969 */
9874 24709, /* A1 = -1.508118 */
9875 -32659, /* A2 = 0.996674 */
9876 20277, /* B2 = 0.618835 */
9877 -15182, /* B1 = -0.926636 */
9878 20277, /* B0 = 0.618835 */
9879 25022, /* A1 = -1.527222 */
9880 -32661, /* A2 = 0.996735 */
9881 4320, /* B2 = 0.131836 */
9882 -3331, /* B1 = -0.203339 */
9883 4320, /* B0 = 0.131836 */
9884 5, /* Internal filter scaling */
9885 159, /* Minimum in-band energy threshold */
9886 21, /* 21/32 in-band to broad-band ratio */
9887 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9890 19776, /* A1 = 1.207092 */
9891 -27437, /* A2 = -0.837341 */
9892 -2666, /* B2 = -0.081371 */
9894 2666, /* B0 = 0.081371 */
9895 16302, /* A1 = 0.995026 */
9896 -30354, /* A2 = -0.926361 */
9897 10389, /* B2 = 0.317062 */
9898 -3327, /* B1 = -0.203064 */
9899 10389, /* B0 = 0.317062 */
9900 24299, /* A1 = 1.483154 */
9901 -30930, /* A2 = -0.943909 */
9902 25016, /* B2 = 0.763428 */
9903 -21171, /* B1 = -1.292236 */
9904 25016, /* B0 = 0.763428 */
9905 7, /* Internal filter scaling */
9906 159, /* Minimum in-band energy threshold */
9907 21, /* 21/32 in-band to broad-band ratio */
9908 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9911 20554, /* A1 = 1.254517 */
9912 -28764, /* A2 = -0.877838 */
9913 -2048, /* B2 = -0.062515 */
9915 2048, /* B0 = 0.062515 */
9916 18209, /* A1 = 1.11145 */
9917 -30951, /* A2 = -0.94458 */
9918 9390, /* B2 = 0.286575 */
9919 -3955, /* B1 = -0.241455 */
9920 9390, /* B0 = 0.286575 */
9921 23902, /* A1 = 1.458923 */
9922 -31286, /* A2 = -0.954803 */
9923 23252, /* B2 = 0.709595 */
9924 -19132, /* B1 = -1.167725 */
9925 23252, /* B0 = 0.709595 */
9926 7, /* Internal filter scaling */
9927 159, /* Minimum in-band energy threshold */
9928 21, /* 21/32 in-band to broad-band ratio */
9929 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9932 17543, /* A1 = 1.07074 */
9933 -26220, /* A2 = -0.800201 */
9934 -3298, /* B2 = -0.100647 */
9936 3298, /* B0 = 0.100647 */
9937 12423, /* A1 = 0.75827 */
9938 -30036, /* A2 = -0.916626 */
9939 12651, /* B2 = 0.386078 */
9940 -2444, /* B1 = -0.14917 */
9941 12653, /* B0 = 0.386154 */
9942 23518, /* A1 = 1.435425 */
9943 -30745, /* A2 = -0.938293 */
9944 27282, /* B2 = 0.832581 */
9945 -22529, /* B1 = -1.375122 */
9946 27286, /* B0 = 0.832703 */
9947 7, /* Internal filter scaling */
9948 159, /* Minimum in-band energy threshold */
9949 21, /* 21/32 in-band to broad-band ratio */
9950 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9953 24104, /* A1 = -1.471252 */
9954 -32507, /* A2 = 0.992065 */
9955 -351, /* B2 = -0.010722 */
9956 0, /* B1 = 0.000000 */
9957 351, /* B0 = 0.010722 */
9958 23996, /* A1 = -1.464600 */
9959 -32671, /* A2 = 0.997040 */
9960 22848, /* B2 = 0.697266 */
9961 -16639, /* B1 = -1.015564 */
9962 22848, /* B0 = 0.697266 */
9963 24332, /* A1 = -1.485168 */
9964 -32673, /* A2 = 0.997101 */
9965 4906, /* B2 = 0.149727 */
9966 -3672, /* B1 = -0.224174 */
9967 4906, /* B0 = 0.149727 */
9968 5, /* Internal filter scaling */
9969 159, /* Minimum in-band energy threshold */
9970 21, /* 21/32 in-band to broad-band ratio */
9971 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9974 23967, /* A1 = -1.462830 */
9975 -32507, /* A2 = 0.992065 */
9976 -518, /* B2 = -0.015821 */
9977 0, /* B1 = 0.000000 */
9978 518, /* B0 = 0.015821 */
9979 23856, /* A1 = -1.456055 */
9980 -32671, /* A2 = 0.997040 */
9981 26287, /* B2 = 0.802246 */
9982 -19031, /* B1 = -1.161560 */
9983 26287, /* B0 = 0.802246 */
9984 24195, /* A1 = -1.476746 */
9985 -32673, /* A2 = 0.997101 */
9986 2890, /* B2 = 0.088196 */
9987 -2151, /* B1 = -0.131317 */
9988 2890, /* B0 = 0.088196 */
9989 5, /* Internal filter scaling */
9990 159, /* Minimum in-band energy threshold */
9991 21, /* 21/32 in-band to broad-band ratio */
9992 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9995 18294, /* A1 = 1.116638 */
9996 -26962, /* A2 = -0.822845 */
9997 -2914, /* B2 = -0.088936 */
9999 2914, /* B0 = 0.088936 */
10000 14119, /* A1 = 0.861786 */
10001 -30227, /* A2 = -0.922455 */
10002 11466, /* B2 = 0.349945 */
10003 -2833, /* B1 = -0.172943 */
10004 11466, /* B0 = 0.349945 */
10005 23431, /* A1 = 1.430115 */
10006 -30828, /* A2 = -0.940796 */
10007 25331, /* B2 = 0.773071 */
10008 -20911, /* B1 = -1.276367 */
10009 25331, /* B0 = 0.773071 */
10010 7, /* Internal filter scaling */
10011 159, /* Minimum in-band energy threshold */
10012 21, /* 21/32 in-band to broad-band ratio */
10013 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10016 23521, /* A1 = -1.435608 */
10017 -32489, /* A2 = 0.991516 */
10018 -193, /* B2 = -0.005915 */
10019 0, /* B1 = 0.000000 */
10020 193, /* B0 = 0.005915 */
10021 23404, /* A1 = -1.428467 */
10022 -32655, /* A2 = 0.996582 */
10023 17740, /* B2 = 0.541412 */
10024 -12567, /* B1 = -0.767029 */
10025 17740, /* B0 = 0.541412 */
10026 23753, /* A1 = -1.449829 */
10027 -32657, /* A2 = 0.996613 */
10028 9090, /* B2 = 0.277405 */
10029 -6662, /* B1 = -0.406647 */
10030 9090, /* B0 = 0.277405 */
10031 5, /* Internal filter scaling */
10032 159, /* Minimum in-band energy threshold */
10033 21, /* 21/32 in-band to broad-band ratio */
10034 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10037 23071, /* A1 = -1.408203 */
10038 -32489, /* A2 = 0.991516 */
10039 -293, /* B2 = -0.008965 */
10040 0, /* B1 = 0.000000 */
10041 293, /* B0 = 0.008965 */
10042 22951, /* A1 = -1.400818 */
10043 -32655, /* A2 = 0.996582 */
10044 5689, /* B2 = 0.173645 */
10045 -3951, /* B1 = -0.241150 */
10046 5689, /* B0 = 0.173645 */
10047 23307, /* A1 = -1.422607 */
10048 -32657, /* A2 = 0.996613 */
10049 18692, /* B2 = 0.570435 */
10050 -13447, /* B1 = -0.820770 */
10051 18692, /* B0 = 0.570435 */
10052 5, /* Internal filter scaling */
10053 159, /* Minimum in-band energy threshold */
10054 21, /* 21/32 in-band to broad-band ratio */
10055 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10058 22701, /* A1 = -1.385620 */
10059 -32474, /* A2 = 0.991058 */
10060 -292, /* B2 = -0.008933 */
10061 0, /*163840 , B1 = 10.000000 */
10062 292, /* B0 = 0.008933 */
10063 22564, /* A1 = -1.377258 */
10064 -32655, /* A2 = 0.996552 */
10065 20756, /* B2 = 0.633423 */
10066 -14176, /* B1 = -0.865295 */
10067 20756, /* B0 = 0.633423 */
10068 22960, /* A1 = -1.401428 */
10069 -32657, /* A2 = 0.996613 */
10070 6520, /* B2 = 0.198990 */
10071 -4619, /* B1 = -0.281937 */
10072 6520, /* B0 = 0.198990 */
10073 5, /* Internal filter scaling */
10074 159, /* Minimum in-band energy threshold */
10075 21, /* 21/32 in-band to broad-band ratio */
10076 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10079 22142, /* A1 = -1.351501 */
10080 -32474, /* A2 = 0.991058 */
10081 -147, /* B2 = -0.004493 */
10082 0, /* B1 = 0.000000 */
10083 147, /* B0 = 0.004493 */
10084 22000, /* A1 = -1.342834 */
10085 -32655, /* A2 = 0.996552 */
10086 15379, /* B2 = 0.469360 */
10087 -10237, /* B1 = -0.624847 */
10088 15379, /* B0 = 0.469360 */
10089 22406, /* A1 = -1.367554 */
10090 -32657, /* A2 = 0.996613 */
10091 17491, /* B2 = 0.533783 */
10092 -12096, /* B1 = -0.738312 */
10093 17491, /* B0 = 0.533783 */
10094 5, /* Internal filter scaling */
10095 159, /* Minimum in-band energy threshold */
10096 21, /* 21/32 in-band to broad-band ratio */
10097 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10099 { /* f1100_1750[] */
10100 12973, /* A1 = 0.79184 */
10101 -24916, /* A2 = -0.760376 */
10102 6655, /* B2 = 0.203102 */
10103 367, /* B1 = 0.0224 */
10104 6657, /* B0 = 0.203171 */
10105 5915, /* A1 = 0.361053 */
10106 -29560, /* A2 = -0.90213 */
10107 -7777, /* B2 = -0.23735 */
10109 7777, /* B0 = 0.23735 */
10110 20510, /* A1 = 1.251892 */
10111 -30260, /* A2 = -0.923462 */
10112 26662, /* B2 = 0.81366 */
10113 -20573, /* B1 = -1.255737 */
10114 26668, /* B0 = 0.813843 */
10115 7, /* Internal filter scaling */
10116 159, /* Minimum in-band energy threshold */
10117 21, /* 21/32 in-band to broad-band ratio */
10118 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10121 20392, /* A1 = -1.244629 */
10122 -32460, /* A2 = 0.990601 */
10123 -270, /* B2 = -0.008240 */
10124 0, /* B1 = 0.000000 */
10125 270, /* B0 = 0.008240 */
10126 20218, /* A1 = -1.234009 */
10127 -32655, /* A2 = 0.996582 */
10128 21337, /* B2 = 0.651154 */
10129 -13044, /* B1 = -0.796143 */
10130 21337, /* B0 = 0.651154 */
10131 20684, /* A1 = -1.262512 */
10132 -32657, /* A2 = 0.996643 */
10133 8572, /* B2 = 0.261612 */
10134 -5476, /* B1 = -0.334244 */
10135 8572, /* B0 = 0.261612 */
10136 5, /* Internal filter scaling */
10137 159, /* Minimum in-band energy threshold */
10138 21, /* 21/32 in-band to broad-band ratio */
10139 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10142 19159, /* A1 = -1.169373 */
10143 -32456, /* A2 = 0.990509 */
10144 -335, /* B2 = -0.010252 */
10145 0, /* B1 = 0.000000 */
10146 335, /* B0 = 0.010252 */
10147 18966, /* A1 = -1.157593 */
10148 -32661, /* A2 = 0.996735 */
10149 6802, /* B2 = 0.207588 */
10150 -3900, /* B1 = -0.238098 */
10151 6802, /* B0 = 0.207588 */
10152 19467, /* A1 = -1.188232 */
10153 -32661, /* A2 = 0.996765 */
10154 25035, /* B2 = 0.764008 */
10155 -15049, /* B1 = -0.918579 */
10156 25035, /* B0 = 0.764008 */
10157 5, /* Internal filter scaling */
10158 159, /* Minimum in-band energy threshold */
10159 21, /* 21/32 in-band to broad-band ratio */
10160 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10163 18976, /* A1 = -1.158264 */
10164 -32439, /* A2 = 0.989990 */
10165 -183, /* B2 = -0.005588 */
10166 0, /* B1 = 0.000000 */
10167 183, /* B0 = 0.005588 */
10168 18774, /* A1 = -1.145874 */
10169 -32650, /* A2 = 0.996429 */
10170 15468, /* B2 = 0.472076 */
10171 -8768, /* B1 = -0.535217 */
10172 15468, /* B0 = 0.472076 */
10173 19300, /* A1 = -1.177979 */
10174 -32652, /* A2 = 0.996490 */
10175 19840, /* B2 = 0.605499 */
10176 -11842, /* B1 = -0.722809 */
10177 19840, /* B0 = 0.605499 */
10178 5, /* Internal filter scaling */
10179 159, /* Minimum in-band energy threshold */
10180 21, /* 21/32 in-band to broad-band ratio */
10181 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10184 16357, /* A1 = -0.998413 */
10185 -32368, /* A2 = 0.987793 */
10186 -217, /* B2 = -0.006652 */
10187 0, /* B1 = 0.000000 */
10188 217, /* B0 = 0.006652 */
10189 16107, /* A1 = -0.983126 */
10190 -32601, /* A2 = 0.994904 */
10191 11602, /* B2 = 0.354065 */
10192 -5555, /* B1 = -0.339111 */
10193 11602, /* B0 = 0.354065 */
10194 16722, /* A1 = -1.020630 */
10195 -32603, /* A2 = 0.994965 */
10196 15574, /* B2 = 0.475311 */
10197 -8176, /* B1 = -0.499069 */
10198 15574, /* B0 = 0.475311 */
10199 5, /* Internal filter scaling */
10200 159, /* Minimum in-band energy threshold */
10201 21, /* 21/32 in-band to broad-band ratio */
10202 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10205 16234, /* A1 = -0.990875 */
10206 32404, /* A2 = -0.988922 */
10207 -193, /* B2 = -0.005908 */
10208 0, /* B1 = 0.000000 */
10209 193, /* B0 = 0.005908 */
10210 15986, /* A1 = -0.975769 */
10211 -32632, /* A2 = 0.995880 */
10212 18051, /* B2 = 0.550903 */
10213 -8658, /* B1 = -0.528473 */
10214 18051, /* B0 = 0.550903 */
10215 16591, /* A1 = -1.012695 */
10216 -32634, /* A2 = 0.995941 */
10217 15736, /* B2 = 0.480240 */
10218 -8125, /* B1 = -0.495926 */
10219 15736, /* B0 = 0.480240 */
10220 5, /* Internal filter scaling */
10221 159, /* Minimum in-band energy threshold */
10222 21, /* 21/32 in-band to broad-band ratio */
10223 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10226 15564, /* A1 = -0.949982 */
10227 -32404, /* A2 = 0.988922 */
10228 -269, /* B2 = -0.008216 */
10229 0, /* B1 = 0.000000 */
10230 269, /* B0 = 0.008216 */
10231 15310, /* A1 = -0.934479 */
10232 -32632, /* A2 = 0.995880 */
10233 10815, /* B2 = 0.330063 */
10234 -4962, /* B1 = -0.302887 */
10235 10815, /* B0 = 0.330063 */
10236 15924, /* A1 = -0.971924 */
10237 -32634, /* A2 = 0.995941 */
10238 18880, /* B2 = 0.576172 */
10239 -9364, /* B1 = -0.571594 */
10240 18880, /* B0 = 0.576172 */
10241 5, /* Internal filter scaling */
10242 159, /* Minimum in-band energy threshold */
10243 21, /* 21/32 in-band to broad-band ratio */
10244 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10247 15247, /* A1 = -0.930603 */
10248 -32397, /* A2 = 0.988708 */
10249 -244, /* B2 = -0.007451 */
10250 0, /* B1 = 0.000000 */
10251 244, /* B0 = 0.007451 */
10252 14989, /* A1 = -0.914886 */
10253 -32627, /* A2 = 0.995697 */
10254 18961, /* B2 = 0.578644 */
10255 -8498, /* B1 = -0.518707 */
10256 18961, /* B0 = 0.578644 */
10257 15608, /* A1 = -0.952667 */
10258 -32628, /* A2 = 0.995758 */
10259 11145, /* B2 = 0.340134 */
10260 -5430, /* B1 = -0.331467 */
10261 11145, /* B0 = 0.340134 */
10262 5, /* Internal filter scaling */
10263 159, /* Minimum in-band energy threshold */
10264 21, /* 21/32 in-band to broad-band ratio */
10265 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10268 14780, /* A1 = -0.902130 */
10269 -32393, /* A2 = 0.988586 */
10270 -396, /* B2 = -0.012086 */
10271 0, /* B1 = 0.000000 */
10272 396, /* B0 = 0.012086 */
10273 14510, /* A1 = -0.885651 */
10274 -32630, /* A2 = 0.995819 */
10275 6326, /* B2 = 0.193069 */
10276 -2747, /* B1 = -0.167671 */
10277 6326, /* B0 = 0.193069 */
10278 15154, /* A1 = -0.924957 */
10279 -32632, /* A2 = 0.995850 */
10280 23235, /* B2 = 0.709076 */
10281 -10983, /* B1 = -0.670380 */
10282 23235, /* B0 = 0.709076 */
10283 5, /* Internal filter scaling */
10284 159, /* Minimum in-band energy threshold */
10285 21, /* 21/32 in-band to broad-band ratio */
10286 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10289 13005, /* A1 = -0.793793 */
10290 -32368, /* A2 = 0.987823 */
10291 -500, /* B2 = -0.015265 */
10292 0, /* B1 = 0.000000 */
10293 500, /* B0 = 0.015265 */
10294 12708, /* A1 = -0.775665 */
10295 -32615, /* A2 = 0.995331 */
10296 11420, /* B2 = 0.348526 */
10297 -4306, /* B1 = -0.262833 */
10298 11420, /* B0 = 0.348526 */
10299 13397, /* A1 = -0.817688 */
10300 -32615, /* A2 = 0.995361 */
10301 9454, /* B2 = 0.288528 */
10302 -3981, /* B1 = -0.243027 */
10303 9454, /* B0 = 0.288528 */
10304 5, /* Internal filter scaling */
10305 159, /* Minimum in-band energy threshold */
10306 21, /* 21/32 in-band to broad-band ratio */
10307 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10310 10046, /* A1 = -0.613190 */
10311 -32331, /* A2 = 0.986694 */
10312 -455, /* B2 = -0.013915 */
10313 0, /* B1 = 0.000000 */
10314 455, /* B0 = 0.013915 */
10315 9694, /* A1 = -0.591705 */
10316 -32601, /* A2 = 0.994934 */
10317 6023, /* B2 = 0.183815 */
10318 -1708, /* B1 = -0.104279 */
10319 6023, /* B0 = 0.183815 */
10320 10478, /* A1 = -0.639587 */
10321 -32603, /* A2 = 0.994965 */
10322 22031, /* B2 = 0.672333 */
10323 -7342, /* B1 = -0.448151 */
10324 22031, /* B0 = 0.672333 */
10325 5, /* Internal filter scaling */
10326 159, /* Minimum in-band energy threshold */
10327 21, /* 21/32 in-band to broad-band ratio */
10328 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10330 { /* f1633_1638[] */
10331 9181, /* A1 = 0.560394 */
10332 -32256, /* A2 = -0.984375 */
10333 -556, /* B2 = -0.016975 */
10335 556, /* B0 = 0.016975 */
10336 8757, /* A1 = 0.534515 */
10337 -32574, /* A2 = -0.99408 */
10338 8443, /* B2 = 0.25769 */
10339 -2135, /* B1 = -0.130341 */
10340 8443, /* B0 = 0.25769 */
10341 9691, /* A1 = 0.591522 */
10342 -32574, /* A2 = -0.99411 */
10343 15446, /* B2 = 0.471375 */
10344 -4809, /* B1 = -0.293579 */
10345 15446, /* B0 = 0.471375 */
10346 7, /* Internal filter scaling */
10347 159, /* Minimum in-band energy threshold */
10348 21, /* 21/32 in-band to broad-band ratio */
10349 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10352 5076, /* A1 = -0.309875 */
10353 -32304, /* A2 = 0.985840 */
10354 -508, /* B2 = -0.015503 */
10355 0, /* B1 = 0.000000 */
10356 508, /* B0 = 0.015503 */
10357 4646, /* A1 = -0.283600 */
10358 -32605, /* A2 = 0.995026 */
10359 6742, /* B2 = 0.205780 */
10360 -878, /* B1 = -0.053635 */
10361 6742, /* B0 = 0.205780 */
10362 5552, /* A1 = -0.338928 */
10363 -32605, /* A2 = 0.995056 */
10364 23667, /* B2 = 0.722260 */
10365 -4297, /* B1 = -0.262329 */
10366 23667, /* B0 = 0.722260 */
10367 5, /* Internal filter scaling */
10368 159, /* Minimum in-band energy threshold */
10369 21, /* 21/32 in-band to broad-band ratio */
10370 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10373 3569, /* A1 = -0.217865 */
10374 -32292, /* A2 = 0.985504 */
10375 -239, /* B2 = -0.007322 */
10376 0, /* B1 = 0.000000 */
10377 239, /* B0 = 0.007322 */
10378 3117, /* A1 = -0.190277 */
10379 -32603, /* A2 = 0.994965 */
10380 18658, /* B2 = 0.569427 */
10381 -1557, /* B1 = -0.095032 */
10382 18658, /* B0 = 0.569427 */
10383 4054, /* A1 = -0.247437 */
10384 -32603, /* A2 = 0.994965 */
10385 18886, /* B2 = 0.576385 */
10386 -2566, /* B1 = -0.156647 */
10387 18886, /* B0 = 0.576385 */
10388 5, /* Internal filter scaling */
10389 159, /* Minimum in-band energy threshold */
10390 21, /* 21/32 in-band to broad-band ratio */
10391 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10394 static int ixj_init_filter(IXJ
*j
, IXJ_FILTER
* jf
)
10396 unsigned short cmd
;
10399 if (jf
->filter
> 3) {
10402 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, j
)) /* Select Filter */
10406 if (ixj_WriteDSPCommand(0x5152, j
)) /* Disable Filter */
10412 if (ixj_WriteDSPCommand(0x5153, j
)) /* Enable Filter */
10415 /* Select the filter (f0 - f3) to use. */
10416 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, j
))
10419 if (jf
->freq
< 12 && jf
->freq
> 3) {
10420 /* Select the frequency for the selected filter. */
10421 if (ixj_WriteDSPCommand(0x5170 + jf
->freq
, j
))
10423 } else if (jf
->freq
> 11) {
10424 /* We need to load a programmable filter set for undefined */
10425 /* frequencies. So we will point the filter to a programmable set. */
10426 /* Since there are only 4 filters and 4 programmable sets, we will */
10427 /* just point the filter to the same number set and program it for the */
10428 /* frequency we want. */
10429 if (ixj_WriteDSPCommand(0x5170 + jf
->filter
, j
))
10431 if (j
->ver
.low
!= 0x12) {
10438 if (ixj_WriteDSPCommand(cmd
, j
))
10440 for (cnt
= 0; cnt
< max
; cnt
++) {
10441 if (ixj_WriteDSPCommand(tone_table
[jf
->freq
- 12][cnt
], j
))
10445 j
->filter_en
[jf
->filter
] = jf
->enable
;
10449 static int ixj_init_filter_raw(IXJ
*j
, IXJ_FILTER_RAW
* jfr
)
10451 unsigned short cmd
;
10453 if (jfr
->filter
> 3) {
10456 if (ixj_WriteDSPCommand(0x5154 + jfr
->filter
, j
)) /* Select Filter */
10459 if (!jfr
->enable
) {
10460 if (ixj_WriteDSPCommand(0x5152, j
)) /* Disable Filter */
10465 if (ixj_WriteDSPCommand(0x5153, j
)) /* Enable Filter */
10467 /* Select the filter (f0 - f3) to use. */
10468 if (ixj_WriteDSPCommand(0x5154 + jfr
->filter
, j
))
10471 /* We need to load a programmable filter set for undefined */
10472 /* frequencies. So we will point the filter to a programmable set. */
10473 /* Since there are only 4 filters and 4 programmable sets, we will */
10474 /* just point the filter to the same number set and program it for the */
10475 /* frequency we want. */
10476 if (ixj_WriteDSPCommand(0x5170 + jfr
->filter
, j
))
10478 if (j
->ver
.low
!= 0x12) {
10485 if (ixj_WriteDSPCommand(cmd
, j
))
10487 for (cnt
= 0; cnt
< max
; cnt
++) {
10488 if (ixj_WriteDSPCommand(jfr
->coeff
[cnt
], j
))
10491 j
->filter_en
[jfr
->filter
] = jfr
->enable
;
10495 static int ixj_init_tone(IXJ
*j
, IXJ_TONE
* ti
)
10498 unsigned short data
;
10511 if(ti
->tone_index
> 12 && ti
->tone_index
< 28)
10513 if (ixj_WriteDSPCommand(0x6800 + ti
->tone_index
, j
))
10515 if (ixj_WriteDSPCommand(0x6000 + (ti
->gain1
<< 4) + ti
->gain0
, j
))
10518 if (ixj_WriteDSPCommand(data
, j
))
10521 if (ixj_WriteDSPCommand(data
, j
))