Import 2.3.36
[davej-history.git] / drivers / telephony / ixj.c
blob8f3115cf522c06e3aa3cfb5ccfb06947fee88583
1 /*
2 * ixj.c
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>
21 * Fixes:
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
33 #define IXJDEBUG 0
34 #define MAXRINGS 5
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>
44 #include <linux/mm.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>
54 #include <asm/io.h>
55 #include <asm/segment.h>
56 #include <asm/uaccess.h>
58 #ifdef CONFIG_ISAPNP
59 #include <linux/isapnp.h>
60 #endif
62 #include "ixj.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)
88 return 0;
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
148 DSPbase +
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)
166 ixj_read_HSR(board);
167 return ixj[board].hsr.bits.controlrdy ? 1 : 0;
170 extern __inline__ int IsStatusReady(int board)
172 ixj_read_HSR(board);
173 return ixj[board].hsr.bits.statusrdy ? 1 : 0;
176 extern __inline__ int IsRxReady(int board)
178 ixj_read_HSR(board);
179 return ixj[board].hsr.bits.rxrdy ? 1 : 0;
182 extern __inline__ int IsTxReady(int board)
184 ixj_read_HSR(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.
203 switch (byState) {
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);
210 fRetVal = TRUE;
211 break;
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);
218 fRetVal = TRUE;
219 break;
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);
226 fRetVal = TRUE;
227 break;
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);
235 fRetVal = TRUE;
236 break;
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);
243 fRetVal = TRUE;
244 break;
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);
251 fRetVal = TRUE;
252 break;
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);
260 fRetVal = TRUE;
261 break;
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);
269 fRetVal = TRUE;
270 break;
271 default:
272 fRetVal = FALSE;
273 break;
276 return fRetVal;
279 int ixj_register(int index, IXJ_REGFUNC regfunc)
281 int cnt;
282 int retval = 0;
283 switch (index) {
284 case G729LOADER:
285 ixj_DownloadG729 = regfunc;
286 for (cnt = 0; cnt < IXJMAX; cnt++)
287 ixj_DownloadG729(&ixj[cnt], 0L);
288 break;
289 case TS85LOADER:
290 ixj_DownloadTS85 = regfunc;
291 for (cnt = 0; cnt < IXJMAX; cnt++)
292 ixj_DownloadTS85(&ixj[cnt], 0L);
293 break;
294 case PRE_READ:
295 ixj_PreRead = regfunc;
296 break;
297 case POST_READ:
298 ixj_PostRead = regfunc;
299 break;
300 case PRE_WRITE:
301 ixj_PreWrite = regfunc;
302 break;
303 case POST_WRITE:
304 ixj_PostWrite = regfunc;
305 break;
306 case PRE_IOCTL:
307 ixj_PreIoctl = regfunc;
308 break;
309 case POST_IOCTL:
310 ixj_PostIoctl = regfunc;
311 break;
312 default:
313 retval = 1;
315 return retval;
318 int ixj_unregister(int index)
320 int retval = 0;
321 switch (index) {
322 case G729LOADER:
323 ixj_DownloadG729 = &Stub;
324 break;
325 case TS85LOADER:
326 ixj_DownloadTS85 = &Stub;
327 break;
328 case PRE_READ:
329 ixj_PreRead = &Stub;
330 break;
331 case POST_READ:
332 ixj_PostRead = &Stub;
333 break;
334 case PRE_WRITE:
335 ixj_PreWrite = &Stub;
336 break;
337 case POST_WRITE:
338 ixj_PostWrite = &Stub;
339 break;
340 case PRE_IOCTL:
341 ixj_PreIoctl = &Stub;
342 break;
343 case POST_IOCTL:
344 ixj_PostIoctl = &Stub;
345 break;
346 default:
347 retval = 1;
349 return retval;
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];
373 IXJ_TONE ti;
375 j->tone_state++;
376 if (j->tone_state == 3) {
377 j->tone_state = 0;
378 if (j->cadence_t) {
379 j->tone_cadence_state++;
380 if (j->tone_cadence_state >= j->cadence_t->elements_used)
382 switch (j->cadence_t->termination)
384 case PLAY_ONCE:
385 ixj_cpt_stop(board);
386 break;
387 case REPEAT_LAST_ELEMENT:
388 j->tone_cadence_state--;
389 ixj_play_tone(board, j->cadence_t->ce[j->tone_cadence_state].index);
390 break;
391 case REPEAT_ALL:
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);
405 break;
407 } else {
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)
427 int board;
428 unsigned long jifon;
429 IXJ *j;
431 for (board = 0; board < IXJMAX; board++)
433 j = &ixj[board];
435 if (j->DSPbase)
437 #ifdef PERFMON_STATS
438 j->timerchecks++;
439 #endif
440 if (j->tone_state)
442 if (!ixj_hookstate(board))
444 ixj_cpt_stop(board);
445 if (j->m_hook)
447 j->m_hook = 0;
448 j->ex.bits.hookstate = 1;
449 if (j->async_queue)
450 kill_fasync(j->async_queue, SIGIO, POLL_IN); // Send apps notice of change
452 goto timer_end;
454 if (j->tone_state == 1)
455 jifon = (hertz * j->tone_on_time * 25 / 100000);
456 else
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) {
463 goto timer_end;
465 } else {
466 ixj_play_tone(board, 0);
467 if (j->dsp.low == 0x20) {
468 goto timer_end;
471 } else {
472 ixj_tone_timeout(board);
473 if (j->flags.dialtone) {
474 ixj_dialtone(board);
476 if (j->flags.busytone) {
477 ixj_busytone(board);
478 if (j->dsp.low == 0x20) {
479 goto timer_end;
482 if (j->flags.ringback) {
483 ixj_ringback(board);
484 if (j->dsp.low == 0x20) {
485 goto timer_end;
488 if (!j->tone_state) {
489 if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
490 idle(board);
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;
509 ixj_ring_off(board);
510 } else {
511 if (jiffies - j->ring_cadence_jif >= (.5 * hertz)) {
512 j->ring_cadence_t--;
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) {
518 ixj_ring_on(board);
519 } else {
520 ixj_ring_off(board);
522 goto timer_end;
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)
529 // Internet LineJACK
531 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, board);
533 LineMonitor(board);
534 read_filters(board);
535 ixj_WriteDSPCommand(0x511B, board);
536 j->proc_load = j->ssr.high << 8 | j->ssr.low;
537 if (!j->m_hook) {
538 j->m_hook = j->ex.bits.hookstate = 1;
539 if (j->async_queue)
540 kill_fasync(j->async_queue, SIGIO, POLL_IN); // Send apps notice of change
542 } else {
543 if (j->dsp.low == 0x21 &&
544 j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE)
545 // Internet LineJACK
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;
552 if (j->m_hook) {
553 j->m_hook = 0;
554 j->ex.bits.hookstate = 1;
555 if (j->async_queue)
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) {
564 daa_int_read(board);
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;
579 } else {
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;
592 } else {
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;
609 } else {
610 if (j->pld_scrr.bits.daaflag) {
611 daa_int_read(board);
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;
620 } else {
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) {
643 if (j->ex.bytes) {
644 wake_up_interruptible(&j->poll_q); // Wake any blocked selects
645 if (j->async_queue)
646 kill_fasync(j->async_queue, SIGIO, POLL_IN); // Send apps notice of change
648 } else {
649 break;
652 timer_end:
653 ixj_add_timer();
656 static int ixj_status_wait(int board)
658 unsigned long jif;
660 jif = jiffies;
661 while (!IsStatusReady(board)) {
662 if (jiffies - jif > (60 * (hertz / 100))) {
663 return -1;
666 return 0;
669 int ixj_WriteDSPCommand(unsigned short cmd, int board)
671 BYTES bytes;
672 unsigned long jif;
674 bytes.high = (cmd & 0xFF00) >> 8;
675 bytes.low = cmd & 0x00FF;
676 jif = jiffies;
677 while (!IsControlReady(board)) {
678 if (jiffies - jif > (60 * (hertz / 100))) {
679 return -1;
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;
688 return -1;
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);
693 return 0;
696 /***************************************************************************
698 * General Purpose IO Register read routine
700 ***************************************************************************/
701 extern __inline__ int ixj_gpio_read(int board)
703 if (ixj_WriteDSPCommand(0x5143, board))
704 return -1;
706 ixj[board].gpio.bytes.low = ixj[board].ssr.low;
707 ixj[board].gpio.bytes.high = ixj[board].ssr.high;
709 return 0;
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)
744 return 10;
745 else
746 return 0;
748 switch (arg) {
749 case PORT_POTS:
750 j->port = PORT_POTS;
751 switch (j->cardtype) {
752 case 500:
753 j->pld_slicw.pcib.mic = 0;
754 j->pld_slicw.pcib.spk = 0;
755 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
756 break;
757 case 300:
758 if (ixj_WriteDSPCommand(0xC528, board)) /* Write CODEC config to
759 Software Control Register */
760 return 2;
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);
770 break;
771 case 100:
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);
776 break;
778 break;
779 case PORT_PSTN:
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);
787 j->port = PORT_PSTN;
788 } else {
789 return 4;
791 break;
792 case PORT_SPEAKER:
793 j->port = PORT_SPEAKER;
794 switch (j->cardtype) {
795 case 500:
796 j->pld_slicw.pcib.mic = 1;
797 j->pld_slicw.pcib.spk = 1;
798 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
799 break;
800 case 300:
801 break;
802 case 100:
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);
807 break;
809 break;
810 case PORT_HANDSET:
811 if (j->cardtype == 300 || j->cardtype == 500) {
812 return 5;
813 } else {
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;
820 break;
821 default:
822 return 6;
823 break;
825 return 0;
828 static int ixj_set_pots(int board, int arg)
830 IXJ *j = &ixj[board];
832 if (j->cardtype == 300) {
833 if (arg) {
834 if (j->port == PORT_PSTN) {
835 j->pld_slicw.bits.rly1 = 0;
836 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
837 return 1;
838 } else {
839 return 0;
841 } else {
842 j->pld_slicw.bits.rly1 = 1;
843 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
844 return 1;
846 } else {
847 return 0;
851 static void ixj_ring_on(int board)
853 IXJ *j = &ixj[board];
854 if (j->dsp.low == 0x20) // Internet PhoneJACK
856 if (ixjdebug > 0)
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
868 if (ixjdebug > 0)
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)
877 unsigned long det;
878 IXJ *j = &ixj[board];
879 int fOffHook = 0;
881 switch (j->cardtype) {
882 case 100:
883 ixj_gpio_read(board);
884 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
885 break;
886 case 300:
887 case 400:
888 case 500:
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)
895 if(!in_interrupt())
897 det = jiffies + (hertz / 50);
898 while (time_before(jiffies, det)) {
899 current->state = TASK_INTERRUPTIBLE;
900 schedule_timeout(1);
903 SLIC_GetState(board);
904 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
905 ixj_ring_on(board);
908 if (j->cardtype == 500) {
909 j->pld_scrr.byte = inb_p(j->XILINXbase);
910 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
911 } else
912 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
914 break;
916 if (j->r_hook != fOffHook) {
917 j->r_hook = fOffHook;
918 if (j->port != PORT_POTS) {
919 j->ex.bits.hookstate = 1;
920 if (j->async_queue)
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)
926 fOffHook |= 2;
928 if (j->port == PORT_SPEAKER)
929 fOffHook |= 2;
931 if (j->port == PORT_HANDSET)
932 fOffHook |= 2;
934 return fOffHook;
937 static void ixj_ring_off(board)
939 IXJ *j = &ixj[board];
941 if (j->dsp.low == 0x20) // Internet PhoneJACK
943 if (ixjdebug > 0)
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
953 if (ixjdebug > 0)
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)
969 ixj_ring_off(board);
970 j->flags.cringing = 0;
971 } else {
972 j->ring_cadence_jif = jiffies;
973 j->ring_cadence_t = 15;
974 if (j->ring_cadence & 1 << j->ring_cadence_t) {
975 ixj_ring_on(board);
976 } else {
977 ixj_ring_off(board);
982 static int ixj_ring(int board)
984 char cntr;
985 unsigned long jif, det;
986 IXJ *j = &ixj[board];
988 j->flags.ringing = 1;
989 if (ixj_hookstate(board) & 1) {
990 ixj_ring_off(board);
991 j->flags.ringing = 0;
992 return 1;
994 det = 0;
995 for (cntr = 0; cntr < j->maxrings; cntr++) {
996 jif = jiffies + (1 * hertz);
997 ixj_ring_on(board);
998 while (time_before(jiffies, jif)) {
999 if (ixj_hookstate(board) & 1) {
1000 ixj_ring_off(board);
1001 j->flags.ringing = 0;
1002 return 1;
1004 current->state = TASK_INTERRUPTIBLE;
1005 schedule_timeout(1);
1006 if(signal_pending(current))
1007 break;
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))
1018 break;
1020 if (ixj_hookstate(board) & 1) {
1021 j->flags.ringing = 0;
1022 return 1;
1025 current->state = TASK_INTERRUPTIBLE;
1026 schedule_timeout(1);
1027 if(signal_pending(current))
1028 break;
1031 ixj_ring_off(board);
1032 j->flags.ringing = 0;
1033 return 0;
1036 int ixj_open(struct phone_device *p, struct file *file_p)
1038 IXJ *j = &ixj[p->board];
1040 if (!j->DSPbase)
1041 return -ENODEV;
1043 if (file_p->f_mode & FMODE_READ)
1044 j->readers++;
1045 if (file_p->f_mode & FMODE_WRITE)
1046 j->writers++;
1048 MOD_INC_USE_COUNT;
1050 if (ixjdebug > 0)
1051 // printk(KERN_INFO "Opening board %d\n", NUM(inode->i_rdev));
1052 printk(KERN_INFO "Opening board %d\n", p->board);
1054 return 0;
1057 int ixj_release(struct inode *inode, struct file *file_p)
1059 IXJ_TONE ti;
1060 int board = NUM(inode->i_rdev);
1061 IXJ *j = &ixj[board];
1063 if (ixjdebug > 0)
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);
1068 aec_stop(board);
1069 ixj_play_stop(board);
1070 ixj_record_stop(board);
1072 ti.tone_index = 10;
1073 ti.gain0 = 1;
1074 ti.freq0 = hz941;
1075 ti.gain1 = 0;
1076 ti.freq1 = hz1209;
1077 ti.tone_index = 11;
1078 ti.gain0 = 1;
1079 ti.freq0 = hz941;
1080 ti.gain1 = 0;
1081 ti.freq1 = hz1336;
1082 ti.tone_index = 12;
1083 ti.gain0 = 1;
1084 ti.freq0 = hz941;
1085 ti.gain1 = 0;
1086 ti.freq1 = hz1477;
1087 ti.tone_index = 13;
1088 ti.gain0 = 1;
1089 ti.freq0 = hz800;
1090 ti.gain1 = 0;
1091 ti.freq1 = 0;
1092 ixj_init_tone(board, &ti);
1093 ti.tone_index = 14;
1094 ti.gain0 = 1;
1095 ti.freq0 = hz1000;
1096 ti.gain1 = 0;
1097 ti.freq1 = 0;
1098 ixj_init_tone(board, &ti);
1099 ti.tone_index = 15;
1100 ti.gain0 = 1;
1101 ti.freq0 = hz1250;
1102 ti.gain1 = 0;
1103 ti.freq1 = 0;
1104 ixj_init_tone(board, &ti);
1105 ti.tone_index = 16;
1106 ti.gain0 = 1;
1107 ti.freq0 = hz950;
1108 ti.gain1 = 0;
1109 ti.freq1 = 0;
1110 ixj_init_tone(board, &ti);
1111 ti.tone_index = 17;
1112 ti.gain0 = 1;
1113 ti.freq0 = hz1100;
1114 ti.gain1 = 0;
1115 ti.freq1 = 0;
1116 ixj_init_tone(board, &ti);
1117 ti.tone_index = 18;
1118 ti.gain0 = 1;
1119 ti.freq0 = hz1400;
1120 ti.gain1 = 0;
1121 ti.freq1 = 0;
1122 ixj_init_tone(board, &ti);
1123 ti.tone_index = 19;
1124 ti.gain0 = 1;
1125 ti.freq0 = hz1500;
1126 ti.gain1 = 0;
1127 ti.freq1 = 0;
1128 ixj_init_tone(board, &ti);
1129 ti.tone_index = 20;
1130 ti.gain0 = 1;
1131 ti.freq0 = hz1600;
1132 ti.gain1 = 0;
1133 ti.freq1 = 0;
1134 ixj_init_tone(board, &ti);
1135 ti.tone_index = 21;
1136 ti.gain0 = 1;
1137 ti.freq0 = hz1800;
1138 ti.gain1 = 0;
1139 ti.freq1 = 0;
1140 ixj_init_tone(board, &ti);
1141 ti.tone_index = 22;
1142 ti.gain0 = 1;
1143 ti.freq0 = hz2100;
1144 ti.gain1 = 0;
1145 ti.freq1 = 0;
1146 ixj_init_tone(board, &ti);
1147 ti.tone_index = 23;
1148 ti.gain0 = 1;
1149 ti.freq0 = hz1300;
1150 ti.gain1 = 0;
1151 ti.freq1 = 0;
1152 ixj_init_tone(board, &ti);
1153 ti.tone_index = 24;
1154 ti.gain0 = 1;
1155 ti.freq0 = hz2450;
1156 ti.gain1 = 0;
1157 ti.freq1 = 0;
1158 ixj_init_tone(board, &ti);
1159 ti.tone_index = 25;
1160 ti.gain0 = 1;
1161 ti.freq0 = hz350;
1162 ti.gain1 = 0;
1163 ti.freq1 = hz440;
1164 ixj_init_tone(board, &ti);
1165 ti.tone_index = 26;
1166 ti.gain0 = 1;
1167 ti.freq0 = hz440;
1168 ti.gain1 = 0;
1169 ti.freq1 = hz480;
1170 ixj_init_tone(board, &ti);
1171 ti.tone_index = 27;
1172 ti.gain0 = 1;
1173 ti.freq0 = hz480;
1174 ti.gain1 = 0;
1175 ti.freq1 = hz620;
1176 ixj_init_tone(board, &ti);
1178 idle(board);
1180 if (file_p->f_mode & FMODE_READ)
1181 j->readers--;
1182 if (file_p->f_mode & FMODE_WRITE)
1183 j->writers--;
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
1199 MOD_DEC_USE_COUNT;
1200 return 0;
1203 static int read_filters(int board)
1205 unsigned short fc, cnt;
1206 IXJ *j = &ixj[board];
1208 if (ixj_WriteDSPCommand(0x5144, board))
1209 return -1;
1211 fc = j->ssr.high << 8 | j->ssr.low;
1212 if (fc == j->frame_count)
1213 return 1;
1215 j->frame_count = fc;
1217 for (cnt = 0; cnt < 4; cnt++) {
1218 if (ixj_WriteDSPCommand(0x5154 + cnt, board))
1219 return -1;
1221 if (ixj_WriteDSPCommand(0x515C, board))
1222 return -1;
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))) {
1227 switch (cnt) {
1228 case 0:
1229 j->ex.bits.f0 = 1;
1230 break;
1231 case 1:
1232 j->ex.bits.f1 = 1;
1233 break;
1234 case 2:
1235 j->ex.bits.f2 = 1;
1236 break;
1237 case 3:
1238 j->ex.bits.f3 = 1;
1239 break;
1243 return 0;
1246 static int LineMonitor(int board)
1248 IXJ *j = &ixj[board];
1250 if (j->dtmf_proc) {
1251 return -1;
1253 j->dtmf_proc = 1;
1255 if (ixj_WriteDSPCommand(0x7000, board)) // Line Monitor
1257 return -1;
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) {
1262 j->dtmf_state = 1;
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;
1268 j->dtmf_wp++;
1269 if (j->dtmf_wp == 79)
1270 j->dtmf_wp = 0;
1271 j->ex.bits.dtmf_ready = 1;
1272 j->dtmf_state = 0;
1274 j->dtmf_proc = 0;
1276 return 0;
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;
1287 mb();
1289 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
1290 ++j->read_wait;
1291 if (file_p->f_flags & O_NONBLOCK) {
1292 current->state = TASK_RUNNING;
1293 remove_wait_queue(&j->read_q, &wait);
1294 return -EAGAIN;
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);
1299 return 0;
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);
1305 return -EINTR;
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;
1314 if (i)
1315 return -EFAULT;
1316 else
1317 return min(length, j->read_buffer_size);
1320 ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
1321 loff_t * ppos)
1323 int pre_retval;
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) {
1329 case NORMAL:
1330 read_retval = ixj_read(file_p, buf, length, ppos);
1331 ixj_PostRead(j, 0L);
1332 break;
1333 case NOPOST:
1334 read_retval = ixj_read(file_p, buf, length, ppos);
1335 break;
1336 case POSTONLY:
1337 ixj_PostRead(j, 0L);
1338 break;
1339 default:
1340 read_retval = pre_retval;
1342 return read_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;
1354 mb();
1357 while (!j->write_buffers_empty) {
1358 ++j->write_wait;
1359 if (file_p->f_flags & O_NONBLOCK) {
1360 current->state = TASK_RUNNING;
1361 remove_wait_queue(&j->read_q, &wait);
1362 return -EAGAIN;
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);
1367 return 0;
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);
1373 return -EINTR;
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));
1381 if (i)
1382 return -EFAULT;
1384 return min(count, j->write_buffer_size);
1387 ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count,
1388 loff_t * ppos)
1390 int pre_retval;
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) {
1396 case NORMAL:
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--;
1403 break;
1404 case NOPOST:
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--;
1410 break;
1411 case POSTONLY:
1412 ixj_PostWrite(j, 0L);
1413 break;
1414 default:
1415 write_retval = pre_retval;
1417 return write_retval;
1420 static void ixj_read_frame(int board)
1422 int cnt, dly;
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)) {
1428 dly = 0;
1429 while (!IsRxReady(board)) {
1430 if (dly++ > 5) {
1431 dly = 0;
1432 break;
1434 udelay(10);
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
1446 ++j->framesread;
1447 #endif
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)) {
1452 dly = 0;
1453 while (!IsTxReady(board)) {
1454 if (dly++ > 5) {
1455 dly = 0;
1456 break;
1458 udelay(10);
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;
1466 #endif
1468 } else {
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
1474 if (j->async_queue)
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;
1484 BYTES blankword;
1485 IXJ *j = &ixj[board];
1487 frame_count = 0;
1488 if (j->write_buffer && j->write_buffers_empty < 2) {
1489 if (j->write_buffer_wp > j->write_buffer_rp) {
1490 frame_count =
1491 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
1493 if (j->write_buffer_rp > j->write_buffer_wp) {
1494 frame_count =
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;
1504 break;
1505 case PLAYBACK_MODE_8LINEAR:
1506 case PLAYBACK_MODE_16LINEAR:
1507 blankword.low = blankword.high = 0x00;
1508 break;
1509 case PLAYBACK_MODE_8LINEAR_WSS:
1510 blankword.low = blankword.high = 0x80;
1511 break;
1513 for (cnt = 0; cnt < 16; cnt++) {
1514 if (!(cnt % 16) && !IsTxReady(board)) {
1515 dly = 0;
1516 while (!IsTxReady(board)) {
1517 if (dly++ > 5) {
1518 dly = 0;
1519 break;
1521 udelay(10);
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)) {
1531 dly = 0;
1532 while (!IsTxReady(board)) {
1533 if (dly++ > 5) {
1534 dly = 0;
1535 break;
1537 udelay(10);
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
1560 if (j->async_queue)
1561 kill_fasync(j->async_queue, SIGIO, POLL_IN); // Send apps notice of empty buffer
1562 #ifdef PERFMON_STATS
1563 ++j->frameswritten;
1564 #endif
1566 } else {
1567 j->drybuffer++;
1571 static int idle(int board)
1573 IXJ *j = &ixj[board];
1575 if (ixj_WriteDSPCommand(0x0000, board)) // DSP Idle
1577 return 0;
1578 if (j->ssr.high || j->ssr.low)
1579 return 0;
1580 else
1581 return 1;
1584 static int set_base_frame(int board, int size)
1586 unsigned short cmd;
1587 int cnt;
1588 IXJ *j = &ixj[board];
1590 aec_stop(board);
1591 for (cnt = 0; cnt < 10; cnt++) {
1592 if (idle(board))
1593 break;
1595 if (j->ssr.high || j->ssr.low)
1596 return -1;
1597 if (j->dsp.low != 0x20) {
1598 switch (size) {
1599 case 30:
1600 cmd = 0x07F0;
1601 /* Set Base Frame Size to 240 pg9-10 8021 */
1602 break;
1603 case 20:
1604 cmd = 0x07A0;
1605 /* Set Base Frame Size to 160 pg9-10 8021 */
1606 break;
1607 case 10:
1608 cmd = 0x0750;
1609 /* Set Base Frame Size to 80 pg9-10 8021 */
1610 break;
1611 default:
1612 return -1;
1614 } else {
1615 if (size == 30)
1616 return size;
1617 else
1618 return -1;
1620 if (ixj_WriteDSPCommand(cmd, board)) {
1621 j->baseframe.high = j->baseframe.low = 0xFF;
1622 return -1;
1623 } else {
1624 j->baseframe.high = j->ssr.high;
1625 j->baseframe.low = j->ssr.low;
1627 return size;
1630 static int set_rec_codec(int board, int rate)
1632 int retval = 0;
1633 IXJ *j = &ixj[board];
1635 j->rec_codec = rate;
1637 switch (rate) {
1638 case G723_63:
1639 if (j->ver.low != 0x12 || ixj_convert_loaded) {
1640 j->rec_frame_size = 12;
1641 j->rec_mode = 0;
1642 } else {
1643 retval = 1;
1645 break;
1646 case G723_53:
1647 if (j->ver.low != 0x12 || ixj_convert_loaded) {
1648 j->rec_frame_size = 10;
1649 j->rec_mode = 0;
1650 } else {
1651 retval = 1;
1653 break;
1654 case TS85:
1655 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
1656 j->rec_frame_size = 16;
1657 j->rec_mode = 0;
1658 } else {
1659 retval = 1;
1661 break;
1662 case TS48:
1663 if (j->ver.low != 0x12 || ixj_convert_loaded) {
1664 j->rec_frame_size = 9;
1665 j->rec_mode = 0;
1666 } else {
1667 retval = 1;
1669 break;
1670 case TS41:
1671 if (j->ver.low != 0x12 || ixj_convert_loaded) {
1672 j->rec_frame_size = 8;
1673 j->rec_mode = 0;
1674 } else {
1675 retval = 1;
1677 break;
1678 case G728:
1679 if (j->dsp.low != 0x20) {
1680 j->rec_frame_size = 48;
1681 j->rec_mode = 0;
1682 } else {
1683 retval = 1;
1685 break;
1686 case G729:
1687 if (j->dsp.low != 0x20) {
1688 if (!j->flags.g729_loaded) {
1689 retval = 1;
1690 break;
1692 switch (j->baseframe.low) {
1693 case 0xA0:
1694 j->rec_frame_size = 10;
1695 break;
1696 case 0x50:
1697 j->rec_frame_size = 5;
1698 break;
1699 default:
1700 j->rec_frame_size = 15;
1701 break;
1703 j->rec_mode = 0;
1704 } else {
1705 retval = 1;
1707 break;
1708 case ULAW:
1709 switch (j->baseframe.low) {
1710 case 0xA0:
1711 j->rec_frame_size = 80;
1712 break;
1713 case 0x50:
1714 j->rec_frame_size = 40;
1715 break;
1716 default:
1717 j->rec_frame_size = 120;
1718 break;
1720 j->rec_mode = 4;
1721 break;
1722 case ALAW:
1723 switch (j->baseframe.low) {
1724 case 0xA0:
1725 j->rec_frame_size = 80;
1726 break;
1727 case 0x50:
1728 j->rec_frame_size = 40;
1729 break;
1730 default:
1731 j->rec_frame_size = 120;
1732 break;
1734 j->rec_mode = 4;
1735 break;
1736 case LINEAR16:
1737 switch (j->baseframe.low) {
1738 case 0xA0:
1739 j->rec_frame_size = 160;
1740 break;
1741 case 0x50:
1742 j->rec_frame_size = 80;
1743 break;
1744 default:
1745 j->rec_frame_size = 240;
1746 break;
1748 j->rec_mode = 5;
1749 break;
1750 case LINEAR8:
1751 switch (j->baseframe.low) {
1752 case 0xA0:
1753 j->rec_frame_size = 80;
1754 break;
1755 case 0x50:
1756 j->rec_frame_size = 40;
1757 break;
1758 default:
1759 j->rec_frame_size = 120;
1760 break;
1762 j->rec_mode = 6;
1763 break;
1764 case WSS:
1765 switch (j->baseframe.low) {
1766 case 0xA0:
1767 j->rec_frame_size = 80;
1768 break;
1769 case 0x50:
1770 j->rec_frame_size = 40;
1771 break;
1772 default:
1773 j->rec_frame_size = 120;
1774 break;
1776 j->rec_mode = 7;
1777 break;
1778 default:
1779 j->rec_frame_size = 0;
1780 j->rec_mode = -1;
1781 if (j->read_buffer) {
1782 kfree(j->read_buffer);
1783 j->read_buffer = NULL;
1784 j->read_buffer_size = 0;
1786 retval = 1;
1787 break;
1789 return retval;
1792 static int ixj_record_start(int board)
1794 unsigned short cmd = 0x0000;
1795 IXJ *j = &ixj[board];
1797 if (!j->rec_mode) {
1798 switch (j->rec_codec) {
1799 case G723_63:
1800 cmd = 0x5131;
1801 break;
1802 case G723_53:
1803 cmd = 0x5132;
1804 break;
1805 case TS85:
1806 cmd = 0x5130; // TrueSpeech 8.5
1808 break;
1809 case TS48:
1810 cmd = 0x5133; // TrueSpeech 4.8
1812 break;
1813 case TS41:
1814 cmd = 0x5134; // TrueSpeech 4.1
1816 break;
1817 case G728:
1818 cmd = 0x5135;
1819 break;
1820 case G729:
1821 cmd = 0x5136;
1822 break;
1823 default:
1824 return 1;
1826 if (ixj_WriteDSPCommand(cmd, board))
1827 return -1;
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);
1834 return -ENOMEM;
1837 j->read_buffer_size = j->rec_frame_size * 2;
1839 if (ixj_WriteDSPCommand(0x5102, board)) // Set Poll sync mode
1841 return -1;
1843 switch (j->rec_mode) {
1844 case 0:
1845 cmd = 0x1C03; // Record C1
1847 break;
1848 case 4:
1849 if (j->ver.low == 0x12) {
1850 cmd = 0x1E03; // Record C1
1852 } else {
1853 cmd = 0x1E01; // Record C1
1856 break;
1857 case 5:
1858 if (j->ver.low == 0x12) {
1859 cmd = 0x1E83; // Record C1
1861 } else {
1862 cmd = 0x1E81; // Record C1
1865 break;
1866 case 6:
1867 if (j->ver.low == 0x12) {
1868 cmd = 0x1F03; // Record C1
1870 } else {
1871 cmd = 0x1F01; // Record C1
1874 break;
1875 case 7:
1876 if (j->ver.low == 0x12) {
1877 cmd = 0x1F83; // Record C1
1879 } else {
1880 cmd = 0x1F81; // Record C1
1883 break;
1885 if (ixj_WriteDSPCommand(cmd, board))
1886 return -1;
1888 return 0;
1891 static void ixj_record_stop(int board)
1893 IXJ *j = &ixj[board];
1895 if (j->rec_mode > -1) {
1896 ixj_WriteDSPCommand(0x5120, board);
1897 j->rec_mode = -1;
1901 static void set_rec_depth(int board, int depth)
1903 if (depth > 60)
1904 depth = 60;
1905 if (depth < 0)
1906 depth = 0;
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;
1930 if (!level) {
1931 ixj_WriteDSPCommand(0xB002, board);
1932 } else {
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
1942 switch (level) {
1943 case 1:
1944 ixj_WriteDSPCommand(0x0000, board); // Advanced AEC C2 = off
1946 ixj_WriteDSPCommand(0xE011, board);
1947 ixj_WriteDSPCommand(0xFFFF, board);
1948 break;
1950 case 2:
1951 ixj_WriteDSPCommand(0x0600, board); // Advanced AEC C2 = on medium
1953 ixj_WriteDSPCommand(0xE011, board);
1954 ixj_WriteDSPCommand(0x0080, board);
1955 break;
1957 case 3:
1958 ixj_WriteDSPCommand(0x0C00, board); // Advanced AEC C2 = on high
1960 ixj_WriteDSPCommand(0xE011, board);
1961 ixj_WriteDSPCommand(0x0080, board);
1962 break;
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)
1985 int retval = 0;
1986 IXJ *j = &ixj[board];
1988 j->play_codec = rate;
1990 switch (rate) {
1991 case G723_63:
1992 if (j->ver.low != 0x12 || ixj_convert_loaded) {
1993 j->play_frame_size = 12;
1994 j->play_mode = 0;
1995 } else {
1996 retval = 1;
1998 break;
1999 case G723_53:
2000 if (j->ver.low != 0x12 || ixj_convert_loaded) {
2001 j->play_frame_size = 10;
2002 j->play_mode = 0;
2003 } else {
2004 retval = 1;
2006 break;
2007 case TS85:
2008 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
2009 j->play_frame_size = 16;
2010 j->play_mode = 0;
2011 } else {
2012 retval = 1;
2014 break;
2015 case TS48:
2016 if (j->ver.low != 0x12 || ixj_convert_loaded) {
2017 j->play_frame_size = 9;
2018 j->play_mode = 0;
2019 } else {
2020 retval = 1;
2022 break;
2023 case TS41:
2024 if (j->ver.low != 0x12 || ixj_convert_loaded) {
2025 j->play_frame_size = 8;
2026 j->play_mode = 0;
2027 } else {
2028 retval = 1;
2030 break;
2031 case G728:
2032 if (j->dsp.low != 0x20) {
2033 j->play_frame_size = 48;
2034 j->play_mode = 0;
2035 } else {
2036 retval = 1;
2038 break;
2039 case G729:
2040 if (j->dsp.low != 0x20) {
2041 if (!j->flags.g729_loaded) {
2042 retval = 1;
2043 break;
2045 switch (j->baseframe.low) {
2046 case 0xA0:
2047 j->play_frame_size = 10;
2048 break;
2049 case 0x50:
2050 j->play_frame_size = 5;
2051 break;
2052 default:
2053 j->play_frame_size = 15;
2054 break;
2056 j->play_mode = 0;
2057 } else {
2058 retval = 1;
2060 break;
2061 case ULAW:
2062 switch (j->baseframe.low) {
2063 case 0xA0:
2064 j->play_frame_size = 80;
2065 break;
2066 case 0x50:
2067 j->play_frame_size = 40;
2068 break;
2069 default:
2070 j->play_frame_size = 120;
2071 break;
2073 j->play_mode = 2;
2074 break;
2075 case ALAW:
2076 switch (j->baseframe.low) {
2077 case 0xA0:
2078 j->play_frame_size = 80;
2079 break;
2080 case 0x50:
2081 j->play_frame_size = 40;
2082 break;
2083 default:
2084 j->play_frame_size = 120;
2085 break;
2087 j->play_mode = 2;
2088 break;
2089 case LINEAR16:
2090 switch (j->baseframe.low) {
2091 case 0xA0:
2092 j->play_frame_size = 160;
2093 break;
2094 case 0x50:
2095 j->play_frame_size = 80;
2096 break;
2097 default:
2098 j->play_frame_size = 240;
2099 break;
2101 j->play_mode = 6;
2102 break;
2103 case LINEAR8:
2104 switch (j->baseframe.low) {
2105 case 0xA0:
2106 j->play_frame_size = 80;
2107 break;
2108 case 0x50:
2109 j->play_frame_size = 40;
2110 break;
2111 default:
2112 j->play_frame_size = 120;
2113 break;
2115 j->play_mode = 4;
2116 break;
2117 case WSS:
2118 switch (j->baseframe.low) {
2119 case 0xA0:
2120 j->play_frame_size = 80;
2121 break;
2122 case 0x50:
2123 j->play_frame_size = 40;
2124 break;
2125 default:
2126 j->play_frame_size = 120;
2127 break;
2129 j->play_mode = 5;
2130 break;
2131 default:
2132 j->play_frame_size = 0;
2133 j->play_mode = -1;
2134 if (j->write_buffer) {
2135 kfree(j->write_buffer);
2136 j->write_buffer = NULL;
2137 j->write_buffer_size = 0;
2139 retval = 1;
2140 break;
2142 return retval;
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;
2151 j->drybuffer = 0;
2153 if (!j->play_mode) {
2154 switch (j->play_codec) {
2155 case G723_63:
2156 cmd = 0x5231;
2157 break;
2158 case G723_53:
2159 cmd = 0x5232;
2160 break;
2161 case TS85:
2162 cmd = 0x5230; // TrueSpeech 8.5
2164 break;
2165 case TS48:
2166 cmd = 0x5233; // TrueSpeech 4.8
2168 break;
2169 case TS41:
2170 cmd = 0x5234; // TrueSpeech 4.1
2172 break;
2173 case G728:
2174 cmd = 0x5235;
2175 break;
2176 case G729:
2177 cmd = 0x5236;
2178 break;
2179 default:
2180 return 1;
2182 if (ixj_WriteDSPCommand(cmd, board))
2183 return -1;
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);
2189 return -ENOMEM;
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
2199 return -1;
2201 switch (j->play_mode) {
2202 case 0:
2203 cmd = 0x2C03;
2204 break;
2205 case 2:
2206 if (j->ver.low == 0x12) {
2207 cmd = 0x2C23;
2208 } else {
2209 cmd = 0x2C21;
2211 break;
2212 case 4:
2213 if (j->ver.low == 0x12) {
2214 cmd = 0x2C43;
2215 } else {
2216 cmd = 0x2C41;
2218 break;
2219 case 5:
2220 if (j->ver.low == 0x12) {
2221 cmd = 0x2C53;
2222 } else {
2223 cmd = 0x2C51;
2225 break;
2226 case 6:
2227 if (j->ver.low == 0x12) {
2228 cmd = 0x2C63;
2229 } else {
2230 cmd = 0x2C61;
2232 break;
2234 if (ixj_WriteDSPCommand(cmd, board))
2235 return -1;
2237 if (ixj_WriteDSPCommand(0x2000, board)) // Playback C2
2239 return -1;
2241 if (ixj_WriteDSPCommand(0x2000 + ixj[board].play_frame_size, board)) // Playback C3
2243 return -1;
2245 return 0;
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
2255 j->play_mode = -1;
2259 extern __inline__ void set_play_depth(int board, int depth)
2261 if (depth > 60)
2262 depth = 60;
2263 if (depth < 0)
2264 depth = 0;
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 */
2290 if (j->ex.bytes)
2291 mask |= POLLPRI;
2292 return mask;
2295 static int ixj_play_tone(int board, char tone)
2297 IXJ *j = &ixj[board];
2299 if (!j->tone_state)
2300 idle(board);
2302 j->tone_index = tone;
2303 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, board))
2304 return -1;
2306 if (!j->tone_state) {
2307 j->tone_start_jif = jiffies;
2309 j->tone_state = 1;
2311 return 0;
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
2322 return -1;
2324 if (ixj_WriteDSPCommand(arg, board))
2325 return -1;
2327 return 0;
2330 static int SCI_WaitHighSCI(int board)
2332 int cnt;
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++) {
2338 udelay(32);
2339 j->pld_scrr.byte = inb_p(j->XILINXbase);
2341 if ((j->pld_scrr.bits.sci))
2342 return 1;
2344 if (ixjdebug > 1)
2345 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
2346 return 0;
2347 } else
2348 return 1;
2351 static int SCI_WaitLowSCI(int board)
2353 int cnt;
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++) {
2359 udelay(32);
2360 j->pld_scrr.byte = inb_p(j->XILINXbase);
2362 if (!(j->pld_scrr.bits.sci))
2363 return 1;
2365 if (ixjdebug > 1)
2366 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
2367 return 0;
2368 } else
2369 return 1;
2372 static int SCI_Control(int board, int control)
2374 IXJ *j = &ixj[board];
2376 switch (control) {
2377 case SCI_End:
2378 j->pld_scrw.bits.c0 = 0; // Set PLD Serial control interface
2380 j->pld_scrw.bits.c1 = 0; // to no selection
2382 break;
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
2388 break;
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
2394 break;
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
2400 break;
2401 default:
2402 return 0;
2403 break;
2405 outb_p(j->pld_scrw.byte, j->XILINXbase);
2407 switch (control) {
2408 case SCI_End:
2409 return 1;
2410 break;
2411 case SCI_Enable_DAA:
2412 case SCI_Enable_Mixer:
2413 case SCI_Enable_EEPROM:
2414 if (!SCI_WaitHighSCI(board))
2415 return 0;
2416 break;
2417 default:
2418 return 0;
2419 break;
2421 return 1;
2424 static int SCI_Prepare(int board)
2426 if (!SCI_Control(board, SCI_End))
2427 return 0;
2429 if (!SCI_WaitLowSCI(board))
2430 return 0;
2432 return 1;
2435 static int ixj_mixer(long val, int board)
2437 BYTES bytes;
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);
2451 return 0;
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))
2461 return 0;
2462 else
2463 return 1;
2466 static int ixj_daa_cr4(int board, char reg)
2468 IXJ *j = &ixj[board];
2469 BYTES bytes;
2471 switch (j->daa_mode) {
2472 case SOP_PU_SLEEP:
2473 bytes.high = 0x14;
2474 break;
2475 case SOP_PU_RINGING:
2476 bytes.high = 0x54;
2477 break;
2478 case SOP_PU_CONVERSATION:
2479 bytes.high = 0x94;
2480 break;
2481 case SOP_PU_PULSEDIALING:
2482 bytes.high = 0xD4;
2483 break;
2486 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
2487 case 0:
2488 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
2489 break;
2490 case 1:
2491 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
2492 break;
2493 case 2:
2494 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
2495 break;
2496 case 3:
2497 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
2498 break;
2501 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
2503 if (!daa_load(&bytes, board))
2504 return 0;
2506 if (!SCI_Prepare(board))
2507 return 0;
2509 return 1;
2512 static char daa_int_read(int board)
2514 BYTES bytes;
2515 IXJ *j = &ixj[board];
2517 if (!SCI_Prepare(board))
2518 return 0;
2520 bytes.high = 0x38;
2521 bytes.low = 0x00;
2522 outb_p(bytes.high, j->XILINXbase + 0x03);
2523 outb_p(bytes.low, j->XILINXbase + 0x02);
2525 if (!SCI_Control(board, SCI_Enable_DAA))
2526 return 0;
2528 bytes.high = inb_p(j->XILINXbase + 0x03);
2529 bytes.low = inb_p(j->XILINXbase + 0x02);
2530 if (bytes.low != ALISDAA_ID_BYTE) {
2531 if (ixjdebug > 0)
2532 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
2533 return 0;
2535 if (!SCI_Control(board, SCI_Enable_DAA))
2536 return 0;
2537 if (!SCI_Control(board, SCI_End))
2538 return 0;
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;
2544 return 1;
2547 static int ixj_daa_cid_reset(int board)
2549 int i;
2550 BYTES bytes;
2551 IXJ *j = &ixj[board];
2553 if (!SCI_Prepare(board))
2554 return 0;
2556 bytes.high = 0x58;
2557 bytes.low = 0x00;
2558 outb_p(bytes.high, j->XILINXbase + 0x03);
2559 outb_p(bytes.low, j->XILINXbase + 0x02);
2561 if (!SCI_Control(board, SCI_Enable_DAA))
2562 return 0;
2564 if (!SCI_WaitHighSCI(board))
2565 return 0;
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))
2575 return 0;
2577 if (!SCI_WaitHighSCI(board))
2578 return 0;
2582 if (!SCI_Control(board, SCI_End))
2583 return 0;
2585 return 1;
2588 static int ixj_daa_cid_read(int board)
2590 int i;
2591 BYTES bytes;
2592 char CID[ALISDAA_CALLERID_SIZE], mContinue;
2593 char *pIn, *pOut;
2594 IXJ *j = &ixj[board];
2596 if (!SCI_Prepare(board))
2597 return 0;
2599 bytes.high = 0x78;
2600 bytes.low = 0x00;
2601 outb_p(bytes.high, j->XILINXbase + 0x03);
2602 outb_p(bytes.low, j->XILINXbase + 0x02);
2604 if (!SCI_Control(board, SCI_Enable_DAA))
2605 return 0;
2607 if (!SCI_WaitHighSCI(board))
2608 return 0;
2610 bytes.high = inb_p(j->XILINXbase + 0x03);
2611 bytes.low = inb_p(j->XILINXbase + 0x02);
2612 if (bytes.low != ALISDAA_ID_BYTE) {
2613 if (ixjdebug > 0)
2614 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
2615 return 0;
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))
2623 return 0;
2625 if (!SCI_WaitHighSCI(board))
2626 return 0;
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))
2633 return 0;
2635 pIn = CID;
2636 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
2637 mContinue = 1;
2638 while (mContinue) {
2639 if ((pIn[1] & 0x03) == 0x01) {
2640 pOut[0] = pIn[0];
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);
2650 } else {
2651 mContinue = FALSE;
2653 pIn += 5, pOut += 4;
2655 memset(&j->cid, 0, sizeof(IXJ_CID));
2656 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
2657 pOut += 4;
2658 strncpy(j->cid.month, pOut, 2);
2659 pOut += 2;
2660 strncpy(j->cid.day, pOut, 2);
2661 pOut += 2;
2662 strncpy(j->cid.hour, pOut, 2);
2663 pOut += 2;
2664 strncpy(j->cid.min, pOut, 2);
2665 pOut += 3;
2666 j->cid.numlen = *pOut;
2667 pOut += 1;
2668 strncpy(j->cid.number, pOut, j->cid.numlen);
2669 pOut += j->cid.numlen + 1;
2670 j->cid.namelen = *pOut;
2671 pOut += 1;
2672 strncpy(j->cid.name, pOut, j->cid.namelen);
2674 ixj_daa_cid_reset(board);
2675 return 1;
2678 static char daa_get_version(int board)
2680 BYTES bytes;
2681 IXJ *j = &ixj[board];
2683 if (!SCI_Prepare(board))
2684 return 0;
2686 bytes.high = 0x35;
2687 bytes.low = 0x00;
2688 outb_p(bytes.high, j->XILINXbase + 0x03);
2689 outb_p(bytes.low, j->XILINXbase + 0x02);
2691 if (!SCI_Control(board, SCI_Enable_DAA))
2692 return 0;
2694 bytes.high = inb_p(j->XILINXbase + 0x03);
2695 bytes.low = inb_p(j->XILINXbase + 0x02);
2696 if (bytes.low != ALISDAA_ID_BYTE) {
2697 if (ixjdebug > 0)
2698 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
2699 return 0;
2701 if (!SCI_Control(board, SCI_Enable_DAA))
2702 return 0;
2704 if (!SCI_Control(board, SCI_End))
2705 return 0;
2707 bytes.high = inb_p(j->XILINXbase + 0x03);
2708 bytes.low = inb_p(j->XILINXbase + 0x02);
2709 if (ixjdebug > 0)
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;
2712 return bytes.high;
2715 static int daa_set_mode(int board, int mode)
2717 // NOTE:
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.
2724 // NOTE:
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
2728 // ALIS-A part.
2732 BYTES bytes;
2733 IXJ *j = &ixj[board];
2735 if (!SCI_Prepare(board))
2736 return 0;
2738 switch (mode) {
2739 case SOP_PU_SLEEP:
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);
2745 bytes.high = 0x10;
2746 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
2747 daa_load(&bytes, board);
2748 if (!SCI_Prepare(board))
2749 return 0;
2750 j->daa_mode = SOP_PU_SLEEP;
2751 j->flags.pstn_ringing = 0;
2752 j->pstn_sleeptil = jiffies + (hertz * 3);
2753 break;
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);
2760 bytes.high = 0x50;
2761 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
2762 daa_load(&bytes, board);
2763 if (!SCI_Prepare(board))
2764 return 0;
2765 j->daa_mode = SOP_PU_RINGING;
2766 break;
2767 case SOP_PU_CONVERSATION:
2768 bytes.high = 0x90;
2769 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
2770 daa_load(&bytes, board);
2771 if (!SCI_Prepare(board))
2772 return 0;
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;
2781 break;
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);
2788 bytes.high = 0xD0;
2789 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
2790 daa_load(&bytes, board);
2791 if (!SCI_Prepare(board))
2792 return 0;
2793 j->daa_mode = SOP_PU_PULSEDIALING;
2794 break;
2795 default:
2796 break;
2798 return 1;
2801 static int ixj_daa_write(int board)
2803 BYTES bytes;
2804 IXJ *j = &ixj[board];
2806 if (!SCI_Prepare(board))
2807 return 0;
2809 bytes.high = 0x14;
2810 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
2811 if (!daa_load(&bytes, board))
2812 return 0;
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))
2817 return 0;
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))
2822 return 0;
2824 if (!SCI_Prepare(board))
2825 return 0;
2827 bytes.high = 0x1F;
2828 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
2829 if (!daa_load(&bytes, board))
2830 return 0;
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))
2835 return 0;
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))
2840 return 0;
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))
2845 return 0;
2847 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
2848 bytes.low = 0x00;
2849 if (!daa_load(&bytes, board))
2850 return 0;
2852 if (!SCI_Prepare(board))
2853 return 0;
2855 bytes.high = 0x00;
2856 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
2857 if (!daa_load(&bytes, board))
2858 return 0;
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))
2863 return 0;
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))
2868 return 0;
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))
2873 return 0;
2875 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
2876 bytes.low = 0x00;
2877 if (!daa_load(&bytes, board))
2878 return 0;
2880 if (!SCI_Control(board, SCI_End))
2881 return 0;
2882 if (!SCI_WaitLowSCI(board))
2883 return 0;
2885 bytes.high = 0x01;
2886 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
2887 if (!daa_load(&bytes, board))
2888 return 0;
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))
2893 return 0;
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))
2898 return 0;
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))
2903 return 0;
2905 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
2906 bytes.low = 0x00;
2907 if (!daa_load(&bytes, board))
2908 return 0;
2910 if (!SCI_Control(board, SCI_End))
2911 return 0;
2912 if (!SCI_WaitLowSCI(board))
2913 return 0;
2915 bytes.high = 0x02;
2916 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
2917 if (!daa_load(&bytes, board))
2918 return 0;
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))
2923 return 0;
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))
2928 return 0;
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))
2933 return 0;
2935 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
2936 bytes.low = 0x00;
2937 if (!daa_load(&bytes, board))
2938 return 0;
2940 if (!SCI_Control(board, SCI_End))
2941 return 0;
2942 if (!SCI_WaitLowSCI(board))
2943 return 0;
2945 bytes.high = 0x03;
2946 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
2947 if (!daa_load(&bytes, board))
2948 return 0;
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))
2953 return 0;
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))
2958 return 0;
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))
2963 return 0;
2965 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
2966 bytes.low = 0x00;
2967 if (!daa_load(&bytes, board))
2968 return 0;
2970 if (!SCI_Control(board, SCI_End))
2971 return 0;
2972 if (!SCI_WaitLowSCI(board))
2973 return 0;
2975 bytes.high = 0x04;
2976 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
2977 if (!daa_load(&bytes, board))
2978 return 0;
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))
2983 return 0;
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))
2988 return 0;
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))
2993 return 0;
2995 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
2996 bytes.low = 0x00;
2997 if (!daa_load(&bytes, board))
2998 return 0;
3000 if (!SCI_Control(board, SCI_End))
3001 return 0;
3002 if (!SCI_WaitLowSCI(board))
3003 return 0;
3005 bytes.high = 0x05;
3006 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
3007 if (!daa_load(&bytes, board))
3008 return 0;
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))
3013 return 0;
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))
3018 return 0;
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))
3023 return 0;
3025 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
3026 bytes.low = 0x00;
3027 if (!daa_load(&bytes, board))
3028 return 0;
3030 if (!SCI_Control(board, SCI_End))
3031 return 0;
3032 if (!SCI_WaitLowSCI(board))
3033 return 0;
3035 bytes.high = 0x06;
3036 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
3037 if (!daa_load(&bytes, board))
3038 return 0;
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))
3043 return 0;
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))
3048 return 0;
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))
3053 return 0;
3055 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
3056 bytes.low = 0x00;
3057 if (!daa_load(&bytes, board))
3058 return 0;
3060 if (!SCI_Control(board, SCI_End))
3061 return 0;
3062 if (!SCI_WaitLowSCI(board))
3063 return 0;
3065 bytes.high = 0x07;
3066 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
3067 if (!daa_load(&bytes, board))
3068 return 0;
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))
3073 return 0;
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))
3078 return 0;
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))
3083 return 0;
3085 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
3086 bytes.low = 0x00;
3087 if (!daa_load(&bytes, board))
3088 return 0;
3090 if (!SCI_Control(board, SCI_End))
3091 return 0;
3092 if (!SCI_WaitLowSCI(board))
3093 return 0;
3095 bytes.high = 0x08;
3096 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
3097 if (!daa_load(&bytes, board))
3098 return 0;
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))
3103 return 0;
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))
3108 return 0;
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))
3113 return 0;
3115 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
3116 bytes.low = 0x00;
3117 if (!daa_load(&bytes, board))
3118 return 0;
3120 if (!SCI_Control(board, SCI_End))
3121 return 0;
3122 if (!SCI_WaitLowSCI(board))
3123 return 0;
3125 bytes.high = 0x09;
3126 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
3127 if (!daa_load(&bytes, board))
3128 return 0;
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))
3133 return 0;
3135 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
3136 bytes.low = 0x00;
3137 if (!daa_load(&bytes, board))
3138 return 0;
3140 if (!SCI_Control(board, SCI_End))
3141 return 0;
3142 if (!SCI_WaitLowSCI(board))
3143 return 0;
3145 bytes.high = 0x0A;
3146 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
3147 if (!daa_load(&bytes, board))
3148 return 0;
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))
3153 return 0;
3155 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
3156 bytes.low = 0x00;
3157 if (!daa_load(&bytes, board))
3158 return 0;
3160 if (!SCI_Control(board, SCI_End))
3161 return 0;
3162 if (!SCI_WaitLowSCI(board))
3163 return 0;
3165 bytes.high = 0x0B;
3166 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
3167 if (!daa_load(&bytes, board))
3168 return 0;
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))
3173 return 0;
3175 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
3176 bytes.low = 0x00;
3177 if (!daa_load(&bytes, board))
3178 return 0;
3180 if (!SCI_Control(board, SCI_End))
3181 return 0;
3182 if (!SCI_WaitLowSCI(board))
3183 return 0;
3185 bytes.high = 0x0C;
3186 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
3187 if (!daa_load(&bytes, board))
3188 return 0;
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))
3193 return 0;
3195 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
3196 bytes.low = 0x00;
3197 if (!daa_load(&bytes, board))
3198 return 0;
3200 if (!SCI_Control(board, SCI_End))
3201 return 0;
3202 if (!SCI_WaitLowSCI(board))
3203 return 0;
3205 bytes.high = 0x0D;
3206 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
3207 if (!daa_load(&bytes, board))
3208 return 0;
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))
3213 return 0;
3215 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
3216 bytes.low = 0x00;
3217 if (!daa_load(&bytes, board))
3218 return 0;
3220 if (!SCI_Control(board, SCI_End))
3221 return 0;
3222 if (!SCI_WaitLowSCI(board))
3223 return 0;
3225 bytes.high = 0x0E;
3226 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
3227 if (!daa_load(&bytes, board))
3228 return 0;
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))
3233 return 0;
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))
3238 return 0;
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))
3243 return 0;
3245 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
3246 bytes.low = 0x00;
3247 if (!daa_load(&bytes, board))
3248 return 0;
3250 if (!SCI_Control(board, SCI_End))
3251 return 0;
3252 if (!SCI_WaitLowSCI(board))
3253 return 0;
3255 bytes.high = 0x0F;
3256 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
3257 if (!daa_load(&bytes, board))
3258 return 0;
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))
3263 return 0;
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))
3268 return 0;
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))
3273 return 0;
3275 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
3276 bytes.low = 0x00;
3277 if (!daa_load(&bytes, board))
3278 return 0;
3280 udelay(32);
3281 j->pld_scrr.byte = inb_p(j->XILINXbase);
3282 if (!SCI_Control(board, SCI_End))
3283 return 0;
3285 return 1;
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
3294 return -1;
3296 if (ixj_WriteDSPCommand(arg, board))
3297 return -1;
3299 return 0;
3302 static int ixj_get_tone_on(int board)
3304 if (ixj_WriteDSPCommand(0x6E06, board)) // Get Tone On Period
3306 return -1;
3308 return 0;
3311 static int ixj_get_tone_off(int board)
3313 if (ixj_WriteDSPCommand(0x6E07, board)) // Get Tone Off Period
3315 return -1;
3317 return 0;
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) {
3338 return;
3339 } else {
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);
3360 j->tone_state = 0;
3362 ixj_del_timer();
3363 if (j->cadence_t) {
3364 if (j->cadence_t->ce) {
3365 kfree(j->cadence_t->ce);
3367 kfree(j->cadence_t);
3368 j->cadence_t = NULL;
3370 ixj_add_timer();
3371 if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
3372 idle(board);
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)
3397 IXJ_CADENCE *lcp;
3398 IXJ_CADENCE_ELEMENT *lcep;
3399 IXJ_TONE ti;
3400 IXJ *j = &ixj[board];
3402 lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
3403 if (lcp == NULL)
3404 return -ENOMEM;
3406 if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)))
3407 return -EFAULT;
3409 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
3410 if (lcep == NULL) {
3411 kfree(lcp);
3412 return -ENOMEM;
3414 if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
3415 return -EFAULT;
3417 if(j->cadence_t)
3419 kfree(j->cadence_t->ce);
3420 kfree(j->cadence_t);
3423 lcp->ce = (void *) lcep;
3424 j->cadence_t = lcp;
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);
3438 return 1;
3441 static void add_caps(int board)
3443 IXJ *j = &ixj[board];
3444 j->caps = 0;
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) {
3452 case 100:
3453 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
3454 j->caplist[j->caps].cap = 100;
3455 break;
3456 case 300:
3457 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
3458 j->caplist[j->caps].cap = 300;
3459 break;
3460 case 400:
3461 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
3462 j->caplist[j->caps].cap = 400;
3463 break;
3464 case 500:
3465 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
3466 j->caplist[j->caps].cap = 500;
3467 break;
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) {
3475 case 100:
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++;
3484 break;
3485 case 300:
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++;
3494 break;
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)
3539 int cnt;
3540 IXJ *j = &ixj[board];
3541 int retval = 0;
3543 for (cnt = 0; cnt < j->caps; cnt++) {
3544 if (pcreq->captype == j->caplist[cnt].captype &&
3545 pcreq->cap == j->caplist[cnt].cap) {
3546 retval = 1;
3547 break;
3550 return retval;
3553 int ixj_ioctl(struct inode *inode, struct file *file_p,
3554 unsigned int cmd, unsigned long arg)
3556 IXJ_TONE ti;
3557 IXJ_FILTER jf;
3558 unsigned int minor = MINOR(inode->i_rdev);
3559 int board = NUM(inode->i_rdev);
3560 IXJ *j = &ixj[NUM(inode->i_rdev)];
3561 int retval = 0;
3563 if (ixjdebug > 1)
3564 printk(KERN_DEBUG "phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
3565 if (minor >= IXJMAX)
3566 return -ENODEV;
3569 * Check ioctls only root can use.
3572 if (!capable(CAP_SYS_ADMIN)) {
3573 switch (cmd) {
3574 case IXJCTL_TESTRAM:
3575 case IXJCTL_HZ:
3576 return -EPERM;
3579 switch (cmd) {
3580 case IXJCTL_TESTRAM:
3581 ixj_testram(board);
3582 retval = (j->ssr.high << 8) + j->ssr.low;
3583 break;
3584 case IXJCTL_CARDTYPE:
3585 retval = j->cardtype;
3586 break;
3587 case IXJCTL_SERIAL:
3588 retval = j->serial;
3589 break;
3590 case PHONE_RING_CADENCE:
3591 j->ring_cadence = arg;
3592 break;
3593 case PHONE_RING_START:
3594 ixj_ring_start(board);
3595 break;
3596 case PHONE_RING_STOP:
3597 j->flags.cringing = 0;
3598 ixj_ring_off(board);
3599 break;
3600 case PHONE_RING:
3601 retval = ixj_ring(board);
3602 break;
3603 case PHONE_EXCEPTION:
3604 retval = j->ex.bytes;
3605 j->ex.bytes &= 0x03;
3606 break;
3607 case PHONE_HOOKSTATE:
3608 j->ex.bits.hookstate = 0;
3609 retval = j->r_hook;
3610 break;
3611 case IXJCTL_SET_LED:
3612 LED_SetState(arg, board);
3613 break;
3614 case PHONE_FRAME:
3615 retval = set_base_frame(board, arg);
3616 break;
3617 case PHONE_REC_CODEC:
3618 retval = set_rec_codec(board, arg);
3619 break;
3620 case PHONE_REC_START:
3621 ixj_record_start(board);
3622 break;
3623 case PHONE_REC_STOP:
3624 ixj_record_stop(board);
3625 break;
3626 case PHONE_REC_DEPTH:
3627 set_rec_depth(board, arg);
3628 break;
3629 case PHONE_REC_VOLUME:
3630 set_rec_volume(board, arg);
3631 break;
3632 case PHONE_REC_LEVEL:
3633 retval = get_rec_level(board);
3634 break;
3635 case IXJCTL_AEC_START:
3636 ixj_aec_start(board, arg);
3637 break;
3638 case IXJCTL_AEC_STOP:
3639 aec_stop(board);
3640 break;
3641 case IXJCTL_AEC_GET_LEVEL:
3642 retval = j->aec_level;
3643 break;
3644 case PHONE_PLAY_CODEC:
3645 retval = set_play_codec(board, arg);
3646 break;
3647 case PHONE_PLAY_START:
3648 ixj_play_start(board);
3649 break;
3650 case PHONE_PLAY_STOP:
3651 ixj_play_stop(board);
3652 break;
3653 case PHONE_PLAY_DEPTH:
3654 set_play_depth(board, arg);
3655 break;
3656 case PHONE_PLAY_VOLUME:
3657 set_play_volume(board, arg);
3658 break;
3659 case PHONE_PLAY_LEVEL:
3660 retval = get_play_level(board);
3661 break;
3662 case IXJCTL_DSP_TYPE:
3663 retval = (j->dsp.high << 8) + j->dsp.low;
3664 break;
3665 case IXJCTL_DSP_VERSION:
3666 retval = (j->ver.high << 8) + j->ver.low;
3667 break;
3668 case IXJCTL_HZ:
3669 hertz = arg;
3670 break;
3671 case IXJCTL_RATE:
3672 if (arg > hertz)
3673 retval = -1;
3674 else
3675 samplerate = arg;
3676 break;
3677 case IXJCTL_DRYBUFFER_READ:
3678 put_user(j->drybuffer, (unsigned long *) arg);
3679 break;
3680 case IXJCTL_DRYBUFFER_CLEAR:
3681 j->drybuffer = 0;
3682 break;
3683 case IXJCTL_FRAMES_READ:
3684 put_user(j->framesread, (unsigned long *) arg);
3685 break;
3686 case IXJCTL_FRAMES_WRITTEN:
3687 put_user(j->frameswritten, (unsigned long *) arg);
3688 break;
3689 case IXJCTL_READ_WAIT:
3690 put_user(j->read_wait, (unsigned long *) arg);
3691 break;
3692 case IXJCTL_WRITE_WAIT:
3693 put_user(j->write_wait, (unsigned long *) arg);
3694 break;
3695 case PHONE_MAXRINGS:
3696 j->maxrings = arg;
3697 break;
3698 case PHONE_SET_TONE_ON_TIME:
3699 ixj_set_tone_on(arg, board);
3700 break;
3701 case PHONE_SET_TONE_OFF_TIME:
3702 ixj_set_tone_off(arg, board);
3703 break;
3704 case PHONE_GET_TONE_ON_TIME:
3705 if (ixj_get_tone_on(board)) {
3706 retval = -1;
3707 } else {
3708 retval = (j->ssr.high << 8) + j->ssr.low;
3710 break;
3711 case PHONE_GET_TONE_OFF_TIME:
3712 if (ixj_get_tone_off(board)) {
3713 retval = -1;
3714 } else {
3715 retval = (j->ssr.high << 8) + j->ssr.low;
3717 break;
3718 case PHONE_PLAY_TONE:
3719 if (!j->tone_state)
3720 ixj_play_tone(board, arg);
3721 break;
3722 case PHONE_GET_TONE_STATE:
3723 retval = j->tone_state;
3724 break;
3725 case PHONE_DTMF_READY:
3726 retval = j->ex.bits.dtmf_ready;
3727 break;
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];
3732 j->dtmf_rp++;
3733 if (j->dtmf_rp == 79)
3734 j->dtmf_rp = 0;
3735 if (j->dtmf_rp == j->dtmf_wp) {
3736 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
3740 break;
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]) {
3745 case 10:
3746 retval = 42; //'*';
3748 break;
3749 case 11:
3750 retval = 48; //'0';
3752 break;
3753 case 12:
3754 retval = 35; //'#';
3756 break;
3757 case 28:
3758 retval = 65; //'A';
3760 break;
3761 case 29:
3762 retval = 66; //'B';
3764 break;
3765 case 30:
3766 retval = 67; //'C';
3768 break;
3769 case 31:
3770 retval = 68; //'D';
3772 break;
3773 default:
3774 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
3775 break;
3777 j->dtmf_rp++;
3778 if (j->dtmf_rp == 79)
3779 j->dtmf_rp = 0;
3780 // if(j->dtmf_rp == j->dtmf_wp)
3782 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
3786 break;
3787 case PHONE_DTMF_OOB:
3788 j->flags.dtmf_oob = arg;
3789 break;
3790 case PHONE_DIALTONE:
3791 ixj_dialtone(board);
3792 break;
3793 case PHONE_BUSY:
3794 ixj_busytone(board);
3795 break;
3796 case PHONE_RINGBACK:
3797 ixj_ringback(board);
3798 break;
3799 case PHONE_CPT_STOP:
3800 ixj_cpt_stop(board);
3801 break;
3802 case IXJCTL_DSP_IDLE:
3803 idle(board);
3804 break;
3805 case IXJCTL_MIXER:
3806 ixj_mixer(arg, board);
3807 break;
3808 case IXJCTL_DAA_COEFF_SET:
3809 switch (arg) {
3810 case DAA_US:
3811 DAA_Coeff_US(board);
3812 ixj_daa_write(board);
3813 break;
3814 case DAA_UK:
3815 DAA_Coeff_UK(board);
3816 ixj_daa_write(board);
3817 break;
3818 case DAA_FRANCE:
3819 DAA_Coeff_France(board);
3820 ixj_daa_write(board);
3821 break;
3822 case DAA_GERMANY:
3823 DAA_Coeff_Germany(board);
3824 ixj_daa_write(board);
3825 break;
3826 case DAA_AUSTRALIA:
3827 DAA_Coeff_Australia(board);
3828 ixj_daa_write(board);
3829 break;
3830 case DAA_JAPAN:
3831 DAA_Coeff_Japan(board);
3832 ixj_daa_write(board);
3833 break;
3834 default:
3835 break;
3837 break;
3838 case IXJCTL_DAA_AGAIN:
3839 ixj_daa_cr4(board, arg | 0x02);
3840 break;
3841 case IXJCTL_PSTN_LINETEST:
3842 retval = ixj_linetest(board);
3843 break;
3844 case IXJCTL_CID:
3845 if (copy_to_user((char *) arg, &j->cid, sizeof(IXJ_CID)))
3846 return -EFAULT;
3847 j->ex.bits.caller_id = 0;
3848 break;
3849 case IXJCTL_WINK_DURATION:
3850 j->winktime = arg;
3851 break;
3852 case IXJCTL_PORT:
3853 if (arg)
3854 retval = ixj_set_port(board, arg);
3855 else
3856 retval = j->port;
3857 break;
3858 case IXJCTL_POTS_PSTN:
3859 retval = ixj_set_pots(board, arg);
3860 break;
3861 case PHONE_CAPABILITIES:
3862 retval = j->caps;
3863 break;
3864 case PHONE_CAPABILITIES_LIST:
3865 if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
3866 return -EFAULT;
3867 break;
3868 case PHONE_CAPABILITIES_CHECK:
3869 retval = capabilities_check(board, (struct phone_capability *) arg);
3870 break;
3871 case PHONE_PSTN_SET_STATE:
3872 daa_set_mode(board, arg);
3873 break;
3874 case PHONE_PSTN_GET_STATE:
3875 retval = j->daa_mode;
3876 j->ex.bits.pstn_ring = 0;
3877 break;
3878 case IXJCTL_SET_FILTER:
3879 if (copy_from_user(&jf, (char *) arg, sizeof(ti)))
3880 return -EFAULT;
3881 retval = ixj_init_filter(board, &jf);
3882 break;
3883 case IXJCTL_GET_FILTER_HIST:
3884 retval = j->filter_hist[arg];
3885 break;
3886 case IXJCTL_INIT_TONE:
3887 copy_from_user(&ti, (char *) arg, sizeof(ti));
3888 retval = ixj_init_tone(board, &ti);
3889 break;
3890 case IXJCTL_TONE_CADENCE:
3891 retval = ixj_build_cadence(board, (IXJ_CADENCE *) arg);
3892 break;
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);
3899 ixj_play_stop(arg);
3900 idle(board);
3901 idle(arg);
3902 break;
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);
3910 idle(board);
3911 idle(arg);
3912 break;
3914 return retval;
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 */
3926 ixj_enhanced_read,
3927 ixj_enhanced_write,
3928 NULL, /* ixj_readdir */
3929 ixj_poll,
3930 ixj_ioctl,
3931 NULL, /* ixj_mmap */
3932 // ixj_open,
3933 NULL, /* ixj_open */
3934 NULL, /* ixj_flush */
3935 ixj_release,
3936 NULL, /* ixj_fsync */
3937 ixj_fasync, /* ixj_fasync */
3938 NULL, /* media change */
3939 NULL, /* revalidate */
3940 NULL /* lock */
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);
3968 } else {
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);
3991 } else {
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;
4014 } else {
4015 j->flags.pstn_present = 0;
4018 if (j->flags.pstn_present) {
4019 if (j->flags.pots_correct) {
4020 LED_SetState(0xA, board);
4021 } else {
4022 LED_SetState(0x6, board);
4024 } else {
4025 if (j->flags.pots_correct) {
4026 LED_SetState(0x9, board);
4027 } else {
4028 LED_SetState(0x5, board);
4031 return j->flags.pstn_present;
4034 static int ixj_selfprobe(int board)
4036 unsigned short cmd;
4037 unsigned long jif;
4038 BYTES bytes;
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);
4050 * Now we can probe
4053 if (ixjdebug > 0)
4054 printk(KERN_INFO "Write IDLE to Software Control Register\n");
4056 if (ixj_WriteDSPCommand(0x0000, board)) /* Write IDLE to Software Control Register */
4057 return -1;
4059 // The read values of the SSR should be 0x00 for the IDLE command
4060 if (j->ssr.low || j->ssr.high)
4061 return -1;
4063 if (ixjdebug > 0)
4064 printk(KERN_INFO "Get Device ID Code\n");
4066 if (ixj_WriteDSPCommand(0x3400, board)) /* Get Device ID Code */
4067 return -1;
4069 j->dsp.low = j->ssr.low;
4070 j->dsp.high = j->ssr.high;
4072 if (ixjdebug > 0)
4073 printk(KERN_INFO "Get Device Version Code\n");
4075 if (ixj_WriteDSPCommand(0x3800, board)) /* Get Device Version Code */
4076 return -1;
4078 j->ver.low = j->ssr.low;
4079 j->ver.high = j->ssr.high;
4081 if (!j->cardtype) {
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);
4095 return -1;
4097 request_region(j->XILINXbase, 4, "ixj control");
4098 j->pld_slicw.pcib.e1 = 1;
4099 outb_p(j->pld_slicw.byte, j->XILINXbase);
4100 } else {
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);
4105 return -1;
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);
4115 } else
4116 j->cardtype = 100; // Internet PhoneJACK
4118 } else {
4119 switch (j->cardtype) {
4120 case 100: // Internet PhoneJACK
4122 if (!j->dsp.low != 0x20) {
4123 j->dsp.high = 0x80;
4124 j->dsp.low = 0x20;
4125 ixj_WriteDSPCommand(0x3800, board);
4126 j->ver.low = j->ssr.low;
4127 j->ver.high = j->ssr.high;
4129 break;
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);
4134 return -1;
4136 request_region(j->XILINXbase, 8, "ixj control");
4137 break;
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);
4144 return -1;
4146 request_region(j->XILINXbase, 4, "ixj control");
4147 j->pld_slicw.pcib.e1 = 1;
4148 outb_p(j->pld_slicw.byte, j->XILINXbase);
4149 break;
4152 if (j->dsp.low == 0x20 || j->cardtype == 400 || j->cardtype == 500) {
4153 if (ixjdebug > 0)
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 */
4157 return -1;
4159 if (ixjdebug > 0)
4160 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
4162 if (j->cardtype == 100) {
4163 cmd = 0x9FF2;
4164 } else {
4165 cmd = 0x9FF5;
4167 if (ixj_WriteDSPCommand(cmd, board)) /* Write CODEC timing to Software Control Register */
4168 return -1;
4169 } else {
4170 if (set_base_frame(board, 30) != 30)
4171 return -1;
4173 if (j->cardtype == 300) {
4174 if (ixjdebug > 0)
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 */
4178 return -1;
4180 if (ixjdebug > 0)
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) {
4189 if (ixjdebug > 0)
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 */
4203 if (ixjdebug > 0)
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;
4213 } else {
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);
4243 if (ixjdebug > 0)
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;
4267 if (ixjdebug > 0)
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
4292 } else {
4293 j->port = PORT_POTS;
4294 SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
4298 j->intercom = -1;
4299 j->framesread = j->frameswritten = 0;
4300 j->rxreadycheck = j->txreadycheck = 0;
4302 if (ixj_WriteDSPCommand(0x0000, board)) /* Write IDLE to Software Control Register */
4303 return -1;
4305 // The read values of the SSR should be 0x00 for the IDLE command
4306 if (j->ssr.low || j->ssr.high)
4307 return -1;
4309 if (ixjdebug > 0)
4310 printk(KERN_INFO "Enable Line Monitor\n");
4312 if (ixjdebug > 0)
4313 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
4315 if (ixj_WriteDSPCommand(0x7E01, board)) // Asynchronous Line Monitor
4317 return -1;
4319 if (ixjdebug > 0)
4320 printk(KERN_INFO "Enable DTMF Detectors\n");
4322 if (ixj_WriteDSPCommand(0x5151, board)) // Enable DTMF detection
4324 return -1;
4326 if (ixj_WriteDSPCommand(0x6E01, board)) // Set Asyncronous Tone Generation
4328 return -1;
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;
4335 j->dtmf_state = 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;
4342 j->drybuffer = 0;
4343 j->winktime = 320;
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);
4352 add_caps(board);
4354 return 0;
4357 static void cleanup(void)
4359 int cnt;
4361 del_timer(&ixj_timer);
4362 // if (ixj_major)
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
4389 if (ixj[cnt].dev)
4390 ixj[cnt].dev->deactivate(ixj[cnt].dev);
4391 #endif
4396 // Typedefs
4397 typedef struct {
4398 BYTE length;
4399 DWORD bits;
4400 } DATABLOCK;
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
4408 udelay(1000);
4409 lastLCC = lastLCC | 0x01;
4410 outb(lastLCC, wEEPROMAddress); //SK rising edge
4412 byData = byData << 1;
4413 lastLCC = lastLCC & 0xfe;
4415 udelay(1000);
4416 outb(lastLCC, wEEPROMAddress); //after delay, SK falling edge
4420 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
4422 udelay(1000);
4423 lastLCC = lastLCC | 0x01;
4424 outb(lastLCC, wEEPROMAddress); //SK rising edge
4426 lastLCC = lastLCC & 0xfe;
4427 udelay(1000);
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)
4435 BYTE lastLCC;
4436 WORD wEEPROMAddress = wAddress + 3;
4437 DWORD i;
4438 BYTE byResult;
4440 *pwResult = 0;
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);
4456 wLoc <<= 1;
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
4469 return 0;
4472 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
4474 WORD wLo, wHi;
4476 if (PCIEE_ReadWord(wAddress, 62, &wLo))
4477 return 0;
4479 if (PCIEE_ReadWord(wAddress, 63, &wHi))
4480 return 0;
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");
4494 #ifdef MODULE
4496 void cleanup_module(void)
4498 cleanup();
4501 int init_module(void)
4502 #else
4503 int __init ixj_init(void)
4504 #endif
4506 int result;
4508 int func = 0x110, i = 0;
4509 int cnt = 0;
4510 int probe = 0;
4511 struct pci_dev *dev = NULL, *old_dev = NULL;
4512 struct pci_dev *pci = NULL;
4514 #ifdef CONFIG_ISAPNP
4515 while (1) {
4516 do {
4517 old_dev = dev;
4518 dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
4519 ISAPNP_FUNCTION(func), old_dev);
4520 if (!dev)
4521 break;
4522 printk("preparing %x\n", func);
4523 result = dev->prepare(dev);
4524 if (result < 0) {
4525 printk("preparing failed %d \n", result);
4526 break;
4528 if (!(dev->resource[0].flags & IORESOURCE_IO))
4529 return -ENODEV;
4530 dev->resource[0].flags |= IORESOURCE_AUTO;
4531 if (func != 0x110)
4532 dev->resource[1].flags |= IORESOURCE_AUTO;
4533 if (dev->activate(dev) < 0) {
4534 printk("isapnp configure failed (out of resources?)\n");
4535 return -ENOMEM;
4537 ixj[cnt].DSPbase = dev->resource[0].start; /* get real port */
4538 if (func != 0x110)
4539 ixj[cnt].XILINXbase = dev->resource[1].start; /* get real port */
4541 result = check_region(ixj[cnt].DSPbase, 16);
4542 if (result) {
4543 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[cnt].DSPbase);
4544 cleanup();
4545 return result;
4547 request_region(ixj[cnt].DSPbase, 16, "ixj DSP");
4548 switch (func) {
4549 case (0x110):
4550 ixj[cnt].cardtype = 100;
4551 break;
4552 case (0x310):
4553 ixj[cnt].cardtype = 300;
4554 break;
4555 case (0x410):
4556 ixj[cnt].cardtype = 400;
4557 break;
4559 probe = ixj_selfprobe(cnt);
4561 ixj[cnt].serial = dev->bus->serial;
4562 ixj[cnt].dev = dev;
4563 printk(KERN_INFO "ixj: found card at 0x%x\n", ixj[cnt].DSPbase);
4564 cnt++;
4565 } while (dev);
4567 if (func == 0x410)
4568 break;
4569 if (func == 0x310)
4570 func = 0x410;
4571 if (func == 0x110)
4572 func = 0x310;
4573 dev = NULL;
4575 #else //CONFIG_ISAPNP
4576 /* Use passed parameters for older kernels without PnP */
4578 for (cnt = 0; cnt < IXJMAX; cnt++) {
4579 if (dspio[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);
4584 if (result) {
4585 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[cnt].DSPbase);
4586 cleanup();
4587 return result;
4589 request_region(ixj[cnt].DSPbase, 16, "ixj DSP");
4590 probe = ixj_selfprobe(cnt);
4591 ixj[cnt].dev = NULL;
4594 #endif
4595 #ifdef CONFIG_PCI
4596 if (pci_present()) {
4597 for (i = 0; i < IXJMAX - cnt; i++) {
4598 pci = pci_find_device(0x15E2, 0x0500, pci);
4599 if (!pci)
4600 break;
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);
4607 if (result) {
4608 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[cnt].DSPbase);
4609 cleanup();
4610 return result;
4612 request_region(ixj[cnt].DSPbase, 16, "ixj DSP");
4613 ixj[cnt].cardtype = 500;
4614 probe = ixj_selfprobe(cnt);
4615 cnt++;
4619 #endif
4620 printk("%s\n", ixj_c_rcsid);
4622 ixj_init_timer();
4623 ixj_add_timer();
4624 return probe;
4627 static void DAA_Coeff_US(int board)
4629 IXJ *j = &ixj[board];
4631 int i;
4633 //-----------------------------------------------
4634 // CAO
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;
4721 // ; (10K, 0.68uF)
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;
4771 // ;CR Registers
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
4792 // ;xr Registers
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];
4842 int i;
4844 //-----------------------------------------------
4845 // CAO
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;
4932 // ; idle
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;
4980 // ;CR Registers
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
5000 // ;xr Registers
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];
5050 int i;
5052 //-----------------------------------------------
5053 // CAO
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;
5140 // ; idle
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;
5188 // ;CR Registers
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
5208 // ;xr Registers
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];
5258 int i;
5260 //-----------------------------------------------
5261 // CAO
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;
5348 // ; (10K, 0.68uF)
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;
5396 // ;CR Registers
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
5416 // ;xr Registers
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];
5466 int i;
5468 //-----------------------------------------------
5469 // CAO
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;
5556 // ; idle
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;
5604 // ;CR Registers
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
5624 // ;xr Registers
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];
5673 int i;
5675 //-----------------------------------------------
5676 // CAO
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;
5763 // ; idle
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;
5811 // ;CR Registers
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
5831 // ;xr Registers
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] =
5879 { // f20_50[]
5880 32538, // A1 = 1.985962
5881 -32325, // A2 = -0.986511
5882 -343, // B2 = -0.010493
5883 0, // B1 = 0
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
5900 { // f133_200[]
5901 32072, // A1 = 1.95752
5902 -31896, // A2 = -0.973419
5903 -435, // B2 = -0.013294
5904 0, // B1 = 0
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
5921 { // 300.txt
5922 31769, // A1 = -1.939026
5923 -32584, // A2 = 0.994385
5924 -475, // B2 = -0.014522
5925 0, // B1 = 0.000000
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
5942 { // f300_420[]
5943 30750, // A1 = 1.876892
5944 -31212, // A2 = -0.952515
5945 -804, // B2 = -0.024541
5946 0, // B1 = 0
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
5963 { // 330.txt
5964 31613, // A1 = -1.929565
5965 -32646, // A2 = 0.996277
5966 -185, // B2 = -0.005657
5967 0, // B1 = 0.000000
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
5984 { // f300_425[]
5985 30741, // A1 = 1.876282
5986 -31475, // A2 = -0.960541
5987 -703, // B2 = -0.021484
5988 0, // B1 = 0
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
6005 { // f330_440[]
6006 30627, // A1 = 1.869324
6007 -31338, // A2 = -0.95636
6008 -843, // B2 = -0.025749
6009 0, // B1 = 0
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
6026 { // 340.txt
6027 31546, // A1 = -1.925476
6028 -32646, // A2 = 0.996277
6029 -445, // B2 = -0.013588
6030 0, // B1 = 0.000000
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
6047 { // f350_400[]
6048 31006, // A1 = 1.892517
6049 -32029, // A2 = -0.977448
6050 -461, // B2 = -0.014096
6051 0, // B1 = 0
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
6068 { // f350_440[]
6069 30634, // A1 = 1.869751
6070 -31533, // A2 = -0.962341
6071 -680, // B2 = -0.020782
6072 0, // B1 = 0
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
6089 { // f350_450[]
6090 30552, // A1 = 1.864807
6091 -31434, // A2 = -0.95929
6092 -690, // B2 = -0.021066
6093 0, // B1 = 0
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
6110 { // 360.txt
6111 31397, // A1 = -1.916321
6112 -32623, // A2 = 0.995605
6113 -117, // B2 = -0.003598
6114 0, // B1 = 0.000000
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
6131 { // f380_420[]
6132 30831, // A1 = 1.881775
6133 -32064, // A2 = -0.978546
6134 -367, // B2 = -0.01122
6135 0, // B1 = 0
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
6152 { // 392.txt
6153 31152, // A1 = -1.901428
6154 -32613, // A2 = 0.995300
6155 -314, // B2 = -0.009605
6156 0, // B1 = 0.000000
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
6173 { // f400_425[]
6174 30836, // A1 = 1.882141
6175 -32296, // A2 = -0.985596
6176 -324, // B2 = -0.009903
6177 0, // B1 = 0
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
6194 { // f400_440[]
6195 30702, // A1 = 1.873962
6196 -32134, // A2 = -0.980682
6197 -517, // B2 = -0.015793
6198 0, // B1 = 0
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
6215 { // f400_450[]
6216 30613, // A1 = 1.86853
6217 -32031, // A2 = -0.977509
6218 -618, // B2 = -0.018866
6219 0, // B1 = 0
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
6236 { // 420.txt
6237 30914, // A1 = -1.886841
6238 -32584, // A2 = 0.994385
6239 -426, // B2 = -0.013020
6240 0, // B1 = 0.000000
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
6257 { // 425.txt
6258 30881, // A1 = -1.884827
6259 -32603, // A2 = 0.994965
6260 -496, // B2 = -0.015144
6261 0, // B1 = 0.000000
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
6278 { // f425_450[]
6279 30646, // A1 = 1.870544
6280 -32327, // A2 = -0.986572
6281 -287, // B2 = -0.008769
6282 0, // B1 = 0
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
6299 { // f425_475[]
6300 30396, // A1 = 1.855225
6301 -32014, // A2 = -0.97699
6302 -395, // B2 = -0.012055
6303 0, // B1 = 0
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
6320 { // 435.txt
6321 30796, // A1 = -1.879639
6322 -32603, // A2 = 0.994965
6323 -254, // B2 = -0.007762
6324 0, // B1 = 0.000000
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
6341 { // f440_450[]
6342 30641, // A1 = 1.870239
6343 -32458, // A2 = -0.99057
6344 -155, // B2 = -0.004735
6345 0, // B1 = 0
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
6362 { // f440_480[]
6363 30367, // A1 = 1.853455
6364 -32147, // A2 = -0.981079
6365 -495, // B2 = -0.015113
6366 0, // B1 = 0
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
6383 { // 445.txt
6384 30709, // A1 = -1.874329
6385 -32603, // A2 = 0.994965
6386 -83, // B2 = -0.002545
6387 0, // B1 = 0.000000
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
6404 { // 450.txt
6405 30664, // A1 = -1.871643
6406 -32603, // A2 = 0.994965
6407 -164, // B2 = -0.005029
6408 0, // B1 = 0.000000
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
6425 { // 452.txt
6426 30653, // A1 = -1.870911
6427 -32615, // A2 = 0.995361
6428 -209, // B2 = -0.006382
6429 0, // B1 = 0.000000
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
6446 { // 475.txt
6447 30437, // A1 = -1.857727
6448 -32603, // A2 = 0.994965
6449 -264, // B2 = -0.008062
6450 0, // B1 = 0.000000
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
6467 { // f480_620[]
6468 28975, // A1 = 1.768494
6469 -30955, // A2 = -0.944672
6470 -1026, // B2 = -0.03133
6471 0, // B1 = 0
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
6488 { // 494.txt
6489 30257, // A1 = -1.846741
6490 -32605, // A2 = 0.995056
6491 -249, // B2 = -0.007625
6492 0, // B1 = 0.000000
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
6509 { // 500.txt
6510 30202, // A1 = -1.843431
6511 -32624, // A2 = 0.995622
6512 -413, // B2 = -0.012622
6513 0, // B1 = 0.000000
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
6530 { // 520.txt
6531 30001, // A1 = -1.831116
6532 -32613, // A2 = 0.995270
6533 -155, // B2 = -0.004750
6534 0, // B1 = 0.000000
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
6551 { // 523.txt
6552 29964, // A1 = -1.828918
6553 -32601, // A2 = 0.994904
6554 -101, // B2 = -0.003110
6555 0, // B1 = 0.000000
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
6572 { // 525.txt
6573 29936, // A1 = -1.827209
6574 -32584, // A2 = 0.994415
6575 -91, // B2 = -0.002806
6576 0, // B1 = 0.000000
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
6593 { // f540_660[]
6594 28499, // A1 = 1.739441
6595 -31129, // A2 = -0.949982
6596 -849, // B2 = -0.025922
6597 0, // B1 = 0
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
6614 { // 587.txt
6615 29271, // A1 = -1.786560
6616 -32599, // A2 = 0.994873
6617 -490, // B2 = -0.014957
6618 0, // B1 = 0.000000
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
6635 { // 590.txt
6636 29230, // A1 = -1.784058
6637 -32584, // A2 = 0.994415
6638 -418, // B2 = -0.012757
6639 0, // B1 = 0.000000
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
6656 { // 600.txt
6657 29116, // A1 = -1.777100
6658 -32603, // A2 = 0.994965
6659 -165, // B2 = -0.005039
6660 0, // B1 = 0.000000
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
6677 { // 660.txt
6678 28376, // A1 = -1.731934
6679 -32567, // A2 = 0.993896
6680 -363, // B2 = -0.011102
6681 0, // B1 = 0.000000
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
6698 { // 700.txt
6699 27844, // A1 = -1.699463
6700 -32563, // A2 = 0.993744
6701 -366, // B2 = -0.011187
6702 0, // B1 = 0.000000
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
6719 { // 740.txt
6720 27297, // A1 = -1.666077
6721 -32551, // A2 = 0.993408
6722 -345, // B2 = -0.010540
6723 0, // B1 = 0.000000
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
6740 { // 750.txt
6741 27155, // A1 = -1.657410
6742 -32551, // A2 = 0.993408
6743 -462, // B2 = -0.014117
6744 0, // B1 = 0.000000
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
6761 { // f750_1450[]
6762 19298, // A1 = 1.177917
6763 -24471, // A2 = -0.746796
6764 -4152, // B2 = -0.126709
6765 0, // B1 = 0
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
6782 { // 770.txt
6783 26867, // A1 = -1.639832
6784 -32551, // A2 = 0.993408
6785 -123, // B2 = -0.003755
6786 0, // B1 = 0.000000
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
6803 { // 800.txt
6804 26413, // A1 = -1.612122
6805 -32547, // A2 = 0.993286
6806 -223, // B2 = -0.006825
6807 0, // B1 = 0.000000
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
6824 { // 816.txt
6825 26168, // A1 = -1.597209
6826 -32528, // A2 = 0.992706
6827 -235, // B2 = -0.007182
6828 0, // B1 = 0.000000
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
6845 { // 850.txt
6846 25641, // A1 = -1.565063
6847 -32536, // A2 = 0.992950
6848 -121, // B2 = -0.003707
6849 0, // B1 = 0.000000
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
6866 { // f857_1645[]
6867 16415, // A1 = 1.001953
6868 -23669, // A2 = -0.722321
6869 -4549, // B2 = -0.138847
6870 0, // B1 = 0
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
6887 { // 900.txt
6888 24806, // A1 = -1.514099
6889 -32501, // A2 = 0.991852
6890 -326, // B2 = -0.009969
6891 0, // B1 = 0.000000
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
6908 { // f900_1300[]
6909 19776, // A1 = 1.207092
6910 -27437, // A2 = -0.837341
6911 -2666, // B2 = -0.081371
6912 0, // B1 = 0
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
6929 { // f935_1215[]
6930 20554, // A1 = 1.254517
6931 -28764, // A2 = -0.877838
6932 -2048, // B2 = -0.062515
6933 0, // B1 = 0
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
6950 { // f941_1477[]
6951 17543, // A1 = 1.07074
6952 -26220, // A2 = -0.800201
6953 -3298, // B2 = -0.100647
6954 0, // B1 = 0
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
6971 { // 942.txt
6972 24104, // A1 = -1.471252
6973 -32507, // A2 = 0.992065
6974 -351, // B2 = -0.010722
6975 0, // B1 = 0.000000
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
6992 { // 950.txt
6993 23967, // A1 = -1.462830
6994 -32507, // A2 = 0.992065
6995 -518, // B2 = -0.015821
6996 0, // B1 = 0.000000
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
7013 { // f950_1400[]
7014 18294, // A1 = 1.116638
7015 -26962, // A2 = -0.822845
7016 -2914, // B2 = -0.088936
7017 0, // B1 = 0
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
7034 { // 975.txt
7035 23521, // A1 = -1.435608
7036 -32489, // A2 = 0.991516
7037 -193, // B2 = -0.005915
7038 0, // B1 = 0.000000
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
7055 { // 1000.txt
7056 23071, // A1 = -1.408203
7057 -32489, // A2 = 0.991516
7058 -293, // B2 = -0.008965
7059 0, // B1 = 0.000000
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
7076 { // 1020.txt
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
7097 { // 1050.txt
7098 22142, // A1 = -1.351501
7099 -32474, // A2 = 0.991058
7100 -147, // B2 = -0.004493
7101 0, // B1 = 0.000000
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
7118 { // f1100_1750[]
7119 12973, // A1 = 0.79184
7120 -24916, // A2 = -0.760376
7121 6655, // B2 = 0.203102
7122 367, // B1 = 0.0224
7123 6657, // B0 = 0.203171
7124 5915, // A1 = 0.361053
7125 -29560, // A2 = -0.90213
7126 -7777, // B2 = -0.23735
7127 0, // B1 = 0
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
7139 { // 1140.txt
7140 20392, // A1 = -1.244629
7141 -32460, // A2 = 0.990601
7142 -270, // B2 = -0.008240
7143 0, // B1 = 0.000000
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
7160 { // 1200.txt
7161 19159, // A1 = -1.169373
7162 -32456, // A2 = 0.990509
7163 -335, // B2 = -0.010252
7164 0, // B1 = 0.000000
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
7181 { // 1209.txt
7182 18976, // A1 = -1.158264
7183 -32439, // A2 = 0.989990
7184 -183, // B2 = -0.005588
7185 0, // B1 = 0.000000
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
7202 { // 1330.txt
7203 16357, // A1 = -0.998413
7204 -32368, // A2 = 0.987793
7205 -217, // B2 = -0.006652
7206 0, // B1 = 0.000000
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
7223 { // 1336.txt
7224 16234, // A1 = -0.990875
7225 32404, // A2 = -0.988922
7226 -193, // B2 = -0.005908
7227 0, // B1 = 0.000000
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
7244 { // 1366.txt
7245 15564, // A1 = -0.949982
7246 -32404, // A2 = 0.988922
7247 -269, // B2 = -0.008216
7248 0, // B1 = 0.000000
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
7265 { // 1380.txt
7266 15247, // A1 = -0.930603
7267 -32397, // A2 = 0.988708
7268 -244, // B2 = -0.007451
7269 0, // B1 = 0.000000
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
7286 { // 1400.txt
7287 14780, // A1 = -0.902130
7288 -32393, // A2 = 0.988586
7289 -396, // B2 = -0.012086
7290 0, // B1 = 0.000000
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
7307 { // 1477.txt
7308 13005, // A1 = -0.793793
7309 -32368, // A2 = 0.987823
7310 -500, // B2 = -0.015265
7311 0, // B1 = 0.000000
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
7328 { // 1600.txt
7329 10046, // A1 = -0.613190
7330 -32331, // A2 = 0.986694
7331 -455, // B2 = -0.013915
7332 0, // B1 = 0.000000
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
7349 { // f1633_1638[]
7350 9181, // A1 = 0.560394
7351 -32256, // A2 = -0.984375
7352 -556, // B2 = -0.016975
7353 0, // B1 = 0
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
7370 { // 1800.txt
7371 5076, // A1 = -0.309875
7372 -32304, // A2 = 0.985840
7373 -508, // B2 = -0.015503
7374 0, // B1 = 0.000000
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
7391 { // 1860.txt
7392 3569, // A1 = -0.217865
7393 -32292, // A2 = 0.985504
7394 -239, // B2 = -0.007322
7395 0, // B1 = 0.000000
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
7411 },};
7413 static int ixj_init_filter(int board, IXJ_FILTER * jf)
7415 unsigned short cmd;
7416 int cnt, max;
7417 IXJ *j = &ixj[board];
7419 if (jf->filter > 3) {
7420 return -1;
7422 if (ixj_WriteDSPCommand(0x5154 + jf->filter, board)) // Select Filter
7424 return -1;
7426 if (!jf->enable) {
7427 if (ixj_WriteDSPCommand(0x5152, board)) // Disable Filter
7429 return -1;
7430 else
7431 return 0;
7432 } else {
7433 if (ixj_WriteDSPCommand(0x5153, board)) // Enable Filter
7435 return -1;
7437 // Select the filter (f0 - f3) to use.
7438 if (ixj_WriteDSPCommand(0x5154 + jf->filter, board))
7439 return -1;
7441 if (jf->freq < 12 && jf->freq > 3) {
7442 // Select the frequency for the selected filter.
7443 if (ixj_WriteDSPCommand(0x5170 + jf->freq, board))
7444 return -1;
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))
7452 return -1;
7454 if (j->ver.low != 0x12) {
7455 cmd = 0x515B;
7456 max = 19;
7457 } else {
7458 cmd = 0x515E;
7459 max = 15;
7461 if (ixj_WriteDSPCommand(cmd, board))
7462 return -1;
7464 for (cnt = 0; cnt < max; cnt++) {
7465 if (ixj_WriteDSPCommand(tone_table[jf->freq][cnt], board))
7466 return -1;
7468 /* if(j->ver.low != 0x12)
7470 if(ixj_WriteDSPCommand(7, board))
7471 return -1;
7472 if(ixj_WriteDSPCommand(159, board))
7473 return -1;
7474 if(ixj_WriteDSPCommand(21, board))
7475 return -1;
7476 if(ixj_WriteDSPCommand(0x0FF5, board))
7477 return -1;
7478 } */
7480 return 0;
7483 static int ixj_init_tone(int board, IXJ_TONE * ti)
7485 int freq0, freq1;
7486 unsigned short data;
7488 if (ti->freq0) {
7489 freq0 = ti->freq0;
7490 } else {
7491 freq0 = 0x7FFF;
7494 if (ti->freq1) {
7495 freq1 = ti->freq1;
7496 } else {
7497 freq1 = 0x7FFF;
7500 // if(ti->tone_index > 12 && ti->tone_index < 28)
7502 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, board))
7503 return -1;
7505 if (ixj_WriteDSPCommand(0x6000 + (ti->gain0 << 4) + ti->gain1, board))
7506 return -1;
7508 data = freq0;
7509 if (ixj_WriteDSPCommand(data, board))
7510 return -1;
7512 data = freq1;
7513 if (ixj_WriteDSPCommand(data, board))
7514 return -1;
7516 return freq0;