4 * Device Driver for the Internet PhoneJACK and
5 * Internet LineJACK Telephony Cards.
7 * (c) Copyright 1999 Quicknet Technologies, Inc.
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version
12 * 2 of the License, or (at your option) any later version.
14 * Author: Ed Okerson, <eokerson@quicknet.net>
16 * Contributors: Greg Herlein, <gherlein@quicknet.net>
17 * David W. Erhart, <derhart@quicknet.net>
18 * John Sellers, <jsellers@quicknet.net>
19 * Mike Preston, <mpreston@quicknet.net>
23 * 2.3.x port : Alan Cox
25 * More information about the hardware related to this driver can be found
26 * at our website: http://www.quicknet.net
30 static char ixj_c_rcsid
[] = "$Id: ixj.c,v 3.4 1999/12/16 22:18:36 root Exp root $";
32 //#define PERFMON_STATS
36 #include <linux/module.h>
37 #include <linux/config.h>
38 #include <linux/init.h>
39 #include <linux/sched.h>
40 #include <linux/kernel.h> /* printk() */
41 #include <linux/fs.h> /* everything... */
42 #include <linux/errno.h> /* error codes */
43 #include <linux/malloc.h>
45 #include <linux/ioport.h>
46 #include <linux/interrupt.h>
47 #include <linux/tqueue.h>
48 #include <linux/proc_fs.h>
49 #include <linux/poll.h>
50 #include <linux/timer.h>
51 #include <linux/delay.h>
52 #include <linux/pci.h>
55 #include <asm/segment.h>
56 #include <asm/uaccess.h>
59 #include <linux/isapnp.h>
64 #define TYPE(dev) (MINOR(dev) >> 4)
65 #define NUM(dev) (MINOR(dev) & 0xf)
67 static int ixjdebug
= 0;
68 static int hertz
= HZ
;
69 static int samplerate
= 100;
71 MODULE_PARM(ixjdebug
, "i");
73 static IXJ ixj
[IXJMAX
];
75 static struct timer_list ixj_timer
;
77 int ixj_convert_loaded
= 0;
79 /************************************************************************
81 * These are function definitions to allow external modules to register
82 * enhanced functionality call backs.
84 ************************************************************************/
86 static int Stub(IXJ
* J
, unsigned long arg
)
91 static IXJ_REGFUNC ixj_DownloadG729
= &Stub
;
92 static IXJ_REGFUNC ixj_DownloadTS85
= &Stub
;
93 static IXJ_REGFUNC ixj_PreRead
= &Stub
;
94 static IXJ_REGFUNC ixj_PostRead
= &Stub
;
95 static IXJ_REGFUNC ixj_PreWrite
= &Stub
;
96 static IXJ_REGFUNC ixj_PostWrite
= &Stub
;
97 static IXJ_REGFUNC ixj_PreIoctl
= &Stub
;
98 static IXJ_REGFUNC ixj_PostIoctl
= &Stub
;
100 static void ixj_read_frame(int board
);
101 static void ixj_write_frame(int board
);
102 static void ixj_init_timer(void);
103 static void ixj_add_timer(void);
104 static void ixj_del_timer(void);
105 static void ixj_timeout(unsigned long ptr
);
106 static int read_filters(int board
);
107 static int LineMonitor(int board
);
108 static int ixj_fasync(int fd
, struct file
*, int mode
);
109 static int ixj_hookstate(int board
);
110 static int ixj_record_start(int board
);
111 static void ixj_record_stop(int board
);
112 static int ixj_play_start(int board
);
113 static void ixj_play_stop(int board
);
114 static int ixj_set_tone_on(unsigned short arg
, int board
);
115 static int ixj_set_tone_off(unsigned short, int board
);
116 static int ixj_play_tone(int board
, char tone
);
117 static int idle(int board
);
118 static void ixj_ring_on(int board
);
119 static void ixj_ring_off(int board
);
120 static void aec_stop(int board
);
121 static void ixj_ringback(int board
);
122 static void ixj_busytone(int board
);
123 static void ixj_dialtone(int board
);
124 static void ixj_cpt_stop(int board
);
125 static char daa_int_read(int board
);
126 static int daa_set_mode(int board
, int mode
);
127 static int ixj_linetest(int board
);
128 static int ixj_daa_cid_read(int board
);
129 static void DAA_Coeff_US(int board
);
130 static void DAA_Coeff_UK(int board
);
131 static void DAA_Coeff_France(int board
);
132 static void DAA_Coeff_Germany(int board
);
133 static void DAA_Coeff_Australia(int board
);
134 static void DAA_Coeff_Japan(int board
);
135 static int ixj_init_filter(int board
, IXJ_FILTER
* jf
);
136 static int ixj_init_tone(int board
, IXJ_TONE
* ti
);
137 static int ixj_build_cadence(int board
, IXJ_CADENCE
* cp
);
138 // Serial Control Interface funtions
139 static int SCI_Control(int board
, int control
);
140 static int SCI_Prepare(int board
);
141 static int SCI_WaitHighSCI(int board
);
142 static int SCI_WaitLowSCI(int board
);
143 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
);
145 /************************************************************************
146 CT8020/CT8021 Host Programmers Model
147 Host address Function Access
149 0-1 Aux Software Status Register (reserved) Read Only
150 2-3 Software Status Register Read Only
151 4-5 Aux Software Control Register (reserved) Read Write
152 6-7 Software Control Register Read Write
153 8-9 Hardware Status Register Read Only
154 A-B Hardware Control Register Read Write
155 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
156 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
157 ************************************************************************/
159 extern __inline__
void ixj_read_HSR(int board
)
161 ixj
[board
].hsr
.bytes
.low
= inb_p(ixj
[board
].DSPbase
+ 8);
162 ixj
[board
].hsr
.bytes
.high
= inb_p(ixj
[board
].DSPbase
+ 9);
164 extern __inline__
int IsControlReady(int board
)
167 return ixj
[board
].hsr
.bits
.controlrdy
? 1 : 0;
170 extern __inline__
int IsStatusReady(int board
)
173 return ixj
[board
].hsr
.bits
.statusrdy
? 1 : 0;
176 extern __inline__
int IsRxReady(int board
)
179 return ixj
[board
].hsr
.bits
.rxrdy
? 1 : 0;
182 extern __inline__
int IsTxReady(int board
)
185 return ixj
[board
].hsr
.bits
.txrdy
? 1 : 0;
188 extern __inline__ BYTE
SLIC_GetState(int board
)
190 IXJ
*j
= &ixj
[board
];
192 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
194 return j
->pld_slicr
.bits
.state
;
197 static BOOL
SLIC_SetState(BYTE byState
, int board
)
199 BOOL fRetVal
= FALSE
;
200 IXJ
*j
= &ixj
[board
];
202 // Set the C1, C2, C3 & B2EN signals.
204 case PLD_SLIC_STATE_OC
:
205 j
->pld_slicw
.bits
.c1
= 0;
206 j
->pld_slicw
.bits
.c2
= 0;
207 j
->pld_slicw
.bits
.c3
= 0;
208 j
->pld_slicw
.bits
.b2en
= 0;
209 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
212 case PLD_SLIC_STATE_RINGING
:
213 j
->pld_slicw
.bits
.c1
= 1;
214 j
->pld_slicw
.bits
.c2
= 0;
215 j
->pld_slicw
.bits
.c3
= 0;
216 j
->pld_slicw
.bits
.b2en
= 1;
217 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
220 case PLD_SLIC_STATE_ACTIVE
:
221 j
->pld_slicw
.bits
.c1
= 0;
222 j
->pld_slicw
.bits
.c2
= 1;
223 j
->pld_slicw
.bits
.c3
= 0;
224 j
->pld_slicw
.bits
.b2en
= 0;
225 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
228 case PLD_SLIC_STATE_OHT
: // On-hook transmit
230 j
->pld_slicw
.bits
.c1
= 1;
231 j
->pld_slicw
.bits
.c2
= 1;
232 j
->pld_slicw
.bits
.c3
= 0;
233 j
->pld_slicw
.bits
.b2en
= 0;
234 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
237 case PLD_SLIC_STATE_TIPOPEN
:
238 j
->pld_slicw
.bits
.c1
= 0;
239 j
->pld_slicw
.bits
.c2
= 0;
240 j
->pld_slicw
.bits
.c3
= 1;
241 j
->pld_slicw
.bits
.b2en
= 0;
242 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
245 case PLD_SLIC_STATE_STANDBY
:
246 j
->pld_slicw
.bits
.c1
= 1;
247 j
->pld_slicw
.bits
.c2
= 0;
248 j
->pld_slicw
.bits
.c3
= 1;
249 j
->pld_slicw
.bits
.b2en
= 1;
250 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
253 case PLD_SLIC_STATE_APR
: // Active polarity reversal
255 j
->pld_slicw
.bits
.c1
= 0;
256 j
->pld_slicw
.bits
.c2
= 1;
257 j
->pld_slicw
.bits
.c3
= 1;
258 j
->pld_slicw
.bits
.b2en
= 0;
259 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
262 case PLD_SLIC_STATE_OHTPR
: // OHT polarity reversal
264 j
->pld_slicw
.bits
.c1
= 1;
265 j
->pld_slicw
.bits
.c2
= 1;
266 j
->pld_slicw
.bits
.c3
= 1;
267 j
->pld_slicw
.bits
.b2en
= 0;
268 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
279 int ixj_register(int index
, IXJ_REGFUNC regfunc
)
285 ixj_DownloadG729
= regfunc
;
286 for (cnt
= 0; cnt
< IXJMAX
; cnt
++)
287 ixj_DownloadG729(&ixj
[cnt
], 0L);
290 ixj_DownloadTS85
= regfunc
;
291 for (cnt
= 0; cnt
< IXJMAX
; cnt
++)
292 ixj_DownloadTS85(&ixj
[cnt
], 0L);
295 ixj_PreRead
= regfunc
;
298 ixj_PostRead
= regfunc
;
301 ixj_PreWrite
= regfunc
;
304 ixj_PostWrite
= regfunc
;
307 ixj_PreIoctl
= regfunc
;
310 ixj_PostIoctl
= regfunc
;
318 int ixj_unregister(int index
)
323 ixj_DownloadG729
= &Stub
;
326 ixj_DownloadTS85
= &Stub
;
332 ixj_PostRead
= &Stub
;
335 ixj_PreWrite
= &Stub
;
338 ixj_PostWrite
= &Stub
;
341 ixj_PreIoctl
= &Stub
;
344 ixj_PostIoctl
= &Stub
;
352 static void ixj_init_timer(void)
354 init_timer(&ixj_timer
);
355 ixj_timer
.function
= ixj_timeout
;
356 ixj_timer
.data
= (int) NULL
;
359 static void ixj_add_timer(void)
361 ixj_timer
.expires
= jiffies
+ (hertz
/ samplerate
);
362 add_timer(&ixj_timer
);
365 static void ixj_del_timer(void)
367 del_timer(&ixj_timer
);
370 static void ixj_tone_timeout(int board
)
372 IXJ
*j
= &ixj
[board
];
376 if (j
->tone_state
== 3) {
379 j
->tone_cadence_state
++;
380 if (j
->tone_cadence_state
>= j
->cadence_t
->elements_used
)
382 switch (j
->cadence_t
->termination
)
387 case REPEAT_LAST_ELEMENT
:
388 j
->tone_cadence_state
--;
389 ixj_play_tone(board
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
392 j
->tone_cadence_state
= 0;
393 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
)
395 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
396 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
397 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
398 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
399 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
400 ixj_init_tone(board
, &ti
);
402 ixj_set_tone_on(j
->cadence_t
->ce
[0].tone_on_time
, board
);
403 ixj_set_tone_off(j
->cadence_t
->ce
[0].tone_off_time
, board
);
404 ixj_play_tone(board
, j
->cadence_t
->ce
[0].index
);
408 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
)
410 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
411 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
412 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
413 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
414 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
415 ixj_init_tone(board
, &ti
);
417 ixj_set_tone_on(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_on_time
, board
);
418 ixj_set_tone_off(j
->cadence_t
->ce
[j
->tone_cadence_state
].tone_off_time
, board
);
419 ixj_play_tone(board
, j
->cadence_t
->ce
[j
->tone_cadence_state
].index
);
425 static void ixj_timeout(unsigned long ptr
)
431 for (board
= 0; board
< IXJMAX
; board
++)
442 if (!ixj_hookstate(board
))
448 j
->ex
.bits
.hookstate
= 1;
450 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of change
454 if (j
->tone_state
== 1)
455 jifon
= (hertz
* j
->tone_on_time
* 25 / 100000);
457 jifon
= (hertz
* j
->tone_on_time
* 25 / 100000) +
458 (hertz
* j
->tone_off_time
* 25 / 100000);
459 if (jiffies
< j
->tone_start_jif
+ jifon
) {
460 if (j
->tone_state
== 1) {
461 ixj_play_tone(board
, j
->tone_index
);
462 if (j
->dsp
.low
== 0x20) {
466 ixj_play_tone(board
, 0);
467 if (j
->dsp
.low
== 0x20) {
472 ixj_tone_timeout(board
);
473 if (j
->flags
.dialtone
) {
476 if (j
->flags
.busytone
) {
478 if (j
->dsp
.low
== 0x20) {
482 if (j
->flags
.ringback
) {
484 if (j
->dsp
.low
== 0x20) {
488 if (!j
->tone_state
) {
489 if (j
->dsp
.low
== 0x20 || (j
->play_mode
== -1 && j
->rec_mode
== -1))
491 if (j
->dsp
.low
== 0x20 && j
->play_mode
!= -1)
492 ixj_play_start(board
);
493 if (j
->dsp
.low
== 0x20 && j
->rec_mode
!= -1)
494 ixj_record_start(board
);
498 if (!j
->tone_state
|| j
->dsp
.low
!= 0x20) {
499 if (IsRxReady(board
)) {
500 ixj_read_frame(board
);
502 if (IsTxReady(board
)) {
503 ixj_write_frame(board
);
506 if (j
->flags
.cringing
) {
507 if (ixj_hookstate(board
) & 1) {
508 j
->flags
.cringing
= 0;
511 if (jiffies
- j
->ring_cadence_jif
>= (.5 * hertz
)) {
513 if (j
->ring_cadence_t
== -1)
514 j
->ring_cadence_t
= 15;
515 j
->ring_cadence_jif
= jiffies
;
517 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
525 if (!j
->flags
.ringing
) {
526 if (ixj_hookstate(board
)) {
527 if (j
->dsp
.low
== 0x21 &&
528 j
->pld_slicr
.bits
.state
!= PLD_SLIC_STATE_ACTIVE
)
531 SLIC_SetState(PLD_SLIC_STATE_ACTIVE
, board
);
535 ixj_WriteDSPCommand(0x511B, board
);
536 j
->proc_load
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
538 j
->m_hook
= j
->ex
.bits
.hookstate
= 1;
540 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of change
543 if (j
->dsp
.low
== 0x21 &&
544 j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_ACTIVE
)
547 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, board
);
549 if (j
->ex
.bits
.dtmf_ready
) {
550 j
->dtmf_wp
= j
->dtmf_rp
= j
->ex
.bits
.dtmf_ready
= 0;
554 j
->ex
.bits
.hookstate
= 1;
556 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of change
560 if (j
->cardtype
== 300) {
561 if (j
->flags
.pstn_present
) {
562 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
563 if (jiffies
>= j
->pstn_sleeptil
&& j
->pld_scrr
.bits
.daaflag
) {
565 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.RING
) {
566 if (!j
->flags
.pstn_ringing
) {
567 j
->flags
.pstn_ringing
= 1;
568 if (j
->daa_mode
!= SOP_PU_RINGING
)
569 daa_set_mode(board
, SOP_PU_RINGING
);
572 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
573 j
->pstn_winkstart
= 0;
574 if (j
->flags
.pstn_ringing
&& !j
->pstn_envelope
) {
575 j
->ex
.bits
.pstn_ring
= 0;
576 j
->pstn_envelope
= 1;
577 j
->pstn_ring_start
= jiffies
;
580 if (j
->flags
.pstn_ringing
&& j
->pstn_envelope
&&
581 jiffies
> j
->pstn_ring_start
+ ((hertz
* 15) / 10)) {
582 j
->ex
.bits
.pstn_ring
= 1;
583 j
->pstn_envelope
= 0;
584 } else if (j
->daa_mode
== SOP_PU_CONVERSATION
) {
585 if (!j
->pstn_winkstart
) {
586 j
->pstn_winkstart
= jiffies
;
587 } else if (jiffies
> j
->pstn_winkstart
+ (hertz
* j
->winktime
/ 1000)) {
588 daa_set_mode(board
, SOP_PU_SLEEP
);
589 j
->pstn_winkstart
= 0;
590 j
->ex
.bits
.pstn_wink
= 1;
593 j
->ex
.bits
.pstn_ring
= 0;
596 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Cadence
) {
597 if (j
->daa_mode
== SOP_PU_RINGING
) {
598 daa_set_mode(board
, SOP_PU_SLEEP
);
599 j
->flags
.pstn_ringing
= 0;
600 j
->ex
.bits
.pstn_ring
= 0;
603 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.Caller_ID
) {
604 if (j
->daa_mode
== SOP_PU_RINGING
&& j
->flags
.pstn_ringing
) {
605 j
->pstn_cid_intr
= 1;
606 j
->pstn_cid_recieved
= jiffies
;
610 if (j
->pld_scrr
.bits
.daaflag
) {
613 j
->ex
.bits
.pstn_ring
= 0;
614 if (j
->pstn_cid_intr
&& jiffies
> j
->pstn_cid_recieved
+ (hertz
* 3)) {
615 if (j
->daa_mode
== SOP_PU_RINGING
) {
616 ixj_daa_cid_read(board
);
617 j
->ex
.bits
.caller_id
= 1;
619 j
->pstn_cid_intr
= 0;
621 j
->ex
.bits
.caller_id
= 0;
623 if (!j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
624 if (j
->flags
.pstn_ringing
&& j
->pstn_envelope
) {
625 j
->ex
.bits
.pstn_ring
= 1;
626 j
->pstn_envelope
= 0;
627 } else if (j
->daa_mode
== SOP_PU_CONVERSATION
) {
628 if (!j
->pstn_winkstart
) {
629 j
->pstn_winkstart
= jiffies
;
630 } else if (jiffies
> j
->pstn_winkstart
+ (hertz
* 320 / 1000)) {
631 daa_set_mode(board
, SOP_PU_SLEEP
);
632 j
->pstn_winkstart
= 0;
633 j
->ex
.bits
.pstn_wink
= 1;
640 if ((j
->ex
.bits
.f0
|| j
->ex
.bits
.f1
|| j
->ex
.bits
.f2
|| j
->ex
.bits
.f3
)
641 && j
->filter_cadence
) {
644 wake_up_interruptible(&j
->poll_q
); // Wake any blocked selects
646 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of change
656 static int ixj_status_wait(int board
)
661 while (!IsStatusReady(board
)) {
662 if (jiffies
- jif
> (60 * (hertz
/ 100))) {
669 int ixj_WriteDSPCommand(unsigned short cmd
, int board
)
674 bytes
.high
= (cmd
& 0xFF00) >> 8;
675 bytes
.low
= cmd
& 0x00FF;
677 while (!IsControlReady(board
)) {
678 if (jiffies
- jif
> (60 * (hertz
/ 100))) {
682 outb_p(bytes
.low
, ixj
[board
].DSPbase
+ 6);
683 outb_p(bytes
.high
, ixj
[board
].DSPbase
+ 7);
685 if (ixj_status_wait(board
)) {
686 ixj
[board
].ssr
.low
= 0xFF;
687 ixj
[board
].ssr
.high
= 0xFF;
690 /* Read Software Status Register */
691 ixj
[board
].ssr
.low
= inb_p(ixj
[board
].DSPbase
+ 2);
692 ixj
[board
].ssr
.high
= inb_p(ixj
[board
].DSPbase
+ 3);
696 /***************************************************************************
698 * General Purpose IO Register read routine
700 ***************************************************************************/
701 extern __inline__
int ixj_gpio_read(int board
)
703 if (ixj_WriteDSPCommand(0x5143, board
))
706 ixj
[board
].gpio
.bytes
.low
= ixj
[board
].ssr
.low
;
707 ixj
[board
].gpio
.bytes
.high
= ixj
[board
].ssr
.high
;
712 extern __inline__
void LED_SetState(int state
, int board
)
714 if (ixj
[board
].dsp
.low
== 0x21) {
715 ixj
[board
].pld_scrw
.bits
.led1
= state
& 0x1 ? 1 : 0;
716 ixj
[board
].pld_scrw
.bits
.led2
= state
& 0x2 ? 1 : 0;
717 ixj
[board
].pld_scrw
.bits
.led3
= state
& 0x4 ? 1 : 0;
718 ixj
[board
].pld_scrw
.bits
.led4
= state
& 0x8 ? 1 : 0;
720 outb_p(ixj
[board
].pld_scrw
.byte
, ixj
[board
].XILINXbase
);
724 /*********************************************************************
725 * GPIO Pins are configured as follows on the Quicknet Internet
726 * PhoneJACK Telephony Cards
728 * POTS Select GPIO_6=0 GPIO_7=0
729 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
730 * Handset Select GPIO_6=1 GPIO_7=0
732 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
733 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
734 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
736 * Hook Switch changes reported on GPIO_3
737 *********************************************************************/
738 static int ixj_set_port(int board
, int arg
)
740 IXJ
*j
= &ixj
[board
];
742 if (j
->cardtype
== 400) {
743 if (arg
!= PORT_POTS
)
751 switch (j
->cardtype
) {
753 j
->pld_slicw
.pcib
.mic
= 0;
754 j
->pld_slicw
.pcib
.spk
= 0;
755 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
758 if (ixj_WriteDSPCommand(0xC528, board
)) /* Write CODEC config to
759 Software Control Register */
761 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
763 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
764 j
->pld_clock
.byte
= 0;
765 outb_p(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
766 j
->pld_slicw
.bits
.rly1
= 1;
767 j
->pld_slicw
.bits
.spken
= 0;
768 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
769 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, board
);
772 j
->gpio
.bytes
.high
= 0x0B;
773 j
->gpio
.bits
.gpio6
= 0;
774 j
->gpio
.bits
.gpio7
= 0;
775 ixj_WriteDSPCommand(j
->gpio
.word
, board
);
780 if (j
->cardtype
== 300) {
781 ixj_WriteDSPCommand(0xC534, board
); /* Write CODEC config to Software Control Register */
783 j
->pld_slicw
.bits
.rly3
= 0;
784 j
->pld_slicw
.bits
.rly1
= 1;
785 j
->pld_slicw
.bits
.spken
= 0;
786 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
793 j
->port
= PORT_SPEAKER
;
794 switch (j
->cardtype
) {
796 j
->pld_slicw
.pcib
.mic
= 1;
797 j
->pld_slicw
.pcib
.spk
= 1;
798 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
803 j
->gpio
.bytes
.high
= 0x0B;
804 j
->gpio
.bits
.gpio6
= 0;
805 j
->gpio
.bits
.gpio7
= 1;
806 ixj_WriteDSPCommand(j
->gpio
.word
, board
);
811 if (j
->cardtype
== 300 || j
->cardtype
== 500) {
814 j
->gpio
.bytes
.high
= 0x0B;
815 j
->gpio
.bits
.gpio6
= 1;
816 j
->gpio
.bits
.gpio7
= 0;
817 ixj_WriteDSPCommand(j
->gpio
.word
, board
);
818 j
->port
= PORT_HANDSET
;
828 static int ixj_set_pots(int board
, int arg
)
830 IXJ
*j
= &ixj
[board
];
832 if (j
->cardtype
== 300) {
834 if (j
->port
== PORT_PSTN
) {
835 j
->pld_slicw
.bits
.rly1
= 0;
836 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
842 j
->pld_slicw
.bits
.rly1
= 1;
843 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
851 static void ixj_ring_on(int board
)
853 IXJ
*j
= &ixj
[board
];
854 if (j
->dsp
.low
== 0x20) // Internet PhoneJACK
857 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", board
);
859 j
->gpio
.bytes
.high
= 0x0B;
860 j
->gpio
.bytes
.low
= 0x00;
861 j
->gpio
.bits
.gpio1
= 1;
862 j
->gpio
.bits
.gpio2
= 1;
863 j
->gpio
.bits
.gpio5
= 0;
864 ixj_WriteDSPCommand(j
->gpio
.word
, board
); /* send the ring signal */
865 } else // Internet LineJACK, Internet PhoneJACK Lite or
866 // Internet PhoneJACK PCI
869 printk(KERN_INFO
"IXJ Ring On /dev/phone%d\n", board
);
871 SLIC_SetState(PLD_SLIC_STATE_RINGING
, board
);
875 static int ixj_hookstate(int board
)
878 IXJ
*j
= &ixj
[board
];
881 switch (j
->cardtype
) {
883 ixj_gpio_read(board
);
884 fOffHook
= j
->gpio
.bits
.gpio3read
? 1 : 0;
889 SLIC_GetState(board
);
890 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_ACTIVE
||
891 j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_STANDBY
)
893 if (j
->flags
.ringing
)
897 det
= jiffies
+ (hertz
/ 50);
898 while (time_before(jiffies
, det
)) {
899 current
->state
= TASK_INTERRUPTIBLE
;
903 SLIC_GetState(board
);
904 if (j
->pld_slicr
.bits
.state
== PLD_SLIC_STATE_RINGING
) {
908 if (j
->cardtype
== 500) {
909 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
910 fOffHook
= j
->pld_scrr
.pcib
.det
? 1 : 0;
912 fOffHook
= j
->pld_slicr
.bits
.det
? 1 : 0;
916 if (j
->r_hook
!= fOffHook
) {
917 j
->r_hook
= fOffHook
;
918 if (j
->port
!= PORT_POTS
) {
919 j
->ex
.bits
.hookstate
= 1;
921 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of change
925 if (j
->port
== PORT_PSTN
&& j
->daa_mode
== SOP_PU_CONVERSATION
)
928 if (j
->port
== PORT_SPEAKER
)
931 if (j
->port
== PORT_HANDSET
)
937 static void ixj_ring_off(board
)
939 IXJ
*j
= &ixj
[board
];
941 if (j
->dsp
.low
== 0x20) // Internet PhoneJACK
944 printk(KERN_INFO
"IXJ Ring Off\n");
945 j
->gpio
.bytes
.high
= 0x0B;
946 j
->gpio
.bytes
.low
= 0x00;
947 j
->gpio
.bits
.gpio1
= 0;
948 j
->gpio
.bits
.gpio2
= 1;
949 j
->gpio
.bits
.gpio5
= 0;
950 ixj_WriteDSPCommand(j
->gpio
.word
, board
);
951 } else // Internet LineJACK
954 printk(KERN_INFO
"IXJ Ring Off\n");
956 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, board
);
958 SLIC_GetState(board
);
962 static void ixj_ring_start(int board
)
964 IXJ
*j
= &ixj
[board
];
966 j
->flags
.cringing
= 1;
967 if (ixj_hookstate(board
) & 1) {
968 if (j
->port
== PORT_POTS
)
970 j
->flags
.cringing
= 0;
972 j
->ring_cadence_jif
= jiffies
;
973 j
->ring_cadence_t
= 15;
974 if (j
->ring_cadence
& 1 << j
->ring_cadence_t
) {
982 static int ixj_ring(int board
)
985 unsigned long jif
, det
;
986 IXJ
*j
= &ixj
[board
];
988 j
->flags
.ringing
= 1;
989 if (ixj_hookstate(board
) & 1) {
991 j
->flags
.ringing
= 0;
995 for (cntr
= 0; cntr
< j
->maxrings
; cntr
++) {
996 jif
= jiffies
+ (1 * hertz
);
998 while (time_before(jiffies
, jif
)) {
999 if (ixj_hookstate(board
) & 1) {
1000 ixj_ring_off(board
);
1001 j
->flags
.ringing
= 0;
1004 current
->state
= TASK_INTERRUPTIBLE
;
1005 schedule_timeout(1);
1006 if(signal_pending(current
))
1009 jif
= jiffies
+ (3 * hertz
);
1010 ixj_ring_off(board
);
1011 while (time_before(jiffies
, jif
)) {
1012 if (ixj_hookstate(board
) & 1) {
1013 det
= jiffies
+ (hertz
/ 100);
1014 while (time_before(jiffies
, det
)) {
1015 current
->state
= TASK_INTERRUPTIBLE
;
1016 schedule_timeout(1);
1017 if(signal_pending(current
))
1020 if (ixj_hookstate(board
) & 1) {
1021 j
->flags
.ringing
= 0;
1025 current
->state
= TASK_INTERRUPTIBLE
;
1026 schedule_timeout(1);
1027 if(signal_pending(current
))
1031 ixj_ring_off(board
);
1032 j
->flags
.ringing
= 0;
1036 int ixj_open(struct phone_device
*p
, struct file
*file_p
)
1038 IXJ
*j
= &ixj
[p
->board
];
1043 if (file_p
->f_mode
& FMODE_READ
)
1045 if (file_p
->f_mode
& FMODE_WRITE
)
1051 // printk(KERN_INFO "Opening board %d\n", NUM(inode->i_rdev));
1052 printk(KERN_INFO
"Opening board %d\n", p
->board
);
1057 int ixj_release(struct inode
*inode
, struct file
*file_p
)
1060 int board
= NUM(inode
->i_rdev
);
1061 IXJ
*j
= &ixj
[board
];
1064 printk(KERN_INFO
"Closing board %d\n", NUM(inode
->i_rdev
));
1066 daa_set_mode(board
, SOP_PU_SLEEP
);
1067 ixj_set_port(board
, PORT_POTS
);
1069 ixj_play_stop(board
);
1070 ixj_record_stop(board
);
1092 ixj_init_tone(board
, &ti
);
1098 ixj_init_tone(board
, &ti
);
1104 ixj_init_tone(board
, &ti
);
1110 ixj_init_tone(board
, &ti
);
1116 ixj_init_tone(board
, &ti
);
1122 ixj_init_tone(board
, &ti
);
1128 ixj_init_tone(board
, &ti
);
1134 ixj_init_tone(board
, &ti
);
1140 ixj_init_tone(board
, &ti
);
1146 ixj_init_tone(board
, &ti
);
1152 ixj_init_tone(board
, &ti
);
1158 ixj_init_tone(board
, &ti
);
1164 ixj_init_tone(board
, &ti
);
1170 ixj_init_tone(board
, &ti
);
1176 ixj_init_tone(board
, &ti
);
1180 if (file_p
->f_mode
& FMODE_READ
)
1182 if (file_p
->f_mode
& FMODE_WRITE
)
1185 if (j
->read_buffer
&& !j
->readers
) {
1186 kfree(j
->read_buffer
);
1187 j
->read_buffer
= NULL
;
1188 j
->read_buffer_size
= 0;
1190 if (j
->write_buffer
&& !j
->writers
) {
1191 kfree(j
->write_buffer
);
1192 j
->write_buffer
= NULL
;
1193 j
->write_buffer_size
= 0;
1195 j
->rec_codec
= j
->play_codec
= 0;
1196 j
->rec_frame_size
= j
->play_frame_size
= 0;
1197 ixj_fasync(-1, file_p
, 0); // remove from list of async notification
1203 static int read_filters(int board
)
1205 unsigned short fc
, cnt
;
1206 IXJ
*j
= &ixj
[board
];
1208 if (ixj_WriteDSPCommand(0x5144, board
))
1211 fc
= j
->ssr
.high
<< 8 | j
->ssr
.low
;
1212 if (fc
== j
->frame_count
)
1215 j
->frame_count
= fc
;
1217 for (cnt
= 0; cnt
< 4; cnt
++) {
1218 if (ixj_WriteDSPCommand(0x5154 + cnt
, board
))
1221 if (ixj_WriteDSPCommand(0x515C, board
))
1224 j
->filter_hist
[cnt
] = j
->ssr
.high
<< 8 | j
->ssr
.low
;
1225 if ((j
->filter_hist
[cnt
] & 1 && !(j
->filter_hist
[cnt
] & 2)) ||
1226 (j
->filter_hist
[cnt
] & 2 && !(j
->filter_hist
[cnt
] & 1))) {
1246 static int LineMonitor(int board
)
1248 IXJ
*j
= &ixj
[board
];
1255 if (ixj_WriteDSPCommand(0x7000, board
)) // Line Monitor
1259 j
->dtmf
.bytes
.high
= j
->ssr
.high
;
1260 j
->dtmf
.bytes
.low
= j
->ssr
.low
;
1261 if (!j
->dtmf_state
&& j
->dtmf
.bits
.dtmf_valid
) {
1263 j
->dtmf_current
= j
->dtmf
.bits
.digit
;
1265 if (j
->dtmf_state
&& !j
->dtmf
.bits
.dtmf_valid
) // && j->dtmf_wp != j->dtmf_rp)
1267 j
->dtmfbuffer
[j
->dtmf_wp
] = j
->dtmf_current
;
1269 if (j
->dtmf_wp
== 79)
1271 j
->ex
.bits
.dtmf_ready
= 1;
1279 ssize_t
ixj_read(struct file
* file_p
, char *buf
, size_t length
, loff_t
* ppos
)
1281 unsigned long i
= *ppos
;
1282 IXJ
*j
= &ixj
[NUM(file_p
->f_dentry
->d_inode
->i_rdev
)];
1283 DECLARE_WAITQUEUE(wait
, current
);
1285 add_wait_queue(&j
->read_q
, &wait
);
1286 current
->state
= TASK_INTERRUPTIBLE
;
1289 while (!j
->read_buffer_ready
|| (j
->dtmf_state
&& j
->flags
.dtmf_oob
)) {
1291 if (file_p
->f_flags
& O_NONBLOCK
) {
1292 current
->state
= TASK_RUNNING
;
1293 remove_wait_queue(&j
->read_q
, &wait
);
1296 if (!ixj_hookstate(NUM(file_p
->f_dentry
->d_inode
->i_rdev
))) {
1297 current
->state
= TASK_RUNNING
;
1298 remove_wait_queue(&j
->read_q
, &wait
);
1301 interruptible_sleep_on(&j
->read_q
);
1302 if (signal_pending(current
)) {
1303 current
->state
= TASK_RUNNING
;
1304 remove_wait_queue(&j
->read_q
, &wait
);
1309 remove_wait_queue(&j
->read_q
, &wait
);
1310 current
->state
= TASK_RUNNING
;
1311 /* Don't ever copy more than the user asks */
1312 i
= copy_to_user(buf
, j
->read_buffer
, min(length
, j
->read_buffer_size
));
1313 j
->read_buffer_ready
= 0;
1317 return min(length
, j
->read_buffer_size
);
1320 ssize_t
ixj_enhanced_read(struct file
* file_p
, char *buf
, size_t length
,
1324 ssize_t read_retval
= 0;
1325 IXJ
*j
= &ixj
[NUM(file_p
->f_dentry
->d_inode
->i_rdev
)];
1327 pre_retval
= ixj_PreRead(j
, 0L);
1328 switch (pre_retval
) {
1330 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
1331 ixj_PostRead(j
, 0L);
1334 read_retval
= ixj_read(file_p
, buf
, length
, ppos
);
1337 ixj_PostRead(j
, 0L);
1340 read_retval
= pre_retval
;
1345 ssize_t
ixj_write(struct file
* file_p
, const char *buf
, size_t count
, loff_t
* ppos
)
1347 unsigned long i
= *ppos
;
1348 int board
= NUM(file_p
->f_dentry
->d_inode
->i_rdev
);
1349 IXJ
*j
= &ixj
[board
];
1350 DECLARE_WAITQUEUE(wait
, current
);
1352 add_wait_queue(&j
->read_q
, &wait
);
1353 current
->state
= TASK_INTERRUPTIBLE
;
1357 while (!j
->write_buffers_empty
) {
1359 if (file_p
->f_flags
& O_NONBLOCK
) {
1360 current
->state
= TASK_RUNNING
;
1361 remove_wait_queue(&j
->read_q
, &wait
);
1364 if (!ixj_hookstate(NUM(file_p
->f_dentry
->d_inode
->i_rdev
))) {
1365 current
->state
= TASK_RUNNING
;
1366 remove_wait_queue(&j
->read_q
, &wait
);
1369 interruptible_sleep_on(&j
->write_q
);
1370 if (signal_pending(current
)) {
1371 current
->state
= TASK_RUNNING
;
1372 remove_wait_queue(&j
->read_q
, &wait
);
1376 current
->state
= TASK_RUNNING
;
1377 remove_wait_queue(&j
->read_q
, &wait
);
1378 if (j
->write_buffer_wp
+ count
>= j
->write_buffer_end
)
1379 j
->write_buffer_wp
= j
->write_buffer
;
1380 i
= copy_from_user(j
->write_buffer_wp
, buf
, min(count
, j
->write_buffer_size
));
1384 return min(count
, j
->write_buffer_size
);
1387 ssize_t
ixj_enhanced_write(struct file
* file_p
, const char *buf
, size_t count
,
1391 ssize_t write_retval
= 0;
1392 IXJ
*j
= &ixj
[NUM(file_p
->f_dentry
->d_inode
->i_rdev
)];
1394 pre_retval
= ixj_PreWrite(j
, 0L);
1395 switch (pre_retval
) {
1397 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
1398 if (write_retval
!= -EFAULT
) {
1399 ixj_PostWrite(j
, 0L);
1400 j
->write_buffer_wp
+= count
;
1401 j
->write_buffers_empty
--;
1405 write_retval
= ixj_write(file_p
, buf
, count
, ppos
);
1406 if (write_retval
!= -EFAULT
) {
1407 j
->write_buffer_wp
+= count
;
1408 j
->write_buffers_empty
--;
1412 ixj_PostWrite(j
, 0L);
1415 write_retval
= pre_retval
;
1417 return write_retval
;
1420 static void ixj_read_frame(int board
)
1423 IXJ
*j
= &ixj
[board
];
1425 if (j
->read_buffer
) {
1426 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
1427 if (!(cnt
% 16) && !IsRxReady(board
)) {
1429 while (!IsRxReady(board
)) {
1437 // Throw away word 0 of the 8021 compressed format to get standard G.729.
1438 if (j
->rec_codec
== G729
&& (cnt
== 0 || cnt
== 5 || cnt
== 10)) {
1439 inb_p(j
->DSPbase
+ 0x0E);
1440 inb_p(j
->DSPbase
+ 0x0F);
1442 *(j
->read_buffer
+ cnt
) = inb_p(j
->DSPbase
+ 0x0E);
1443 *(j
->read_buffer
+ cnt
+ 1) = inb_p(j
->DSPbase
+ 0x0F);
1445 #ifdef PERFMON_STATS
1448 if (j
->intercom
!= -1) {
1449 if (IsTxReady(j
->intercom
)) {
1450 for (cnt
= 0; cnt
< j
->rec_frame_size
* 2; cnt
+= 2) {
1451 if (!(cnt
% 16) && !IsTxReady(board
)) {
1453 while (!IsTxReady(board
)) {
1461 outb_p(*(j
->read_buffer
+ cnt
), ixj
[j
->intercom
].DSPbase
+ 0x0C);
1462 outb_p(*(j
->read_buffer
+ cnt
+ 1), ixj
[j
->intercom
].DSPbase
+ 0x0D);
1464 #ifdef PERFMON_STATS
1465 ++ixj
[j
->intercom
].frameswritten
;
1469 j
->read_buffer_ready
= 1;
1470 wake_up_interruptible(&j
->read_q
); // Wake any blocked readers
1472 wake_up_interruptible(&j
->poll_q
); // Wake any blocked selects
1475 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of frame
1481 static void ixj_write_frame(int board
)
1483 int cnt
, frame_count
, dly
;
1485 IXJ
*j
= &ixj
[board
];
1488 if (j
->write_buffer
&& j
->write_buffers_empty
< 2) {
1489 if (j
->write_buffer_wp
> j
->write_buffer_rp
) {
1491 (j
->write_buffer_wp
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
1493 if (j
->write_buffer_rp
> j
->write_buffer_wp
) {
1495 (j
->write_buffer_wp
- j
->write_buffer
) / (j
->play_frame_size
* 2) +
1496 (j
->write_buffer_end
- j
->write_buffer_rp
) / (j
->play_frame_size
* 2);
1498 if (frame_count
>= 1) {
1499 if (j
->ver
.low
== 0x12 && j
->play_mode
&& j
->flags
.play_first_frame
) {
1500 switch (j
->play_mode
) {
1501 case PLAYBACK_MODE_ULAW
:
1502 case PLAYBACK_MODE_ALAW
:
1503 blankword
.low
= blankword
.high
= 0xFF;
1505 case PLAYBACK_MODE_8LINEAR
:
1506 case PLAYBACK_MODE_16LINEAR
:
1507 blankword
.low
= blankword
.high
= 0x00;
1509 case PLAYBACK_MODE_8LINEAR_WSS
:
1510 blankword
.low
= blankword
.high
= 0x80;
1513 for (cnt
= 0; cnt
< 16; cnt
++) {
1514 if (!(cnt
% 16) && !IsTxReady(board
)) {
1516 while (!IsTxReady(board
)) {
1524 outb_p((blankword
.low
), j
->DSPbase
+ 0x0C);
1525 outb_p((blankword
.high
), j
->DSPbase
+ 0x0D);
1527 j
->flags
.play_first_frame
= 0;
1529 for (cnt
= 0; cnt
< j
->play_frame_size
* 2; cnt
+= 2) {
1530 if (!(cnt
% 16) && !IsTxReady(board
)) {
1532 while (!IsTxReady(board
)) {
1540 // Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG
1541 // so all frames are type 1.
1542 if (j
->play_codec
== G729
&& (cnt
== 0 || cnt
== 5 || cnt
== 10)) {
1543 outb_p(0x01, j
->DSPbase
+ 0x0C);
1544 outb_p(0x00, j
->DSPbase
+ 0x0D);
1546 outb_p(*(j
->write_buffer_rp
+ cnt
), j
->DSPbase
+ 0x0C);
1547 outb_p(*(j
->write_buffer_rp
+ cnt
+ 1), j
->DSPbase
+ 0x0D);
1548 *(j
->write_buffer_rp
+ cnt
) = 0;
1549 *(j
->write_buffer_rp
+ cnt
+ 1) = 0;
1551 j
->write_buffer_rp
+= j
->play_frame_size
* 2;
1552 if (j
->write_buffer_rp
>= j
->write_buffer_end
) {
1553 j
->write_buffer_rp
= j
->write_buffer
;
1555 j
->write_buffers_empty
++;
1556 wake_up_interruptible(&(j
->write_q
)); // Wake any blocked writers
1558 wake_up_interruptible(&j
->poll_q
); // Wake any blocked selects
1561 kill_fasync(j
->async_queue
, SIGIO
, POLL_IN
); // Send apps notice of empty buffer
1562 #ifdef PERFMON_STATS
1571 static int idle(int board
)
1573 IXJ
*j
= &ixj
[board
];
1575 if (ixj_WriteDSPCommand(0x0000, board
)) // DSP Idle
1578 if (j
->ssr
.high
|| j
->ssr
.low
)
1584 static int set_base_frame(int board
, int size
)
1588 IXJ
*j
= &ixj
[board
];
1591 for (cnt
= 0; cnt
< 10; cnt
++) {
1595 if (j
->ssr
.high
|| j
->ssr
.low
)
1597 if (j
->dsp
.low
!= 0x20) {
1601 /* Set Base Frame Size to 240 pg9-10 8021 */
1605 /* Set Base Frame Size to 160 pg9-10 8021 */
1609 /* Set Base Frame Size to 80 pg9-10 8021 */
1620 if (ixj_WriteDSPCommand(cmd
, board
)) {
1621 j
->baseframe
.high
= j
->baseframe
.low
= 0xFF;
1624 j
->baseframe
.high
= j
->ssr
.high
;
1625 j
->baseframe
.low
= j
->ssr
.low
;
1630 static int set_rec_codec(int board
, int rate
)
1633 IXJ
*j
= &ixj
[board
];
1635 j
->rec_codec
= rate
;
1639 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
1640 j
->rec_frame_size
= 12;
1647 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
1648 j
->rec_frame_size
= 10;
1655 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
1656 j
->rec_frame_size
= 16;
1663 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
1664 j
->rec_frame_size
= 9;
1671 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
1672 j
->rec_frame_size
= 8;
1679 if (j
->dsp
.low
!= 0x20) {
1680 j
->rec_frame_size
= 48;
1687 if (j
->dsp
.low
!= 0x20) {
1688 if (!j
->flags
.g729_loaded
) {
1692 switch (j
->baseframe
.low
) {
1694 j
->rec_frame_size
= 10;
1697 j
->rec_frame_size
= 5;
1700 j
->rec_frame_size
= 15;
1709 switch (j
->baseframe
.low
) {
1711 j
->rec_frame_size
= 80;
1714 j
->rec_frame_size
= 40;
1717 j
->rec_frame_size
= 120;
1723 switch (j
->baseframe
.low
) {
1725 j
->rec_frame_size
= 80;
1728 j
->rec_frame_size
= 40;
1731 j
->rec_frame_size
= 120;
1737 switch (j
->baseframe
.low
) {
1739 j
->rec_frame_size
= 160;
1742 j
->rec_frame_size
= 80;
1745 j
->rec_frame_size
= 240;
1751 switch (j
->baseframe
.low
) {
1753 j
->rec_frame_size
= 80;
1756 j
->rec_frame_size
= 40;
1759 j
->rec_frame_size
= 120;
1765 switch (j
->baseframe
.low
) {
1767 j
->rec_frame_size
= 80;
1770 j
->rec_frame_size
= 40;
1773 j
->rec_frame_size
= 120;
1779 j
->rec_frame_size
= 0;
1781 if (j
->read_buffer
) {
1782 kfree(j
->read_buffer
);
1783 j
->read_buffer
= NULL
;
1784 j
->read_buffer_size
= 0;
1792 static int ixj_record_start(int board
)
1794 unsigned short cmd
= 0x0000;
1795 IXJ
*j
= &ixj
[board
];
1798 switch (j
->rec_codec
) {
1806 cmd
= 0x5130; // TrueSpeech 8.5
1810 cmd
= 0x5133; // TrueSpeech 4.8
1814 cmd
= 0x5134; // TrueSpeech 4.1
1826 if (ixj_WriteDSPCommand(cmd
, board
))
1829 if (!j
->read_buffer
) {
1830 if (!j
->read_buffer
)
1831 j
->read_buffer
= kmalloc(j
->rec_frame_size
* 2, GFP_ATOMIC
);
1832 if (!j
->read_buffer
) {
1833 printk("Read buffer allocation for ixj board %d failed!\n", board
);
1837 j
->read_buffer_size
= j
->rec_frame_size
* 2;
1839 if (ixj_WriteDSPCommand(0x5102, board
)) // Set Poll sync mode
1843 switch (j
->rec_mode
) {
1845 cmd
= 0x1C03; // Record C1
1849 if (j
->ver
.low
== 0x12) {
1850 cmd
= 0x1E03; // Record C1
1853 cmd
= 0x1E01; // Record C1
1858 if (j
->ver
.low
== 0x12) {
1859 cmd
= 0x1E83; // Record C1
1862 cmd
= 0x1E81; // Record C1
1867 if (j
->ver
.low
== 0x12) {
1868 cmd
= 0x1F03; // Record C1
1871 cmd
= 0x1F01; // Record C1
1876 if (j
->ver
.low
== 0x12) {
1877 cmd
= 0x1F83; // Record C1
1880 cmd
= 0x1F81; // Record C1
1885 if (ixj_WriteDSPCommand(cmd
, board
))
1891 static void ixj_record_stop(int board
)
1893 IXJ
*j
= &ixj
[board
];
1895 if (j
->rec_mode
> -1) {
1896 ixj_WriteDSPCommand(0x5120, board
);
1901 static void set_rec_depth(int board
, int depth
)
1907 ixj_WriteDSPCommand(0x5180 + depth
, board
);
1910 static void set_rec_volume(int board
, int volume
)
1912 ixj_WriteDSPCommand(0xCF03, board
);
1913 ixj_WriteDSPCommand(volume
, board
);
1916 static int get_rec_level(int board
)
1918 IXJ
*j
= &ixj
[board
];
1920 ixj_WriteDSPCommand(0xCF88, board
);
1922 return j
->ssr
.high
<< 8 | j
->ssr
.low
;
1925 static void ixj_aec_start(int board
, int level
)
1927 IXJ
*j
= &ixj
[board
];
1929 j
->aec_level
= level
;
1931 ixj_WriteDSPCommand(0xB002, board
);
1933 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
) {
1934 ixj_WriteDSPCommand(0xE022, board
); // Move AEC filter buffer
1936 ixj_WriteDSPCommand(0x0300, board
);
1938 ixj_WriteDSPCommand(0xB001, board
); // AEC On
1940 ixj_WriteDSPCommand(0xE013, board
); // Advanced AEC C1
1944 ixj_WriteDSPCommand(0x0000, board
); // Advanced AEC C2 = off
1946 ixj_WriteDSPCommand(0xE011, board
);
1947 ixj_WriteDSPCommand(0xFFFF, board
);
1951 ixj_WriteDSPCommand(0x0600, board
); // Advanced AEC C2 = on medium
1953 ixj_WriteDSPCommand(0xE011, board
);
1954 ixj_WriteDSPCommand(0x0080, board
);
1958 ixj_WriteDSPCommand(0x0C00, board
); // Advanced AEC C2 = on high
1960 ixj_WriteDSPCommand(0xE011, board
);
1961 ixj_WriteDSPCommand(0x0080, board
);
1967 static void aec_stop(int board
)
1969 IXJ
*j
= &ixj
[board
];
1971 if (j
->rec_codec
== G729
|| j
->play_codec
== G729
) {
1972 ixj_WriteDSPCommand(0xE022, board
); // Move AEC filter buffer back
1974 ixj_WriteDSPCommand(0x0700, board
);
1976 if (ixj
[board
].play_mode
!= -1 && ixj
[board
].rec_mode
!= -1);
1978 ixj_WriteDSPCommand(0xB002, board
); // AEC Stop
1983 static int set_play_codec(int board
, int rate
)
1986 IXJ
*j
= &ixj
[board
];
1988 j
->play_codec
= rate
;
1992 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
1993 j
->play_frame_size
= 12;
2000 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
2001 j
->play_frame_size
= 10;
2008 if (j
->dsp
.low
== 0x20 || j
->flags
.ts85_loaded
) {
2009 j
->play_frame_size
= 16;
2016 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
2017 j
->play_frame_size
= 9;
2024 if (j
->ver
.low
!= 0x12 || ixj_convert_loaded
) {
2025 j
->play_frame_size
= 8;
2032 if (j
->dsp
.low
!= 0x20) {
2033 j
->play_frame_size
= 48;
2040 if (j
->dsp
.low
!= 0x20) {
2041 if (!j
->flags
.g729_loaded
) {
2045 switch (j
->baseframe
.low
) {
2047 j
->play_frame_size
= 10;
2050 j
->play_frame_size
= 5;
2053 j
->play_frame_size
= 15;
2062 switch (j
->baseframe
.low
) {
2064 j
->play_frame_size
= 80;
2067 j
->play_frame_size
= 40;
2070 j
->play_frame_size
= 120;
2076 switch (j
->baseframe
.low
) {
2078 j
->play_frame_size
= 80;
2081 j
->play_frame_size
= 40;
2084 j
->play_frame_size
= 120;
2090 switch (j
->baseframe
.low
) {
2092 j
->play_frame_size
= 160;
2095 j
->play_frame_size
= 80;
2098 j
->play_frame_size
= 240;
2104 switch (j
->baseframe
.low
) {
2106 j
->play_frame_size
= 80;
2109 j
->play_frame_size
= 40;
2112 j
->play_frame_size
= 120;
2118 switch (j
->baseframe
.low
) {
2120 j
->play_frame_size
= 80;
2123 j
->play_frame_size
= 40;
2126 j
->play_frame_size
= 120;
2132 j
->play_frame_size
= 0;
2134 if (j
->write_buffer
) {
2135 kfree(j
->write_buffer
);
2136 j
->write_buffer
= NULL
;
2137 j
->write_buffer_size
= 0;
2145 static int ixj_play_start(int board
)
2147 unsigned short cmd
= 0x0000;
2148 IXJ
*j
= &ixj
[board
];
2150 j
->flags
.play_first_frame
= 1;
2153 if (!j
->play_mode
) {
2154 switch (j
->play_codec
) {
2162 cmd
= 0x5230; // TrueSpeech 8.5
2166 cmd
= 0x5233; // TrueSpeech 4.8
2170 cmd
= 0x5234; // TrueSpeech 4.1
2182 if (ixj_WriteDSPCommand(cmd
, board
))
2185 if (!j
->write_buffer
) {
2186 j
->write_buffer
= kmalloc(j
->play_frame_size
* 2, GFP_ATOMIC
);
2187 if (!j
->write_buffer
) {
2188 printk("Write buffer allocation for ixj board %d failed!\n", board
);
2192 j
->write_buffers_empty
= 2;
2193 j
->write_buffer_size
= j
->play_frame_size
* 2;
2194 j
->write_buffer_end
= j
->write_buffer
+ j
->play_frame_size
* 2;
2195 j
->write_buffer_rp
= j
->write_buffer_wp
= j
->write_buffer
;
2197 if (ixj_WriteDSPCommand(0x5202, board
)) // Set Poll sync mode
2201 switch (j
->play_mode
) {
2206 if (j
->ver
.low
== 0x12) {
2213 if (j
->ver
.low
== 0x12) {
2220 if (j
->ver
.low
== 0x12) {
2227 if (j
->ver
.low
== 0x12) {
2234 if (ixj_WriteDSPCommand(cmd
, board
))
2237 if (ixj_WriteDSPCommand(0x2000, board
)) // Playback C2
2241 if (ixj_WriteDSPCommand(0x2000 + ixj
[board
].play_frame_size
, board
)) // Playback C3
2248 static void ixj_play_stop(int board
)
2250 IXJ
*j
= &ixj
[board
];
2252 if (j
->play_mode
> -1) {
2253 ixj_WriteDSPCommand(0x5221, board
); // Stop playback
2259 extern __inline__
void set_play_depth(int board
, int depth
)
2265 ixj_WriteDSPCommand(0x5280 + depth
, board
);
2268 extern __inline__
void set_play_volume(int board
, int volume
)
2270 ixj_WriteDSPCommand(0xCF02, board
);
2271 ixj_WriteDSPCommand(volume
, board
);
2274 extern __inline__
int get_play_level(int board
)
2276 ixj_WriteDSPCommand(0xCF8F, board
);
2277 return ixj
[board
].ssr
.high
<< 8 | ixj
[board
].ssr
.low
;
2280 static unsigned int ixj_poll(struct file
*file_p
, poll_table
* wait
)
2282 unsigned int mask
= 0;
2283 IXJ
*j
= &ixj
[NUM(file_p
->f_dentry
->d_inode
->i_rdev
)];
2285 poll_wait(file_p
, &(j
->poll_q
), wait
);
2286 if (j
->read_buffer_ready
> 0)
2287 mask
|= POLLIN
| POLLRDNORM
; /* readable */
2288 if (j
->write_buffers_empty
> 0)
2289 mask
|= POLLOUT
| POLLWRNORM
; /* writable */
2295 static int ixj_play_tone(int board
, char tone
)
2297 IXJ
*j
= &ixj
[board
];
2302 j
->tone_index
= tone
;
2303 if (ixj_WriteDSPCommand(0x6000 + j
->tone_index
, board
))
2306 if (!j
->tone_state
) {
2307 j
->tone_start_jif
= jiffies
;
2314 static int ixj_set_tone_on(unsigned short arg
, int board
)
2316 IXJ
*j
= &ixj
[board
];
2318 j
->tone_on_time
= arg
;
2320 if (ixj_WriteDSPCommand(0x6E04, board
)) // Set Tone On Period
2324 if (ixj_WriteDSPCommand(arg
, board
))
2330 static int SCI_WaitHighSCI(int board
)
2333 IXJ
*j
= &ixj
[board
];
2335 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
2336 if (!j
->pld_scrr
.bits
.sci
) {
2337 for (cnt
= 0; cnt
< 10; cnt
++) {
2339 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
2341 if ((j
->pld_scrr
.bits
.sci
))
2345 printk(KERN_INFO
"SCI Wait High failed %x\n", j
->pld_scrr
.byte
);
2351 static int SCI_WaitLowSCI(int board
)
2354 IXJ
*j
= &ixj
[board
];
2356 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
2357 if (j
->pld_scrr
.bits
.sci
) {
2358 for (cnt
= 0; cnt
< 10; cnt
++) {
2360 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
2362 if (!(j
->pld_scrr
.bits
.sci
))
2366 printk(KERN_INFO
"SCI Wait Low failed %x\n", j
->pld_scrr
.byte
);
2372 static int SCI_Control(int board
, int control
)
2374 IXJ
*j
= &ixj
[board
];
2378 j
->pld_scrw
.bits
.c0
= 0; // Set PLD Serial control interface
2380 j
->pld_scrw
.bits
.c1
= 0; // to no selection
2383 case SCI_Enable_DAA
:
2384 j
->pld_scrw
.bits
.c0
= 1; // Set PLD Serial control interface
2386 j
->pld_scrw
.bits
.c1
= 0; // to write to DAA
2389 case SCI_Enable_Mixer
:
2390 j
->pld_scrw
.bits
.c0
= 0; // Set PLD Serial control interface
2392 j
->pld_scrw
.bits
.c1
= 1; // to write to mixer
2395 case SCI_Enable_EEPROM
:
2396 j
->pld_scrw
.bits
.c0
= 1; // Set PLD Serial control interface
2398 j
->pld_scrw
.bits
.c1
= 1; // to write to EEPROM
2405 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
2411 case SCI_Enable_DAA
:
2412 case SCI_Enable_Mixer
:
2413 case SCI_Enable_EEPROM
:
2414 if (!SCI_WaitHighSCI(board
))
2424 static int SCI_Prepare(int board
)
2426 if (!SCI_Control(board
, SCI_End
))
2429 if (!SCI_WaitLowSCI(board
))
2435 static int ixj_mixer(long val
, int board
)
2438 IXJ
*j
= &ixj
[board
];
2440 bytes
.high
= (val
& 0xFF00) >> 8;
2441 bytes
.low
= val
& 0x00FF;
2443 outb_p(bytes
.high
& 0x1F, j
->XILINXbase
+ 0x03); // Load Mixer Address
2445 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02); // Load Mixer Data
2447 SCI_Control(board
, SCI_Enable_Mixer
);
2449 SCI_Control(board
, SCI_End
);
2454 static int daa_load(BYTES
* p_bytes
, int board
)
2456 IXJ
*j
= &ixj
[board
];
2458 outb_p(p_bytes
->high
, j
->XILINXbase
+ 0x03);
2459 outb_p(p_bytes
->low
, j
->XILINXbase
+ 0x02);
2460 if (!SCI_Control(board
, SCI_Enable_DAA
))
2466 static int ixj_daa_cr4(int board
, char reg
)
2468 IXJ
*j
= &ixj
[board
];
2471 switch (j
->daa_mode
) {
2475 case SOP_PU_RINGING
:
2478 case SOP_PU_CONVERSATION
:
2481 case SOP_PU_PULSEDIALING
:
2486 switch (j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGX
) {
2488 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 0;
2491 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 2;
2494 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 1;
2497 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.bitreg
.AGR_Z
= 3;
2501 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
2503 if (!daa_load(&bytes
, board
))
2506 if (!SCI_Prepare(board
))
2512 static char daa_int_read(int board
)
2515 IXJ
*j
= &ixj
[board
];
2517 if (!SCI_Prepare(board
))
2522 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2523 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2525 if (!SCI_Control(board
, SCI_Enable_DAA
))
2528 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
2529 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
2530 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
2532 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
2535 if (!SCI_Control(board
, SCI_Enable_DAA
))
2537 if (!SCI_Control(board
, SCI_End
))
2540 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
2541 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
2543 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.reg
= bytes
.high
;
2547 static int ixj_daa_cid_reset(int board
)
2551 IXJ
*j
= &ixj
[board
];
2553 if (!SCI_Prepare(board
))
2558 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2559 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2561 if (!SCI_Control(board
, SCI_Enable_DAA
))
2564 if (!SCI_WaitHighSCI(board
))
2567 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
- 1; i
+= 2) {
2568 bytes
.high
= bytes
.low
= 0x00;
2569 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2571 if (i
< ALISDAA_CALLERID_SIZE
- 1)
2572 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2574 if (!SCI_Control(board
, SCI_Enable_DAA
))
2577 if (!SCI_WaitHighSCI(board
))
2582 if (!SCI_Control(board
, SCI_End
))
2588 static int ixj_daa_cid_read(int board
)
2592 char CID
[ALISDAA_CALLERID_SIZE
], mContinue
;
2594 IXJ
*j
= &ixj
[board
];
2596 if (!SCI_Prepare(board
))
2601 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2602 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2604 if (!SCI_Control(board
, SCI_Enable_DAA
))
2607 if (!SCI_WaitHighSCI(board
))
2610 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
2611 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
2612 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
2614 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
2617 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
+= 2) {
2618 bytes
.high
= bytes
.low
= 0x00;
2619 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2620 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2622 if (!SCI_Control(board
, SCI_Enable_DAA
))
2625 if (!SCI_WaitHighSCI(board
))
2628 CID
[i
+ 0] = inb_p(j
->XILINXbase
+ 0x03);
2629 CID
[i
+ 1] = inb_p(j
->XILINXbase
+ 0x02);
2632 if (!SCI_Control(board
, SCI_End
))
2636 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
2639 if ((pIn
[1] & 0x03) == 0x01) {
2642 if ((pIn
[2] & 0x0c) == 0x04) {
2643 pOut
[1] = ((pIn
[2] & 0x03) << 6) | ((pIn
[1] & 0xfc) >> 2);
2645 if ((pIn
[3] & 0x30) == 0x10) {
2646 pOut
[2] = ((pIn
[3] & 0x0f) << 4) | ((pIn
[2] & 0xf0) >> 4);
2648 if ((pIn
[4] & 0xc0) == 0x40) {
2649 pOut
[3] = ((pIn
[4] & 0x3f) << 2) | ((pIn
[3] & 0xc0) >> 6);
2653 pIn
+= 5, pOut
+= 4;
2655 memset(&j
->cid
, 0, sizeof(IXJ_CID
));
2656 pOut
= j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
;
2658 strncpy(j
->cid
.month
, pOut
, 2);
2660 strncpy(j
->cid
.day
, pOut
, 2);
2662 strncpy(j
->cid
.hour
, pOut
, 2);
2664 strncpy(j
->cid
.min
, pOut
, 2);
2666 j
->cid
.numlen
= *pOut
;
2668 strncpy(j
->cid
.number
, pOut
, j
->cid
.numlen
);
2669 pOut
+= j
->cid
.numlen
+ 1;
2670 j
->cid
.namelen
= *pOut
;
2672 strncpy(j
->cid
.name
, pOut
, j
->cid
.namelen
);
2674 ixj_daa_cid_reset(board
);
2678 static char daa_get_version(int board
)
2681 IXJ
*j
= &ixj
[board
];
2683 if (!SCI_Prepare(board
))
2688 outb_p(bytes
.high
, j
->XILINXbase
+ 0x03);
2689 outb_p(bytes
.low
, j
->XILINXbase
+ 0x02);
2691 if (!SCI_Control(board
, SCI_Enable_DAA
))
2694 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
2695 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
2696 if (bytes
.low
!= ALISDAA_ID_BYTE
) {
2698 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes
.high
, bytes
.low
);
2701 if (!SCI_Control(board
, SCI_Enable_DAA
))
2704 if (!SCI_Control(board
, SCI_End
))
2707 bytes
.high
= inb_p(j
->XILINXbase
+ 0x03);
2708 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
2710 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes
.high
, bytes
.low
);
2711 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr5
.reg
= bytes
.high
;
2715 static int daa_set_mode(int board
, int mode
)
2718 // The DAA *MUST* be in the conversation mode if the
2719 // PSTN line is to be seized (PSTN line off-hook).
2720 // Taking the PSTN line off-hook while the DAA is in
2721 // a mode other than conversation mode will cause a
2722 // hardware failure of the ALIS-A part.
2725 // The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
2726 // if the PSTN line is on-hook. Failure to have the PSTN line
2727 // in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
2733 IXJ
*j
= &ixj
[board
];
2735 if (!SCI_Prepare(board
))
2740 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
2742 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
2743 j
->pld_slicw
.bits
.rly2
= 0;
2744 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
2746 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
2747 daa_load(&bytes
, board
);
2748 if (!SCI_Prepare(board
))
2750 j
->daa_mode
= SOP_PU_SLEEP
;
2751 j
->flags
.pstn_ringing
= 0;
2752 j
->pstn_sleeptil
= jiffies
+ (hertz
* 3);
2754 case SOP_PU_RINGING
:
2755 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
2757 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
2758 j
->pld_slicw
.bits
.rly2
= 0;
2759 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
2761 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
2762 daa_load(&bytes
, board
);
2763 if (!SCI_Prepare(board
))
2765 j
->daa_mode
= SOP_PU_RINGING
;
2767 case SOP_PU_CONVERSATION
:
2769 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
2770 daa_load(&bytes
, board
);
2771 if (!SCI_Prepare(board
))
2773 j
->pld_slicw
.bits
.rly2
= 1;
2774 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
2775 j
->pld_scrw
.bits
.daafsyncen
= 1; // Turn on DAA Frame Sync
2777 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
2778 j
->daa_mode
= SOP_PU_CONVERSATION
;
2779 j
->flags
.pstn_ringing
= 0;
2780 j
->ex
.bits
.pstn_ring
= 0;
2782 case SOP_PU_PULSEDIALING
:
2783 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
2785 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
2786 j
->pld_slicw
.bits
.rly2
= 0;
2787 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
2789 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
2790 daa_load(&bytes
, board
);
2791 if (!SCI_Prepare(board
))
2793 j
->daa_mode
= SOP_PU_PULSEDIALING
;
2801 static int ixj_daa_write(int board
)
2804 IXJ
*j
= &ixj
[board
];
2806 if (!SCI_Prepare(board
))
2810 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
;
2811 if (!daa_load(&bytes
, board
))
2814 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
;
2815 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
;
2816 if (!daa_load(&bytes
, board
))
2819 bytes
.high
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
;
2820 bytes
.low
= j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
;
2821 if (!daa_load(&bytes
, board
))
2824 if (!SCI_Prepare(board
))
2828 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
;
2829 if (!daa_load(&bytes
, board
))
2832 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
;
2833 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
;
2834 if (!daa_load(&bytes
, board
))
2837 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
;
2838 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
;
2839 if (!daa_load(&bytes
, board
))
2842 bytes
.high
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
;
2843 bytes
.low
= j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
;
2844 if (!daa_load(&bytes
, board
))
2847 bytes
.high
= j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
;
2849 if (!daa_load(&bytes
, board
))
2852 if (!SCI_Prepare(board
))
2856 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7];
2857 if (!daa_load(&bytes
, board
))
2860 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6];
2861 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5];
2862 if (!daa_load(&bytes
, board
))
2865 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4];
2866 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3];
2867 if (!daa_load(&bytes
, board
))
2870 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2];
2871 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1];
2872 if (!daa_load(&bytes
, board
))
2875 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0];
2877 if (!daa_load(&bytes
, board
))
2880 if (!SCI_Control(board
, SCI_End
))
2882 if (!SCI_WaitLowSCI(board
))
2886 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7];
2887 if (!daa_load(&bytes
, board
))
2890 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6];
2891 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5];
2892 if (!daa_load(&bytes
, board
))
2895 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4];
2896 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3];
2897 if (!daa_load(&bytes
, board
))
2900 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2];
2901 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1];
2902 if (!daa_load(&bytes
, board
))
2905 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0];
2907 if (!daa_load(&bytes
, board
))
2910 if (!SCI_Control(board
, SCI_End
))
2912 if (!SCI_WaitLowSCI(board
))
2916 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7];
2917 if (!daa_load(&bytes
, board
))
2920 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6];
2921 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5];
2922 if (!daa_load(&bytes
, board
))
2925 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4];
2926 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3];
2927 if (!daa_load(&bytes
, board
))
2930 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2];
2931 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1];
2932 if (!daa_load(&bytes
, board
))
2935 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0];
2937 if (!daa_load(&bytes
, board
))
2940 if (!SCI_Control(board
, SCI_End
))
2942 if (!SCI_WaitLowSCI(board
))
2946 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7];
2947 if (!daa_load(&bytes
, board
))
2950 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6];
2951 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5];
2952 if (!daa_load(&bytes
, board
))
2955 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4];
2956 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3];
2957 if (!daa_load(&bytes
, board
))
2960 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2];
2961 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1];
2962 if (!daa_load(&bytes
, board
))
2965 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0];
2967 if (!daa_load(&bytes
, board
))
2970 if (!SCI_Control(board
, SCI_End
))
2972 if (!SCI_WaitLowSCI(board
))
2976 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7];
2977 if (!daa_load(&bytes
, board
))
2980 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6];
2981 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5];
2982 if (!daa_load(&bytes
, board
))
2985 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4];
2986 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3];
2987 if (!daa_load(&bytes
, board
))
2990 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2];
2991 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1];
2992 if (!daa_load(&bytes
, board
))
2995 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0];
2997 if (!daa_load(&bytes
, board
))
3000 if (!SCI_Control(board
, SCI_End
))
3002 if (!SCI_WaitLowSCI(board
))
3006 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7];
3007 if (!daa_load(&bytes
, board
))
3010 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6];
3011 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5];
3012 if (!daa_load(&bytes
, board
))
3015 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4];
3016 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3];
3017 if (!daa_load(&bytes
, board
))
3020 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2];
3021 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1];
3022 if (!daa_load(&bytes
, board
))
3025 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0];
3027 if (!daa_load(&bytes
, board
))
3030 if (!SCI_Control(board
, SCI_End
))
3032 if (!SCI_WaitLowSCI(board
))
3036 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7];
3037 if (!daa_load(&bytes
, board
))
3040 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6];
3041 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5];
3042 if (!daa_load(&bytes
, board
))
3045 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4];
3046 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3];
3047 if (!daa_load(&bytes
, board
))
3050 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2];
3051 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1];
3052 if (!daa_load(&bytes
, board
))
3055 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0];
3057 if (!daa_load(&bytes
, board
))
3060 if (!SCI_Control(board
, SCI_End
))
3062 if (!SCI_WaitLowSCI(board
))
3066 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7];
3067 if (!daa_load(&bytes
, board
))
3070 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6];
3071 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5];
3072 if (!daa_load(&bytes
, board
))
3075 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4];
3076 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3];
3077 if (!daa_load(&bytes
, board
))
3080 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2];
3081 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1];
3082 if (!daa_load(&bytes
, board
))
3085 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0];
3087 if (!daa_load(&bytes
, board
))
3090 if (!SCI_Control(board
, SCI_End
))
3092 if (!SCI_WaitLowSCI(board
))
3096 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7];
3097 if (!daa_load(&bytes
, board
))
3100 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6];
3101 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5];
3102 if (!daa_load(&bytes
, board
))
3105 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4];
3106 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3];
3107 if (!daa_load(&bytes
, board
))
3110 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2];
3111 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1];
3112 if (!daa_load(&bytes
, board
))
3115 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0];
3117 if (!daa_load(&bytes
, board
))
3120 if (!SCI_Control(board
, SCI_End
))
3122 if (!SCI_WaitLowSCI(board
))
3126 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3];
3127 if (!daa_load(&bytes
, board
))
3130 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2];
3131 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1];
3132 if (!daa_load(&bytes
, board
))
3135 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0];
3137 if (!daa_load(&bytes
, board
))
3140 if (!SCI_Control(board
, SCI_End
))
3142 if (!SCI_WaitLowSCI(board
))
3146 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3];
3147 if (!daa_load(&bytes
, board
))
3150 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2];
3151 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1];
3152 if (!daa_load(&bytes
, board
))
3155 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0];
3157 if (!daa_load(&bytes
, board
))
3160 if (!SCI_Control(board
, SCI_End
))
3162 if (!SCI_WaitLowSCI(board
))
3166 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3];
3167 if (!daa_load(&bytes
, board
))
3170 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2];
3171 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1];
3172 if (!daa_load(&bytes
, board
))
3175 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0];
3177 if (!daa_load(&bytes
, board
))
3180 if (!SCI_Control(board
, SCI_End
))
3182 if (!SCI_WaitLowSCI(board
))
3186 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3];
3187 if (!daa_load(&bytes
, board
))
3190 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2];
3191 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1];
3192 if (!daa_load(&bytes
, board
))
3195 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0];
3197 if (!daa_load(&bytes
, board
))
3200 if (!SCI_Control(board
, SCI_End
))
3202 if (!SCI_WaitLowSCI(board
))
3206 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3];
3207 if (!daa_load(&bytes
, board
))
3210 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2];
3211 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1];
3212 if (!daa_load(&bytes
, board
))
3215 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0];
3217 if (!daa_load(&bytes
, board
))
3220 if (!SCI_Control(board
, SCI_End
))
3222 if (!SCI_WaitLowSCI(board
))
3226 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7];
3227 if (!daa_load(&bytes
, board
))
3230 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6];
3231 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5];
3232 if (!daa_load(&bytes
, board
))
3235 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4];
3236 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3];
3237 if (!daa_load(&bytes
, board
))
3240 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2];
3241 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1];
3242 if (!daa_load(&bytes
, board
))
3245 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0];
3247 if (!daa_load(&bytes
, board
))
3250 if (!SCI_Control(board
, SCI_End
))
3252 if (!SCI_WaitLowSCI(board
))
3256 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7];
3257 if (!daa_load(&bytes
, board
))
3260 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6];
3261 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5];
3262 if (!daa_load(&bytes
, board
))
3265 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4];
3266 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3];
3267 if (!daa_load(&bytes
, board
))
3270 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2];
3271 bytes
.low
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1];
3272 if (!daa_load(&bytes
, board
))
3275 bytes
.high
= j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0];
3277 if (!daa_load(&bytes
, board
))
3281 j
->pld_scrr
.byte
= inb_p(j
->XILINXbase
);
3282 if (!SCI_Control(board
, SCI_End
))
3288 int ixj_set_tone_off(unsigned short arg
, int board
)
3290 ixj
[board
].tone_off_time
= arg
;
3292 if (ixj_WriteDSPCommand(0x6E05, board
)) // Set Tone Off Period
3296 if (ixj_WriteDSPCommand(arg
, board
))
3302 static int ixj_get_tone_on(int board
)
3304 if (ixj_WriteDSPCommand(0x6E06, board
)) // Get Tone On Period
3311 static int ixj_get_tone_off(int board
)
3313 if (ixj_WriteDSPCommand(0x6E07, board
)) // Get Tone Off Period
3320 static void ixj_busytone(int board
)
3322 ixj
[board
].flags
.ringback
= 0;
3323 ixj
[board
].flags
.dialtone
= 0;
3324 ixj
[board
].flags
.busytone
= 1;
3326 ixj_set_tone_on(0x07D0, board
);
3327 ixj_set_tone_off(0x07D0, board
);
3328 ixj_play_tone(board
, 27);
3331 static void ixj_dialtone(int board
)
3333 ixj
[board
].flags
.ringback
= 0;
3334 ixj
[board
].flags
.dialtone
= 1;
3335 ixj
[board
].flags
.busytone
= 0;
3337 if (ixj
[board
].dsp
.low
== 0x20) {
3340 ixj_set_tone_on(0xFFFF, board
);
3341 ixj_set_tone_off(0x0000, board
);
3343 ixj_play_tone(board
, 25);
3347 static void ixj_cpt_stop(board
)
3349 IXJ
*j
= &ixj
[board
];
3351 j
->flags
.dialtone
= 0;
3352 j
->flags
.busytone
= 0;
3353 j
->flags
.ringback
= 0;
3355 ixj_set_tone_on(0x0001, board
);
3356 ixj_set_tone_off(0x0000, board
);
3358 ixj_play_tone(board
, 0);
3364 if (j
->cadence_t
->ce
) {
3365 kfree(j
->cadence_t
->ce
);
3367 kfree(j
->cadence_t
);
3368 j
->cadence_t
= NULL
;
3371 if (j
->dsp
.low
== 0x20 || (j
->play_mode
== -1 && j
->rec_mode
== -1))
3373 if (j
->play_mode
!= -1)
3374 ixj_play_start(board
);
3375 if (j
->rec_mode
!= -1)
3376 ixj_record_start(board
);
3379 static void ixj_ringback(int board
)
3381 ixj
[board
].flags
.busytone
= 0;
3382 ixj
[board
].flags
.dialtone
= 0;
3383 ixj
[board
].flags
.ringback
= 1;
3385 ixj_set_tone_on(0x0FA0, board
);
3386 ixj_set_tone_off(0x2EE0, board
);
3387 ixj_play_tone(board
, 26);
3390 static void ixj_testram(int board
)
3392 ixj_WriteDSPCommand(0x3001, board
); /* Test External SRAM */
3395 static int ixj_build_cadence(int board
, IXJ_CADENCE
* cp
)
3398 IXJ_CADENCE_ELEMENT
*lcep
;
3400 IXJ
*j
= &ixj
[board
];
3402 lcp
= kmalloc(sizeof(IXJ_CADENCE
), GFP_KERNEL
);
3406 if (copy_from_user(lcp
, (char *) cp
, sizeof(IXJ_CADENCE
)))
3409 lcep
= kmalloc(sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
, GFP_KERNEL
);
3414 if (copy_from_user(lcep
, lcp
->ce
, sizeof(IXJ_CADENCE_ELEMENT
) * lcp
->elements_used
))
3419 kfree(j
->cadence_t
->ce
);
3420 kfree(j
->cadence_t
);
3423 lcp
->ce
= (void *) lcep
;
3425 j
->tone_cadence_state
= 0;
3426 ixj_set_tone_on(lcp
->ce
[0].tone_on_time
, board
);
3427 ixj_set_tone_off(lcp
->ce
[0].tone_off_time
, board
);
3428 if (j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
) {
3429 ti
.tone_index
= j
->cadence_t
->ce
[j
->tone_cadence_state
].index
;
3430 ti
.freq0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq0
;
3431 ti
.gain0
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain0
;
3432 ti
.freq1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].freq1
;
3433 ti
.gain1
= j
->cadence_t
->ce
[j
->tone_cadence_state
].gain1
;
3434 ixj_init_tone(board
, &ti
);
3436 ixj_play_tone(board
, lcp
->ce
[0].index
);
3441 static void add_caps(int board
)
3443 IXJ
*j
= &ixj
[board
];
3446 j
->caplist
[j
->caps
].cap
= vendor
;
3447 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Technologies, Inc. (www.quicknet.net)");
3448 j
->caplist
[j
->caps
].captype
= vendor
;
3449 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3450 j
->caplist
[j
->caps
].captype
= device
;
3451 switch (j
->cardtype
) {
3453 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK");
3454 j
->caplist
[j
->caps
].cap
= 100;
3457 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet LineJACK");
3458 j
->caplist
[j
->caps
].cap
= 300;
3461 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK Lite");
3462 j
->caplist
[j
->caps
].cap
= 400;
3465 strcpy(j
->caplist
[j
->caps
].desc
, "Quicknet Internet PhoneJACK PCI");
3466 j
->caplist
[j
->caps
].cap
= 500;
3469 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3470 strcpy(j
->caplist
[j
->caps
].desc
, "POTS");
3471 j
->caplist
[j
->caps
].captype
= port
;
3472 j
->caplist
[j
->caps
].cap
= pots
;
3473 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3474 switch (ixj
[board
].cardtype
) {
3476 strcpy(j
->caplist
[j
->caps
].desc
, "SPEAKER");
3477 j
->caplist
[j
->caps
].captype
= port
;
3478 j
->caplist
[j
->caps
].cap
= speaker
;
3479 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3480 strcpy(j
->caplist
[j
->caps
].desc
, "HANDSET");
3481 j
->caplist
[j
->caps
].captype
= port
;
3482 j
->caplist
[j
->caps
].cap
= handset
;
3483 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3486 strcpy(j
->caplist
[j
->caps
].desc
, "SPEAKER");
3487 j
->caplist
[j
->caps
].captype
= port
;
3488 j
->caplist
[j
->caps
].cap
= speaker
;
3489 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3490 strcpy(j
->caplist
[j
->caps
].desc
, "PSTN");
3491 j
->caplist
[j
->caps
].captype
= port
;
3492 j
->caplist
[j
->caps
].cap
= pstn
;
3493 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3496 strcpy(j
->caplist
[j
->caps
].desc
, "ULAW");
3497 j
->caplist
[j
->caps
].captype
= codec
;
3498 j
->caplist
[j
->caps
].cap
= ULAW
;
3499 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3500 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 16 bit");
3501 j
->caplist
[j
->caps
].captype
= codec
;
3502 j
->caplist
[j
->caps
].cap
= LINEAR16
;
3503 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3504 strcpy(j
->caplist
[j
->caps
].desc
, "LINEAR 8 bit");
3505 j
->caplist
[j
->caps
].captype
= codec
;
3506 j
->caplist
[j
->caps
].cap
= LINEAR8
;
3507 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3508 strcpy(j
->caplist
[j
->caps
].desc
, "Windows Sound System");
3509 j
->caplist
[j
->caps
].captype
= codec
;
3510 j
->caplist
[j
->caps
].cap
= WSS
;
3511 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3512 if (j
->ver
.low
!= 0x12) {
3513 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 6.3Kbps");
3514 j
->caplist
[j
->caps
].captype
= codec
;
3515 j
->caplist
[j
->caps
].cap
= G723_63
;
3516 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3517 strcpy(j
->caplist
[j
->caps
].desc
, "G.723.1 5.3Kbps");
3518 j
->caplist
[j
->caps
].captype
= codec
;
3519 j
->caplist
[j
->caps
].cap
= G723_53
;
3520 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3521 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.8Kbps");
3522 j
->caplist
[j
->caps
].captype
= codec
;
3523 j
->caplist
[j
->caps
].cap
= TS48
;
3524 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3525 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 4.1Kbps");
3526 j
->caplist
[j
->caps
].captype
= codec
;
3527 j
->caplist
[j
->caps
].cap
= TS41
;
3528 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3530 if (j
->cardtype
== 100) {
3531 strcpy(j
->caplist
[j
->caps
].desc
, "TrueSpeech 8.5Kbps");
3532 j
->caplist
[j
->caps
].captype
= codec
;
3533 j
->caplist
[j
->caps
].cap
= TS85
;
3534 j
->caplist
[j
->caps
].handle
= j
->caps
++;
3537 static int capabilities_check(int board
, struct phone_capability
*pcreq
)
3540 IXJ
*j
= &ixj
[board
];
3543 for (cnt
= 0; cnt
< j
->caps
; cnt
++) {
3544 if (pcreq
->captype
== j
->caplist
[cnt
].captype
&&
3545 pcreq
->cap
== j
->caplist
[cnt
].cap
) {
3553 int ixj_ioctl(struct inode
*inode
, struct file
*file_p
,
3554 unsigned int cmd
, unsigned long arg
)
3558 unsigned int minor
= MINOR(inode
->i_rdev
);
3559 int board
= NUM(inode
->i_rdev
);
3560 IXJ
*j
= &ixj
[NUM(inode
->i_rdev
)];
3564 printk(KERN_DEBUG
"phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor
, cmd
, arg
);
3565 if (minor
>= IXJMAX
)
3569 * Check ioctls only root can use.
3572 if (!capable(CAP_SYS_ADMIN
)) {
3574 case IXJCTL_TESTRAM
:
3580 case IXJCTL_TESTRAM
:
3582 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
3584 case IXJCTL_CARDTYPE
:
3585 retval
= j
->cardtype
;
3590 case PHONE_RING_CADENCE
:
3591 j
->ring_cadence
= arg
;
3593 case PHONE_RING_START
:
3594 ixj_ring_start(board
);
3596 case PHONE_RING_STOP
:
3597 j
->flags
.cringing
= 0;
3598 ixj_ring_off(board
);
3601 retval
= ixj_ring(board
);
3603 case PHONE_EXCEPTION
:
3604 retval
= j
->ex
.bytes
;
3605 j
->ex
.bytes
&= 0x03;
3607 case PHONE_HOOKSTATE
:
3608 j
->ex
.bits
.hookstate
= 0;
3611 case IXJCTL_SET_LED
:
3612 LED_SetState(arg
, board
);
3615 retval
= set_base_frame(board
, arg
);
3617 case PHONE_REC_CODEC
:
3618 retval
= set_rec_codec(board
, arg
);
3620 case PHONE_REC_START
:
3621 ixj_record_start(board
);
3623 case PHONE_REC_STOP
:
3624 ixj_record_stop(board
);
3626 case PHONE_REC_DEPTH
:
3627 set_rec_depth(board
, arg
);
3629 case PHONE_REC_VOLUME
:
3630 set_rec_volume(board
, arg
);
3632 case PHONE_REC_LEVEL
:
3633 retval
= get_rec_level(board
);
3635 case IXJCTL_AEC_START
:
3636 ixj_aec_start(board
, arg
);
3638 case IXJCTL_AEC_STOP
:
3641 case IXJCTL_AEC_GET_LEVEL
:
3642 retval
= j
->aec_level
;
3644 case PHONE_PLAY_CODEC
:
3645 retval
= set_play_codec(board
, arg
);
3647 case PHONE_PLAY_START
:
3648 ixj_play_start(board
);
3650 case PHONE_PLAY_STOP
:
3651 ixj_play_stop(board
);
3653 case PHONE_PLAY_DEPTH
:
3654 set_play_depth(board
, arg
);
3656 case PHONE_PLAY_VOLUME
:
3657 set_play_volume(board
, arg
);
3659 case PHONE_PLAY_LEVEL
:
3660 retval
= get_play_level(board
);
3662 case IXJCTL_DSP_TYPE
:
3663 retval
= (j
->dsp
.high
<< 8) + j
->dsp
.low
;
3665 case IXJCTL_DSP_VERSION
:
3666 retval
= (j
->ver
.high
<< 8) + j
->ver
.low
;
3677 case IXJCTL_DRYBUFFER_READ
:
3678 put_user(j
->drybuffer
, (unsigned long *) arg
);
3680 case IXJCTL_DRYBUFFER_CLEAR
:
3683 case IXJCTL_FRAMES_READ
:
3684 put_user(j
->framesread
, (unsigned long *) arg
);
3686 case IXJCTL_FRAMES_WRITTEN
:
3687 put_user(j
->frameswritten
, (unsigned long *) arg
);
3689 case IXJCTL_READ_WAIT
:
3690 put_user(j
->read_wait
, (unsigned long *) arg
);
3692 case IXJCTL_WRITE_WAIT
:
3693 put_user(j
->write_wait
, (unsigned long *) arg
);
3695 case PHONE_MAXRINGS
:
3698 case PHONE_SET_TONE_ON_TIME
:
3699 ixj_set_tone_on(arg
, board
);
3701 case PHONE_SET_TONE_OFF_TIME
:
3702 ixj_set_tone_off(arg
, board
);
3704 case PHONE_GET_TONE_ON_TIME
:
3705 if (ixj_get_tone_on(board
)) {
3708 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
3711 case PHONE_GET_TONE_OFF_TIME
:
3712 if (ixj_get_tone_off(board
)) {
3715 retval
= (j
->ssr
.high
<< 8) + j
->ssr
.low
;
3718 case PHONE_PLAY_TONE
:
3720 ixj_play_tone(board
, arg
);
3722 case PHONE_GET_TONE_STATE
:
3723 retval
= j
->tone_state
;
3725 case PHONE_DTMF_READY
:
3726 retval
= j
->ex
.bits
.dtmf_ready
;
3728 case PHONE_GET_DTMF
:
3729 if (ixj_hookstate(board
)) {
3730 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
3731 retval
= j
->dtmfbuffer
[j
->dtmf_rp
];
3733 if (j
->dtmf_rp
== 79)
3735 if (j
->dtmf_rp
== j
->dtmf_wp
) {
3736 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
3741 case PHONE_GET_DTMF_ASCII
:
3742 if (ixj_hookstate(board
)) {
3743 if (j
->dtmf_rp
!= j
->dtmf_wp
) {
3744 switch (j
->dtmfbuffer
[j
->dtmf_rp
]) {
3774 retval
= 48 + j
->dtmfbuffer
[j
->dtmf_rp
];
3778 if (j
->dtmf_rp
== 79)
3780 // if(j->dtmf_rp == j->dtmf_wp)
3782 j
->ex
.bits
.dtmf_ready
= j
->dtmf_rp
= j
->dtmf_wp
= 0;
3787 case PHONE_DTMF_OOB
:
3788 j
->flags
.dtmf_oob
= arg
;
3790 case PHONE_DIALTONE
:
3791 ixj_dialtone(board
);
3794 ixj_busytone(board
);
3796 case PHONE_RINGBACK
:
3797 ixj_ringback(board
);
3799 case PHONE_CPT_STOP
:
3800 ixj_cpt_stop(board
);
3802 case IXJCTL_DSP_IDLE
:
3806 ixj_mixer(arg
, board
);
3808 case IXJCTL_DAA_COEFF_SET
:
3811 DAA_Coeff_US(board
);
3812 ixj_daa_write(board
);
3815 DAA_Coeff_UK(board
);
3816 ixj_daa_write(board
);
3819 DAA_Coeff_France(board
);
3820 ixj_daa_write(board
);
3823 DAA_Coeff_Germany(board
);
3824 ixj_daa_write(board
);
3827 DAA_Coeff_Australia(board
);
3828 ixj_daa_write(board
);
3831 DAA_Coeff_Japan(board
);
3832 ixj_daa_write(board
);
3838 case IXJCTL_DAA_AGAIN
:
3839 ixj_daa_cr4(board
, arg
| 0x02);
3841 case IXJCTL_PSTN_LINETEST
:
3842 retval
= ixj_linetest(board
);
3845 if (copy_to_user((char *) arg
, &j
->cid
, sizeof(IXJ_CID
)))
3847 j
->ex
.bits
.caller_id
= 0;
3849 case IXJCTL_WINK_DURATION
:
3854 retval
= ixj_set_port(board
, arg
);
3858 case IXJCTL_POTS_PSTN
:
3859 retval
= ixj_set_pots(board
, arg
);
3861 case PHONE_CAPABILITIES
:
3864 case PHONE_CAPABILITIES_LIST
:
3865 if (copy_to_user((char *) arg
, j
->caplist
, sizeof(struct phone_capability
) * j
->caps
))
3868 case PHONE_CAPABILITIES_CHECK
:
3869 retval
= capabilities_check(board
, (struct phone_capability
*) arg
);
3871 case PHONE_PSTN_SET_STATE
:
3872 daa_set_mode(board
, arg
);
3874 case PHONE_PSTN_GET_STATE
:
3875 retval
= j
->daa_mode
;
3876 j
->ex
.bits
.pstn_ring
= 0;
3878 case IXJCTL_SET_FILTER
:
3879 if (copy_from_user(&jf
, (char *) arg
, sizeof(ti
)))
3881 retval
= ixj_init_filter(board
, &jf
);
3883 case IXJCTL_GET_FILTER_HIST
:
3884 retval
= j
->filter_hist
[arg
];
3886 case IXJCTL_INIT_TONE
:
3887 copy_from_user(&ti
, (char *) arg
, sizeof(ti
));
3888 retval
= ixj_init_tone(board
, &ti
);
3890 case IXJCTL_TONE_CADENCE
:
3891 retval
= ixj_build_cadence(board
, (IXJ_CADENCE
*) arg
);
3893 case IXJCTL_INTERCOM_STOP
:
3894 ixj
[board
].intercom
= -1;
3895 ixj
[arg
].intercom
= -1;
3896 ixj_record_stop(board
);
3897 ixj_record_stop(arg
);
3898 ixj_play_stop(board
);
3903 case IXJCTL_INTERCOM_START
:
3904 ixj
[board
].intercom
= arg
;
3905 ixj
[arg
].intercom
= board
;
3906 ixj_play_start(arg
);
3907 ixj_record_start(board
);
3908 ixj_play_start(board
);
3909 ixj_record_start(arg
);
3917 static int ixj_fasync(int fd
, struct file
*file_p
, int mode
)
3919 IXJ
*j
= &ixj
[NUM(file_p
->f_dentry
->d_inode
->i_rdev
)];
3920 return fasync_helper(fd
, file_p
, mode
, &j
->async_queue
);
3923 struct file_operations ixj_fops
=
3925 NULL
, /* ixj_lseek */
3928 NULL
, /* ixj_readdir */
3931 NULL
, /* ixj_mmap */
3933 NULL
, /* ixj_open */
3934 NULL
, /* ixj_flush */
3936 NULL
, /* ixj_fsync */
3937 ixj_fasync
, /* ixj_fasync */
3938 NULL
, /* media change */
3939 NULL
, /* revalidate */
3943 static int ixj_linetest(int board
)
3945 unsigned long jifwait
;
3946 IXJ
*j
= &ixj
[board
];
3948 if (!j
->flags
.pots_correct
) {
3949 j
->flags
.pots_correct
= 1; // Testing
3951 daa_int_read(board
); //Clear DAA Interrupt flags
3953 // Hold all relays in the normally de-energized position.
3956 j
->pld_slicw
.bits
.rly1
= 0;
3957 j
->pld_slicw
.bits
.rly2
= 0;
3958 j
->pld_slicw
.bits
.rly3
= 0;
3959 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
3960 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
3962 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
3963 j
->pld_slicr
.byte
= inb_p(j
->XILINXbase
+ 0x01);
3964 if (j
->pld_slicr
.bits
.potspstn
) {
3965 j
->flags
.pots_pstn
= 1;
3966 j
->flags
.pots_correct
= 0;
3967 LED_SetState(0x4, board
);
3969 j
->flags
.pots_pstn
= 0;
3970 j
->pld_slicw
.bits
.rly1
= 0;
3971 j
->pld_slicw
.bits
.rly2
= 0;
3972 j
->pld_slicw
.bits
.rly3
= 1;
3973 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
3974 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
3976 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
3977 daa_set_mode(board
, SOP_PU_CONVERSATION
);
3978 jifwait
= jiffies
+ hertz
;
3979 while (time_before(jiffies
, jifwait
)) {
3980 current
->state
= TASK_INTERRUPTIBLE
;
3981 schedule_timeout(1);
3983 daa_int_read(board
);
3984 daa_set_mode(board
, SOP_PU_SLEEP
);
3985 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
3986 j
->flags
.pots_correct
= 0; // Should not be line voltage on POTS port.
3988 LED_SetState(0x4, board
);
3989 j
->pld_slicw
.bits
.rly3
= 0;
3990 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
3992 j
->flags
.pots_correct
= 1;
3993 LED_SetState(0x8, board
);
3994 j
->pld_slicw
.bits
.rly1
= 1;
3995 j
->pld_slicw
.bits
.rly2
= 0;
3996 j
->pld_slicw
.bits
.rly3
= 0;
3997 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
4001 if (!j
->flags
.pstn_present
) {
4002 j
->pld_slicw
.bits
.rly3
= 0;
4003 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
4004 daa_set_mode(board
, SOP_PU_CONVERSATION
);
4005 jifwait
= jiffies
+ hertz
;
4006 while (time_before(jiffies
, jifwait
)) {
4007 current
->state
= TASK_INTERRUPTIBLE
;
4008 schedule_timeout(1);
4010 daa_int_read(board
);
4011 daa_set_mode(board
, SOP_PU_SLEEP
);
4012 if (j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr0
.bitreg
.VDD_OK
) {
4013 j
->flags
.pstn_present
= 1;
4015 j
->flags
.pstn_present
= 0;
4018 if (j
->flags
.pstn_present
) {
4019 if (j
->flags
.pots_correct
) {
4020 LED_SetState(0xA, board
);
4022 LED_SetState(0x6, board
);
4025 if (j
->flags
.pots_correct
) {
4026 LED_SetState(0x9, board
);
4028 LED_SetState(0x5, board
);
4031 return j
->flags
.pstn_present
;
4034 static int ixj_selfprobe(int board
)
4039 IXJ
*j
= &ixj
[board
];
4042 * First initialise the queues
4045 init_waitqueue_head(&j
->read_q
);
4046 init_waitqueue_head(&j
->write_q
);
4047 init_waitqueue_head(&j
->poll_q
);
4054 printk(KERN_INFO
"Write IDLE to Software Control Register\n");
4056 if (ixj_WriteDSPCommand(0x0000, board
)) /* Write IDLE to Software Control Register */
4059 // The read values of the SSR should be 0x00 for the IDLE command
4060 if (j
->ssr
.low
|| j
->ssr
.high
)
4064 printk(KERN_INFO
"Get Device ID Code\n");
4066 if (ixj_WriteDSPCommand(0x3400, board
)) /* Get Device ID Code */
4069 j
->dsp
.low
= j
->ssr
.low
;
4070 j
->dsp
.high
= j
->ssr
.high
;
4073 printk(KERN_INFO
"Get Device Version Code\n");
4075 if (ixj_WriteDSPCommand(0x3800, board
)) /* Get Device Version Code */
4078 j
->ver
.low
= j
->ssr
.low
;
4079 j
->ver
.high
= j
->ssr
.high
;
4082 if (j
->dsp
.low
== 0x21) {
4083 j
->XILINXbase
= j
->DSPbase
+ 0x10;
4084 bytes
.high
= bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4085 outb_p(bytes
.low
^ 0xFF, j
->XILINXbase
+ 0x02);
4086 // Test for Internet LineJACK or Internet PhoneJACK Lite
4087 bytes
.low
= inb_p(j
->XILINXbase
+ 0x02);
4088 if (bytes
.low
== bytes
.high
) // Register is read only on
4089 // Internet PhoneJack Lite
4091 j
->cardtype
= 400; // Internet PhoneJACK Lite
4093 if (check_region(j
->XILINXbase
, 4)) {
4094 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
4097 request_region(j
->XILINXbase
, 4, "ixj control");
4098 j
->pld_slicw
.pcib
.e1
= 1;
4099 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
4101 j
->cardtype
= 300; // Internet LineJACK
4103 if (check_region(j
->XILINXbase
, 8)) {
4104 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
4107 request_region(j
->XILINXbase
, 8, "ixj control");
4109 } else if (j
->dsp
.low
== 0x22) {
4110 j
->cardtype
= 500; // Internet PhoneJACK PCI
4112 request_region(j
->XILINXbase
, 4, "ixj control");
4113 j
->pld_slicw
.pcib
.e1
= 1;
4114 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
4116 j
->cardtype
= 100; // Internet PhoneJACK
4119 switch (j
->cardtype
) {
4120 case 100: // Internet PhoneJACK
4122 if (!j
->dsp
.low
!= 0x20) {
4125 ixj_WriteDSPCommand(0x3800, board
);
4126 j
->ver
.low
= j
->ssr
.low
;
4127 j
->ver
.high
= j
->ssr
.high
;
4130 case 300: // Internet LineJACK
4132 if (check_region(j
->XILINXbase
, 8)) {
4133 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
4136 request_region(j
->XILINXbase
, 8, "ixj control");
4138 case 400: //Internet PhoneJACK Lite
4140 case 500: //Internet PhoneJACK PCI
4142 if (check_region(j
->XILINXbase
, 4)) {
4143 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", j
->XILINXbase
);
4146 request_region(j
->XILINXbase
, 4, "ixj control");
4147 j
->pld_slicw
.pcib
.e1
= 1;
4148 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
);
4152 if (j
->dsp
.low
== 0x20 || j
->cardtype
== 400 || j
->cardtype
== 500) {
4154 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
4156 if (ixj_WriteDSPCommand(0xC462, board
)) /* Write CODEC config to Software Control Register */
4160 printk(KERN_INFO
"Write CODEC timing to Software Control Register\n");
4162 if (j
->cardtype
== 100) {
4167 if (ixj_WriteDSPCommand(cmd
, board
)) /* Write CODEC timing to Software Control Register */
4170 if (set_base_frame(board
, 30) != 30)
4173 if (j
->cardtype
== 300) {
4175 printk(KERN_INFO
"Write CODEC config to Software Control Register\n");
4177 if (ixj_WriteDSPCommand(0xC528, board
)) /* Write CODEC config to Software Control Register */
4181 printk(KERN_INFO
"Turn on the PLD Clock at 8Khz\n");
4183 j
->pld_clock
.byte
= 0;
4184 outb_p(j
->pld_clock
.byte
, j
->XILINXbase
+ 0x04);
4188 if (j
->dsp
.low
== 0x20) {
4190 printk(KERN_INFO
"Configure GPIO pins\n");
4192 j
->gpio
.bytes
.high
= 0x09;
4193 /* bytes.low = 0xEF; 0xF7 */
4194 j
->gpio
.bits
.gpio1
= 1;
4195 j
->gpio
.bits
.gpio2
= 1;
4196 j
->gpio
.bits
.gpio3
= 0;
4197 j
->gpio
.bits
.gpio4
= 1;
4198 j
->gpio
.bits
.gpio5
= 1;
4199 j
->gpio
.bits
.gpio6
= 1;
4200 j
->gpio
.bits
.gpio7
= 1;
4201 ixj_WriteDSPCommand(ixj
[board
].gpio
.word
, board
); /* Set GPIO pin directions */
4204 printk(KERN_INFO
"Enable SLIC\n");
4206 j
->gpio
.bytes
.high
= 0x0B;
4207 j
->gpio
.bytes
.low
= 0x00;
4208 j
->gpio
.bits
.gpio1
= 0;
4209 j
->gpio
.bits
.gpio2
= 1;
4210 j
->gpio
.bits
.gpio5
= 0;
4211 ixj_WriteDSPCommand(ixj
[board
].gpio
.word
, board
); /* send the ring stop signal */
4212 j
->port
= PORT_POTS
;
4214 if (j
->cardtype
== 300) {
4215 LED_SetState(0x1, board
);
4216 jif
= jiffies
+ (hertz
/ 10);
4217 while (time_before(jiffies
, jif
)) {
4218 current
->state
= TASK_INTERRUPTIBLE
;
4219 schedule_timeout(1);
4221 LED_SetState(0x2, board
);
4222 jif
= jiffies
+ (hertz
/ 10);
4223 while (time_before(jiffies
, jif
)) {
4224 current
->state
= TASK_INTERRUPTIBLE
;
4225 schedule_timeout(1);
4227 LED_SetState(0x4, board
);
4228 jif
= jiffies
+ (hertz
/ 10);
4229 while (time_before(jiffies
, jif
)) {
4230 current
->state
= TASK_INTERRUPTIBLE
;
4231 schedule_timeout(1);
4233 LED_SetState(0x8, board
);
4234 jif
= jiffies
+ (hertz
/ 10);
4235 while (time_before(jiffies
, jif
)) {
4236 current
->state
= TASK_INTERRUPTIBLE
;
4237 schedule_timeout(1);
4239 LED_SetState(0x0, board
);
4241 daa_get_version(board
);
4244 printk("Loading DAA Coefficients\n");
4246 DAA_Coeff_US(board
);
4247 if (!ixj_daa_write(board
))
4248 printk("DAA write failed on board %d\n", board
);
4250 ixj_daa_cid_reset(board
);
4252 j
->flags
.pots_correct
= 0;
4253 j
->flags
.pstn_present
= 0;
4255 ixj_linetest(board
);
4257 if (j
->flags
.pots_correct
) {
4258 j
->pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
4260 outb_p(j
->pld_scrw
.byte
, j
->XILINXbase
);
4261 j
->pld_slicw
.bits
.rly1
= 1;
4262 j
->pld_slicw
.bits
.spken
= 1;
4263 outb_p(j
->pld_slicw
.byte
, j
->XILINXbase
+ 0x01);
4264 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, board
);
4265 j
->port
= PORT_POTS
;
4268 printk(KERN_INFO
"Enable Mixer\n");
4270 ixj_mixer(0x0000, board
); //Master Volume Left unmute 0db
4272 ixj_mixer(0x0100, board
); //Master Volume Right unmute 0db
4274 ixj_mixer(0x0F00, board
); //Mono Out Volume unmute 0db
4276 ixj_mixer(0x0C00, board
); //Mono1 Volume unmute 0db
4278 ixj_mixer(0x0200, board
); //Voice Left Volume unmute 0db
4280 ixj_mixer(0x0300, board
); //Voice Right Volume unmute 0db
4282 ixj_mixer(0x110C, board
); //Voice Left and Right out
4284 ixj_mixer(0x1401, board
); //Mono1 switch on mixer left
4286 ixj_mixer(0x1501, board
); //Mono1 switch on mixer right
4288 ixj_mixer(0x1700, board
); //Clock select
4290 ixj_mixer(0x1800, board
); //ADC Source select
4293 j
->port
= PORT_POTS
;
4294 SLIC_SetState(PLD_SLIC_STATE_STANDBY
, board
);
4299 j
->framesread
= j
->frameswritten
= 0;
4300 j
->rxreadycheck
= j
->txreadycheck
= 0;
4302 if (ixj_WriteDSPCommand(0x0000, board
)) /* Write IDLE to Software Control Register */
4305 // The read values of the SSR should be 0x00 for the IDLE command
4306 if (j
->ssr
.low
|| j
->ssr
.high
)
4310 printk(KERN_INFO
"Enable Line Monitor\n");
4313 printk(KERN_INFO
"Set Line Monitor to Asyncronous Mode\n");
4315 if (ixj_WriteDSPCommand(0x7E01, board
)) // Asynchronous Line Monitor
4320 printk(KERN_INFO
"Enable DTMF Detectors\n");
4322 if (ixj_WriteDSPCommand(0x5151, board
)) // Enable DTMF detection
4326 if (ixj_WriteDSPCommand(0x6E01, board
)) // Set Asyncronous Tone Generation
4330 set_rec_depth(board
, 2); // Set Record Channel Limit to 2 frames
4332 set_play_depth(board
, 2); // Set Playback Channel Limit to 2 frames
4334 j
->ex
.bits
.dtmf_ready
= 0;
4336 j
->dtmf_wp
= ixj
[board
].dtmf_rp
= 0;
4338 j
->rec_mode
= ixj
[board
].play_mode
= -1;
4339 j
->flags
.ringing
= 0;
4340 j
->maxrings
= MAXRINGS
;
4341 j
->ring_cadence
= USA_RING_CADENCE
;
4344 j
->flags
.dtmf_oob
= 0;
4346 /* must be a device on the specified address */
4347 /* Register with the Telephony for Linux subsystem */
4348 j
->p
.f_op
= &ixj_fops
;
4349 j
->p
.open
= ixj_open
;
4350 phone_register_device(&j
->p
, PHONE_UNIT_ANY
);
4357 static void cleanup(void)
4361 del_timer(&ixj_timer
);
4363 // unregister_chrdev(ixj_major, "ixj");
4364 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
4365 if (ixj
[cnt
].cardtype
== 300) {
4366 ixj
[cnt
].pld_scrw
.bits
.daafsyncen
= 0; // Turn off DAA Frame Sync
4368 outb_p(ixj
[cnt
].pld_scrw
.byte
, ixj
[cnt
].XILINXbase
);
4369 ixj
[cnt
].pld_slicw
.bits
.rly1
= 0;
4370 ixj
[cnt
].pld_slicw
.bits
.rly2
= 0;
4371 ixj
[cnt
].pld_slicw
.bits
.rly3
= 0;
4372 outb_p(ixj
[cnt
].pld_slicw
.byte
, ixj
[cnt
].XILINXbase
+ 0x01);
4373 LED_SetState(0x0, cnt
);
4375 release_region(ixj
[cnt
].XILINXbase
, 8);
4377 if (ixj
[cnt
].cardtype
== 400 || ixj
[cnt
].cardtype
== 500) {
4378 release_region(ixj
[cnt
].XILINXbase
, 4);
4380 if (ixj
[cnt
].DSPbase
) {
4381 release_region(ixj
[cnt
].DSPbase
, 16);
4382 phone_unregister_device(&ixj
[cnt
].p
);
4384 if (ixj
[cnt
].read_buffer
)
4385 kfree(ixj
[cnt
].read_buffer
);
4386 if (ixj
[cnt
].write_buffer
)
4387 kfree(ixj
[cnt
].write_buffer
);
4388 #ifdef CONFIG_ISAPNP
4390 ixj
[cnt
].dev
->deactivate(ixj
[cnt
].dev
);
4402 static void PCIEE_WriteBit(WORD wEEPROMAddress
, BYTE lastLCC
, BYTE byData
)
4404 lastLCC
= lastLCC
& 0xfb;
4405 lastLCC
= lastLCC
| (byData
? 4 : 0);
4406 outb(lastLCC
, wEEPROMAddress
); //set data out bit as appropriate
4409 lastLCC
= lastLCC
| 0x01;
4410 outb(lastLCC
, wEEPROMAddress
); //SK rising edge
4412 byData
= byData
<< 1;
4413 lastLCC
= lastLCC
& 0xfe;
4416 outb(lastLCC
, wEEPROMAddress
); //after delay, SK falling edge
4420 static BYTE
PCIEE_ReadBit(WORD wEEPROMAddress
, BYTE lastLCC
)
4423 lastLCC
= lastLCC
| 0x01;
4424 outb(lastLCC
, wEEPROMAddress
); //SK rising edge
4426 lastLCC
= lastLCC
& 0xfe;
4428 outb(lastLCC
, wEEPROMAddress
); //after delay, SK falling edge
4430 return ((inb(wEEPROMAddress
) >> 3) & 1);
4433 static BOOL
PCIEE_ReadWord(WORD wAddress
, WORD wLoc
, WORD
* pwResult
)
4436 WORD wEEPROMAddress
= wAddress
+ 3;
4442 lastLCC
= inb(wEEPROMAddress
);
4444 lastLCC
= lastLCC
| 0x02;
4445 lastLCC
= lastLCC
& 0xfe;
4446 outb(lastLCC
, wEEPROMAddress
); // CS hi, SK lo
4448 udelay(1000); // delay
4450 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
4451 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 1);
4452 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, 0);
4454 for (i
= 0; i
< 8; i
++) {
4455 PCIEE_WriteBit(wEEPROMAddress
, lastLCC
, wLoc
& 0x80 ? 1 : 0);
4459 for (i
= 0; i
< 16; i
++) {
4460 byResult
= PCIEE_ReadBit(wEEPROMAddress
, lastLCC
);
4461 *pwResult
= (*pwResult
<< 1) | byResult
;
4464 udelay(1000); // another delay
4466 lastLCC
= lastLCC
& 0xfd;
4467 outb(lastLCC
, wEEPROMAddress
); // negate CS
4472 static DWORD
PCIEE_GetSerialNumber(WORD wAddress
)
4476 if (PCIEE_ReadWord(wAddress
, 62, &wLo
))
4479 if (PCIEE_ReadWord(wAddress
, 63, &wHi
))
4482 return (((DWORD
) wHi
<< 16) | wLo
);
4485 static int dspio
[IXJMAX
+ 1] = {0,};
4486 static int xio
[IXJMAX
+ 1] = {0,};
4488 MODULE_DESCRIPTION("Internet PhoneJACK/Internet LineJACK module - www.quicknet.net");
4489 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
4491 MODULE_PARM(dspio
, "1-" __MODULE_STRING(IXJMAX
) "i");
4492 MODULE_PARM(xio
, "1-" __MODULE_STRING(IXJMAX
) "i");
4496 void cleanup_module(void)
4501 int init_module(void)
4503 int __init
ixj_init(void)
4508 int func
= 0x110, i
= 0;
4511 struct pci_dev
*dev
= NULL
, *old_dev
= NULL
;
4512 struct pci_dev
*pci
= NULL
;
4514 #ifdef CONFIG_ISAPNP
4518 dev
= isapnp_find_dev(NULL
, ISAPNP_VENDOR('Q', 'T', 'I'),
4519 ISAPNP_FUNCTION(func
), old_dev
);
4522 printk("preparing %x\n", func
);
4523 result
= dev
->prepare(dev
);
4525 printk("preparing failed %d \n", result
);
4528 if (!(dev
->resource
[0].flags
& IORESOURCE_IO
))
4530 dev
->resource
[0].flags
|= IORESOURCE_AUTO
;
4532 dev
->resource
[1].flags
|= IORESOURCE_AUTO
;
4533 if (dev
->activate(dev
) < 0) {
4534 printk("isapnp configure failed (out of resources?)\n");
4537 ixj
[cnt
].DSPbase
= dev
->resource
[0].start
; /* get real port */
4539 ixj
[cnt
].XILINXbase
= dev
->resource
[1].start
; /* get real port */
4541 result
= check_region(ixj
[cnt
].DSPbase
, 16);
4543 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", ixj
[cnt
].DSPbase
);
4547 request_region(ixj
[cnt
].DSPbase
, 16, "ixj DSP");
4550 ixj
[cnt
].cardtype
= 100;
4553 ixj
[cnt
].cardtype
= 300;
4556 ixj
[cnt
].cardtype
= 400;
4559 probe
= ixj_selfprobe(cnt
);
4561 ixj
[cnt
].serial
= dev
->bus
->serial
;
4563 printk(KERN_INFO
"ixj: found card at 0x%x\n", ixj
[cnt
].DSPbase
);
4575 #else //CONFIG_ISAPNP
4576 /* Use passed parameters for older kernels without PnP */
4578 for (cnt
= 0; cnt
< IXJMAX
; cnt
++) {
4580 ixj
[cnt
].DSPbase
= dspio
[cnt
];
4581 ixj
[cnt
].XILINXbase
= xio
[cnt
];
4582 ixj
[cnt
].cardtype
= 0;
4583 result
= check_region(ixj
[cnt
].DSPbase
, 16);
4585 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", ixj
[cnt
].DSPbase
);
4589 request_region(ixj
[cnt
].DSPbase
, 16, "ixj DSP");
4590 probe
= ixj_selfprobe(cnt
);
4591 ixj
[cnt
].dev
= NULL
;
4596 if (pci_present()) {
4597 for (i
= 0; i
< IXJMAX
- cnt
; i
++) {
4598 pci
= pci_find_device(0x15E2, 0x0500, pci
);
4602 ixj
[cnt
].DSPbase
= pci
->resource
[0].start
;
4603 ixj
[cnt
].XILINXbase
= ixj
[cnt
].DSPbase
+ 0x10;
4604 ixj
[cnt
].serial
= PCIEE_GetSerialNumber(pci
->resource
[2].start
);
4606 result
= check_region(ixj
[cnt
].DSPbase
, 16);
4608 printk(KERN_INFO
"ixj: can't get I/O address 0x%x\n", ixj
[cnt
].DSPbase
);
4612 request_region(ixj
[cnt
].DSPbase
, 16, "ixj DSP");
4613 ixj
[cnt
].cardtype
= 500;
4614 probe
= ixj_selfprobe(cnt
);
4620 printk("%s\n", ixj_c_rcsid
);
4627 static void DAA_Coeff_US(int board
)
4629 IXJ
*j
= &ixj
[board
];
4633 //-----------------------------------------------
4635 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
4636 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
4639 // Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00
4640 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x0E;
4641 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0x32;
4642 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xE2;
4643 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2F;
4644 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xC2;
4645 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x5A;
4646 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xC0;
4647 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
4649 // Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08
4650 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x72;
4651 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x85;
4652 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
4653 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0E;
4654 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x2B;
4655 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x3A;
4656 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xD0;
4657 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
4659 // Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08
4660 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x03;
4661 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x8F;
4662 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x48;
4663 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0xF2;
4664 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x8F;
4665 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x48;
4666 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x70;
4667 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
4669 // Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08
4670 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x04;
4671 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
4672 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0x38;
4673 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x7F;
4674 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9B;
4675 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xEA;
4676 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
4677 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
4679 // Bytes for AX-filter (0A): 16,55,DD,CA
4680 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x16;
4681 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0x55;
4682 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
4683 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
4685 // Bytes for AR-filter (09): 52,D3,11,42
4686 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x52;
4687 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xD3;
4688 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x11;
4689 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0x42;
4691 // Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98
4692 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
4693 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
4694 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
4695 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
4696 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xB3;
4697 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
4698 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
4699 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
4701 // Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD
4702 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
4703 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xF2;
4704 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x33;
4705 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xA0;
4706 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x68;
4707 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAB;
4708 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x8A;
4709 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xAD;
4711 // Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB
4712 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
4713 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
4714 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
4715 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x54;
4716 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xA4;
4717 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xBA;
4718 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x2D;
4719 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xBB;
4723 // Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
4724 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
4725 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3B;
4726 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x9B;
4727 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0xBA;
4728 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0xD4;
4729 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x1C;
4730 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xB3;
4731 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
4733 // Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5
4734 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x13;
4735 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0x42;
4736 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
4737 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
4738 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0xD4;
4739 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x73;
4740 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0xCA;
4741 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
4744 // Levelmetering Ringing (0D):B2,45,0F,8E
4745 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xB2;
4746 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
4747 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
4748 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
4750 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
4751 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
4752 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
4753 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
4754 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
4755 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
4756 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
4757 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
4758 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
4760 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
4761 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
4762 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
4763 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
4764 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
4765 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
4766 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
4767 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
4768 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
4772 // Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal
4773 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFE;
4775 // Config. Reg. 1 (dialing) (cr1):05
4776 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
4778 // Config. Reg. 2 (caller ID) (cr2):04
4779 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
4781 // Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled
4782 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x03;
4784 // Config. Reg. 4 (analog gain) (cr4):01
4785 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
4787 // Config. Reg. 5 (Version) (cr5):02
4788 // Config. Reg. 6 (Reserved) (cr6):00
4789 // Config. Reg. 7 (Reserved) (cr7):00
4793 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
4794 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
4796 // Ext. Reg. 1 (Interrupt enable) (xr1):1C // Cadence, RING, Caller ID, VDD_OK
4797 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x3C;
4799 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
4800 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
4802 // Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1
4803 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x12; //0x32;
4805 // Ext. Reg. 4 (Cadence) (xr4):00
4806 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
4808 // Ext. Reg. 5 (Ring timer) (xr5):22
4809 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
4811 // Ext. Reg. 6 (Power State) (xr6):00
4812 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
4814 // Ext. Reg. 7 (Vdd) (xr7):40
4815 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; // 0x40 ??? Should it be 0x00?
4818 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
4819 // 12,33,5A,C3 ; 770 Hz
4820 // 13,3C,5B,32 ; 852 Hz
4821 // 1D,1B,5C,CC ; 941 Hz
4822 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
4823 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
4824 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
4825 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
4827 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
4828 // EC,1D,52,22 ; 1336 Hz
4829 // AA,AC,51,D2 ; 1477 Hz
4830 // 9B,3B,51,25 ; 1633 Hz
4831 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
4832 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
4833 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
4834 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
4838 static void DAA_Coeff_UK(int board
)
4840 IXJ
*j
= &ixj
[board
];
4844 //-----------------------------------------------
4846 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
4847 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
4850 // Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00
4851 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
4852 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xC2;
4853 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
4854 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xA8;
4855 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xCB;
4856 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
4857 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
4858 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
4860 // Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08
4861 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x40;
4862 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x00;
4863 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
4864 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0A;
4865 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xA4;
4866 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
4867 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
4868 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
4870 // Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08
4871 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
4872 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9B;
4873 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xED;
4874 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x24;
4875 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0xB2;
4876 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0xA2;
4877 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xA0;
4878 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
4880 // Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08
4881 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
4882 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x92;
4883 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF2;
4884 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0xB2;
4885 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
4886 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xD2;
4887 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x30;
4888 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
4890 // Bytes for AX-filter (0A): 1B,A5,DD,CA
4891 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x1B;
4892 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xA5;
4893 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
4894 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
4896 // Bytes for AR-filter (09): E2,27,10,D6
4897 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
4898 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x27;
4899 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
4900 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
4902 // Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98
4903 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
4904 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x2D;
4905 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x38;
4906 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x8B;
4907 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xD0;
4908 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x00;
4909 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
4910 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
4912 // Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4
4913 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
4914 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x5A;
4915 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x53;
4916 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xF0;
4917 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x0B;
4918 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5F;
4919 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x84;
4920 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xD4;
4922 // Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32
4923 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
4924 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
4925 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x6A;
4926 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA4;
4927 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x8F;
4928 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x52;
4929 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xF5;
4930 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x32;
4934 // Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
4935 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
4936 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
4937 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
4938 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
4939 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
4940 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
4941 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
4942 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
4944 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
4945 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
4946 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
4947 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
4948 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
4949 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
4950 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
4951 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
4952 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
4954 // Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible?
4955 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
4956 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
4957 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
4958 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
4960 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
4961 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
4962 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
4963 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
4964 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
4965 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
4966 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
4967 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
4968 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
4970 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
4971 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
4972 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
4973 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
4974 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
4975 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
4976 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
4977 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
4978 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
4981 // Config. Reg. 0 (filters) (cr0):FF
4982 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF; //0xFE;
4984 // Config. Reg. 1 (dialing) (cr1):05
4985 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
4987 // Config. Reg. 2 (caller ID) (cr2):04
4988 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
4990 // Config. Reg. 3 (testloops) (cr3):00 ;
4991 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
4993 // Config. Reg. 4 (analog gain) (cr4):01
4994 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
4996 // Config. Reg. 5 (Version) (cr5):02
4997 // Config. Reg. 6 (Reserved) (cr6):00
4998 // Config. Reg. 7 (Reserved) (cr7):00
5001 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
5002 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
5004 // Ext. Reg. 1 (Interrupt enable) (xr1):1C
5005 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; // RING, Caller ID, VDD_OK
5007 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
5008 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
5010 // Ext. Reg. 3 (DC Char) (xr3):36 ;
5011 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
5013 // Ext. Reg. 4 (Cadence) (xr4):00
5014 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
5016 // Ext. Reg. 5 (Ring timer) (xr5):22
5017 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
5019 // Ext. Reg. 6 (Power State) (xr6):00
5020 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
5022 // Ext. Reg. 7 (Vdd) (xr7):46
5023 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; // 0x46 ??? Should it be 0x00?
5025 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
5026 // 12,33,5A,C3 ; 770 Hz
5027 // 13,3C,5B,32 ; 852 Hz
5028 // 1D,1B,5C,CC ; 941 Hz
5029 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
5030 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
5031 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
5032 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
5034 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
5035 // EC,1D,52,22 ; 1336 Hz
5036 // AA,AC,51,D2 ; 1477 Hz
5037 // 9B,3B,51,25 ; 1633 Hz
5038 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
5039 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
5040 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
5041 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
5046 static void DAA_Coeff_France(int board
)
5048 IXJ
*j
= &ixj
[board
];
5052 //-----------------------------------------------
5054 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
5055 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
5058 // Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00
5059 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x02;
5060 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA2;
5061 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0x43;
5062 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2C;
5063 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0x22;
5064 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xAF;
5065 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
5066 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
5068 // Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08
5069 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x67;
5070 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xCE;
5071 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
5072 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x2C;
5073 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x22;
5074 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
5075 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
5076 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
5078 // Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08
5079 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
5080 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x9A;
5081 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x28;
5082 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0xF6;
5083 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x23;
5084 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x4A;
5085 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xB0;
5086 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
5088 // Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08
5089 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
5090 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
5091 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xF9;
5092 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
5093 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9E;
5094 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xFA;
5095 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
5096 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
5098 // Bytes for AX-filter (0A): 16,B5,DD,CA
5099 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x16;
5100 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xB5;
5101 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
5102 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
5104 // Bytes for AR-filter (09): 52,C7,10,D6
5105 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0xE2;
5106 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xC7;
5107 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
5108 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
5110 // Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98
5111 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
5112 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
5113 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
5114 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
5115 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xA6;
5116 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
5117 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
5118 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
5120 // Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C
5121 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
5122 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAC;
5123 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
5124 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x30;
5125 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x78;
5126 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0xAC;
5127 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x8A;
5128 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x2C;
5130 // Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45
5131 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
5132 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
5133 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
5134 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0xA5;
5135 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x22;
5136 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xBA;
5137 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x2C;
5138 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x45;
5142 // Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
5143 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
5144 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
5145 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
5146 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
5147 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
5148 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
5149 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
5150 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
5152 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
5153 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
5154 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
5155 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
5156 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
5157 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
5158 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
5159 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
5160 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
5162 // Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V
5163 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
5164 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
5165 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
5166 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
5168 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
5169 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
5170 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
5171 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
5172 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
5173 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
5174 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
5175 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
5176 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
5178 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
5179 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
5180 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
5181 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
5182 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
5183 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
5184 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
5185 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
5186 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
5189 // Config. Reg. 0 (filters) (cr0):FF
5190 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
5192 // Config. Reg. 1 (dialing) (cr1):05
5193 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
5195 // Config. Reg. 2 (caller ID) (cr2):04
5196 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
5198 // Config. Reg. 3 (testloops) (cr3):00 ;
5199 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
5201 // Config. Reg. 4 (analog gain) (cr4):01
5202 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
5204 // Config. Reg. 5 (Version) (cr5):02
5205 // Config. Reg. 6 (Reserved) (cr6):00
5206 // Config. Reg. 7 (Reserved) (cr7):00
5209 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
5210 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
5212 // Ext. Reg. 1 (Interrupt enable) (xr1):1C
5213 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; // RING, Caller ID, VDD_OK
5215 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
5216 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
5218 // Ext. Reg. 3 (DC Char) (xr3):36 ;
5219 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x36;
5221 // Ext. Reg. 4 (Cadence) (xr4):00
5222 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
5224 // Ext. Reg. 5 (Ring timer) (xr5):22
5225 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
5227 // Ext. Reg. 6 (Power State) (xr6):00
5228 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
5230 // Ext. Reg. 7 (Vdd) (xr7):46
5231 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x46; // 0x46 ??? Should it be 0x00?
5233 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
5234 // 12,33,5A,C3 ; 770 Hz
5235 // 13,3C,5B,32 ; 852 Hz
5236 // 1D,1B,5C,CC ; 941 Hz
5237 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
5238 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
5239 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
5240 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
5242 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
5243 // EC,1D,52,22 ; 1336 Hz
5244 // AA,AC,51,D2 ; 1477 Hz
5245 // 9B,3B,51,25 ; 1633 Hz
5246 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
5247 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
5248 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
5249 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
5254 static void DAA_Coeff_Germany(int board
)
5256 IXJ
*j
= &ixj
[board
];
5260 //-----------------------------------------------
5262 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
5263 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
5266 // Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00
5267 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
5268 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xCE;
5269 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xBB;
5270 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0xB8;
5271 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xD2;
5272 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x81;
5273 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xB0;
5274 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
5276 // Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08
5277 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x45;
5278 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x8F;
5279 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
5280 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0C;
5281 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0xD2;
5282 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x3A;
5283 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xD0;
5284 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
5286 // Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08
5287 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
5288 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0xAA;
5289 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
5290 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
5291 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x24;
5292 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x89;
5293 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x20;
5294 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
5296 // Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08
5297 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x02;
5298 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x87;
5299 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xFA;
5300 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x37;
5301 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x9A;
5302 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCA;
5303 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xB0;
5304 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
5306 // Bytes for AX-filter (0A): 72,D5,DD,CA
5307 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x72;
5308 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xD5;
5309 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
5310 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
5312 // Bytes for AR-filter (09): 72,42,13,4B
5313 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x72;
5314 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x42;
5315 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x13;
5316 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0x4B;
5318 // Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98
5319 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
5320 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
5321 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
5322 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
5323 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAD;
5324 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
5325 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
5326 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
5328 // Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27
5329 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
5330 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0x42;
5331 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x5A;
5332 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
5333 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0xE8;
5334 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x1A;
5335 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x81;
5336 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x27;
5338 // Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2
5339 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
5340 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
5341 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x63;
5342 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x26;
5343 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0xBD;
5344 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x4B;
5345 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0xA3;
5346 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xC2;
5350 // Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
5351 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
5352 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3B;
5353 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x9B;
5354 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0xBA;
5355 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0xD4;
5356 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x1C;
5357 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xB3;
5358 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
5360 // Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5
5361 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x13;
5362 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0x42;
5363 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
5364 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
5365 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0xD4;
5366 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x73;
5367 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0xCA;
5368 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
5370 // Levelmetering Ringing (0D):B2,45,0F,8E
5371 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xB2;
5372 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
5373 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
5374 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
5376 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
5377 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
5378 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
5379 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
5380 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
5381 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
5382 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
5383 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
5384 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
5386 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
5387 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
5388 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
5389 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
5390 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
5391 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
5392 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
5393 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
5394 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
5397 // Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source
5398 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
5400 // Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled
5401 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
5403 // Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal
5404 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
5406 // Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled
5407 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
5409 // Config. Reg. 4 (analog gain) (cr4):01
5410 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
5412 // Config. Reg. 5 (Version) (cr5):02
5413 // Config. Reg. 6 (Reserved) (cr6):00
5414 // Config. Reg. 7 (Reserved) (cr7):00
5417 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
5418 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
5420 // Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled
5421 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; // RING, Caller ID, VDD_OK
5423 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
5424 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
5426 // Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm
5427 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x32;
5429 // Ext. Reg. 4 (Cadence) (xr4):00
5430 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
5432 // Ext. Reg. 5 (Ring timer) (xr5):22
5433 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
5435 // Ext. Reg. 6 (Power State) (xr6):00
5436 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
5438 // Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V
5439 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; // 0x40 ??? Should it be 0x00?
5441 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
5442 // 12,33,5A,C3 ; 770 Hz
5443 // 13,3C,5B,32 ; 852 Hz
5444 // 1D,1B,5C,CC ; 941 Hz
5445 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
5446 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
5447 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
5448 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
5450 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
5451 // EC,1D,52,22 ; 1336 Hz
5452 // AA,AC,51,D2 ; 1477 Hz
5453 // 9B,3B,51,25 ; 1633 Hz
5454 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
5455 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
5456 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
5457 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
5462 static void DAA_Coeff_Australia(int board
)
5464 IXJ
*j
= &ixj
[board
];
5468 //-----------------------------------------------
5470 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
5471 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
5474 // Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00
5475 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x00;
5476 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xA3;
5477 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xAA;
5478 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x28;
5479 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xB3;
5480 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0x82;
5481 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xD0;
5482 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
5484 // Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08
5485 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x70;
5486 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0x96;
5487 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
5488 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x09;
5489 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x32;
5490 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x6B;
5491 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xC0;
5492 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
5494 // Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08
5495 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x07;
5496 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x96;
5497 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0xE2;
5498 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x34;
5499 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x32;
5500 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x9B;
5501 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0x30;
5502 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
5504 // Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08
5505 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x0F;
5506 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x9A;
5507 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0xE9;
5508 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x2F;
5509 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x22;
5510 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xCC;
5511 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0xA0;
5512 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
5514 // Bytes for AX-filter (0A): CB,45,DD,CA
5515 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0xCB;
5516 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0x45;
5517 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
5518 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
5520 // Bytes for AR-filter (09): 1B,67,10,D6
5521 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x1B;
5522 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0x67;
5523 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
5524 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
5526 // Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98
5527 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x80;
5528 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x52;
5529 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
5530 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
5531 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAF;
5532 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
5533 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
5534 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
5536 // Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC
5537 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
5538 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xDB;
5539 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x52;
5540 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0xB0;
5541 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x38;
5542 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x01;
5543 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x82;
5544 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0xAC;
5546 // Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46
5547 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
5548 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
5549 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0x4A;
5550 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x3E;
5551 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x2C;
5552 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0x3B;
5553 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x24;
5554 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0x46;
5558 // Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
5559 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
5560 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
5561 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
5562 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
5563 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
5564 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
5565 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
5566 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
5568 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
5569 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
5570 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
5571 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
5572 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
5573 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
5574 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
5575 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
5576 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
5578 // Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V
5579 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0x32;
5580 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x45;
5581 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0xB5;
5582 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x84;
5584 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
5585 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
5586 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
5587 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
5588 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
5589 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
5590 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
5591 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
5592 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
5594 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
5595 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
5596 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
5597 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
5598 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
5599 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
5600 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
5601 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
5602 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
5605 // Config. Reg. 0 (filters) (cr0):FF
5606 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
5608 // Config. Reg. 1 (dialing) (cr1):05
5609 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
5611 // Config. Reg. 2 (caller ID) (cr2):04
5612 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
5614 // Config. Reg. 3 (testloops) (cr3):00 ;
5615 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
5617 // Config. Reg. 4 (analog gain) (cr4):01
5618 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
5620 // Config. Reg. 5 (Version) (cr5):02
5621 // Config. Reg. 6 (Reserved) (cr6):00
5622 // Config. Reg. 7 (Reserved) (cr7):00
5625 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
5626 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
5628 // Ext. Reg. 1 (Interrupt enable) (xr1):1C
5629 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; // RING, Caller ID, VDD_OK
5631 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
5632 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
5634 // Ext. Reg. 3 (DC Char) (xr3):2B ;
5635 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x2B;
5637 // Ext. Reg. 4 (Cadence) (xr4):00
5638 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
5640 // Ext. Reg. 5 (Ring timer) (xr5):22
5641 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
5643 // Ext. Reg. 6 (Power State) (xr6):00
5644 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
5646 // Ext. Reg. 7 (Vdd) (xr7):40
5647 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; // 0x40 ??? Should it be 0x00?
5649 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
5650 // 12,33,5A,C3 ; 770 Hz
5651 // 13,3C,5B,32 ; 852 Hz
5652 // 1D,1B,5C,CC ; 941 Hz
5653 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
5654 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
5655 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
5656 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
5658 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
5659 // EC,1D,52,22 ; 1336 Hz
5660 // AA,AC,51,D2 ; 1477 Hz
5661 // 9B,3B,51,25 ; 1633 Hz
5662 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
5663 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
5664 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
5665 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
5669 static void DAA_Coeff_Japan(int board
)
5671 IXJ
*j
= &ixj
[board
];
5675 //-----------------------------------------------
5677 for (i
= 0; i
< ALISDAA_CALLERID_SIZE
; i
++) {
5678 j
->m_DAAShadowRegs
.CAO_REGS
.CAO
.CallerID
[i
] = 0;
5681 // Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00
5682 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[7] = 0x06;
5683 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[6] = 0xBD;
5684 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[5] = 0xE2;
5685 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[4] = 0x2D;
5686 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[3] = 0xBA;
5687 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[2] = 0xF9;
5688 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[1] = 0xA0;
5689 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_1
[0] = 0x00;
5691 // Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08
5692 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[7] = 0x6F;
5693 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[6] = 0xF7;
5694 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[5] = 0x00;
5695 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[4] = 0x0E;
5696 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[3] = 0x34;
5697 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[2] = 0x33;
5698 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[1] = 0xE0;
5699 j
->m_DAAShadowRegs
.COP_REGS
.COP
.IMFilterCoeff_2
[0] = 0x08;
5701 // Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08
5702 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[7] = 0x02;
5703 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[6] = 0x8F;
5704 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[5] = 0x68;
5705 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[4] = 0x77;
5706 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[3] = 0x9C;
5707 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[2] = 0x58;
5708 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[1] = 0xF0;
5709 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRXFilterCoeff
[0] = 0x08;
5711 // Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08
5712 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[7] = 0x03;
5713 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[6] = 0x8F;
5714 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[5] = 0x38;
5715 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[4] = 0x73;
5716 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[3] = 0x87;
5717 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[2] = 0xEA;
5718 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[1] = 0x20;
5719 j
->m_DAAShadowRegs
.COP_REGS
.COP
.FRRFilterCoeff
[0] = 0x08;
5721 // Bytes for AX-filter (0A): 51,C5,DD,CA
5722 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[3] = 0x51;
5723 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[2] = 0xC5;
5724 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[1] = 0xDD;
5725 j
->m_DAAShadowRegs
.COP_REGS
.COP
.AXFilterCoeff
[0] = 0xCA;
5727 // Bytes for AR-filter (09): 25,A7,10,D6
5728 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[3] = 0x25;
5729 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[2] = 0xA7;
5730 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[1] = 0x10;
5731 j
->m_DAAShadowRegs
.COP_REGS
.COP
.ARFilterCoeff
[0] = 0xD6;
5733 // Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98
5734 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[7] = 0x00;
5735 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[6] = 0x42;
5736 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[5] = 0x48;
5737 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[4] = 0x81;
5738 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[3] = 0xAE;
5739 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[2] = 0x80;
5740 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[1] = 0x00;
5741 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_1
[0] = 0x98;
5743 // Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28
5744 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[7] = 0x02;
5745 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[6] = 0xAB;
5746 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[5] = 0x2A;
5747 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[4] = 0x20;
5748 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[3] = 0x99;
5749 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[2] = 0x5B;
5750 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[1] = 0x89;
5751 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_2
[0] = 0x28;
5753 // Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA
5754 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[7] = 0x00;
5755 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[6] = 0x88;
5756 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[5] = 0xDA;
5757 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[4] = 0x25;
5758 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[3] = 0x34;
5759 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[2] = 0xC5;
5760 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[1] = 0x4C;
5761 j
->m_DAAShadowRegs
.COP_REGS
.COP
.THFilterCoeff_3
[0] = 0xBA;
5765 // Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
5766 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[7] = 0x1B;
5767 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[6] = 0x3C;
5768 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[5] = 0x93;
5769 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[4] = 0x3A;
5770 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[3] = 0x22;
5771 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[2] = 0x12;
5772 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[1] = 0xA3;
5773 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_1
[0] = 0x23;
5775 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
5776 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[7] = 0x12;
5777 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[6] = 0xA2;
5778 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[5] = 0xA6;
5779 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[4] = 0xBA;
5780 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[3] = 0x22;
5781 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[2] = 0x7A;
5782 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[1] = 0x0A;
5783 j
->m_DAAShadowRegs
.COP_REGS
.COP
.RingerImpendance_2
[0] = 0xD5;
5785 // Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ?????????
5786 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[3] = 0xAA;
5787 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[2] = 0x35;
5788 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[1] = 0x0F;
5789 j
->m_DAAShadowRegs
.COP_REGS
.COP
.LevelmeteringRinging
[0] = 0x8E;
5791 // Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99
5792 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[7] = 0xCA;
5793 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[6] = 0x0E;
5794 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[5] = 0xCA;
5795 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[4] = 0x09;
5796 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[3] = 0x99;
5797 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[2] = 0x99;
5798 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[1] = 0x99;
5799 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID1stTone
[0] = 0x99;
5801 // Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00
5802 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[7] = 0xFD;
5803 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[6] = 0xB5;
5804 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[5] = 0xBA;
5805 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[4] = 0x07;
5806 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[3] = 0xDA;
5807 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[2] = 0x00;
5808 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[1] = 0x00;
5809 j
->m_DAAShadowRegs
.COP_REGS
.COP
.CallerID2ndTone
[0] = 0x00;
5812 // Config. Reg. 0 (filters) (cr0):FF
5813 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr0
.reg
= 0xFF;
5815 // Config. Reg. 1 (dialing) (cr1):05
5816 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr1
.reg
= 0x05;
5818 // Config. Reg. 2 (caller ID) (cr2):04
5819 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr2
.reg
= 0x04;
5821 // Config. Reg. 3 (testloops) (cr3):00 ;
5822 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr3
.reg
= 0x00;
5824 // Config. Reg. 4 (analog gain) (cr4):01
5825 j
->m_DAAShadowRegs
.SOP_REGS
.SOP
.cr4
.reg
= 0x02; //0x01;
5827 // Config. Reg. 5 (Version) (cr5):02
5828 // Config. Reg. 6 (Reserved) (cr6):00
5829 // Config. Reg. 7 (Reserved) (cr7):00
5832 // Ext. Reg. 0 (Interrupt Reg.) (xr0):02
5833 j
->m_DAAShadowRegs
.XOP_xr0_W
.reg
= 0x02; // SO_1 set to '1' because it is inverted.
5835 // Ext. Reg. 1 (Interrupt enable) (xr1):1C
5836 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr1
.reg
= 0x1C; // RING, Caller ID, VDD_OK
5838 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
5839 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr2
.reg
= 0x7D;
5841 // Ext. Reg. 3 (DC Char) (xr3):22 ;
5842 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr3
.reg
= 0x22;
5844 // Ext. Reg. 4 (Cadence) (xr4):00
5845 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr4
.reg
= 0x00;
5847 // Ext. Reg. 5 (Ring timer) (xr5):22
5848 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr5
.reg
= 0x22;
5850 // Ext. Reg. 6 (Power State) (xr6):00
5851 j
->m_DAAShadowRegs
.XOP_xr6_W
.reg
= 0x00;
5853 // Ext. Reg. 7 (Vdd) (xr7):40
5854 j
->m_DAAShadowRegs
.XOP_REGS
.XOP
.xr7
.reg
= 0x40; // 0x40 ??? Should it be 0x00?
5856 // DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz
5857 // 12,33,5A,C3 ; 770 Hz
5858 // 13,3C,5B,32 ; 852 Hz
5859 // 1D,1B,5C,CC ; 941 Hz
5860 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[3] = 0x11;
5861 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[2] = 0xB3;
5862 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[1] = 0x5A;
5863 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone1Coeff
[0] = 0x2C;
5865 // DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz
5866 // EC,1D,52,22 ; 1336 Hz
5867 // AA,AC,51,D2 ; 1477 Hz
5868 // 9B,3B,51,25 ; 1633 Hz
5870 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[3] = 0x32;
5871 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[2] = 0x32;
5872 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[1] = 0x52;
5873 j
->m_DAAShadowRegs
.COP_REGS
.COP
.Tone2Coeff
[0] = 0xB3;
5877 static s16 tone_table
[][19] =
5880 32538, // A1 = 1.985962
5881 -32325, // A2 = -0.986511
5882 -343, // B2 = -0.010493
5884 343, // B0 = 0.010493
5885 32619, // A1 = 1.990906
5886 -32520, // A2 = -0.992462
5887 19179, // B2 = 0.585327
5888 -19178, // B1 = -1.170593
5889 19179, // B0 = 0.585327
5890 32723, // A1 = 1.997314
5891 -32686, // A2 = -0.997528
5892 9973, // B2 = 0.304352
5893 -9955, // B1 = -0.607605
5894 9973, // B0 = 0.304352
5895 7, // Internal filter scaling
5896 159, // Minimum in-band energy threshold
5897 21, // 21/32 in-band to broad-band ratio
5898 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
5901 32072, // A1 = 1.95752
5902 -31896, // A2 = -0.973419
5903 -435, // B2 = -0.013294
5905 435, // B0 = 0.013294
5906 32188, // A1 = 1.9646
5907 -32400, // A2 = -0.98877
5908 15139, // B2 = 0.462036
5909 -14882, // B1 = -0.908356
5910 15139, // B0 = 0.462036
5911 32473, // A1 = 1.981995
5912 -32524, // A2 = -0.992584
5913 23200, // B2 = 0.708008
5914 -23113, // B1 = -1.410706
5915 23200, // B0 = 0.708008
5916 7, // Internal filter scaling
5917 159, // Minimum in-band energy threshold
5918 21, // 21/32 in-band to broad-band ratio
5919 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
5922 31769, // A1 = -1.939026
5923 -32584, // A2 = 0.994385
5924 -475, // B2 = -0.014522
5926 475, // B0 = 0.014522
5927 31789, // A1 = -1.940247
5928 -32679, // A2 = 0.997284
5929 17280, // B2 = 0.527344
5930 -16865, // B1 = -1.029358
5931 17280, // B0 = 0.527344
5932 31841, // A1 = -1.943481
5933 -32681, // A2 = 0.997345
5934 543, // B2 = 0.016579
5935 -525, // B1 = -0.032097
5936 543, // B0 = 0.016579
5937 5, // Internal filter scaling
5938 159, // Minimum in-band energy threshold
5939 21, // 21/32 in-band to broad-band ratio
5940 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
5943 30750, // A1 = 1.876892
5944 -31212, // A2 = -0.952515
5945 -804, // B2 = -0.024541
5947 804, // B0 = 0.024541
5948 30686, // A1 = 1.872925
5949 -32145, // A2 = -0.980988
5950 14747, // B2 = 0.450043
5951 -13703, // B1 = -0.836395
5952 14747, // B0 = 0.450043
5953 31651, // A1 = 1.931824
5954 -32321, // A2 = -0.986389
5955 24425, // B2 = 0.745422
5956 -23914, // B1 = -1.459595
5957 24427, // B0 = 0.745483
5958 7, // Internal filter scaling
5959 159, // Minimum in-band energy threshold
5960 21, // 21/32 in-band to broad-band ratio
5961 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
5964 31613, // A1 = -1.929565
5965 -32646, // A2 = 0.996277
5966 -185, // B2 = -0.005657
5968 185, // B0 = 0.005657
5969 31620, // A1 = -1.929932
5970 -32713, // A2 = 0.998352
5971 19253, // B2 = 0.587585
5972 -18566, // B1 = -1.133179
5973 19253, // B0 = 0.587585
5974 31674, // A1 = -1.933228
5975 -32715, // A2 = 0.998413
5976 2575, // B2 = 0.078590
5977 -2495, // B1 = -0.152283
5978 2575, // B0 = 0.078590
5979 5, // Internal filter scaling
5980 159, // Minimum in-band energy threshold
5981 21, // 21/32 in-band to broad-band ratio
5982 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
5985 30741, // A1 = 1.876282
5986 -31475, // A2 = -0.960541
5987 -703, // B2 = -0.021484
5989 703, // B0 = 0.021484
5990 30688, // A1 = 1.873047
5991 -32248, // A2 = -0.984161
5992 14542, // B2 = 0.443787
5993 -13523, // B1 = -0.825439
5994 14542, // B0 = 0.443817
5995 31494, // A1 = 1.922302
5996 -32366, // A2 = -0.987762
5997 21577, // B2 = 0.658508
5998 -21013, // B1 = -1.282532
5999 21577, // B0 = 0.658508
6000 7, // Internal filter scaling
6001 159, // Minimum in-band energy threshold
6002 21, // 21/32 in-band to broad-band ratio
6003 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6006 30627, // A1 = 1.869324
6007 -31338, // A2 = -0.95636
6008 -843, // B2 = -0.025749
6010 843, // B0 = 0.025749
6011 30550, // A1 = 1.864685
6012 -32221, // A2 = -0.983337
6013 13594, // B2 = 0.414886
6014 -12589, // B1 = -0.768402
6015 13594, // B0 = 0.414886
6016 31488, // A1 = 1.921936
6017 -32358, // A2 = -0.987518
6018 24684, // B2 = 0.753296
6019 -24029, // B1 = -1.466614
6020 24684, // B0 = 0.753296
6021 7, // Internal filter scaling
6022 159, // Minimum in-band energy threshold
6023 21, // 21/32 in-band to broad-band ratio
6024 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6027 31546, // A1 = -1.925476
6028 -32646, // A2 = 0.996277
6029 -445, // B2 = -0.013588
6031 445, // B0 = 0.013588
6032 31551, // A1 = -1.925781
6033 -32713, // A2 = 0.998352
6034 23884, // B2 = 0.728882
6035 -22979, // B1 = -1.402527
6036 23884, // B0 = 0.728882
6037 31606, // A1 = -1.929138
6038 -32715, // A2 = 0.998413
6039 863, // B2 = 0.026367
6040 -835, // B1 = -0.050985
6041 863, // B0 = 0.026367
6042 5, // Internal filter scaling
6043 159, // Minimum in-band energy threshold
6044 21, // 21/32 in-band to broad-band ratio
6045 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6048 31006, // A1 = 1.892517
6049 -32029, // A2 = -0.977448
6050 -461, // B2 = -0.014096
6052 461, // B0 = 0.014096
6053 30999, // A1 = 1.892029
6054 -32487, // A2 = -0.991455
6055 11325, // B2 = 0.345612
6056 -10682, // B1 = -0.651978
6057 11325, // B0 = 0.345612
6058 31441, // A1 = 1.919067
6059 -32526, // A2 = -0.992615
6060 24324, // B2 = 0.74231
6061 -23535, // B1 = -1.436523
6062 24324, // B0 = 0.74231
6063 7, // Internal filter scaling
6064 159, // Minimum in-band energy threshold
6065 21, // 21/32 in-band to broad-band ratio
6066 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6069 30634, // A1 = 1.869751
6070 -31533, // A2 = -0.962341
6071 -680, // B2 = -0.020782
6073 680, // B0 = 0.020782
6074 30571, // A1 = 1.865906
6075 -32277, // A2 = -0.985016
6076 12894, // B2 = 0.393524
6077 -11945, // B1 = -0.729065
6078 12894, // B0 = 0.393524
6079 31367, // A1 = 1.91449
6080 -32379, // A2 = -0.988129
6081 23820, // B2 = 0.726929
6082 -23104, // B1 = -1.410217
6083 23820, // B0 = 0.726929
6084 7, // Internal filter scaling
6085 159, // Minimum in-band energy threshold
6086 21, // 21/32 in-band to broad-band ratio
6087 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6090 30552, // A1 = 1.864807
6091 -31434, // A2 = -0.95929
6092 -690, // B2 = -0.021066
6094 690, // B0 = 0.021066
6095 30472, // A1 = 1.859924
6096 -32248, // A2 = -0.984161
6097 13385, // B2 = 0.408478
6098 -12357, // B1 = -0.754242
6099 13385, // B0 = 0.408478
6100 31358, // A1 = 1.914001
6101 -32366, // A2 = -0.987732
6102 26488, // B2 = 0.80835
6103 -25692, // B1 = -1.568176
6104 26490, // B0 = 0.808411
6105 7, // Internal filter scaling
6106 159, // Minimum in-band energy threshold
6107 21, // 21/32 in-band to broad-band ratio
6108 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6111 31397, // A1 = -1.916321
6112 -32623, // A2 = 0.995605
6113 -117, // B2 = -0.003598
6115 117, // B0 = 0.003598
6116 31403, // A1 = -1.916687
6117 -32700, // A2 = 0.997925
6118 3388, // B2 = 0.103401
6119 -3240, // B1 = -0.197784
6120 3388, // B0 = 0.103401
6121 31463, // A1 = -1.920410
6122 -32702, // A2 = 0.997986
6123 13346, // B2 = 0.407288
6124 -12863, // B1 = -0.785126
6125 13346, // B0 = 0.407288
6126 5, // Internal filter scaling
6127 159, // Minimum in-band energy threshold
6128 21, // 21/32 in-band to broad-band ratio
6129 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6132 30831, // A1 = 1.881775
6133 -32064, // A2 = -0.978546
6134 -367, // B2 = -0.01122
6136 367, // B0 = 0.01122
6137 30813, // A1 = 1.880737
6138 -32456, // A2 = -0.990509
6139 11068, // B2 = 0.337769
6140 -10338, // B1 = -0.631042
6141 11068, // B0 = 0.337769
6142 31214, // A1 = 1.905212
6143 -32491, // A2 = -0.991577
6144 16374, // B2 = 0.499695
6145 -15781, // B1 = -0.963196
6146 16374, // B0 = 0.499695
6147 7, // Internal filter scaling
6148 159, // Minimum in-band energy threshold
6149 21, // 21/32 in-band to broad-band ratio
6150 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6153 31152, // A1 = -1.901428
6154 -32613, // A2 = 0.995300
6155 -314, // B2 = -0.009605
6157 314, // B0 = 0.009605
6158 31156, // A1 = -1.901672
6159 -32694, // A2 = 0.997742
6160 28847, // B2 = 0.880371
6161 -2734, // B1 = -0.166901
6162 28847, // B0 = 0.880371
6163 31225, // A1 = -1.905823
6164 -32696, // A2 = 0.997803
6165 462, // B2 = 0.014108
6166 -442, // B1 = -0.027019
6167 462, // B0 = 0.014108
6168 5, // Internal filter scaling
6169 159, // Minimum in-band energy threshold
6170 21, // 21/32 in-band to broad-band ratio
6171 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6174 30836, // A1 = 1.882141
6175 -32296, // A2 = -0.985596
6176 -324, // B2 = -0.009903
6178 324, // B0 = 0.009903
6179 30825, // A1 = 1.881409
6180 -32570, // A2 = -0.993958
6181 16847, // B2 = 0.51416
6182 -15792, // B1 = -0.963898
6183 16847, // B0 = 0.51416
6184 31106, // A1 = 1.89856
6185 -32584, // A2 = -0.994415
6186 9579, // B2 = 0.292328
6187 -9164, // B1 = -0.559357
6188 9579, // B0 = 0.292328
6189 7, // Internal filter scaling
6190 159, // Minimum in-band energy threshold
6191 21, // 21/32 in-band to broad-band ratio
6192 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6195 30702, // A1 = 1.873962
6196 -32134, // A2 = -0.980682
6197 -517, // B2 = -0.015793
6199 517, // B0 = 0.015793
6200 30676, // A1 = 1.872375
6201 -32520, // A2 = -0.992462
6202 8144, // B2 = 0.24855
6203 -7596, // B1 = -0.463684
6204 8144, // B0 = 0.24855
6205 31084, // A1 = 1.897217
6206 -32547, // A2 = -0.993256
6207 22713, // B2 = 0.693176
6208 -21734, // B1 = -1.326599
6209 22713, // B0 = 0.693176
6210 7, // Internal filter scaling
6211 159, // Minimum in-band energy threshold
6212 21, // 21/32 in-band to broad-band ratio
6213 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6216 30613, // A1 = 1.86853
6217 -32031, // A2 = -0.977509
6218 -618, // B2 = -0.018866
6220 618, // B0 = 0.018866
6221 30577, // A1 = 1.866272
6222 -32491, // A2 = -0.991577
6223 9612, // B2 = 0.293335
6224 -8935, // B1 = -0.54541
6225 9612, // B0 = 0.293335
6226 31071, // A1 = 1.896484
6227 -32524, // A2 = -0.992584
6228 21596, // B2 = 0.659058
6229 -20667, // B1 = -1.261414
6230 21596, // B0 = 0.659058
6231 7, // Internal filter scaling
6232 159, // Minimum in-band energy threshold
6233 21, // 21/32 in-band to broad-band ratio
6234 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6237 30914, // A1 = -1.886841
6238 -32584, // A2 = 0.994385
6239 -426, // B2 = -0.013020
6241 426, // B0 = 0.013020
6242 30914, // A1 = -1.886841
6243 -32679, // A2 = 0.997314
6244 17520, // B2 = 0.534668
6245 -16471, // B1 = -1.005310
6246 17520, // B0 = 0.534668
6247 31004, // A1 = -1.892334
6248 -32683, // A2 = 0.997406
6249 819, // B2 = 0.025023
6250 -780, // B1 = -0.047619
6251 819, // B0 = 0.025023
6252 5, // Internal filter scaling
6253 159, // Minimum in-band energy threshold
6254 21, // 21/32 in-band to broad-band ratio
6255 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6258 30881, // A1 = -1.884827
6259 -32603, // A2 = 0.994965
6260 -496, // B2 = -0.015144
6262 496, // B0 = 0.015144
6263 30880, // A1 = -1.884766
6264 -32692, // A2 = 0.997711
6265 24767, // B2 = 0.755859
6266 -23290, // B1 = -1.421509
6267 24767, // B0 = 0.755859
6268 30967, // A1 = -1.890076
6269 -32694, // A2 = 0.997772
6270 728, // B2 = 0.022232
6271 -691, // B1 = -0.042194
6272 728, // B0 = 0.022232
6273 5, // Internal filter scaling
6274 159, // Minimum in-band energy threshold
6275 21, // 21/32 in-band to broad-band ratio
6276 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6279 30646, // A1 = 1.870544
6280 -32327, // A2 = -0.986572
6281 -287, // B2 = -0.008769
6283 287, // B0 = 0.008769
6284 30627, // A1 = 1.869324
6285 -32607, // A2 = -0.995087
6286 13269, // B2 = 0.404968
6287 -12376, // B1 = -0.755432
6288 13269, // B0 = 0.404968
6289 30924, // A1 = 1.887512
6290 -32619, // A2 = -0.995453
6291 19950, // B2 = 0.608826
6292 -18940, // B1 = -1.156006
6293 19950, // B0 = 0.608826
6294 7, // Internal filter scaling
6295 159, // Minimum in-band energy threshold
6296 21, // 21/32 in-band to broad-band ratio
6297 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6300 30396, // A1 = 1.855225
6301 -32014, // A2 = -0.97699
6302 -395, // B2 = -0.012055
6304 395, // B0 = 0.012055
6305 30343, // A1 = 1.85199
6306 -32482, // A2 = -0.991302
6307 17823, // B2 = 0.543945
6308 -16431, // B1 = -1.002869
6309 17823, // B0 = 0.543945
6310 30872, // A1 = 1.884338
6311 -32516, // A2 = -0.99231
6312 18124, // B2 = 0.553101
6313 -17246, // B1 = -1.052673
6314 18124, // B0 = 0.553101
6315 7, // Internal filter scaling
6316 159, // Minimum in-band energy threshold
6317 21, // 21/32 in-band to broad-band ratio
6318 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6321 30796, // A1 = -1.879639
6322 -32603, // A2 = 0.994965
6323 -254, // B2 = -0.007762
6325 254, // B0 = 0.007762
6326 30793, // A1 = -1.879456
6327 -32692, // A2 = 0.997711
6328 18934, // B2 = 0.577820
6329 -17751, // B1 = -1.083496
6330 18934, // B0 = 0.577820
6331 30882, // A1 = -1.884888
6332 -32694, // A2 = 0.997772
6333 1858, // B2 = 0.056713
6334 -1758, // B1 = -0.107357
6335 1858, // B0 = 0.056713
6336 5, // Internal filter scaling
6337 159, // Minimum in-band energy threshold
6338 21, // 21/32 in-band to broad-band ratio
6339 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6342 30641, // A1 = 1.870239
6343 -32458, // A2 = -0.99057
6344 -155, // B2 = -0.004735
6346 155, // B0 = 0.004735
6347 30631, // A1 = 1.869568
6348 -32630, // A2 = -0.995789
6349 11453, // B2 = 0.349548
6350 -10666, // B1 = -0.651001
6351 11453, // B0 = 0.349548
6352 30810, // A1 = 1.880554
6353 -32634, // A2 = -0.995941
6354 12237, // B2 = 0.373474
6355 -11588, // B1 = -0.707336
6356 12237, // B0 = 0.373474
6357 7, // Internal filter scaling
6358 159, // Minimum in-band energy threshold
6359 21, // 21/32 in-band to broad-band ratio
6360 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6363 30367, // A1 = 1.853455
6364 -32147, // A2 = -0.981079
6365 -495, // B2 = -0.015113
6367 495, // B0 = 0.015113
6368 30322, // A1 = 1.850769
6369 -32543, // A2 = -0.993134
6370 10031, // B2 = 0.306152
6371 -9252, // B1 = -0.564728
6372 10031, // B0 = 0.306152
6373 30770, // A1 = 1.878052
6374 -32563, // A2 = -0.993774
6375 22674, // B2 = 0.691956
6376 -21465, // B1 = -1.31012
6377 22674, // B0 = 0.691956
6378 7, // Internal filter scaling
6379 159, // Minimum in-band energy threshold
6380 21, // 21/32 in-band to broad-band ratio
6381 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6384 30709, // A1 = -1.874329
6385 -32603, // A2 = 0.994965
6386 -83, // B2 = -0.002545
6388 83, // B0 = 0.002545
6389 30704, // A1 = -1.874084
6390 -32692, // A2 = 0.997711
6391 10641, // B2 = 0.324738
6392 -9947, // B1 = -0.607147
6393 10641, // B0 = 0.324738
6394 30796, // A1 = -1.879639
6395 -32694, // A2 = 0.997772
6396 10079, // B2 = 0.307587
6397 9513, // B1 = 0.580688
6398 10079, // B0 = 0.307587
6399 5, // Internal filter scaling
6400 159, // Minimum in-band energy threshold
6401 21, // 21/32 in-band to broad-band ratio
6402 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6405 30664, // A1 = -1.871643
6406 -32603, // A2 = 0.994965
6407 -164, // B2 = -0.005029
6409 164, // B0 = 0.005029
6410 30661, // A1 = -1.871399
6411 -32692, // A2 = 0.997711
6412 15294, // B2 = 0.466736
6413 -14275, // B1 = -0.871307
6414 15294, // B0 = 0.466736
6415 30751, // A1 = -1.876953
6416 -32694, // A2 = 0.997772
6417 3548, // B2 = 0.108284
6418 -3344, // B1 = -0.204155
6419 3548, // B0 = 0.108284
6420 5, // Internal filter scaling
6421 159, // Minimum in-band energy threshold
6422 21, // 21/32 in-band to broad-band ratio
6423 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6426 30653, // A1 = -1.870911
6427 -32615, // A2 = 0.995361
6428 -209, // B2 = -0.006382
6430 209, // B0 = 0.006382
6431 30647, // A1 = -1.870605
6432 -32702, // A2 = 0.997986
6433 18971, // B2 = 0.578979
6434 -17716, // B1 = -1.081299
6435 18971, // B0 = 0.578979
6436 30738, // A1 = -1.876099
6437 -32702, // A2 = 0.998016
6438 2967, // B2 = 0.090561
6439 -2793, // B1 = -0.170502
6440 2967, // B0 = 0.090561
6441 5, // Internal filter scaling
6442 159, // Minimum in-band energy threshold
6443 21, // 21/32 in-band to broad-band ratio
6444 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6447 30437, // A1 = -1.857727
6448 -32603, // A2 = 0.994965
6449 -264, // B2 = -0.008062
6451 264, // B0 = 0.008062
6452 30430, // A1 = -1.857300
6453 -32692, // A2 = 0.997711
6454 21681, // B2 = 0.661682
6455 -20082, // B1 = -1.225708
6456 21681, // B0 = 0.661682
6457 30526, // A1 = -1.863220
6458 -32694, // A2 = 0.997742
6459 1559, // B2 = 0.047600
6460 -1459, // B1 = -0.089096
6461 1559, // B0 = 0.047600
6462 5, // Internal filter scaling
6463 159, // Minimum in-band energy threshold
6464 21, // 21/32 in-band to broad-band ratio
6465 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6468 28975, // A1 = 1.768494
6469 -30955, // A2 = -0.944672
6470 -1026, // B2 = -0.03133
6472 1026, // B0 = 0.03133
6473 28613, // A1 = 1.746399
6474 -32089, // A2 = -0.979309
6475 14214, // B2 = 0.433807
6476 -12202, // B1 = -0.744812
6477 14214, // B0 = 0.433807
6478 30243, // A1 = 1.845947
6479 -32238, // A2 = -0.983856
6480 24825, // B2 = 0.757629
6481 -23402, // B1 = -1.428345
6482 24825, // B0 = 0.757629
6483 7, // Internal filter scaling
6484 159, // Minimum in-band energy threshold
6485 21, // 21/32 in-band to broad-band ratio
6486 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6489 30257, // A1 = -1.846741
6490 -32605, // A2 = 0.995056
6491 -249, // B2 = -0.007625
6493 249, // B0 = 0.007625
6494 30247, // A1 = -1.846191
6495 -32694, // A2 = 0.997772
6496 18088, // B2 = 0.552002
6497 -16652, // B1 = -1.016418
6498 18088, // B0 = 0.552002
6499 30348, // A1 = -1.852295
6500 -32696, // A2 = 0.997803
6501 2099, // B2 = 0.064064
6502 -1953, // B1 = -0.119202
6503 2099, // B0 = 0.064064
6504 5, // Internal filter scaling
6505 159, // Minimum in-band energy threshold
6506 21, // 21/32 in-band to broad-band ratio
6507 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6510 30202, // A1 = -1.843431
6511 -32624, // A2 = 0.995622
6512 -413, // B2 = -0.012622
6514 413, // B0 = 0.012622
6515 30191, // A1 = -1.842721
6516 -32714, // A2 = 0.998364
6517 25954, // B2 = 0.792057
6518 -23890, // B1 = -1.458131
6519 25954, // B0 = 0.792057
6520 30296, // A1 = -1.849172
6521 -32715, // A2 = 0.998397
6522 2007, // B2 = 0.061264
6523 -1860, // B1 = -0.113568
6524 2007, // B0 = 0.061264
6525 5, // Internal filter scaling
6526 159, // Minimum in-band energy threshold
6527 21, // 21/32 in-band to broad-band ratio
6528 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6531 30001, // A1 = -1.831116
6532 -32613, // A2 = 0.995270
6533 -155, // B2 = -0.004750
6535 155, // B0 = 0.004750
6536 29985, // A1 = -1.830200
6537 -32710, // A2 = 0.998260
6538 6584, // B2 = 0.200928
6539 -6018, // B1 = -0.367355
6540 6584, // B0 = 0.200928
6541 30105, // A1 = -1.837524
6542 -32712, // A2 = 0.998291
6543 23812, // B2 = 0.726685
6544 -21936, // B1 = -1.338928
6545 23812, // B0 = 0.726685
6546 5, // Internal filter scaling
6547 159, // Minimum in-band energy threshold
6548 21, // 21/32 in-band to broad-band ratio
6549 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6552 29964, // A1 = -1.828918
6553 -32601, // A2 = 0.994904
6554 -101, // B2 = -0.003110
6556 101, // B0 = 0.003110
6557 29949, // A1 = -1.827942
6558 -32700, // A2 = 0.997925
6559 11041, // B2 = 0.336975
6560 -10075, // B1 = -0.614960
6561 11041, // B0 = 0.336975
6562 30070, // A1 = -1.835388
6563 -32702, // A2 = 0.997986
6564 16762, // B2 = 0.511536
6565 -15437, // B1 = -0.942230
6566 16762, // B0 = 0.511536
6567 5, // Internal filter scaling
6568 159, // Minimum in-band energy threshold
6569 21, // 21/32 in-band to broad-band ratio
6570 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6573 29936, // A1 = -1.827209
6574 -32584, // A2 = 0.994415
6575 -91, // B2 = -0.002806
6577 91, // B0 = 0.002806
6578 29921, // A1 = -1.826233
6579 -32688, // A2 = 0.997559
6580 11449, // B2 = 0.349396
6581 -10426, // B1 = -0.636383
6582 11449, // B0 = 0.349396
6583 30045, // A1 = -1.833862
6584 -32688, // A2 = 0.997589
6585 13055, // B2 = 0.398407
6586 -12028, // B1 = -0.734161
6587 13055, // B0 = 0.398407
6588 5, // Internal filter scaling
6589 159, // Minimum in-band energy threshold
6590 21, // 21/32 in-band to broad-band ratio
6591 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6594 28499, // A1 = 1.739441
6595 -31129, // A2 = -0.949982
6596 -849, // B2 = -0.025922
6598 849, // B0 = 0.025922
6599 28128, // A1 = 1.716797
6600 -32130, // A2 = -0.98056
6601 14556, // B2 = 0.444214
6602 -12251, // B1 = -0.747772
6603 14556, // B0 = 0.444244
6604 29667, // A1 = 1.81073
6605 -32244, // A2 = -0.984039
6606 23038, // B2 = 0.703064
6607 -21358, // B1 = -1.303589
6608 23040, // B0 = 0.703125
6609 7, // Internal filter scaling
6610 159, // Minimum in-band energy threshold
6611 21, // 21/32 in-band to broad-band ratio
6612 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6615 29271, // A1 = -1.786560
6616 -32599, // A2 = 0.994873
6617 -490, // B2 = -0.014957
6619 490, // B0 = 0.014957
6620 29246, // A1 = -1.785095
6621 -32700, // A2 = 0.997925
6622 28961, // B2 = 0.883850
6623 -25796, // B1 = -1.574463
6624 28961, // B0 = 0.883850
6625 29383, // A1 = -1.793396
6626 -32700, // A2 = 0.997955
6627 1299, // B2 = 0.039650
6628 -1169, // B1 = -0.071396
6629 1299, // B0 = 0.039650
6630 5, // Internal filter scaling
6631 159, // Minimum in-band energy threshold
6632 21, // 21/32 in-band to broad-band ratio
6633 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6636 29230, // A1 = -1.784058
6637 -32584, // A2 = 0.994415
6638 -418, // B2 = -0.012757
6640 418, // B0 = 0.012757
6641 29206, // A1 = -1.782593
6642 -32688, // A2 = 0.997559
6643 36556, // B2 = 1.115601
6644 -32478, // B1 = -1.982300
6645 36556, // B0 = 1.115601
6646 29345, // A1 = -1.791077
6647 -32688, // A2 = 0.997589
6648 897, // B2 = 0.027397
6649 -808, // B1 = -0.049334
6650 897, // B0 = 0.027397
6651 5, // Internal filter scaling
6652 159, // Minimum in-band energy threshold
6653 21, // 21/32 in-band to broad-band ratio
6654 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6657 29116, // A1 = -1.777100
6658 -32603, // A2 = 0.994965
6659 -165, // B2 = -0.005039
6661 165, // B0 = 0.005039
6662 29089, // A1 = -1.775452
6663 -32708, // A2 = 0.998199
6664 6963, // B2 = 0.212494
6665 -6172, // B1 = -0.376770
6666 6963, // B0 = 0.212494
6667 29237, // A1 = -1.784485
6668 -32710, // A2 = 0.998230
6669 24197, // B2 = 0.738464
6670 -21657, // B1 = -1.321899
6671 24197, // B0 = 0.738464
6672 5, // Internal filter scaling
6673 159, // Minimum in-band energy threshold
6674 21, // 21/32 in-band to broad-band ratio
6675 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6678 28376, // A1 = -1.731934
6679 -32567, // A2 = 0.993896
6680 -363, // B2 = -0.011102
6682 363, // B0 = 0.011102
6683 28337, // A1 = -1.729614
6684 -32683, // A2 = 0.997434
6685 21766, // B2 = 0.664246
6686 -18761, // B1 = -1.145081
6687 21766, // B0 = 0.664246
6688 28513, // A1 = -1.740356
6689 -32686, // A2 = 0.997498
6690 2509, // B2 = 0.076584
6691 -2196, // B1 = -0.134041
6692 2509, // B0 = 0.076584
6693 5, // Internal filter scaling
6694 159, // Minimum in-band energy threshold
6695 21, // 21/32 in-band to broad-band ratio
6696 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6699 27844, // A1 = -1.699463
6700 -32563, // A2 = 0.993744
6701 -366, // B2 = -0.011187
6703 366, // B0 = 0.011187
6704 27797, // A1 = -1.696655
6705 -32686, // A2 = 0.997498
6706 22748, // B2 = 0.694214
6707 -19235, // B1 = -1.174072
6708 22748, // B0 = 0.694214
6709 27995, // A1 = -1.708740
6710 -32688, // A2 = 0.997559
6711 2964, // B2 = 0.090477
6712 -2546, // B1 = -0.155449
6713 2964, // B0 = 0.090477
6714 5, // Internal filter scaling
6715 159, // Minimum in-band energy threshold
6716 21, // 21/32 in-band to broad-band ratio
6717 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6720 27297, // A1 = -1.666077
6721 -32551, // A2 = 0.993408
6722 -345, // B2 = -0.010540
6724 345, // B0 = 0.010540
6725 27240, // A1 = -1.662598
6726 -32683, // A2 = 0.997406
6727 22560, // B2 = 0.688477
6728 -18688, // B1 = -1.140625
6729 22560, // B0 = 0.688477
6730 27461, // A1 = -1.676147
6731 -32684, // A2 = 0.997467
6732 3541, // B2 = 0.108086
6733 -2985, // B1 = -0.182220
6734 3541, // B0 = 0.108086
6735 5, // Internal filter scaling
6736 159, // Minimum in-band energy threshold
6737 21, // 21/32 in-band to broad-band ratio
6738 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6741 27155, // A1 = -1.657410
6742 -32551, // A2 = 0.993408
6743 -462, // B2 = -0.014117
6745 462, // B0 = 0.014117
6746 27097, // A1 = -1.653870
6747 -32683, // A2 = 0.997406
6748 32495, // B2 = 0.991699
6749 -26776, // B1 = -1.634338
6750 32495, // B0 = 0.991699
6751 27321, // A1 = -1.667542
6752 -32684, // A2 = 0.997467
6753 1835, // B2 = 0.056007
6754 -1539, // B1 = -0.093948
6755 1835, // B0 = 0.056007
6756 5, // Internal filter scaling
6757 159, // Minimum in-band energy threshold
6758 21, // 21/32 in-band to broad-band ratio
6759 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6762 19298, // A1 = 1.177917
6763 -24471, // A2 = -0.746796
6764 -4152, // B2 = -0.126709
6766 4152, // B0 = 0.126709
6767 12902, // A1 = 0.787476
6768 -29091, // A2 = -0.887817
6769 12491, // B2 = 0.38121
6770 -1794, // B1 = -0.109528
6771 12494, // B0 = 0.381317
6772 26291, // A1 = 1.604736
6773 -30470, // A2 = -0.929901
6774 28859, // B2 = 0.880737
6775 -26084, // B1 = -1.592102
6776 28861, // B0 = 0.880798
6777 7, // Internal filter scaling
6778 159, // Minimum in-band energy threshold
6779 21, // 21/32 in-band to broad-band ratio
6780 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6783 26867, // A1 = -1.639832
6784 -32551, // A2 = 0.993408
6785 -123, // B2 = -0.003755
6787 123, // B0 = 0.003755
6788 26805, // A1 = -1.636108
6789 -32683, // A2 = 0.997406
6790 17297, // B2 = 0.527863
6791 -14096, // B1 = -0.860382
6792 17297, // B0 = 0.527863
6793 27034, // A1 = -1.650085
6794 -32684, // A2 = 0.997467
6795 12958, // B2 = 0.395477
6796 -10756, // B1 = -0.656525
6797 12958, // B0 = 0.395477
6798 5, // Internal filter scaling
6799 159, // Minimum in-band energy threshold
6800 21, // 21/32 in-band to broad-band ratio
6801 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6804 26413, // A1 = -1.612122
6805 -32547, // A2 = 0.993286
6806 -223, // B2 = -0.006825
6808 223, // B0 = 0.006825
6809 26342, // A1 = -1.607849
6810 -32686, // A2 = 0.997498
6811 6391, // B2 = 0.195053
6812 -5120, // B1 = -0.312531
6813 6391, // B0 = 0.195053
6814 26593, // A1 = -1.623108
6815 -32688, // A2 = 0.997559
6816 23681, // B2 = 0.722717
6817 -19328, // B1 = -1.179688
6818 23681, // B0 = 0.722717
6819 5, // Internal filter scaling
6820 159, // Minimum in-band energy threshold
6821 21, // 21/32 in-band to broad-band ratio
6822 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6825 26168, // A1 = -1.597209
6826 -32528, // A2 = 0.992706
6827 -235, // B2 = -0.007182
6829 235, // B0 = 0.007182
6830 26092, // A1 = -1.592590
6831 -32675, // A2 = 0.997192
6832 20823, // B2 = 0.635498
6833 -16510, // B1 = -1.007751
6834 20823, // B0 = 0.635498
6835 26363, // A1 = -1.609070
6836 -32677, // A2 = 0.997253
6837 6739, // B2 = 0.205688
6838 -5459, // B1 = -0.333206
6839 6739, // B0 = 0.205688
6840 5, // Internal filter scaling
6841 159, // Minimum in-band energy threshold
6842 21, // 21/32 in-band to broad-band ratio
6843 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6846 25641, // A1 = -1.565063
6847 -32536, // A2 = 0.992950
6848 -121, // B2 = -0.003707
6850 121, // B0 = 0.003707
6851 25560, // A1 = -1.560059
6852 -32684, // A2 = 0.997437
6853 18341, // B2 = 0.559753
6854 -14252, // B1 = -0.869904
6855 18341, // B0 = 0.559753
6856 25837, // A1 = -1.577026
6857 -32684, // A2 = 0.997467
6858 16679, // B2 = 0.509003
6859 -13232, // B1 = -0.807648
6860 16679, // B0 = 0.509003
6861 5, // Internal filter scaling
6862 159, // Minimum in-band energy threshold
6863 21, // 21/32 in-band to broad-band ratio
6864 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6867 16415, // A1 = 1.001953
6868 -23669, // A2 = -0.722321
6869 -4549, // B2 = -0.138847
6871 4549, // B0 = 0.138847
6872 8456, // A1 = 0.516174
6873 -28996, // A2 = -0.884918
6874 13753, // B2 = 0.419724
6875 -12, // B1 = -0.000763
6876 13757, // B0 = 0.419846
6877 24632, // A1 = 1.503418
6878 -30271, // A2 = -0.923828
6879 29070, // B2 = 0.887146
6880 -25265, // B1 = -1.542114
6881 29073, // B0 = 0.887268
6882 7, // Internal filter scaling
6883 159, // Minimum in-band energy threshold
6884 21, // 21/32 in-band to broad-band ratio
6885 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6888 24806, // A1 = -1.514099
6889 -32501, // A2 = 0.991852
6890 -326, // B2 = -0.009969
6892 326, // B0 = 0.009969
6893 24709, // A1 = -1.508118
6894 -32659, // A2 = 0.996674
6895 20277, // B2 = 0.618835
6896 -15182, // B1 = -0.926636
6897 20277, // B0 = 0.618835
6898 25022, // A1 = -1.527222
6899 -32661, // A2 = 0.996735
6900 4320, // B2 = 0.131836
6901 -3331, // B1 = -0.203339
6902 4320, // B0 = 0.131836
6903 5, // Internal filter scaling
6904 159, // Minimum in-band energy threshold
6905 21, // 21/32 in-band to broad-band ratio
6906 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6909 19776, // A1 = 1.207092
6910 -27437, // A2 = -0.837341
6911 -2666, // B2 = -0.081371
6913 2666, // B0 = 0.081371
6914 16302, // A1 = 0.995026
6915 -30354, // A2 = -0.926361
6916 10389, // B2 = 0.317062
6917 -3327, // B1 = -0.203064
6918 10389, // B0 = 0.317062
6919 24299, // A1 = 1.483154
6920 -30930, // A2 = -0.943909
6921 25016, // B2 = 0.763428
6922 -21171, // B1 = -1.292236
6923 25016, // B0 = 0.763428
6924 7, // Internal filter scaling
6925 159, // Minimum in-band energy threshold
6926 21, // 21/32 in-band to broad-band ratio
6927 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6930 20554, // A1 = 1.254517
6931 -28764, // A2 = -0.877838
6932 -2048, // B2 = -0.062515
6934 2048, // B0 = 0.062515
6935 18209, // A1 = 1.11145
6936 -30951, // A2 = -0.94458
6937 9390, // B2 = 0.286575
6938 -3955, // B1 = -0.241455
6939 9390, // B0 = 0.286575
6940 23902, // A1 = 1.458923
6941 -31286, // A2 = -0.954803
6942 23252, // B2 = 0.709595
6943 -19132, // B1 = -1.167725
6944 23252, // B0 = 0.709595
6945 7, // Internal filter scaling
6946 159, // Minimum in-band energy threshold
6947 21, // 21/32 in-band to broad-band ratio
6948 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6951 17543, // A1 = 1.07074
6952 -26220, // A2 = -0.800201
6953 -3298, // B2 = -0.100647
6955 3298, // B0 = 0.100647
6956 12423, // A1 = 0.75827
6957 -30036, // A2 = -0.916626
6958 12651, // B2 = 0.386078
6959 -2444, // B1 = -0.14917
6960 12653, // B0 = 0.386154
6961 23518, // A1 = 1.435425
6962 -30745, // A2 = -0.938293
6963 27282, // B2 = 0.832581
6964 -22529, // B1 = -1.375122
6965 27286, // B0 = 0.832703
6966 7, // Internal filter scaling
6967 159, // Minimum in-band energy threshold
6968 21, // 21/32 in-band to broad-band ratio
6969 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6972 24104, // A1 = -1.471252
6973 -32507, // A2 = 0.992065
6974 -351, // B2 = -0.010722
6976 351, // B0 = 0.010722
6977 23996, // A1 = -1.464600
6978 -32671, // A2 = 0.997040
6979 22848, // B2 = 0.697266
6980 -16639, // B1 = -1.015564
6981 22848, // B0 = 0.697266
6982 24332, // A1 = -1.485168
6983 -32673, // A2 = 0.997101
6984 4906, // B2 = 0.149727
6985 -3672, // B1 = -0.224174
6986 4906, // B0 = 0.149727
6987 5, // Internal filter scaling
6988 159, // Minimum in-band energy threshold
6989 21, // 21/32 in-band to broad-band ratio
6990 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
6993 23967, // A1 = -1.462830
6994 -32507, // A2 = 0.992065
6995 -518, // B2 = -0.015821
6997 518, // B0 = 0.015821
6998 23856, // A1 = -1.456055
6999 -32671, // A2 = 0.997040
7000 26287, // B2 = 0.802246
7001 -19031, // B1 = -1.161560
7002 26287, // B0 = 0.802246
7003 24195, // A1 = -1.476746
7004 -32673, // A2 = 0.997101
7005 2890, // B2 = 0.088196
7006 -2151, // B1 = -0.131317
7007 2890, // B0 = 0.088196
7008 5, // Internal filter scaling
7009 159, // Minimum in-band energy threshold
7010 21, // 21/32 in-band to broad-band ratio
7011 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7014 18294, // A1 = 1.116638
7015 -26962, // A2 = -0.822845
7016 -2914, // B2 = -0.088936
7018 2914, // B0 = 0.088936
7019 14119, // A1 = 0.861786
7020 -30227, // A2 = -0.922455
7021 11466, // B2 = 0.349945
7022 -2833, // B1 = -0.172943
7023 11466, // B0 = 0.349945
7024 23431, // A1 = 1.430115
7025 -30828, // A2 = -0.940796
7026 25331, // B2 = 0.773071
7027 -20911, // B1 = -1.276367
7028 25331, // B0 = 0.773071
7029 7, // Internal filter scaling
7030 159, // Minimum in-band energy threshold
7031 21, // 21/32 in-band to broad-band ratio
7032 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7035 23521, // A1 = -1.435608
7036 -32489, // A2 = 0.991516
7037 -193, // B2 = -0.005915
7039 193, // B0 = 0.005915
7040 23404, // A1 = -1.428467
7041 -32655, // A2 = 0.996582
7042 17740, // B2 = 0.541412
7043 -12567, // B1 = -0.767029
7044 17740, // B0 = 0.541412
7045 23753, // A1 = -1.449829
7046 -32657, // A2 = 0.996613
7047 9090, // B2 = 0.277405
7048 -6662, // B1 = -0.406647
7049 9090, // B0 = 0.277405
7050 5, // Internal filter scaling
7051 159, // Minimum in-band energy threshold
7052 21, // 21/32 in-band to broad-band ratio
7053 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7056 23071, // A1 = -1.408203
7057 -32489, // A2 = 0.991516
7058 -293, // B2 = -0.008965
7060 293, // B0 = 0.008965
7061 22951, // A1 = -1.400818
7062 -32655, // A2 = 0.996582
7063 5689, // B2 = 0.173645
7064 -3951, // B1 = -0.241150
7065 5689, // B0 = 0.173645
7066 23307, // A1 = -1.422607
7067 -32657, // A2 = 0.996613
7068 18692, // B2 = 0.570435
7069 -13447, // B1 = -0.820770
7070 18692, // B0 = 0.570435
7071 5, // Internal filter scaling
7072 159, // Minimum in-band energy threshold
7073 21, // 21/32 in-band to broad-band ratio
7074 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7077 22701, // A1 = -1.385620
7078 -32474, // A2 = 0.991058
7079 -292, // B2 = -0.008933
7080 0, //163840 , // B1 = 10.000000
7081 292, // B0 = 0.008933
7082 22564, // A1 = -1.377258
7083 -32655, // A2 = 0.996552
7084 20756, // B2 = 0.633423
7085 -14176, // B1 = -0.865295
7086 20756, // B0 = 0.633423
7087 22960, // A1 = -1.401428
7088 -32657, // A2 = 0.996613
7089 6520, // B2 = 0.198990
7090 -4619, // B1 = -0.281937
7091 6520, // B0 = 0.198990
7092 5, // Internal filter scaling
7093 159, // Minimum in-band energy threshold
7094 21, // 21/32 in-band to broad-band ratio
7095 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7098 22142, // A1 = -1.351501
7099 -32474, // A2 = 0.991058
7100 -147, // B2 = -0.004493
7102 147, // B0 = 0.004493
7103 22000, // A1 = -1.342834
7104 -32655, // A2 = 0.996552
7105 15379, // B2 = 0.469360
7106 -10237, // B1 = -0.624847
7107 15379, // B0 = 0.469360
7108 22406, // A1 = -1.367554
7109 -32657, // A2 = 0.996613
7110 17491, // B2 = 0.533783
7111 -12096, // B1 = -0.738312
7112 17491, // B0 = 0.533783
7113 5, // Internal filter scaling
7114 159, // Minimum in-band energy threshold
7115 21, // 21/32 in-band to broad-band ratio
7116 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7119 12973, // A1 = 0.79184
7120 -24916, // A2 = -0.760376
7121 6655, // B2 = 0.203102
7123 6657, // B0 = 0.203171
7124 5915, // A1 = 0.361053
7125 -29560, // A2 = -0.90213
7126 -7777, // B2 = -0.23735
7128 7777, // B0 = 0.23735
7129 20510, // A1 = 1.251892
7130 -30260, // A2 = -0.923462
7131 26662, // B2 = 0.81366
7132 -20573, // B1 = -1.255737
7133 26668, // B0 = 0.813843
7134 7, // Internal filter scaling
7135 159, // Minimum in-band energy threshold
7136 21, // 21/32 in-band to broad-band ratio
7137 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7140 20392, // A1 = -1.244629
7141 -32460, // A2 = 0.990601
7142 -270, // B2 = -0.008240
7144 270, // B0 = 0.008240
7145 20218, // A1 = -1.234009
7146 -32655, // A2 = 0.996582
7147 21337, // B2 = 0.651154
7148 -13044, // B1 = -0.796143
7149 21337, // B0 = 0.651154
7150 20684, // A1 = -1.262512
7151 -32657, // A2 = 0.996643
7152 8572, // B2 = 0.261612
7153 -5476, // B1 = -0.334244
7154 8572, // B0 = 0.261612
7155 5, // Internal filter scaling
7156 159, // Minimum in-band energy threshold
7157 21, // 21/32 in-band to broad-band ratio
7158 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7161 19159, // A1 = -1.169373
7162 -32456, // A2 = 0.990509
7163 -335, // B2 = -0.010252
7165 335, // B0 = 0.010252
7166 18966, // A1 = -1.157593
7167 -32661, // A2 = 0.996735
7168 6802, // B2 = 0.207588
7169 -3900, // B1 = -0.238098
7170 6802, // B0 = 0.207588
7171 19467, // A1 = -1.188232
7172 -32661, // A2 = 0.996765
7173 25035, // B2 = 0.764008
7174 -15049, // B1 = -0.918579
7175 25035, // B0 = 0.764008
7176 5, // Internal filter scaling
7177 159, // Minimum in-band energy threshold
7178 21, // 21/32 in-band to broad-band ratio
7179 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7182 18976, // A1 = -1.158264
7183 -32439, // A2 = 0.989990
7184 -183, // B2 = -0.005588
7186 183, // B0 = 0.005588
7187 18774, // A1 = -1.145874
7188 -32650, // A2 = 0.996429
7189 15468, // B2 = 0.472076
7190 -8768, // B1 = -0.535217
7191 15468, // B0 = 0.472076
7192 19300, // A1 = -1.177979
7193 -32652, // A2 = 0.996490
7194 19840, // B2 = 0.605499
7195 -11842, // B1 = -0.722809
7196 19840, // B0 = 0.605499
7197 5, // Internal filter scaling
7198 159, // Minimum in-band energy threshold
7199 21, // 21/32 in-band to broad-band ratio
7200 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7203 16357, // A1 = -0.998413
7204 -32368, // A2 = 0.987793
7205 -217, // B2 = -0.006652
7207 217, // B0 = 0.006652
7208 16107, // A1 = -0.983126
7209 -32601, // A2 = 0.994904
7210 11602, // B2 = 0.354065
7211 -5555, // B1 = -0.339111
7212 11602, // B0 = 0.354065
7213 16722, // A1 = -1.020630
7214 -32603, // A2 = 0.994965
7215 15574, // B2 = 0.475311
7216 -8176, // B1 = -0.499069
7217 15574, // B0 = 0.475311
7218 5, // Internal filter scaling
7219 159, // Minimum in-band energy threshold
7220 21, // 21/32 in-band to broad-band ratio
7221 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7224 16234, // A1 = -0.990875
7225 32404, // A2 = -0.988922
7226 -193, // B2 = -0.005908
7228 193, // B0 = 0.005908
7229 15986, // A1 = -0.975769
7230 -32632, // A2 = 0.995880
7231 18051, // B2 = 0.550903
7232 -8658, // B1 = -0.528473
7233 18051, // B0 = 0.550903
7234 16591, // A1 = -1.012695
7235 -32634, // A2 = 0.995941
7236 15736, // B2 = 0.480240
7237 -8125, // B1 = -0.495926
7238 15736, // B0 = 0.480240
7239 5, // Internal filter scaling
7240 159, // Minimum in-band energy threshold
7241 21, // 21/32 in-band to broad-band ratio
7242 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7245 15564, // A1 = -0.949982
7246 -32404, // A2 = 0.988922
7247 -269, // B2 = -0.008216
7249 269, // B0 = 0.008216
7250 15310, // A1 = -0.934479
7251 -32632, // A2 = 0.995880
7252 10815, // B2 = 0.330063
7253 -4962, // B1 = -0.302887
7254 10815, // B0 = 0.330063
7255 15924, // A1 = -0.971924
7256 -32634, // A2 = 0.995941
7257 18880, // B2 = 0.576172
7258 -9364, // B1 = -0.571594
7259 18880, // B0 = 0.576172
7260 5, // Internal filter scaling
7261 159, // Minimum in-band energy threshold
7262 21, // 21/32 in-band to broad-band ratio
7263 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7266 15247, // A1 = -0.930603
7267 -32397, // A2 = 0.988708
7268 -244, // B2 = -0.007451
7270 244, // B0 = 0.007451
7271 14989, // A1 = -0.914886
7272 -32627, // A2 = 0.995697
7273 18961, // B2 = 0.578644
7274 -8498, // B1 = -0.518707
7275 18961, // B0 = 0.578644
7276 15608, // A1 = -0.952667
7277 -32628, // A2 = 0.995758
7278 11145, // B2 = 0.340134
7279 -5430, // B1 = -0.331467
7280 11145, // B0 = 0.340134
7281 5, // Internal filter scaling
7282 159, // Minimum in-band energy threshold
7283 21, // 21/32 in-band to broad-band ratio
7284 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7287 14780, // A1 = -0.902130
7288 -32393, // A2 = 0.988586
7289 -396, // B2 = -0.012086
7291 396, // B0 = 0.012086
7292 14510, // A1 = -0.885651
7293 -32630, // A2 = 0.995819
7294 6326, // B2 = 0.193069
7295 -2747, // B1 = -0.167671
7296 6326, // B0 = 0.193069
7297 15154, // A1 = -0.924957
7298 -32632, // A2 = 0.995850
7299 23235, // B2 = 0.709076
7300 -10983, // B1 = -0.670380
7301 23235, // B0 = 0.709076
7302 5, // Internal filter scaling
7303 159, // Minimum in-band energy threshold
7304 21, // 21/32 in-band to broad-band ratio
7305 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7308 13005, // A1 = -0.793793
7309 -32368, // A2 = 0.987823
7310 -500, // B2 = -0.015265
7312 500, // B0 = 0.015265
7313 12708, // A1 = -0.775665
7314 -32615, // A2 = 0.995331
7315 11420, // B2 = 0.348526
7316 -4306, // B1 = -0.262833
7317 11420, // B0 = 0.348526
7318 13397, // A1 = -0.817688
7319 -32615, // A2 = 0.995361
7320 9454, // B2 = 0.288528
7321 -3981, // B1 = -0.243027
7322 9454, // B0 = 0.288528
7323 5, // Internal filter scaling
7324 159, // Minimum in-band energy threshold
7325 21, // 21/32 in-band to broad-band ratio
7326 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7329 10046, // A1 = -0.613190
7330 -32331, // A2 = 0.986694
7331 -455, // B2 = -0.013915
7333 455, // B0 = 0.013915
7334 9694, // A1 = -0.591705
7335 -32601, // A2 = 0.994934
7336 6023, // B2 = 0.183815
7337 -1708, // B1 = -0.104279
7338 6023, // B0 = 0.183815
7339 10478, // A1 = -0.639587
7340 -32603, // A2 = 0.994965
7341 22031, // B2 = 0.672333
7342 -7342, // B1 = -0.448151
7343 22031, // B0 = 0.672333
7344 5, // Internal filter scaling
7345 159, // Minimum in-band energy threshold
7346 21, // 21/32 in-band to broad-band ratio
7347 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7350 9181, // A1 = 0.560394
7351 -32256, // A2 = -0.984375
7352 -556, // B2 = -0.016975
7354 556, // B0 = 0.016975
7355 8757, // A1 = 0.534515
7356 -32574, // A2 = -0.99408
7357 8443, // B2 = 0.25769
7358 -2135, // B1 = -0.130341
7359 8443, // B0 = 0.25769
7360 9691, // A1 = 0.591522
7361 -32574, // A2 = -0.99411
7362 15446, // B2 = 0.471375
7363 -4809, // B1 = -0.293579
7364 15446, // B0 = 0.471375
7365 7, // Internal filter scaling
7366 159, // Minimum in-band energy threshold
7367 21, // 21/32 in-band to broad-band ratio
7368 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7371 5076, // A1 = -0.309875
7372 -32304, // A2 = 0.985840
7373 -508, // B2 = -0.015503
7375 508, // B0 = 0.015503
7376 4646, // A1 = -0.283600
7377 -32605, // A2 = 0.995026
7378 6742, // B2 = 0.205780
7379 -878, // B1 = -0.053635
7380 6742, // B0 = 0.205780
7381 5552, // A1 = -0.338928
7382 -32605, // A2 = 0.995056
7383 23667, // B2 = 0.722260
7384 -4297, // B1 = -0.262329
7385 23667, // B0 = 0.722260
7386 5, // Internal filter scaling
7387 159, // Minimum in-band energy threshold
7388 21, // 21/32 in-band to broad-band ratio
7389 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7392 3569, // A1 = -0.217865
7393 -32292, // A2 = 0.985504
7394 -239, // B2 = -0.007322
7396 239, // B0 = 0.007322
7397 3117, // A1 = -0.190277
7398 -32603, // A2 = 0.994965
7399 18658, // B2 = 0.569427
7400 -1557, // B1 = -0.095032
7401 18658, // B0 = 0.569427
7402 4054, // A1 = -0.247437
7403 -32603, // A2 = 0.994965
7404 18886, // B2 = 0.576385
7405 -2566, // B1 = -0.156647
7406 18886, // B0 = 0.576385
7407 5, // Internal filter scaling
7408 159, // Minimum in-band energy threshold
7409 21, // 21/32 in-band to broad-band ratio
7410 0x0FF5 // shift-mask 0x0FF (look at 16 half-frames) bit count = 5
7413 static int ixj_init_filter(int board
, IXJ_FILTER
* jf
)
7417 IXJ
*j
= &ixj
[board
];
7419 if (jf
->filter
> 3) {
7422 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, board
)) // Select Filter
7427 if (ixj_WriteDSPCommand(0x5152, board
)) // Disable Filter
7433 if (ixj_WriteDSPCommand(0x5153, board
)) // Enable Filter
7437 // Select the filter (f0 - f3) to use.
7438 if (ixj_WriteDSPCommand(0x5154 + jf
->filter
, board
))
7441 if (jf
->freq
< 12 && jf
->freq
> 3) {
7442 // Select the frequency for the selected filter.
7443 if (ixj_WriteDSPCommand(0x5170 + jf
->freq
, board
))
7445 } else if (jf
->freq
> 11) {
7446 // We need to load a programmable filter set for undefined
7447 // frequencies. So we will point the filter to a programmable set.
7448 // Since there are only 4 filters and 4 programmable sets, we will
7449 // just point the filter to the same number set and program it for the
7450 // frequency we want.
7451 if (ixj_WriteDSPCommand(0x5170 + jf
->filter
, board
))
7454 if (j
->ver
.low
!= 0x12) {
7461 if (ixj_WriteDSPCommand(cmd
, board
))
7464 for (cnt
= 0; cnt
< max
; cnt
++) {
7465 if (ixj_WriteDSPCommand(tone_table
[jf
->freq
][cnt
], board
))
7468 /* if(j->ver.low != 0x12)
7470 if(ixj_WriteDSPCommand(7, board))
7472 if(ixj_WriteDSPCommand(159, board))
7474 if(ixj_WriteDSPCommand(21, board))
7476 if(ixj_WriteDSPCommand(0x0FF5, board))
7483 static int ixj_init_tone(int board
, IXJ_TONE
* ti
)
7486 unsigned short data
;
7500 // if(ti->tone_index > 12 && ti->tone_index < 28)
7502 if (ixj_WriteDSPCommand(0x6800 + ti
->tone_index
, board
))
7505 if (ixj_WriteDSPCommand(0x6000 + (ti
->gain0
<< 4) + ti
->gain1
, board
))
7509 if (ixj_WriteDSPCommand(data
, board
))
7513 if (ixj_WriteDSPCommand(data
, board
))