1 |
1275 |
phoenix |
/****************************************************************************
|
2 |
|
|
* ixj.c
|
3 |
|
|
*
|
4 |
|
|
* Device Driver for Quicknet Technologies, Inc.'s Telephony cards
|
5 |
|
|
* including the Internet PhoneJACK, Internet PhoneJACK Lite,
|
6 |
|
|
* Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
|
7 |
|
|
* SmartCABLE
|
8 |
|
|
*
|
9 |
|
|
* (c) Copyright 1999-2001 Quicknet Technologies, Inc.
|
10 |
|
|
*
|
11 |
|
|
* This program is free software; you can redistribute it and/or
|
12 |
|
|
* modify it under the terms of the GNU General Public License
|
13 |
|
|
* as published by the Free Software Foundation; either version
|
14 |
|
|
* 2 of the License, or (at your option) any later version.
|
15 |
|
|
*
|
16 |
|
|
* Author: Ed Okerson, <eokerson@quicknet.net>
|
17 |
|
|
*
|
18 |
|
|
* Contributors: Greg Herlein, <gherlein@quicknet.net>
|
19 |
|
|
* David W. Erhart, <derhart@quicknet.net>
|
20 |
|
|
* John Sellers, <jsellers@quicknet.net>
|
21 |
|
|
* Mike Preston, <mpreston@quicknet.net>
|
22 |
|
|
*
|
23 |
|
|
* Fixes: David Huggins-Daines, <dhd@cepstral.com>
|
24 |
|
|
* Fabio Ferrari, <fabio.ferrari@digitro.com.br>
|
25 |
|
|
* Artis Kugevics, <artis@mt.lv>
|
26 |
|
|
*
|
27 |
|
|
* More information about the hardware related to this driver can be found
|
28 |
|
|
* at our website: http://www.quicknet.net
|
29 |
|
|
*
|
30 |
|
|
* IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
|
31 |
|
|
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
32 |
|
|
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
|
33 |
|
|
* TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34 |
|
|
*
|
35 |
|
|
* QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
36 |
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
37 |
|
|
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
38 |
|
|
* ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
|
39 |
|
|
* TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
40 |
|
|
*
|
41 |
|
|
***************************************************************************/
|
42 |
|
|
|
43 |
|
|
static char ixj_c_rcsid[] = "$Id: ixj.c,v 1.1.1.1 2004-04-15 02:29:06 phoenix Exp $";
|
44 |
|
|
static char ixj_c_revision[] = "$Revision: 1.1.1.1 $";
|
45 |
|
|
|
46 |
|
|
/*
|
47 |
|
|
* $Log: not supported by cvs2svn $
|
48 |
|
|
* Revision 4.7 2001/08/13 06:19:33 craigs
|
49 |
|
|
* Added additional changes from Alan Cox and John Anderson for
|
50 |
|
|
* 2.2 to 2.4 cleanup and bounds checking
|
51 |
|
|
*
|
52 |
|
|
* Revision 4.6 2001/08/13 01:05:05 craigs
|
53 |
|
|
* Really fixed PHONE_QUERY_CODEC problem this time
|
54 |
|
|
*
|
55 |
|
|
* Revision 4.5 2001/08/13 00:11:03 craigs
|
56 |
|
|
* Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
|
57 |
|
|
*
|
58 |
|
|
* Revision 4.4 2001/08/07 07:58:12 craigs
|
59 |
|
|
* Changed back to three digit version numbers
|
60 |
|
|
* Added tagbuild target to allow automatic and easy tagging of versions
|
61 |
|
|
*
|
62 |
|
|
* Revision 4.3 2001/08/07 07:24:47 craigs
|
63 |
|
|
* Added ixj-ver.h to allow easy configuration management of driver
|
64 |
|
|
* Added display of version number in /prox/ixj
|
65 |
|
|
*
|
66 |
|
|
* Revision 4.2 2001/08/06 07:07:19 craigs
|
67 |
|
|
* Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
|
68 |
|
|
* behaviour of returning int rather than short *
|
69 |
|
|
*
|
70 |
|
|
* Revision 4.1 2001/08/05 00:17:37 craigs
|
71 |
|
|
* More changes for correct PCMCIA installation
|
72 |
|
|
* Start of changes for backward Linux compatibility
|
73 |
|
|
*
|
74 |
|
|
* Revision 4.0 2001/08/04 12:33:12 craigs
|
75 |
|
|
* New version using GNU autoconf
|
76 |
|
|
*
|
77 |
|
|
* Revision 3.105 2001/07/20 23:14:32 eokerson
|
78 |
|
|
* More work on CallerID generation when using ring cadences.
|
79 |
|
|
*
|
80 |
|
|
* Revision 3.104 2001/07/06 01:33:55 eokerson
|
81 |
|
|
* Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
|
82 |
|
|
*
|
83 |
|
|
* Revision 3.103 2001/07/05 19:20:16 eokerson
|
84 |
|
|
* Updated HOWTO
|
85 |
|
|
* Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
|
86 |
|
|
*
|
87 |
|
|
* Revision 3.102 2001/07/03 23:51:21 eokerson
|
88 |
|
|
* Un-mute mic on Internet LineJACK when in speakerphone mode.
|
89 |
|
|
*
|
90 |
|
|
* Revision 3.101 2001/07/02 19:26:56 eokerson
|
91 |
|
|
* Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
|
92 |
|
|
*
|
93 |
|
|
* Revision 3.100 2001/07/02 19:18:27 eokerson
|
94 |
|
|
* Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
|
95 |
|
|
* Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
|
96 |
|
|
* Fixed speaker mode on Internet LineJACK.
|
97 |
|
|
*
|
98 |
|
|
* Revision 3.99 2001/05/09 14:11:16 eokerson
|
99 |
|
|
* Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
|
100 |
|
|
*
|
101 |
|
|
* Revision 3.98 2001/05/08 19:55:33 eokerson
|
102 |
|
|
* Fixed POTS hookstate detection while it is connected to PSTN port.
|
103 |
|
|
*
|
104 |
|
|
* Revision 3.97 2001/05/08 00:01:04 eokerson
|
105 |
|
|
* Fixed kernel oops when sending caller ID data.
|
106 |
|
|
*
|
107 |
|
|
* Revision 3.96 2001/05/04 23:09:30 eokerson
|
108 |
|
|
* Now uses one kernel timer for each card, instead of one for the entire driver.
|
109 |
|
|
*
|
110 |
|
|
* Revision 3.95 2001/04/25 22:06:47 eokerson
|
111 |
|
|
* Fixed squawking at beginning of some G.723.1 calls.
|
112 |
|
|
*
|
113 |
|
|
* Revision 3.94 2001/04/03 23:42:00 eokerson
|
114 |
|
|
* Added linear volume ioctls
|
115 |
|
|
* Added raw filter load ioctl
|
116 |
|
|
*
|
117 |
|
|
* Revision 3.93 2001/02/27 01:00:06 eokerson
|
118 |
|
|
* Fixed blocking in CallerID.
|
119 |
|
|
* Reduced size of ixj structure for smaller driver footprint.
|
120 |
|
|
*
|
121 |
|
|
* Revision 3.92 2001/02/20 22:02:59 eokerson
|
122 |
|
|
* Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
|
123 |
|
|
* Improved PSTN ring detection.
|
124 |
|
|
* Fixed wink generation on POTS ports.
|
125 |
|
|
*
|
126 |
|
|
* Revision 3.91 2001/02/13 00:55:44 eokerson
|
127 |
|
|
* Turn AEC back on after changing frame sizes.
|
128 |
|
|
*
|
129 |
|
|
* Revision 3.90 2001/02/12 16:42:00 eokerson
|
130 |
|
|
* Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
|
131 |
|
|
*
|
132 |
|
|
* Revision 3.89 2001/02/12 15:41:16 eokerson
|
133 |
|
|
* Fix from Artis Kugevics - Tone gains were not being set correctly.
|
134 |
|
|
*
|
135 |
|
|
* Revision 3.88 2001/02/05 23:25:42 eokerson
|
136 |
|
|
* Fixed lockup bugs with deregister.
|
137 |
|
|
*
|
138 |
|
|
* Revision 3.87 2001/01/29 21:00:39 eokerson
|
139 |
|
|
* Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
|
140 |
|
|
* Updated copyright date.
|
141 |
|
|
*
|
142 |
|
|
* Revision 3.86 2001/01/23 23:53:46 eokerson
|
143 |
|
|
* Fixes to G.729 compatibility.
|
144 |
|
|
*
|
145 |
|
|
* Revision 3.85 2001/01/23 21:30:36 eokerson
|
146 |
|
|
* Added verbage about cards supported.
|
147 |
|
|
* Removed commands that put the card in low power mode at some times that it should not be in low power mode.
|
148 |
|
|
*
|
149 |
|
|
* Revision 3.84 2001/01/22 23:32:10 eokerson
|
150 |
|
|
* Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
|
151 |
|
|
*
|
152 |
|
|
* Revision 3.83 2001/01/19 14:51:41 eokerson
|
153 |
|
|
* Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
|
154 |
|
|
*
|
155 |
|
|
* Revision 3.82 2001/01/19 00:34:49 eokerson
|
156 |
|
|
* Added verbosity to write overlap errors.
|
157 |
|
|
*
|
158 |
|
|
* Revision 3.81 2001/01/18 23:56:54 eokerson
|
159 |
|
|
* Fixed PSTN line test functions.
|
160 |
|
|
*
|
161 |
|
|
* Revision 3.80 2001/01/18 22:29:27 eokerson
|
162 |
|
|
* Updated AEC/AGC values for different cards.
|
163 |
|
|
*
|
164 |
|
|
* Revision 3.79 2001/01/17 02:58:54 eokerson
|
165 |
|
|
* Fixed AEC reset after Caller ID.
|
166 |
|
|
* Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
|
167 |
|
|
*
|
168 |
|
|
* Revision 3.78 2001/01/16 19:43:09 eokerson
|
169 |
|
|
* Added support for Linux 2.4.x kernels.
|
170 |
|
|
*
|
171 |
|
|
* Revision 3.77 2001/01/09 04:00:52 eokerson
|
172 |
|
|
* Linetest will now test the line, even if it has previously succeded.
|
173 |
|
|
*
|
174 |
|
|
* Revision 3.76 2001/01/08 19:27:00 eokerson
|
175 |
|
|
* Fixed problem with standard cable on Internet PhoneCARD.
|
176 |
|
|
*
|
177 |
|
|
* Revision 3.75 2000/12/22 16:52:14 eokerson
|
178 |
|
|
* Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
|
179 |
|
|
*
|
180 |
|
|
* Revision 3.74 2000/12/08 22:41:50 eokerson
|
181 |
|
|
* Added capability for G729B.
|
182 |
|
|
*
|
183 |
|
|
* Revision 3.73 2000/12/07 23:35:16 eokerson
|
184 |
|
|
* Added capability to have different ring pattern before CallerID data.
|
185 |
|
|
* Added hookstate checks in CallerID routines to stop FSK.
|
186 |
|
|
*
|
187 |
|
|
* Revision 3.72 2000/12/06 19:31:31 eokerson
|
188 |
|
|
* Modified signal behavior to only send one signal per event.
|
189 |
|
|
*
|
190 |
|
|
* Revision 3.71 2000/12/06 03:23:08 eokerson
|
191 |
|
|
* Fixed CallerID on Call Waiting.
|
192 |
|
|
*
|
193 |
|
|
* Revision 3.70 2000/12/04 21:29:37 eokerson
|
194 |
|
|
* Added checking to Smart Cable gain functions.
|
195 |
|
|
*
|
196 |
|
|
* Revision 3.69 2000/12/04 21:05:20 eokerson
|
197 |
|
|
* Changed ixjdebug levels.
|
198 |
|
|
* Added ioctls to change gains in Internet Phone CARD Smart Cable.
|
199 |
|
|
*
|
200 |
|
|
* Revision 3.68 2000/12/04 00:17:21 craigs
|
201 |
|
|
* Changed mixer voice gain to +6dB rather than 0dB
|
202 |
|
|
*
|
203 |
|
|
* Revision 3.67 2000/11/30 21:25:51 eokerson
|
204 |
|
|
* Fixed write signal errors.
|
205 |
|
|
*
|
206 |
|
|
* Revision 3.66 2000/11/29 22:42:44 eokerson
|
207 |
|
|
* Fixed PSTN ring detect problems.
|
208 |
|
|
*
|
209 |
|
|
* Revision 3.65 2000/11/29 07:31:55 craigs
|
210 |
|
|
* Added new 425Hz filter co-efficients
|
211 |
|
|
* Added card-specific DTMF prescaler initialisation
|
212 |
|
|
*
|
213 |
|
|
* Revision 3.64 2000/11/28 14:03:32 craigs
|
214 |
|
|
* Changed certain mixer initialisations to be 0dB rather than 12dB
|
215 |
|
|
* Added additional information to /proc/ixj
|
216 |
|
|
*
|
217 |
|
|
* Revision 3.63 2000/11/28 11:38:41 craigs
|
218 |
|
|
* Added display of AEC modes in AUTO and AGC mode
|
219 |
|
|
*
|
220 |
|
|
* Revision 3.62 2000/11/28 04:05:44 eokerson
|
221 |
|
|
* Improved PSTN ring detection routine.
|
222 |
|
|
*
|
223 |
|
|
* Revision 3.61 2000/11/27 21:53:12 eokerson
|
224 |
|
|
* Fixed flash detection.
|
225 |
|
|
*
|
226 |
|
|
* Revision 3.60 2000/11/27 15:57:29 eokerson
|
227 |
|
|
* More work on G.729 load routines.
|
228 |
|
|
*
|
229 |
|
|
* Revision 3.59 2000/11/25 21:55:12 eokerson
|
230 |
|
|
* Fixed errors in G.729 load routine.
|
231 |
|
|
*
|
232 |
|
|
* Revision 3.58 2000/11/25 04:08:29 eokerson
|
233 |
|
|
* Added board locks around G.729 and TS85 load routines.
|
234 |
|
|
*
|
235 |
|
|
* Revision 3.57 2000/11/24 05:35:17 craigs
|
236 |
|
|
* Added ability to retrieve mixer values on LineJACK
|
237 |
|
|
* Added complete initialisation of all mixer values at startup
|
238 |
|
|
* Fixed spelling mistake
|
239 |
|
|
*
|
240 |
|
|
* Revision 3.56 2000/11/23 02:52:11 robertj
|
241 |
|
|
* Added cvs change log keyword.
|
242 |
|
|
* Fixed bug in capabilities list when using G.729 module.
|
243 |
|
|
*
|
244 |
|
|
*/
|
245 |
|
|
|
246 |
|
|
#include "ixj-ver.h"
|
247 |
|
|
|
248 |
|
|
#define PERFMON_STATS
|
249 |
|
|
#define IXJDEBUG 0
|
250 |
|
|
#define MAXRINGS 5
|
251 |
|
|
|
252 |
|
|
#include <linux/module.h>
|
253 |
|
|
|
254 |
|
|
#include <linux/init.h>
|
255 |
|
|
#include <linux/sched.h>
|
256 |
|
|
#include <linux/kernel.h> /* printk() */
|
257 |
|
|
#include <linux/fs.h> /* everything... */
|
258 |
|
|
#include <linux/errno.h> /* error codes */
|
259 |
|
|
#include <linux/slab.h>
|
260 |
|
|
#include <linux/mm.h>
|
261 |
|
|
#include <linux/ioport.h>
|
262 |
|
|
#include <linux/interrupt.h>
|
263 |
|
|
#include <linux/tqueue.h>
|
264 |
|
|
#include <linux/proc_fs.h>
|
265 |
|
|
#include <linux/poll.h>
|
266 |
|
|
#include <linux/timer.h>
|
267 |
|
|
#include <linux/delay.h>
|
268 |
|
|
#include <linux/pci.h>
|
269 |
|
|
|
270 |
|
|
#include <asm/io.h>
|
271 |
|
|
#include <asm/segment.h>
|
272 |
|
|
#include <asm/uaccess.h>
|
273 |
|
|
|
274 |
|
|
#include <linux/isapnp.h>
|
275 |
|
|
|
276 |
|
|
#include "ixj.h"
|
277 |
|
|
|
278 |
|
|
#define TYPE(dev) (MINOR(dev) >> 4)
|
279 |
|
|
#define NUM(dev) (MINOR(dev) & 0xf)
|
280 |
|
|
|
281 |
|
|
static int ixjdebug;
|
282 |
|
|
static int hertz = HZ;
|
283 |
|
|
static int samplerate = 100;
|
284 |
|
|
|
285 |
|
|
MODULE_PARM(ixjdebug, "i");
|
286 |
|
|
|
287 |
|
|
/************************************************************************
|
288 |
|
|
*
|
289 |
|
|
* ixjdebug meanings are now bit mapped instead of level based
|
290 |
|
|
* Values can be or'ed together to turn on multiple messages
|
291 |
|
|
*
|
292 |
|
|
* bit 0 (0x0001) = any failure
|
293 |
|
|
* bit 1 (0x0002) = general messages
|
294 |
|
|
* bit 2 (0x0004) = POTS ringing related
|
295 |
|
|
* bit 3 (0x0008) = PSTN events
|
296 |
|
|
* bit 4 (0x0010) = PSTN Cadence state details
|
297 |
|
|
* bit 5 (0x0020) = Tone detection triggers
|
298 |
|
|
* bit 6 (0x0040) = Tone detection cadence details
|
299 |
|
|
* bit 7 (0x0080) = ioctl tracking
|
300 |
|
|
* bit 8 (0x0100) = signal tracking
|
301 |
|
|
* bit 9 (0x0200) = CallerID generation details
|
302 |
|
|
*
|
303 |
|
|
************************************************************************/
|
304 |
|
|
|
305 |
|
|
#ifdef IXJ_DYN_ALLOC
|
306 |
|
|
|
307 |
|
|
static IXJ *ixj[IXJMAX];
|
308 |
|
|
#define get_ixj(b) ixj[(b)]
|
309 |
|
|
|
310 |
|
|
/*
|
311 |
|
|
* Allocate a free IXJ device
|
312 |
|
|
*/
|
313 |
|
|
|
314 |
|
|
static IXJ *ixj_alloc()
|
315 |
|
|
{
|
316 |
|
|
for(cnt=0; cnt<IXJMAX; cnt++)
|
317 |
|
|
{
|
318 |
|
|
if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
|
319 |
|
|
{
|
320 |
|
|
j = kmalloc(sizeof(IXJ), GFP_KERNEL);
|
321 |
|
|
if (j == NULL)
|
322 |
|
|
return NULL;
|
323 |
|
|
ixj[cnt] = j;
|
324 |
|
|
return j;
|
325 |
|
|
}
|
326 |
|
|
}
|
327 |
|
|
return NULL;
|
328 |
|
|
}
|
329 |
|
|
|
330 |
|
|
static void ixj_fsk_free(IXJ *j)
|
331 |
|
|
{
|
332 |
|
|
if(j->fskdata != NULL) {
|
333 |
|
|
kfree(j->fskdata);
|
334 |
|
|
j->fskdata = NULL;
|
335 |
|
|
}
|
336 |
|
|
}
|
337 |
|
|
|
338 |
|
|
static void ixj_fsk_alloc(IXJ *j)
|
339 |
|
|
{
|
340 |
|
|
if(!j->fskdata) {
|
341 |
|
|
j->fskdata = kmalloc(8000, GFP_KERNEL);
|
342 |
|
|
if (!j->fskdata) {
|
343 |
|
|
if(ixjdebug & 0x0200) {
|
344 |
|
|
printk("IXJ phone%d - allocate failed\n", j->board);
|
345 |
|
|
}
|
346 |
|
|
return;
|
347 |
|
|
} else {
|
348 |
|
|
j->fsksize = 8000;
|
349 |
|
|
if(ixjdebug & 0x0200) {
|
350 |
|
|
printk("IXJ phone%d - allocate succeded\n", j->board);
|
351 |
|
|
}
|
352 |
|
|
}
|
353 |
|
|
}
|
354 |
|
|
}
|
355 |
|
|
|
356 |
|
|
#else
|
357 |
|
|
|
358 |
|
|
static IXJ ixj[IXJMAX];
|
359 |
|
|
#define get_ixj(b) (&ixj[(b)])
|
360 |
|
|
|
361 |
|
|
/*
|
362 |
|
|
* Allocate a free IXJ device
|
363 |
|
|
*/
|
364 |
|
|
|
365 |
|
|
static IXJ *ixj_alloc(void)
|
366 |
|
|
{
|
367 |
|
|
int cnt;
|
368 |
|
|
for(cnt=0; cnt<IXJMAX; cnt++)
|
369 |
|
|
{
|
370 |
|
|
if(!ixj[cnt].DSPbase)
|
371 |
|
|
{
|
372 |
|
|
return &ixj[cnt];
|
373 |
|
|
}
|
374 |
|
|
}
|
375 |
|
|
return NULL;
|
376 |
|
|
}
|
377 |
|
|
|
378 |
|
|
static inline void ixj_fsk_free(IXJ *j) {;}
|
379 |
|
|
|
380 |
|
|
static inline void ixj_fsk_alloc(IXJ *j)
|
381 |
|
|
{
|
382 |
|
|
j->fsksize = 8000;
|
383 |
|
|
}
|
384 |
|
|
|
385 |
|
|
#endif
|
386 |
|
|
|
387 |
|
|
#ifdef PERFMON_STATS
|
388 |
|
|
#define ixj_perfmon(x) ((x)++)
|
389 |
|
|
#else
|
390 |
|
|
#define ixj_perfmon(x) do { } while(0)
|
391 |
|
|
#endif
|
392 |
|
|
|
393 |
|
|
static int ixj_convert_loaded;
|
394 |
|
|
|
395 |
|
|
static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
|
396 |
|
|
|
397 |
|
|
/************************************************************************
|
398 |
|
|
*
|
399 |
|
|
* These are function definitions to allow external modules to register
|
400 |
|
|
* enhanced functionality call backs.
|
401 |
|
|
*
|
402 |
|
|
************************************************************************/
|
403 |
|
|
|
404 |
|
|
static int Stub(IXJ * J, unsigned long arg)
|
405 |
|
|
{
|
406 |
|
|
return 0;
|
407 |
|
|
}
|
408 |
|
|
|
409 |
|
|
static IXJ_REGFUNC ixj_DownloadG729 = &Stub;
|
410 |
|
|
static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
|
411 |
|
|
static IXJ_REGFUNC ixj_PreRead = &Stub;
|
412 |
|
|
static IXJ_REGFUNC ixj_PostRead = &Stub;
|
413 |
|
|
static IXJ_REGFUNC ixj_PreWrite = &Stub;
|
414 |
|
|
static IXJ_REGFUNC ixj_PostWrite = &Stub;
|
415 |
|
|
static IXJ_REGFUNC ixj_PreIoctl = &Stub;
|
416 |
|
|
static IXJ_REGFUNC ixj_PostIoctl = &Stub;
|
417 |
|
|
|
418 |
|
|
static void ixj_read_frame(IXJ *j);
|
419 |
|
|
static void ixj_write_frame(IXJ *j);
|
420 |
|
|
static void ixj_init_timer(IXJ *j);
|
421 |
|
|
static void ixj_add_timer(IXJ * j);
|
422 |
|
|
static void ixj_timeout(unsigned long ptr);
|
423 |
|
|
static int read_filters(IXJ *j);
|
424 |
|
|
static int LineMonitor(IXJ *j);
|
425 |
|
|
static int ixj_fasync(int fd, struct file *, int mode);
|
426 |
|
|
static int ixj_set_port(IXJ *j, int arg);
|
427 |
|
|
static int ixj_set_pots(IXJ *j, int arg);
|
428 |
|
|
static int ixj_hookstate(IXJ *j);
|
429 |
|
|
static int ixj_record_start(IXJ *j);
|
430 |
|
|
static void ixj_record_stop(IXJ *j);
|
431 |
|
|
static void set_rec_volume(IXJ *j, int volume);
|
432 |
|
|
static int get_rec_volume(IXJ *j);
|
433 |
|
|
static int set_rec_codec(IXJ *j, int rate);
|
434 |
|
|
static void ixj_vad(IXJ *j, int arg);
|
435 |
|
|
static int ixj_play_start(IXJ *j);
|
436 |
|
|
static void ixj_play_stop(IXJ *j);
|
437 |
|
|
static int ixj_set_tone_on(unsigned short arg, IXJ *j);
|
438 |
|
|
static int ixj_set_tone_off(unsigned short, IXJ *j);
|
439 |
|
|
static int ixj_play_tone(IXJ *j, char tone);
|
440 |
|
|
static void ixj_aec_start(IXJ *j, int level);
|
441 |
|
|
static int idle(IXJ *j);
|
442 |
|
|
static void ixj_ring_on(IXJ *j);
|
443 |
|
|
static void ixj_ring_off(IXJ *j);
|
444 |
|
|
static void aec_stop(IXJ *j);
|
445 |
|
|
static void ixj_ringback(IXJ *j);
|
446 |
|
|
static void ixj_busytone(IXJ *j);
|
447 |
|
|
static void ixj_dialtone(IXJ *j);
|
448 |
|
|
static void ixj_cpt_stop(IXJ *j);
|
449 |
|
|
static char daa_int_read(IXJ *j);
|
450 |
|
|
static char daa_CR_read(IXJ *j, int cr);
|
451 |
|
|
static int daa_set_mode(IXJ *j, int mode);
|
452 |
|
|
static int ixj_linetest(IXJ *j);
|
453 |
|
|
static int ixj_daa_write(IXJ *j);
|
454 |
|
|
static int ixj_daa_cid_read(IXJ *j);
|
455 |
|
|
static void DAA_Coeff_US(IXJ *j);
|
456 |
|
|
static void DAA_Coeff_UK(IXJ *j);
|
457 |
|
|
static void DAA_Coeff_France(IXJ *j);
|
458 |
|
|
static void DAA_Coeff_Germany(IXJ *j);
|
459 |
|
|
static void DAA_Coeff_Australia(IXJ *j);
|
460 |
|
|
static void DAA_Coeff_Japan(IXJ *j);
|
461 |
|
|
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
|
462 |
|
|
static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
|
463 |
|
|
static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
|
464 |
|
|
static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp);
|
465 |
|
|
static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp);
|
466 |
|
|
/* Serial Control Interface funtions */
|
467 |
|
|
static int SCI_Control(IXJ *j, int control);
|
468 |
|
|
static int SCI_Prepare(IXJ *j);
|
469 |
|
|
static int SCI_WaitHighSCI(IXJ *j);
|
470 |
|
|
static int SCI_WaitLowSCI(IXJ *j);
|
471 |
|
|
static DWORD PCIEE_GetSerialNumber(WORD wAddress);
|
472 |
|
|
static int ixj_PCcontrol_wait(IXJ *j);
|
473 |
|
|
static void ixj_pre_cid(IXJ *j);
|
474 |
|
|
static void ixj_write_cid(IXJ *j);
|
475 |
|
|
static void ixj_write_cid_bit(IXJ *j, int bit);
|
476 |
|
|
static int set_base_frame(IXJ *j, int size);
|
477 |
|
|
static int set_play_codec(IXJ *j, int rate);
|
478 |
|
|
static void set_rec_depth(IXJ *j, int depth);
|
479 |
|
|
static int ixj_mixer(long val, IXJ *j);
|
480 |
|
|
|
481 |
|
|
/************************************************************************
|
482 |
|
|
CT8020/CT8021 Host Programmers Model
|
483 |
|
|
Host address Function Access
|
484 |
|
|
DSPbase +
|
485 |
|
|
0-1 Aux Software Status Register (reserved) Read Only
|
486 |
|
|
2-3 Software Status Register Read Only
|
487 |
|
|
4-5 Aux Software Control Register (reserved) Read Write
|
488 |
|
|
6-7 Software Control Register Read Write
|
489 |
|
|
8-9 Hardware Status Register Read Only
|
490 |
|
|
A-B Hardware Control Register Read Write
|
491 |
|
|
C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
|
492 |
|
|
E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
|
493 |
|
|
************************************************************************/
|
494 |
|
|
|
495 |
|
|
static inline void ixj_read_HSR(IXJ *j)
|
496 |
|
|
{
|
497 |
|
|
j->hsr.bytes.low = inb_p(j->DSPbase + 8);
|
498 |
|
|
j->hsr.bytes.high = inb_p(j->DSPbase + 9);
|
499 |
|
|
}
|
500 |
|
|
|
501 |
|
|
static inline int IsControlReady(IXJ *j)
|
502 |
|
|
{
|
503 |
|
|
ixj_read_HSR(j);
|
504 |
|
|
return j->hsr.bits.controlrdy ? 1 : 0;
|
505 |
|
|
}
|
506 |
|
|
|
507 |
|
|
static inline int IsPCControlReady(IXJ *j)
|
508 |
|
|
{
|
509 |
|
|
j->pccr1.byte = inb_p(j->XILINXbase + 3);
|
510 |
|
|
return j->pccr1.bits.crr ? 1 : 0;
|
511 |
|
|
}
|
512 |
|
|
|
513 |
|
|
static inline int IsStatusReady(IXJ *j)
|
514 |
|
|
{
|
515 |
|
|
ixj_read_HSR(j);
|
516 |
|
|
return j->hsr.bits.statusrdy ? 1 : 0;
|
517 |
|
|
}
|
518 |
|
|
|
519 |
|
|
static inline int IsRxReady(IXJ *j)
|
520 |
|
|
{
|
521 |
|
|
ixj_read_HSR(j);
|
522 |
|
|
ixj_perfmon(j->rxreadycheck);
|
523 |
|
|
return j->hsr.bits.rxrdy ? 1 : 0;
|
524 |
|
|
}
|
525 |
|
|
|
526 |
|
|
static inline int IsTxReady(IXJ *j)
|
527 |
|
|
{
|
528 |
|
|
ixj_read_HSR(j);
|
529 |
|
|
ixj_perfmon(j->txreadycheck);
|
530 |
|
|
return j->hsr.bits.txrdy ? 1 : 0;
|
531 |
|
|
}
|
532 |
|
|
|
533 |
|
|
static inline void set_play_volume(IXJ *j, int volume)
|
534 |
|
|
{
|
535 |
|
|
if (ixjdebug & 0x0002)
|
536 |
|
|
printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
|
537 |
|
|
ixj_WriteDSPCommand(0xCF02, j);
|
538 |
|
|
ixj_WriteDSPCommand(volume, j);
|
539 |
|
|
}
|
540 |
|
|
|
541 |
|
|
static int set_play_volume_linear(IXJ *j, int volume)
|
542 |
|
|
{
|
543 |
|
|
int newvolume, dspplaymax;
|
544 |
|
|
|
545 |
|
|
if (ixjdebug & 0x0002)
|
546 |
|
|
printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
|
547 |
|
|
if(volume > 100 || volume < 0) {
|
548 |
|
|
return -1;
|
549 |
|
|
}
|
550 |
|
|
|
551 |
|
|
/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
|
552 |
|
|
switch (j->cardtype) {
|
553 |
|
|
case QTI_PHONEJACK:
|
554 |
|
|
dspplaymax = 0x380;
|
555 |
|
|
break;
|
556 |
|
|
case QTI_LINEJACK:
|
557 |
|
|
if(j->port == PORT_PSTN) {
|
558 |
|
|
dspplaymax = 0x48;
|
559 |
|
|
} else {
|
560 |
|
|
dspplaymax = 0x100;
|
561 |
|
|
}
|
562 |
|
|
break;
|
563 |
|
|
case QTI_PHONEJACK_LITE:
|
564 |
|
|
dspplaymax = 0x380;
|
565 |
|
|
break;
|
566 |
|
|
case QTI_PHONEJACK_PCI:
|
567 |
|
|
dspplaymax = 0x6C;
|
568 |
|
|
break;
|
569 |
|
|
case QTI_PHONECARD:
|
570 |
|
|
dspplaymax = 0x50;
|
571 |
|
|
break;
|
572 |
|
|
default:
|
573 |
|
|
return -1;
|
574 |
|
|
}
|
575 |
|
|
newvolume = (dspplaymax * volume) / 100;
|
576 |
|
|
set_play_volume(j, newvolume);
|
577 |
|
|
return 0;
|
578 |
|
|
}
|
579 |
|
|
|
580 |
|
|
static inline void set_play_depth(IXJ *j, int depth)
|
581 |
|
|
{
|
582 |
|
|
if (depth > 60)
|
583 |
|
|
depth = 60;
|
584 |
|
|
if (depth < 0)
|
585 |
|
|
depth = 0;
|
586 |
|
|
ixj_WriteDSPCommand(0x5280 + depth, j);
|
587 |
|
|
}
|
588 |
|
|
|
589 |
|
|
static inline int get_play_volume(IXJ *j)
|
590 |
|
|
{
|
591 |
|
|
ixj_WriteDSPCommand(0xCF00, j);
|
592 |
|
|
return j->ssr.high << 8 | j->ssr.low;
|
593 |
|
|
}
|
594 |
|
|
|
595 |
|
|
static int get_play_volume_linear(IXJ *j)
|
596 |
|
|
{
|
597 |
|
|
int volume, newvolume, dspplaymax;
|
598 |
|
|
|
599 |
|
|
/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
|
600 |
|
|
switch (j->cardtype) {
|
601 |
|
|
case QTI_PHONEJACK:
|
602 |
|
|
dspplaymax = 0x380;
|
603 |
|
|
break;
|
604 |
|
|
case QTI_LINEJACK:
|
605 |
|
|
if(j->port == PORT_PSTN) {
|
606 |
|
|
dspplaymax = 0x48;
|
607 |
|
|
} else {
|
608 |
|
|
dspplaymax = 0x100;
|
609 |
|
|
}
|
610 |
|
|
break;
|
611 |
|
|
case QTI_PHONEJACK_LITE:
|
612 |
|
|
dspplaymax = 0x380;
|
613 |
|
|
break;
|
614 |
|
|
case QTI_PHONEJACK_PCI:
|
615 |
|
|
dspplaymax = 0x6C;
|
616 |
|
|
break;
|
617 |
|
|
case QTI_PHONECARD:
|
618 |
|
|
dspplaymax = 100;
|
619 |
|
|
break;
|
620 |
|
|
default:
|
621 |
|
|
return -1;
|
622 |
|
|
}
|
623 |
|
|
volume = get_play_volume(j);
|
624 |
|
|
newvolume = (volume * 100) / dspplaymax;
|
625 |
|
|
if(newvolume > 100)
|
626 |
|
|
newvolume = 100;
|
627 |
|
|
return newvolume;
|
628 |
|
|
}
|
629 |
|
|
|
630 |
|
|
static inline BYTE SLIC_GetState(IXJ *j)
|
631 |
|
|
{
|
632 |
|
|
if (j->cardtype == QTI_PHONECARD) {
|
633 |
|
|
j->pccr1.byte = 0;
|
634 |
|
|
j->psccr.bits.dev = 3;
|
635 |
|
|
j->psccr.bits.rw = 1;
|
636 |
|
|
outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
|
637 |
|
|
ixj_PCcontrol_wait(j);
|
638 |
|
|
j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
|
639 |
|
|
ixj_PCcontrol_wait(j);
|
640 |
|
|
if (j->pslic.bits.powerdown)
|
641 |
|
|
return PLD_SLIC_STATE_OC;
|
642 |
|
|
else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
|
643 |
|
|
return PLD_SLIC_STATE_ACTIVE;
|
644 |
|
|
else
|
645 |
|
|
return PLD_SLIC_STATE_RINGING;
|
646 |
|
|
} else {
|
647 |
|
|
j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
|
648 |
|
|
}
|
649 |
|
|
return j->pld_slicr.bits.state;
|
650 |
|
|
}
|
651 |
|
|
|
652 |
|
|
static BOOL SLIC_SetState(BYTE byState, IXJ *j)
|
653 |
|
|
{
|
654 |
|
|
BOOL fRetVal = FALSE;
|
655 |
|
|
|
656 |
|
|
if (j->cardtype == QTI_PHONECARD) {
|
657 |
|
|
if (j->flags.pcmciasct) {
|
658 |
|
|
switch (byState) {
|
659 |
|
|
case PLD_SLIC_STATE_TIPOPEN:
|
660 |
|
|
case PLD_SLIC_STATE_OC:
|
661 |
|
|
j->pslic.bits.powerdown = 1;
|
662 |
|
|
j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
|
663 |
|
|
fRetVal = TRUE;
|
664 |
|
|
break;
|
665 |
|
|
case PLD_SLIC_STATE_RINGING:
|
666 |
|
|
if (j->readers || j->writers) {
|
667 |
|
|
j->pslic.bits.powerdown = 0;
|
668 |
|
|
j->pslic.bits.ring0 = 1;
|
669 |
|
|
j->pslic.bits.ring1 = 0;
|
670 |
|
|
fRetVal = TRUE;
|
671 |
|
|
}
|
672 |
|
|
break;
|
673 |
|
|
case PLD_SLIC_STATE_OHT: /* On-hook transmit */
|
674 |
|
|
|
675 |
|
|
case PLD_SLIC_STATE_STANDBY:
|
676 |
|
|
case PLD_SLIC_STATE_ACTIVE:
|
677 |
|
|
if (j->readers || j->writers) {
|
678 |
|
|
j->pslic.bits.powerdown = 0;
|
679 |
|
|
} else {
|
680 |
|
|
j->pslic.bits.powerdown = 1;
|
681 |
|
|
}
|
682 |
|
|
j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
|
683 |
|
|
fRetVal = TRUE;
|
684 |
|
|
break;
|
685 |
|
|
case PLD_SLIC_STATE_APR: /* Active polarity reversal */
|
686 |
|
|
|
687 |
|
|
case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
|
688 |
|
|
|
689 |
|
|
default:
|
690 |
|
|
fRetVal = FALSE;
|
691 |
|
|
break;
|
692 |
|
|
}
|
693 |
|
|
j->psccr.bits.dev = 3;
|
694 |
|
|
j->psccr.bits.rw = 0;
|
695 |
|
|
outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
|
696 |
|
|
ixj_PCcontrol_wait(j);
|
697 |
|
|
}
|
698 |
|
|
} else {
|
699 |
|
|
/* Set the C1, C2, C3 & B2EN signals. */
|
700 |
|
|
switch (byState) {
|
701 |
|
|
case PLD_SLIC_STATE_OC:
|
702 |
|
|
j->pld_slicw.bits.c1 = 0;
|
703 |
|
|
j->pld_slicw.bits.c2 = 0;
|
704 |
|
|
j->pld_slicw.bits.c3 = 0;
|
705 |
|
|
j->pld_slicw.bits.b2en = 0;
|
706 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
707 |
|
|
fRetVal = TRUE;
|
708 |
|
|
break;
|
709 |
|
|
case PLD_SLIC_STATE_RINGING:
|
710 |
|
|
j->pld_slicw.bits.c1 = 1;
|
711 |
|
|
j->pld_slicw.bits.c2 = 0;
|
712 |
|
|
j->pld_slicw.bits.c3 = 0;
|
713 |
|
|
j->pld_slicw.bits.b2en = 1;
|
714 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
715 |
|
|
fRetVal = TRUE;
|
716 |
|
|
break;
|
717 |
|
|
case PLD_SLIC_STATE_ACTIVE:
|
718 |
|
|
j->pld_slicw.bits.c1 = 0;
|
719 |
|
|
j->pld_slicw.bits.c2 = 1;
|
720 |
|
|
j->pld_slicw.bits.c3 = 0;
|
721 |
|
|
j->pld_slicw.bits.b2en = 0;
|
722 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
723 |
|
|
fRetVal = TRUE;
|
724 |
|
|
break;
|
725 |
|
|
case PLD_SLIC_STATE_OHT: /* On-hook transmit */
|
726 |
|
|
|
727 |
|
|
j->pld_slicw.bits.c1 = 1;
|
728 |
|
|
j->pld_slicw.bits.c2 = 1;
|
729 |
|
|
j->pld_slicw.bits.c3 = 0;
|
730 |
|
|
j->pld_slicw.bits.b2en = 0;
|
731 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
732 |
|
|
fRetVal = TRUE;
|
733 |
|
|
break;
|
734 |
|
|
case PLD_SLIC_STATE_TIPOPEN:
|
735 |
|
|
j->pld_slicw.bits.c1 = 0;
|
736 |
|
|
j->pld_slicw.bits.c2 = 0;
|
737 |
|
|
j->pld_slicw.bits.c3 = 1;
|
738 |
|
|
j->pld_slicw.bits.b2en = 0;
|
739 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
740 |
|
|
fRetVal = TRUE;
|
741 |
|
|
break;
|
742 |
|
|
case PLD_SLIC_STATE_STANDBY:
|
743 |
|
|
j->pld_slicw.bits.c1 = 1;
|
744 |
|
|
j->pld_slicw.bits.c2 = 0;
|
745 |
|
|
j->pld_slicw.bits.c3 = 1;
|
746 |
|
|
j->pld_slicw.bits.b2en = 1;
|
747 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
748 |
|
|
fRetVal = TRUE;
|
749 |
|
|
break;
|
750 |
|
|
case PLD_SLIC_STATE_APR: /* Active polarity reversal */
|
751 |
|
|
|
752 |
|
|
j->pld_slicw.bits.c1 = 0;
|
753 |
|
|
j->pld_slicw.bits.c2 = 1;
|
754 |
|
|
j->pld_slicw.bits.c3 = 1;
|
755 |
|
|
j->pld_slicw.bits.b2en = 0;
|
756 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
757 |
|
|
fRetVal = TRUE;
|
758 |
|
|
break;
|
759 |
|
|
case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
|
760 |
|
|
|
761 |
|
|
j->pld_slicw.bits.c1 = 1;
|
762 |
|
|
j->pld_slicw.bits.c2 = 1;
|
763 |
|
|
j->pld_slicw.bits.c3 = 1;
|
764 |
|
|
j->pld_slicw.bits.b2en = 0;
|
765 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
766 |
|
|
fRetVal = TRUE;
|
767 |
|
|
break;
|
768 |
|
|
default:
|
769 |
|
|
fRetVal = FALSE;
|
770 |
|
|
break;
|
771 |
|
|
}
|
772 |
|
|
}
|
773 |
|
|
|
774 |
|
|
return fRetVal;
|
775 |
|
|
}
|
776 |
|
|
|
777 |
|
|
static int ixj_wink(IXJ *j)
|
778 |
|
|
{
|
779 |
|
|
BYTE slicnow;
|
780 |
|
|
|
781 |
|
|
slicnow = SLIC_GetState(j);
|
782 |
|
|
|
783 |
|
|
j->pots_winkstart = jiffies;
|
784 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OC, j);
|
785 |
|
|
|
786 |
|
|
while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
|
787 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
788 |
|
|
schedule_timeout(1);
|
789 |
|
|
}
|
790 |
|
|
|
791 |
|
|
SLIC_SetState(slicnow, j);
|
792 |
|
|
return 0;
|
793 |
|
|
}
|
794 |
|
|
|
795 |
|
|
static int ixj_register(int index, IXJ_REGFUNC regfunc)
|
796 |
|
|
{
|
797 |
|
|
int cnt;
|
798 |
|
|
int retval = 0;
|
799 |
|
|
switch (index) {
|
800 |
|
|
case G729LOADER:
|
801 |
|
|
ixj_DownloadG729 = regfunc;
|
802 |
|
|
for (cnt = 0; cnt < IXJMAX; cnt++) {
|
803 |
|
|
IXJ *j = get_ixj(cnt);
|
804 |
|
|
while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
|
805 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
806 |
|
|
schedule_timeout(1);
|
807 |
|
|
}
|
808 |
|
|
ixj_DownloadG729(j, 0L);
|
809 |
|
|
clear_bit(cnt, &j->busyflags);
|
810 |
|
|
}
|
811 |
|
|
break;
|
812 |
|
|
case TS85LOADER:
|
813 |
|
|
ixj_DownloadTS85 = regfunc;
|
814 |
|
|
for (cnt = 0; cnt < IXJMAX; cnt++) {
|
815 |
|
|
IXJ *j = get_ixj(cnt);
|
816 |
|
|
while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
|
817 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
818 |
|
|
schedule_timeout(1);
|
819 |
|
|
}
|
820 |
|
|
ixj_DownloadTS85(j, 0L);
|
821 |
|
|
clear_bit(cnt, &j->busyflags);
|
822 |
|
|
}
|
823 |
|
|
break;
|
824 |
|
|
case PRE_READ:
|
825 |
|
|
ixj_PreRead = regfunc;
|
826 |
|
|
break;
|
827 |
|
|
case POST_READ:
|
828 |
|
|
ixj_PostRead = regfunc;
|
829 |
|
|
break;
|
830 |
|
|
case PRE_WRITE:
|
831 |
|
|
ixj_PreWrite = regfunc;
|
832 |
|
|
break;
|
833 |
|
|
case POST_WRITE:
|
834 |
|
|
ixj_PostWrite = regfunc;
|
835 |
|
|
break;
|
836 |
|
|
case PRE_IOCTL:
|
837 |
|
|
ixj_PreIoctl = regfunc;
|
838 |
|
|
break;
|
839 |
|
|
case POST_IOCTL:
|
840 |
|
|
ixj_PostIoctl = regfunc;
|
841 |
|
|
break;
|
842 |
|
|
default:
|
843 |
|
|
retval = 1;
|
844 |
|
|
}
|
845 |
|
|
return retval;
|
846 |
|
|
}
|
847 |
|
|
|
848 |
|
|
EXPORT_SYMBOL(ixj_register);
|
849 |
|
|
|
850 |
|
|
static int ixj_unregister(int index)
|
851 |
|
|
{
|
852 |
|
|
int retval = 0;
|
853 |
|
|
switch (index) {
|
854 |
|
|
case G729LOADER:
|
855 |
|
|
ixj_DownloadG729 = &Stub;
|
856 |
|
|
break;
|
857 |
|
|
case TS85LOADER:
|
858 |
|
|
ixj_DownloadTS85 = &Stub;
|
859 |
|
|
break;
|
860 |
|
|
case PRE_READ:
|
861 |
|
|
ixj_PreRead = &Stub;
|
862 |
|
|
break;
|
863 |
|
|
case POST_READ:
|
864 |
|
|
ixj_PostRead = &Stub;
|
865 |
|
|
break;
|
866 |
|
|
case PRE_WRITE:
|
867 |
|
|
ixj_PreWrite = &Stub;
|
868 |
|
|
break;
|
869 |
|
|
case POST_WRITE:
|
870 |
|
|
ixj_PostWrite = &Stub;
|
871 |
|
|
break;
|
872 |
|
|
case PRE_IOCTL:
|
873 |
|
|
ixj_PreIoctl = &Stub;
|
874 |
|
|
break;
|
875 |
|
|
case POST_IOCTL:
|
876 |
|
|
ixj_PostIoctl = &Stub;
|
877 |
|
|
break;
|
878 |
|
|
default:
|
879 |
|
|
retval = 1;
|
880 |
|
|
}
|
881 |
|
|
return retval;
|
882 |
|
|
}
|
883 |
|
|
|
884 |
|
|
EXPORT_SYMBOL(ixj_unregister);
|
885 |
|
|
|
886 |
|
|
static void ixj_init_timer(IXJ *j)
|
887 |
|
|
{
|
888 |
|
|
init_timer(&j->timer);
|
889 |
|
|
j->timer.function = ixj_timeout;
|
890 |
|
|
j->timer.data = (unsigned long)j;
|
891 |
|
|
}
|
892 |
|
|
|
893 |
|
|
static void ixj_add_timer(IXJ *j)
|
894 |
|
|
{
|
895 |
|
|
j->timer.expires = jiffies + (hertz / samplerate);
|
896 |
|
|
add_timer(&j->timer);
|
897 |
|
|
}
|
898 |
|
|
|
899 |
|
|
static void ixj_tone_timeout(IXJ *j)
|
900 |
|
|
{
|
901 |
|
|
IXJ_TONE ti;
|
902 |
|
|
|
903 |
|
|
j->tone_state++;
|
904 |
|
|
if (j->tone_state == 3) {
|
905 |
|
|
j->tone_state = 0;
|
906 |
|
|
if (j->cadence_t) {
|
907 |
|
|
j->tone_cadence_state++;
|
908 |
|
|
if (j->tone_cadence_state >= j->cadence_t->elements_used) {
|
909 |
|
|
switch (j->cadence_t->termination) {
|
910 |
|
|
case PLAY_ONCE:
|
911 |
|
|
ixj_cpt_stop(j);
|
912 |
|
|
break;
|
913 |
|
|
case REPEAT_LAST_ELEMENT:
|
914 |
|
|
j->tone_cadence_state--;
|
915 |
|
|
ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
|
916 |
|
|
break;
|
917 |
|
|
case REPEAT_ALL:
|
918 |
|
|
j->tone_cadence_state = 0;
|
919 |
|
|
if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
|
920 |
|
|
ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
|
921 |
|
|
ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
|
922 |
|
|
ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
|
923 |
|
|
ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
|
924 |
|
|
ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
|
925 |
|
|
ixj_init_tone(j, &ti);
|
926 |
|
|
}
|
927 |
|
|
ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
|
928 |
|
|
ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
|
929 |
|
|
ixj_play_tone(j, j->cadence_t->ce[0].index);
|
930 |
|
|
break;
|
931 |
|
|
}
|
932 |
|
|
} else {
|
933 |
|
|
if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
|
934 |
|
|
ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
|
935 |
|
|
ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
|
936 |
|
|
ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
|
937 |
|
|
ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
|
938 |
|
|
ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
|
939 |
|
|
ixj_init_tone(j, &ti);
|
940 |
|
|
}
|
941 |
|
|
ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
|
942 |
|
|
ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
|
943 |
|
|
ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
|
944 |
|
|
}
|
945 |
|
|
}
|
946 |
|
|
}
|
947 |
|
|
}
|
948 |
|
|
|
949 |
|
|
static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
|
950 |
|
|
{
|
951 |
|
|
if(j->ixj_signals[event]) {
|
952 |
|
|
if(ixjdebug & 0x0100)
|
953 |
|
|
printk("Sending signal for event %d\n", event);
|
954 |
|
|
/* Send apps notice of change */
|
955 |
|
|
/* see config.h for macro definition */
|
956 |
|
|
kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
|
957 |
|
|
}
|
958 |
|
|
}
|
959 |
|
|
|
960 |
|
|
static void ixj_pstn_state(IXJ *j)
|
961 |
|
|
{
|
962 |
|
|
int var;
|
963 |
|
|
union XOPXR0 XR0, daaint;
|
964 |
|
|
|
965 |
|
|
var = 10;
|
966 |
|
|
|
967 |
|
|
XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
|
968 |
|
|
daaint.reg = 0;
|
969 |
|
|
XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
|
970 |
|
|
|
971 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
972 |
|
|
if (j->pld_scrr.bits.daaflag) {
|
973 |
|
|
daa_int_read(j);
|
974 |
|
|
if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
|
975 |
|
|
if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
|
976 |
|
|
daaint.bitreg.RING = 1;
|
977 |
|
|
if(ixjdebug & 0x0008) {
|
978 |
|
|
printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
|
979 |
|
|
}
|
980 |
|
|
} else {
|
981 |
|
|
daa_set_mode(j, SOP_PU_RESET);
|
982 |
|
|
}
|
983 |
|
|
}
|
984 |
|
|
if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
|
985 |
|
|
daaint.bitreg.Caller_ID = 1;
|
986 |
|
|
j->pstn_cid_intr = 1;
|
987 |
|
|
j->pstn_cid_received = jiffies;
|
988 |
|
|
if(ixjdebug & 0x0008) {
|
989 |
|
|
printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
|
990 |
|
|
}
|
991 |
|
|
}
|
992 |
|
|
if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
|
993 |
|
|
daaint.bitreg.Cadence = 1;
|
994 |
|
|
if(ixjdebug & 0x0008) {
|
995 |
|
|
printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
|
996 |
|
|
}
|
997 |
|
|
}
|
998 |
|
|
if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
|
999 |
|
|
daaint.bitreg.VDD_OK = 1;
|
1000 |
|
|
daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
|
1001 |
|
|
}
|
1002 |
|
|
}
|
1003 |
|
|
daa_CR_read(j, 1);
|
1004 |
|
|
if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
|
1005 |
|
|
daaint.bitreg.RMR = 1;
|
1006 |
|
|
daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
|
1007 |
|
|
if(ixjdebug & 0x0008) {
|
1008 |
|
|
printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
|
1009 |
|
|
}
|
1010 |
|
|
j->pstn_prev_rmr = j->pstn_last_rmr;
|
1011 |
|
|
j->pstn_last_rmr = jiffies;
|
1012 |
|
|
}
|
1013 |
|
|
switch(j->daa_mode) {
|
1014 |
|
|
case SOP_PU_SLEEP:
|
1015 |
|
|
if (daaint.bitreg.RING) {
|
1016 |
|
|
if (!j->flags.pstn_ringing) {
|
1017 |
|
|
if (j->daa_mode != SOP_PU_RINGING) {
|
1018 |
|
|
j->pstn_ring_int = jiffies;
|
1019 |
|
|
daa_set_mode(j, SOP_PU_RINGING);
|
1020 |
|
|
}
|
1021 |
|
|
}
|
1022 |
|
|
}
|
1023 |
|
|
break;
|
1024 |
|
|
case SOP_PU_RINGING:
|
1025 |
|
|
if (daaint.bitreg.RMR) {
|
1026 |
|
|
if (ixjdebug & 0x0008) {
|
1027 |
|
|
printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
|
1028 |
|
|
}
|
1029 |
|
|
if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
|
1030 |
|
|
j->flags.pstn_rmr = 1;
|
1031 |
|
|
j->pstn_ring_start = jiffies;
|
1032 |
|
|
j->pstn_ring_stop = 0;
|
1033 |
|
|
j->ex.bits.pstn_ring = 0;
|
1034 |
|
|
if (j->cadence_f[4].state == 0) {
|
1035 |
|
|
j->cadence_f[4].state = 1;
|
1036 |
|
|
j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
|
1037 |
|
|
j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
|
1038 |
|
|
j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
|
1039 |
|
|
} else if (j->cadence_f[4].state == 2) {
|
1040 |
|
|
if((time_after(jiffies, j->cadence_f[4].off1min) &&
|
1041 |
|
|
time_before(jiffies, j->cadence_f[4].off1max))) {
|
1042 |
|
|
if (j->cadence_f[4].on2) {
|
1043 |
|
|
j->cadence_f[4].state = 3;
|
1044 |
|
|
j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
|
1045 |
|
|
j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
|
1046 |
|
|
j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
|
1047 |
|
|
} else {
|
1048 |
|
|
j->cadence_f[4].state = 7;
|
1049 |
|
|
}
|
1050 |
|
|
} else {
|
1051 |
|
|
if (ixjdebug & 0x0008) {
|
1052 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1053 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1054 |
|
|
j->cadence_f[4].off1);
|
1055 |
|
|
}
|
1056 |
|
|
j->cadence_f[4].state = 0;
|
1057 |
|
|
}
|
1058 |
|
|
} else if (j->cadence_f[4].state == 4) {
|
1059 |
|
|
if((time_after(jiffies, j->cadence_f[4].off2min) &&
|
1060 |
|
|
time_before(jiffies, j->cadence_f[4].off2max))) {
|
1061 |
|
|
if (j->cadence_f[4].on3) {
|
1062 |
|
|
j->cadence_f[4].state = 5;
|
1063 |
|
|
j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
|
1064 |
|
|
j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
|
1065 |
|
|
j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
|
1066 |
|
|
} else {
|
1067 |
|
|
j->cadence_f[4].state = 7;
|
1068 |
|
|
}
|
1069 |
|
|
} else {
|
1070 |
|
|
if (ixjdebug & 0x0008) {
|
1071 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1072 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1073 |
|
|
j->cadence_f[4].off2);
|
1074 |
|
|
}
|
1075 |
|
|
j->cadence_f[4].state = 0;
|
1076 |
|
|
}
|
1077 |
|
|
} else if (j->cadence_f[4].state == 6) {
|
1078 |
|
|
if((time_after(jiffies, j->cadence_f[4].off3min) &&
|
1079 |
|
|
time_before(jiffies, j->cadence_f[4].off3max))) {
|
1080 |
|
|
j->cadence_f[4].state = 7;
|
1081 |
|
|
} else {
|
1082 |
|
|
if (ixjdebug & 0x0008) {
|
1083 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1084 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1085 |
|
|
j->cadence_f[4].off3);
|
1086 |
|
|
}
|
1087 |
|
|
j->cadence_f[4].state = 0;
|
1088 |
|
|
}
|
1089 |
|
|
} else {
|
1090 |
|
|
j->cadence_f[4].state = 0;
|
1091 |
|
|
}
|
1092 |
|
|
} else { /* Falling edge of RMR */
|
1093 |
|
|
j->pstn_ring_start = 0;
|
1094 |
|
|
j->pstn_ring_stop = jiffies;
|
1095 |
|
|
if (j->cadence_f[4].state == 1) {
|
1096 |
|
|
if(!j->cadence_f[4].on1) {
|
1097 |
|
|
j->cadence_f[4].state = 7;
|
1098 |
|
|
} else if((time_after(jiffies, j->cadence_f[4].on1min) &&
|
1099 |
|
|
time_before(jiffies, j->cadence_f[4].on1max))) {
|
1100 |
|
|
if (j->cadence_f[4].off1) {
|
1101 |
|
|
j->cadence_f[4].state = 2;
|
1102 |
|
|
j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
|
1103 |
|
|
j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
|
1104 |
|
|
j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
|
1105 |
|
|
} else {
|
1106 |
|
|
j->cadence_f[4].state = 7;
|
1107 |
|
|
}
|
1108 |
|
|
} else {
|
1109 |
|
|
if (ixjdebug & 0x0008) {
|
1110 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1111 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1112 |
|
|
j->cadence_f[4].on1);
|
1113 |
|
|
}
|
1114 |
|
|
j->cadence_f[4].state = 0;
|
1115 |
|
|
}
|
1116 |
|
|
} else if (j->cadence_f[4].state == 3) {
|
1117 |
|
|
if((time_after(jiffies, j->cadence_f[4].on2min) &&
|
1118 |
|
|
time_before(jiffies, j->cadence_f[4].on2max))) {
|
1119 |
|
|
if (j->cadence_f[4].off2) {
|
1120 |
|
|
j->cadence_f[4].state = 4;
|
1121 |
|
|
j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
|
1122 |
|
|
j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
|
1123 |
|
|
j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
|
1124 |
|
|
} else {
|
1125 |
|
|
j->cadence_f[4].state = 7;
|
1126 |
|
|
}
|
1127 |
|
|
} else {
|
1128 |
|
|
if (ixjdebug & 0x0008) {
|
1129 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1130 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1131 |
|
|
j->cadence_f[4].on2);
|
1132 |
|
|
}
|
1133 |
|
|
j->cadence_f[4].state = 0;
|
1134 |
|
|
}
|
1135 |
|
|
} else if (j->cadence_f[4].state == 5) {
|
1136 |
|
|
if((time_after(jiffies, j->cadence_f[4].on3min) &&
|
1137 |
|
|
time_before(jiffies, j->cadence_f[4].on3max))) {
|
1138 |
|
|
if (j->cadence_f[4].off3) {
|
1139 |
|
|
j->cadence_f[4].state = 6;
|
1140 |
|
|
j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
|
1141 |
|
|
j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
|
1142 |
|
|
j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
|
1143 |
|
|
} else {
|
1144 |
|
|
j->cadence_f[4].state = 7;
|
1145 |
|
|
}
|
1146 |
|
|
} else {
|
1147 |
|
|
j->cadence_f[4].state = 0;
|
1148 |
|
|
}
|
1149 |
|
|
} else {
|
1150 |
|
|
if (ixjdebug & 0x0008) {
|
1151 |
|
|
printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
|
1152 |
|
|
j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
|
1153 |
|
|
j->cadence_f[4].on3);
|
1154 |
|
|
}
|
1155 |
|
|
j->cadence_f[4].state = 0;
|
1156 |
|
|
}
|
1157 |
|
|
}
|
1158 |
|
|
if (ixjdebug & 0x0010) {
|
1159 |
|
|
printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
|
1160 |
|
|
}
|
1161 |
|
|
if (ixjdebug & 0x0010) {
|
1162 |
|
|
switch(j->cadence_f[4].state) {
|
1163 |
|
|
case 1:
|
1164 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1165 |
|
|
j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
|
1166 |
|
|
break;
|
1167 |
|
|
case 2:
|
1168 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1169 |
|
|
j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
|
1170 |
|
|
break;
|
1171 |
|
|
case 3:
|
1172 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1173 |
|
|
j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
|
1174 |
|
|
break;
|
1175 |
|
|
case 4:
|
1176 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1177 |
|
|
j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
|
1178 |
|
|
break;
|
1179 |
|
|
case 5:
|
1180 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1181 |
|
|
j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
|
1182 |
|
|
break;
|
1183 |
|
|
case 6:
|
1184 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
|
1185 |
|
|
j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
|
1186 |
|
|
break;
|
1187 |
|
|
}
|
1188 |
|
|
}
|
1189 |
|
|
}
|
1190 |
|
|
if (j->cadence_f[4].state == 7) {
|
1191 |
|
|
j->cadence_f[4].state = 0;
|
1192 |
|
|
j->pstn_ring_stop = jiffies;
|
1193 |
|
|
j->ex.bits.pstn_ring = 1;
|
1194 |
|
|
ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
|
1195 |
|
|
if(ixjdebug & 0x0008) {
|
1196 |
|
|
printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
|
1197 |
|
|
}
|
1198 |
|
|
}
|
1199 |
|
|
if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
|
1200 |
|
|
(j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
|
1201 |
|
|
if(ixjdebug & 0x0008) {
|
1202 |
|
|
printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
|
1203 |
|
|
printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
|
1204 |
|
|
printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
|
1205 |
|
|
}
|
1206 |
|
|
j->pstn_ring_stop = j->pstn_ring_int = 0;
|
1207 |
|
|
daa_set_mode(j, SOP_PU_SLEEP);
|
1208 |
|
|
}
|
1209 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
1210 |
|
|
if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
|
1211 |
|
|
ixj_daa_cid_read(j);
|
1212 |
|
|
j->ex.bits.caller_id = 1;
|
1213 |
|
|
ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
|
1214 |
|
|
j->pstn_cid_intr = 0;
|
1215 |
|
|
}
|
1216 |
|
|
if (daaint.bitreg.Cadence) {
|
1217 |
|
|
if(ixjdebug & 0x0008) {
|
1218 |
|
|
printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
|
1219 |
|
|
}
|
1220 |
|
|
daa_set_mode(j, SOP_PU_SLEEP);
|
1221 |
|
|
j->ex.bits.pstn_ring = 0;
|
1222 |
|
|
}
|
1223 |
|
|
break;
|
1224 |
|
|
case SOP_PU_CONVERSATION:
|
1225 |
|
|
if (daaint.bitreg.VDD_OK) {
|
1226 |
|
|
if(!daaint.bitreg.SI_0) {
|
1227 |
|
|
if (!j->pstn_winkstart) {
|
1228 |
|
|
if(ixjdebug & 0x0008) {
|
1229 |
|
|
printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
|
1230 |
|
|
}
|
1231 |
|
|
j->pstn_winkstart = jiffies;
|
1232 |
|
|
}
|
1233 |
|
|
} else {
|
1234 |
|
|
if (j->pstn_winkstart) {
|
1235 |
|
|
if(ixjdebug & 0x0008) {
|
1236 |
|
|
printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
|
1237 |
|
|
}
|
1238 |
|
|
j->pstn_winkstart = 0;
|
1239 |
|
|
}
|
1240 |
|
|
}
|
1241 |
|
|
}
|
1242 |
|
|
if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
|
1243 |
|
|
if(ixjdebug & 0x0008) {
|
1244 |
|
|
printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
|
1245 |
|
|
}
|
1246 |
|
|
daa_set_mode(j, SOP_PU_SLEEP);
|
1247 |
|
|
j->pstn_winkstart = 0;
|
1248 |
|
|
j->ex.bits.pstn_wink = 1;
|
1249 |
|
|
ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
|
1250 |
|
|
}
|
1251 |
|
|
break;
|
1252 |
|
|
}
|
1253 |
|
|
}
|
1254 |
|
|
|
1255 |
|
|
static void ixj_timeout(unsigned long ptr)
|
1256 |
|
|
{
|
1257 |
|
|
int board;
|
1258 |
|
|
unsigned long jifon;
|
1259 |
|
|
IXJ *j = (IXJ *)ptr;
|
1260 |
|
|
board = j->board;
|
1261 |
|
|
|
1262 |
|
|
if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
|
1263 |
|
|
ixj_perfmon(j->timerchecks);
|
1264 |
|
|
j->hookstate = ixj_hookstate(j);
|
1265 |
|
|
if (j->tone_state) {
|
1266 |
|
|
if (!(j->hookstate)) {
|
1267 |
|
|
ixj_cpt_stop(j);
|
1268 |
|
|
if (j->m_hook) {
|
1269 |
|
|
j->m_hook = 0;
|
1270 |
|
|
j->ex.bits.hookstate = 1;
|
1271 |
|
|
ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
|
1272 |
|
|
}
|
1273 |
|
|
clear_bit(board, &j->busyflags);
|
1274 |
|
|
ixj_add_timer(j);
|
1275 |
|
|
return;
|
1276 |
|
|
}
|
1277 |
|
|
if (j->tone_state == 1)
|
1278 |
|
|
jifon = ((hertz * j->tone_on_time) * 25 / 100000);
|
1279 |
|
|
else
|
1280 |
|
|
jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
|
1281 |
|
|
if (time_before(jiffies, j->tone_start_jif + jifon)) {
|
1282 |
|
|
if (j->tone_state == 1) {
|
1283 |
|
|
ixj_play_tone(j, j->tone_index);
|
1284 |
|
|
if (j->dsp.low == 0x20) {
|
1285 |
|
|
clear_bit(board, &j->busyflags);
|
1286 |
|
|
ixj_add_timer(j);
|
1287 |
|
|
return;
|
1288 |
|
|
}
|
1289 |
|
|
} else {
|
1290 |
|
|
ixj_play_tone(j, 0);
|
1291 |
|
|
if (j->dsp.low == 0x20) {
|
1292 |
|
|
clear_bit(board, &j->busyflags);
|
1293 |
|
|
ixj_add_timer(j);
|
1294 |
|
|
return;
|
1295 |
|
|
}
|
1296 |
|
|
}
|
1297 |
|
|
} else {
|
1298 |
|
|
ixj_tone_timeout(j);
|
1299 |
|
|
if (j->flags.dialtone) {
|
1300 |
|
|
ixj_dialtone(j);
|
1301 |
|
|
}
|
1302 |
|
|
if (j->flags.busytone) {
|
1303 |
|
|
ixj_busytone(j);
|
1304 |
|
|
if (j->dsp.low == 0x20) {
|
1305 |
|
|
clear_bit(board, &j->busyflags);
|
1306 |
|
|
ixj_add_timer(j);
|
1307 |
|
|
return;
|
1308 |
|
|
}
|
1309 |
|
|
}
|
1310 |
|
|
if (j->flags.ringback) {
|
1311 |
|
|
ixj_ringback(j);
|
1312 |
|
|
if (j->dsp.low == 0x20) {
|
1313 |
|
|
clear_bit(board, &j->busyflags);
|
1314 |
|
|
ixj_add_timer(j);
|
1315 |
|
|
return;
|
1316 |
|
|
}
|
1317 |
|
|
}
|
1318 |
|
|
if (!j->tone_state) {
|
1319 |
|
|
ixj_cpt_stop(j);
|
1320 |
|
|
}
|
1321 |
|
|
}
|
1322 |
|
|
}
|
1323 |
|
|
if (!(j->tone_state && j->dsp.low == 0x20)) {
|
1324 |
|
|
if (IsRxReady(j)) {
|
1325 |
|
|
ixj_read_frame(j);
|
1326 |
|
|
}
|
1327 |
|
|
if (IsTxReady(j)) {
|
1328 |
|
|
ixj_write_frame(j);
|
1329 |
|
|
}
|
1330 |
|
|
}
|
1331 |
|
|
if (j->flags.cringing) {
|
1332 |
|
|
if (j->hookstate & 1) {
|
1333 |
|
|
j->flags.cringing = 0;
|
1334 |
|
|
ixj_ring_off(j);
|
1335 |
|
|
} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
|
1336 |
|
|
switch(j->cadence_f[5].state) {
|
1337 |
|
|
case 0:
|
1338 |
|
|
j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
|
1339 |
|
|
if (time_before(jiffies, j->cadence_f[5].on1dot)) {
|
1340 |
|
|
if(ixjdebug & 0x0004) {
|
1341 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1342 |
|
|
}
|
1343 |
|
|
ixj_ring_on(j);
|
1344 |
|
|
}
|
1345 |
|
|
j->cadence_f[5].state = 1;
|
1346 |
|
|
break;
|
1347 |
|
|
case 1:
|
1348 |
|
|
if (time_after(jiffies, j->cadence_f[5].on1dot)) {
|
1349 |
|
|
j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
|
1350 |
|
|
if(ixjdebug & 0x0004) {
|
1351 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1352 |
|
|
}
|
1353 |
|
|
ixj_ring_off(j);
|
1354 |
|
|
j->cadence_f[5].state = 2;
|
1355 |
|
|
}
|
1356 |
|
|
break;
|
1357 |
|
|
case 2:
|
1358 |
|
|
if (time_after(jiffies, j->cadence_f[5].off1dot)) {
|
1359 |
|
|
if(ixjdebug & 0x0004) {
|
1360 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1361 |
|
|
}
|
1362 |
|
|
ixj_ring_on(j);
|
1363 |
|
|
if (j->cadence_f[5].on2) {
|
1364 |
|
|
j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
|
1365 |
|
|
j->cadence_f[5].state = 3;
|
1366 |
|
|
} else {
|
1367 |
|
|
j->cadence_f[5].state = 7;
|
1368 |
|
|
}
|
1369 |
|
|
}
|
1370 |
|
|
break;
|
1371 |
|
|
case 3:
|
1372 |
|
|
if (time_after(jiffies, j->cadence_f[5].on2dot)) {
|
1373 |
|
|
if(ixjdebug & 0x0004) {
|
1374 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1375 |
|
|
}
|
1376 |
|
|
ixj_ring_off(j);
|
1377 |
|
|
if (j->cadence_f[5].off2) {
|
1378 |
|
|
j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
|
1379 |
|
|
j->cadence_f[5].state = 4;
|
1380 |
|
|
} else {
|
1381 |
|
|
j->cadence_f[5].state = 7;
|
1382 |
|
|
}
|
1383 |
|
|
}
|
1384 |
|
|
break;
|
1385 |
|
|
case 4:
|
1386 |
|
|
if (time_after(jiffies, j->cadence_f[5].off2dot)) {
|
1387 |
|
|
if(ixjdebug & 0x0004) {
|
1388 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1389 |
|
|
}
|
1390 |
|
|
ixj_ring_on(j);
|
1391 |
|
|
if (j->cadence_f[5].on3) {
|
1392 |
|
|
j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
|
1393 |
|
|
j->cadence_f[5].state = 5;
|
1394 |
|
|
} else {
|
1395 |
|
|
j->cadence_f[5].state = 7;
|
1396 |
|
|
}
|
1397 |
|
|
}
|
1398 |
|
|
break;
|
1399 |
|
|
case 5:
|
1400 |
|
|
if (time_after(jiffies, j->cadence_f[5].on3dot)) {
|
1401 |
|
|
if(ixjdebug & 0x0004) {
|
1402 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1403 |
|
|
}
|
1404 |
|
|
ixj_ring_off(j);
|
1405 |
|
|
if (j->cadence_f[5].off3) {
|
1406 |
|
|
j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
|
1407 |
|
|
j->cadence_f[5].state = 6;
|
1408 |
|
|
} else {
|
1409 |
|
|
j->cadence_f[5].state = 7;
|
1410 |
|
|
}
|
1411 |
|
|
}
|
1412 |
|
|
break;
|
1413 |
|
|
case 6:
|
1414 |
|
|
if (time_after(jiffies, j->cadence_f[5].off3dot)) {
|
1415 |
|
|
if(ixjdebug & 0x0004) {
|
1416 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1417 |
|
|
}
|
1418 |
|
|
j->cadence_f[5].state = 7;
|
1419 |
|
|
}
|
1420 |
|
|
break;
|
1421 |
|
|
case 7:
|
1422 |
|
|
if(ixjdebug & 0x0004) {
|
1423 |
|
|
printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
|
1424 |
|
|
}
|
1425 |
|
|
j->flags.cidring = 1;
|
1426 |
|
|
j->cadence_f[5].state = 0;
|
1427 |
|
|
break;
|
1428 |
|
|
}
|
1429 |
|
|
if (j->flags.cidring && !j->flags.cidsent) {
|
1430 |
|
|
j->flags.cidsent = 1;
|
1431 |
|
|
if(j->fskdcnt) {
|
1432 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OHT, j);
|
1433 |
|
|
ixj_pre_cid(j);
|
1434 |
|
|
}
|
1435 |
|
|
j->flags.cidring = 0;
|
1436 |
|
|
}
|
1437 |
|
|
clear_bit(board, &j->busyflags);
|
1438 |
|
|
ixj_add_timer(j);
|
1439 |
|
|
return;
|
1440 |
|
|
} else {
|
1441 |
|
|
if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
|
1442 |
|
|
if (j->flags.cidring && !j->flags.cidsent) {
|
1443 |
|
|
j->flags.cidsent = 1;
|
1444 |
|
|
if(j->fskdcnt) {
|
1445 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OHT, j);
|
1446 |
|
|
ixj_pre_cid(j);
|
1447 |
|
|
}
|
1448 |
|
|
j->flags.cidring = 0;
|
1449 |
|
|
}
|
1450 |
|
|
j->ring_cadence_t--;
|
1451 |
|
|
if (j->ring_cadence_t == -1)
|
1452 |
|
|
j->ring_cadence_t = 15;
|
1453 |
|
|
j->ring_cadence_jif = jiffies;
|
1454 |
|
|
|
1455 |
|
|
if (j->ring_cadence & 1 << j->ring_cadence_t) {
|
1456 |
|
|
if(j->flags.cidsent && j->cadence_f[5].en_filter)
|
1457 |
|
|
j->flags.firstring = 1;
|
1458 |
|
|
else
|
1459 |
|
|
ixj_ring_on(j);
|
1460 |
|
|
} else {
|
1461 |
|
|
ixj_ring_off(j);
|
1462 |
|
|
if(!j->flags.cidsent)
|
1463 |
|
|
j->flags.cidring = 1;
|
1464 |
|
|
}
|
1465 |
|
|
}
|
1466 |
|
|
clear_bit(board, &j->busyflags);
|
1467 |
|
|
ixj_add_timer(j);
|
1468 |
|
|
return;
|
1469 |
|
|
}
|
1470 |
|
|
}
|
1471 |
|
|
if (!j->flags.ringing) {
|
1472 |
|
|
if (j->hookstate) { /* & 1) { */
|
1473 |
|
|
if (j->dsp.low != 0x20 &&
|
1474 |
|
|
SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
|
1475 |
|
|
SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
|
1476 |
|
|
}
|
1477 |
|
|
LineMonitor(j);
|
1478 |
|
|
read_filters(j);
|
1479 |
|
|
ixj_WriteDSPCommand(0x511B, j);
|
1480 |
|
|
j->proc_load = j->ssr.high << 8 | j->ssr.low;
|
1481 |
|
|
if (!j->m_hook && (j->hookstate & 1)) {
|
1482 |
|
|
j->m_hook = j->ex.bits.hookstate = 1;
|
1483 |
|
|
ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
|
1484 |
|
|
}
|
1485 |
|
|
} else {
|
1486 |
|
|
if (j->ex.bits.dtmf_ready) {
|
1487 |
|
|
j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
|
1488 |
|
|
}
|
1489 |
|
|
if (j->m_hook) {
|
1490 |
|
|
j->m_hook = 0;
|
1491 |
|
|
j->ex.bits.hookstate = 1;
|
1492 |
|
|
ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
|
1493 |
|
|
}
|
1494 |
|
|
}
|
1495 |
|
|
}
|
1496 |
|
|
if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
|
1497 |
|
|
ixj_pstn_state(j);
|
1498 |
|
|
}
|
1499 |
|
|
if (j->ex.bytes) {
|
1500 |
|
|
wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
|
1501 |
|
|
}
|
1502 |
|
|
clear_bit(board, &j->busyflags);
|
1503 |
|
|
}
|
1504 |
|
|
ixj_add_timer(j);
|
1505 |
|
|
}
|
1506 |
|
|
|
1507 |
|
|
static int ixj_status_wait(IXJ *j)
|
1508 |
|
|
{
|
1509 |
|
|
unsigned long jif;
|
1510 |
|
|
|
1511 |
|
|
jif = jiffies + ((60 * hertz) / 100);
|
1512 |
|
|
while (!IsStatusReady(j)) {
|
1513 |
|
|
ixj_perfmon(j->statuswait);
|
1514 |
|
|
if (time_after(jiffies, jif)) {
|
1515 |
|
|
ixj_perfmon(j->statuswaitfail);
|
1516 |
|
|
return -1;
|
1517 |
|
|
}
|
1518 |
|
|
}
|
1519 |
|
|
return 0;
|
1520 |
|
|
}
|
1521 |
|
|
|
1522 |
|
|
static int ixj_PCcontrol_wait(IXJ *j)
|
1523 |
|
|
{
|
1524 |
|
|
unsigned long jif;
|
1525 |
|
|
|
1526 |
|
|
jif = jiffies + ((60 * hertz) / 100);
|
1527 |
|
|
while (!IsPCControlReady(j)) {
|
1528 |
|
|
ixj_perfmon(j->pcontrolwait);
|
1529 |
|
|
if (time_after(jiffies, jif)) {
|
1530 |
|
|
ixj_perfmon(j->pcontrolwaitfail);
|
1531 |
|
|
return -1;
|
1532 |
|
|
}
|
1533 |
|
|
}
|
1534 |
|
|
return 0;
|
1535 |
|
|
}
|
1536 |
|
|
|
1537 |
|
|
static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
|
1538 |
|
|
{
|
1539 |
|
|
BYTES bytes;
|
1540 |
|
|
unsigned long jif;
|
1541 |
|
|
|
1542 |
|
|
atomic_inc(&j->DSPWrite);
|
1543 |
|
|
if(atomic_read(&j->DSPWrite) > 1) {
|
1544 |
|
|
printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
|
1545 |
|
|
return -1;
|
1546 |
|
|
}
|
1547 |
|
|
bytes.high = (cmd & 0xFF00) >> 8;
|
1548 |
|
|
bytes.low = cmd & 0x00FF;
|
1549 |
|
|
jif = jiffies + ((60 * hertz) / 100);
|
1550 |
|
|
while (!IsControlReady(j)) {
|
1551 |
|
|
ixj_perfmon(j->iscontrolready);
|
1552 |
|
|
if (time_after(jiffies, jif)) {
|
1553 |
|
|
ixj_perfmon(j->iscontrolreadyfail);
|
1554 |
|
|
atomic_dec(&j->DSPWrite);
|
1555 |
|
|
if(atomic_read(&j->DSPWrite) > 0) {
|
1556 |
|
|
printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
|
1557 |
|
|
while(atomic_read(&j->DSPWrite) > 0) {
|
1558 |
|
|
atomic_dec(&j->DSPWrite);
|
1559 |
|
|
}
|
1560 |
|
|
}
|
1561 |
|
|
return -1;
|
1562 |
|
|
}
|
1563 |
|
|
}
|
1564 |
|
|
outb(bytes.low, j->DSPbase + 6);
|
1565 |
|
|
outb(bytes.high, j->DSPbase + 7);
|
1566 |
|
|
|
1567 |
|
|
if (ixj_status_wait(j)) {
|
1568 |
|
|
j->ssr.low = 0xFF;
|
1569 |
|
|
j->ssr.high = 0xFF;
|
1570 |
|
|
atomic_dec(&j->DSPWrite);
|
1571 |
|
|
if(atomic_read(&j->DSPWrite) > 0) {
|
1572 |
|
|
printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
|
1573 |
|
|
while(atomic_read(&j->DSPWrite) > 0) {
|
1574 |
|
|
atomic_dec(&j->DSPWrite);
|
1575 |
|
|
}
|
1576 |
|
|
}
|
1577 |
|
|
return -1;
|
1578 |
|
|
}
|
1579 |
|
|
/* Read Software Status Register */
|
1580 |
|
|
j->ssr.low = inb_p(j->DSPbase + 2);
|
1581 |
|
|
j->ssr.high = inb_p(j->DSPbase + 3);
|
1582 |
|
|
atomic_dec(&j->DSPWrite);
|
1583 |
|
|
if(atomic_read(&j->DSPWrite) > 0) {
|
1584 |
|
|
printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
|
1585 |
|
|
while(atomic_read(&j->DSPWrite) > 0) {
|
1586 |
|
|
atomic_dec(&j->DSPWrite);
|
1587 |
|
|
}
|
1588 |
|
|
}
|
1589 |
|
|
return 0;
|
1590 |
|
|
}
|
1591 |
|
|
|
1592 |
|
|
/***************************************************************************
|
1593 |
|
|
*
|
1594 |
|
|
* General Purpose IO Register read routine
|
1595 |
|
|
*
|
1596 |
|
|
***************************************************************************/
|
1597 |
|
|
static inline int ixj_gpio_read(IXJ *j)
|
1598 |
|
|
{
|
1599 |
|
|
if (ixj_WriteDSPCommand(0x5143, j))
|
1600 |
|
|
return -1;
|
1601 |
|
|
|
1602 |
|
|
j->gpio.bytes.low = j->ssr.low;
|
1603 |
|
|
j->gpio.bytes.high = j->ssr.high;
|
1604 |
|
|
|
1605 |
|
|
return 0;
|
1606 |
|
|
}
|
1607 |
|
|
|
1608 |
|
|
static inline void LED_SetState(int state, IXJ *j)
|
1609 |
|
|
{
|
1610 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
1611 |
|
|
j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
|
1612 |
|
|
j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
|
1613 |
|
|
j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
|
1614 |
|
|
j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
|
1615 |
|
|
|
1616 |
|
|
outb(j->pld_scrw.byte, j->XILINXbase);
|
1617 |
|
|
}
|
1618 |
|
|
}
|
1619 |
|
|
|
1620 |
|
|
/*********************************************************************
|
1621 |
|
|
* GPIO Pins are configured as follows on the Quicknet Internet
|
1622 |
|
|
* PhoneJACK Telephony Cards
|
1623 |
|
|
*
|
1624 |
|
|
* POTS Select GPIO_6=0 GPIO_7=0
|
1625 |
|
|
* Mic/Speaker Select GPIO_6=0 GPIO_7=1
|
1626 |
|
|
* Handset Select GPIO_6=1 GPIO_7=0
|
1627 |
|
|
*
|
1628 |
|
|
* SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
|
1629 |
|
|
* SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
|
1630 |
|
|
* SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
|
1631 |
|
|
*
|
1632 |
|
|
* Hook Switch changes reported on GPIO_3
|
1633 |
|
|
*********************************************************************/
|
1634 |
|
|
static int ixj_set_port(IXJ *j, int arg)
|
1635 |
|
|
{
|
1636 |
|
|
if (j->cardtype == QTI_PHONEJACK_LITE) {
|
1637 |
|
|
if (arg != PORT_POTS)
|
1638 |
|
|
return 10;
|
1639 |
|
|
else
|
1640 |
|
|
return 0;
|
1641 |
|
|
}
|
1642 |
|
|
switch (arg) {
|
1643 |
|
|
case PORT_POTS:
|
1644 |
|
|
j->port = PORT_POTS;
|
1645 |
|
|
switch (j->cardtype) {
|
1646 |
|
|
case QTI_PHONECARD:
|
1647 |
|
|
if (j->flags.pcmciasct == 1)
|
1648 |
|
|
SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
|
1649 |
|
|
else
|
1650 |
|
|
return 11;
|
1651 |
|
|
break;
|
1652 |
|
|
case QTI_PHONEJACK_PCI:
|
1653 |
|
|
j->pld_slicw.pcib.mic = 0;
|
1654 |
|
|
j->pld_slicw.pcib.spk = 0;
|
1655 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1656 |
|
|
break;
|
1657 |
|
|
case QTI_LINEJACK:
|
1658 |
|
|
ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
|
1659 |
|
|
if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
|
1660 |
|
|
Software Control Register */
|
1661 |
|
|
return 2;
|
1662 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
1663 |
|
|
|
1664 |
|
|
outb(j->pld_scrw.byte, j->XILINXbase);
|
1665 |
|
|
j->pld_clock.byte = 0;
|
1666 |
|
|
outb(j->pld_clock.byte, j->XILINXbase + 0x04);
|
1667 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
1668 |
|
|
j->pld_slicw.bits.spken = 0;
|
1669 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1670 |
|
|
ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
|
1671 |
|
|
ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
|
1672 |
|
|
ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
|
1673 |
|
|
ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
|
1674 |
|
|
ixj_mixer(0x0E80, j); /*Mic mute */
|
1675 |
|
|
ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
|
1676 |
|
|
ixj_mixer(0x0080, j); /* Mute Master Left volume */
|
1677 |
|
|
ixj_mixer(0x0180, j); /* Mute Master Right volume */
|
1678 |
|
|
SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
|
1679 |
|
|
/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
|
1680 |
|
|
break;
|
1681 |
|
|
case QTI_PHONEJACK:
|
1682 |
|
|
j->gpio.bytes.high = 0x0B;
|
1683 |
|
|
j->gpio.bits.gpio6 = 0;
|
1684 |
|
|
j->gpio.bits.gpio7 = 0;
|
1685 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j);
|
1686 |
|
|
break;
|
1687 |
|
|
}
|
1688 |
|
|
break;
|
1689 |
|
|
case PORT_PSTN:
|
1690 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
1691 |
|
|
ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
|
1692 |
|
|
|
1693 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
1694 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
1695 |
|
|
j->pld_slicw.bits.spken = 0;
|
1696 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1697 |
|
|
j->port = PORT_PSTN;
|
1698 |
|
|
} else {
|
1699 |
|
|
return 4;
|
1700 |
|
|
}
|
1701 |
|
|
break;
|
1702 |
|
|
case PORT_SPEAKER:
|
1703 |
|
|
j->port = PORT_SPEAKER;
|
1704 |
|
|
switch (j->cardtype) {
|
1705 |
|
|
case QTI_PHONECARD:
|
1706 |
|
|
if (j->flags.pcmciasct) {
|
1707 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OC, j);
|
1708 |
|
|
}
|
1709 |
|
|
break;
|
1710 |
|
|
case QTI_PHONEJACK_PCI:
|
1711 |
|
|
j->pld_slicw.pcib.mic = 1;
|
1712 |
|
|
j->pld_slicw.pcib.spk = 1;
|
1713 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1714 |
|
|
break;
|
1715 |
|
|
case QTI_LINEJACK:
|
1716 |
|
|
ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
|
1717 |
|
|
if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
|
1718 |
|
|
Software Control Register */
|
1719 |
|
|
return 2;
|
1720 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
1721 |
|
|
|
1722 |
|
|
outb(j->pld_scrw.byte, j->XILINXbase);
|
1723 |
|
|
j->pld_clock.byte = 0;
|
1724 |
|
|
outb(j->pld_clock.byte, j->XILINXbase + 0x04);
|
1725 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
1726 |
|
|
j->pld_slicw.bits.spken = 1;
|
1727 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1728 |
|
|
ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
|
1729 |
|
|
ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
|
1730 |
|
|
ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
|
1731 |
|
|
ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
|
1732 |
|
|
ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
|
1733 |
|
|
ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
|
1734 |
|
|
ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
|
1735 |
|
|
ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
|
1736 |
|
|
break;
|
1737 |
|
|
case QTI_PHONEJACK:
|
1738 |
|
|
j->gpio.bytes.high = 0x0B;
|
1739 |
|
|
j->gpio.bits.gpio6 = 0;
|
1740 |
|
|
j->gpio.bits.gpio7 = 1;
|
1741 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j);
|
1742 |
|
|
break;
|
1743 |
|
|
}
|
1744 |
|
|
break;
|
1745 |
|
|
case PORT_HANDSET:
|
1746 |
|
|
if (j->cardtype != QTI_PHONEJACK) {
|
1747 |
|
|
return 5;
|
1748 |
|
|
} else {
|
1749 |
|
|
j->gpio.bytes.high = 0x0B;
|
1750 |
|
|
j->gpio.bits.gpio6 = 1;
|
1751 |
|
|
j->gpio.bits.gpio7 = 0;
|
1752 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j);
|
1753 |
|
|
j->port = PORT_HANDSET;
|
1754 |
|
|
}
|
1755 |
|
|
break;
|
1756 |
|
|
default:
|
1757 |
|
|
return 6;
|
1758 |
|
|
break;
|
1759 |
|
|
}
|
1760 |
|
|
return 0;
|
1761 |
|
|
}
|
1762 |
|
|
|
1763 |
|
|
static int ixj_set_pots(IXJ *j, int arg)
|
1764 |
|
|
{
|
1765 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
1766 |
|
|
if (arg) {
|
1767 |
|
|
if (j->port == PORT_PSTN) {
|
1768 |
|
|
j->pld_slicw.bits.rly1 = 0;
|
1769 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1770 |
|
|
j->flags.pots_pstn = 1;
|
1771 |
|
|
return 1;
|
1772 |
|
|
} else {
|
1773 |
|
|
j->flags.pots_pstn = 0;
|
1774 |
|
|
return 0;
|
1775 |
|
|
}
|
1776 |
|
|
} else {
|
1777 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
1778 |
|
|
outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
1779 |
|
|
j->flags.pots_pstn = 0;
|
1780 |
|
|
return 1;
|
1781 |
|
|
}
|
1782 |
|
|
} else {
|
1783 |
|
|
return 0;
|
1784 |
|
|
}
|
1785 |
|
|
}
|
1786 |
|
|
|
1787 |
|
|
static void ixj_ring_on(IXJ *j)
|
1788 |
|
|
{
|
1789 |
|
|
if (j->dsp.low == 0x20) /* Internet PhoneJACK */
|
1790 |
|
|
{
|
1791 |
|
|
if (ixjdebug & 0x0004)
|
1792 |
|
|
printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
|
1793 |
|
|
|
1794 |
|
|
j->gpio.bytes.high = 0x0B;
|
1795 |
|
|
j->gpio.bytes.low = 0x00;
|
1796 |
|
|
j->gpio.bits.gpio1 = 1;
|
1797 |
|
|
j->gpio.bits.gpio2 = 1;
|
1798 |
|
|
j->gpio.bits.gpio5 = 0;
|
1799 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
|
1800 |
|
|
} else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
|
1801 |
|
|
{
|
1802 |
|
|
if (ixjdebug & 0x0004)
|
1803 |
|
|
printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
|
1804 |
|
|
|
1805 |
|
|
SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
|
1806 |
|
|
}
|
1807 |
|
|
}
|
1808 |
|
|
|
1809 |
|
|
static int ixj_siadc(IXJ *j, int val)
|
1810 |
|
|
{
|
1811 |
|
|
if(j->cardtype == QTI_PHONECARD){
|
1812 |
|
|
if(j->flags.pcmciascp){
|
1813 |
|
|
if(val == -1)
|
1814 |
|
|
return j->siadc.bits.rxg;
|
1815 |
|
|
|
1816 |
|
|
if(val < 0 || val > 0x1F)
|
1817 |
|
|
return -1;
|
1818 |
|
|
|
1819 |
|
|
j->siadc.bits.hom = 0; /* Handset Out Mute */
|
1820 |
|
|
j->siadc.bits.lom = 0; /* Line Out Mute */
|
1821 |
|
|
j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
|
1822 |
|
|
j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
|
1823 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1824 |
|
|
j->psccr.bits.dev = 0;
|
1825 |
|
|
outb(j->siadc.byte, j->XILINXbase + 0x00);
|
1826 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1827 |
|
|
ixj_PCcontrol_wait(j);
|
1828 |
|
|
return j->siadc.bits.rxg;
|
1829 |
|
|
}
|
1830 |
|
|
}
|
1831 |
|
|
return -1;
|
1832 |
|
|
}
|
1833 |
|
|
|
1834 |
|
|
static int ixj_sidac(IXJ *j, int val)
|
1835 |
|
|
{
|
1836 |
|
|
if(j->cardtype == QTI_PHONECARD){
|
1837 |
|
|
if(j->flags.pcmciascp){
|
1838 |
|
|
if(val == -1)
|
1839 |
|
|
return j->sidac.bits.txg;
|
1840 |
|
|
|
1841 |
|
|
if(val < 0 || val > 0x1F)
|
1842 |
|
|
return -1;
|
1843 |
|
|
|
1844 |
|
|
j->sidac.bits.srm = 1; /* Speaker Right Mute */
|
1845 |
|
|
j->sidac.bits.slm = 1; /* Speaker Left Mute */
|
1846 |
|
|
j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
|
1847 |
|
|
j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
|
1848 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1849 |
|
|
j->psccr.bits.dev = 0;
|
1850 |
|
|
outb(j->sidac.byte, j->XILINXbase + 0x00);
|
1851 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1852 |
|
|
ixj_PCcontrol_wait(j);
|
1853 |
|
|
return j->sidac.bits.txg;
|
1854 |
|
|
}
|
1855 |
|
|
}
|
1856 |
|
|
return -1;
|
1857 |
|
|
}
|
1858 |
|
|
|
1859 |
|
|
static int ixj_pcmcia_cable_check(IXJ *j)
|
1860 |
|
|
{
|
1861 |
|
|
j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
|
1862 |
|
|
if (!j->flags.pcmciastate) {
|
1863 |
|
|
j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
|
1864 |
|
|
if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
|
1865 |
|
|
j->flags.pcmciastate = 4;
|
1866 |
|
|
return 0;
|
1867 |
|
|
}
|
1868 |
|
|
if (j->pccr1.bits.ed) {
|
1869 |
|
|
j->pccr1.bits.ed = 0;
|
1870 |
|
|
j->psccr.bits.dev = 3;
|
1871 |
|
|
j->psccr.bits.rw = 1;
|
1872 |
|
|
outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
|
1873 |
|
|
ixj_PCcontrol_wait(j);
|
1874 |
|
|
j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
|
1875 |
|
|
j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
|
1876 |
|
|
j->psccr.bits.dev = 3;
|
1877 |
|
|
j->psccr.bits.rw = 0;
|
1878 |
|
|
outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
|
1879 |
|
|
ixj_PCcontrol_wait(j);
|
1880 |
|
|
return j->pslic.bits.led2 ? 1 : 0;
|
1881 |
|
|
} else if (j->flags.pcmciasct) {
|
1882 |
|
|
return j->r_hook;
|
1883 |
|
|
} else {
|
1884 |
|
|
return 1;
|
1885 |
|
|
}
|
1886 |
|
|
} else if (j->flags.pcmciastate == 4) {
|
1887 |
|
|
if (!j->pccr1.bits.drf) {
|
1888 |
|
|
j->flags.pcmciastate = 3;
|
1889 |
|
|
}
|
1890 |
|
|
return 0;
|
1891 |
|
|
} else if (j->flags.pcmciastate == 3) {
|
1892 |
|
|
j->pccr2.bits.pwr = 0;
|
1893 |
|
|
j->pccr2.bits.rstc = 1;
|
1894 |
|
|
outb(j->pccr2.byte, j->XILINXbase + 0x02);
|
1895 |
|
|
j->checkwait = jiffies + (hertz * 2);
|
1896 |
|
|
j->flags.incheck = 1;
|
1897 |
|
|
j->flags.pcmciastate = 2;
|
1898 |
|
|
return 0;
|
1899 |
|
|
} else if (j->flags.pcmciastate == 2) {
|
1900 |
|
|
if (j->flags.incheck) {
|
1901 |
|
|
if (time_before(jiffies, j->checkwait)) {
|
1902 |
|
|
return 0;
|
1903 |
|
|
} else {
|
1904 |
|
|
j->flags.incheck = 0;
|
1905 |
|
|
}
|
1906 |
|
|
}
|
1907 |
|
|
j->pccr2.bits.pwr = 0;
|
1908 |
|
|
j->pccr2.bits.rstc = 0;
|
1909 |
|
|
outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
|
1910 |
|
|
j->flags.pcmciastate = 1;
|
1911 |
|
|
return 0;
|
1912 |
|
|
} else if (j->flags.pcmciastate == 1) {
|
1913 |
|
|
j->flags.pcmciastate = 0;
|
1914 |
|
|
if (!j->pccr1.bits.drf) {
|
1915 |
|
|
j->psccr.bits.dev = 3;
|
1916 |
|
|
j->psccr.bits.rw = 1;
|
1917 |
|
|
outb_p(j->psccr.byte, j->XILINXbase + 0x01);
|
1918 |
|
|
ixj_PCcontrol_wait(j);
|
1919 |
|
|
j->flags.pcmciascp = 1; /* Set Cable Present Flag */
|
1920 |
|
|
|
1921 |
|
|
j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
|
1922 |
|
|
|
1923 |
|
|
if (j->flags.pcmciasct == 3) {
|
1924 |
|
|
j->flags.pcmciastate = 4;
|
1925 |
|
|
return 0;
|
1926 |
|
|
} else if (j->flags.pcmciasct == 0) {
|
1927 |
|
|
j->pccr2.bits.pwr = 1;
|
1928 |
|
|
j->pccr2.bits.rstc = 0;
|
1929 |
|
|
outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
|
1930 |
|
|
j->port = PORT_SPEAKER;
|
1931 |
|
|
} else {
|
1932 |
|
|
j->port = PORT_POTS;
|
1933 |
|
|
}
|
1934 |
|
|
j->sic1.bits.cpd = 0; /* Chip Power Down */
|
1935 |
|
|
j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
|
1936 |
|
|
j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
|
1937 |
|
|
j->sic1.bits.lpd = 0; /* Line Bias Power Down */
|
1938 |
|
|
j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
|
1939 |
|
|
j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
|
1940 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1941 |
|
|
j->psccr.bits.dev = 0;
|
1942 |
|
|
outb(j->sic1.byte, j->XILINXbase + 0x00);
|
1943 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1944 |
|
|
ixj_PCcontrol_wait(j);
|
1945 |
|
|
|
1946 |
|
|
j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
|
1947 |
|
|
j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
|
1948 |
|
|
j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
|
1949 |
|
|
j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
|
1950 |
|
|
j->sic2.bits.hpd = 0; /* HPF disable */
|
1951 |
|
|
j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
|
1952 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1953 |
|
|
j->psccr.bits.dev = 0;
|
1954 |
|
|
outb(j->sic2.byte, j->XILINXbase + 0x00);
|
1955 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1956 |
|
|
ixj_PCcontrol_wait(j);
|
1957 |
|
|
|
1958 |
|
|
j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
|
1959 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1960 |
|
|
j->psccr.bits.dev = 0;
|
1961 |
|
|
outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
|
1962 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1963 |
|
|
ixj_PCcontrol_wait(j);
|
1964 |
|
|
|
1965 |
|
|
j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
|
1966 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1967 |
|
|
j->psccr.bits.dev = 0;
|
1968 |
|
|
outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
|
1969 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1970 |
|
|
ixj_PCcontrol_wait(j);
|
1971 |
|
|
|
1972 |
|
|
j->sirxg.bits.lig = 1; /* Line In Gain */
|
1973 |
|
|
j->sirxg.bits.lim = 1; /* Line In Mute */
|
1974 |
|
|
j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
|
1975 |
|
|
j->sirxg.bits.mcm = 0; /* MIC In Mute */
|
1976 |
|
|
j->sirxg.bits.him = 0; /* Handset In Mute */
|
1977 |
|
|
j->sirxg.bits.iir = 1; /* IIR */
|
1978 |
|
|
j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
|
1979 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1980 |
|
|
j->psccr.bits.dev = 0;
|
1981 |
|
|
outb(j->sirxg.byte, j->XILINXbase + 0x00);
|
1982 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1983 |
|
|
ixj_PCcontrol_wait(j);
|
1984 |
|
|
|
1985 |
|
|
ixj_siadc(j, 0x17);
|
1986 |
|
|
ixj_sidac(j, 0x1D);
|
1987 |
|
|
|
1988 |
|
|
j->siaatt.bits.sot = 0;
|
1989 |
|
|
j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
|
1990 |
|
|
j->psccr.bits.rw = 0; /* Read / Write flag */
|
1991 |
|
|
j->psccr.bits.dev = 0;
|
1992 |
|
|
outb(j->siaatt.byte, j->XILINXbase + 0x00);
|
1993 |
|
|
outb(j->psccr.byte, j->XILINXbase + 0x01);
|
1994 |
|
|
ixj_PCcontrol_wait(j);
|
1995 |
|
|
|
1996 |
|
|
if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
|
1997 |
|
|
j->psccr.byte = j->pslic.byte = 0;
|
1998 |
|
|
j->pslic.bits.powerdown = 1;
|
1999 |
|
|
j->psccr.bits.dev = 3;
|
2000 |
|
|
j->psccr.bits.rw = 0;
|
2001 |
|
|
outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
|
2002 |
|
|
ixj_PCcontrol_wait(j);
|
2003 |
|
|
}
|
2004 |
|
|
}
|
2005 |
|
|
return 0;
|
2006 |
|
|
} else {
|
2007 |
|
|
j->flags.pcmciascp = 0;
|
2008 |
|
|
return 0;
|
2009 |
|
|
}
|
2010 |
|
|
return 0;
|
2011 |
|
|
}
|
2012 |
|
|
|
2013 |
|
|
static int ixj_hookstate(IXJ *j)
|
2014 |
|
|
{
|
2015 |
|
|
unsigned long det;
|
2016 |
|
|
int fOffHook = 0;
|
2017 |
|
|
|
2018 |
|
|
switch (j->cardtype) {
|
2019 |
|
|
case QTI_PHONEJACK:
|
2020 |
|
|
ixj_gpio_read(j);
|
2021 |
|
|
fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
|
2022 |
|
|
break;
|
2023 |
|
|
case QTI_LINEJACK:
|
2024 |
|
|
case QTI_PHONEJACK_LITE:
|
2025 |
|
|
case QTI_PHONEJACK_PCI:
|
2026 |
|
|
SLIC_GetState(j);
|
2027 |
|
|
if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
|
2028 |
|
|
fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
|
2029 |
|
|
if(fOffHook != j->p_hook) {
|
2030 |
|
|
if(!j->checkwait) {
|
2031 |
|
|
j->checkwait = jiffies;
|
2032 |
|
|
}
|
2033 |
|
|
if(time_before(jiffies, j->checkwait + 2)) {
|
2034 |
|
|
fOffHook ^= 1;
|
2035 |
|
|
} else {
|
2036 |
|
|
j->checkwait = 0;
|
2037 |
|
|
}
|
2038 |
|
|
j->p_hook = fOffHook;
|
2039 |
|
|
printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
|
2040 |
|
|
}
|
2041 |
|
|
} else {
|
2042 |
|
|
if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
|
2043 |
|
|
j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
|
2044 |
|
|
if (j->flags.ringing || j->flags.cringing) {
|
2045 |
|
|
if (!in_interrupt()) {
|
2046 |
|
|
det = jiffies + (hertz / 50);
|
2047 |
|
|
while (time_before(jiffies, det)) {
|
2048 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2049 |
|
|
schedule_timeout(1);
|
2050 |
|
|
}
|
2051 |
|
|
}
|
2052 |
|
|
SLIC_GetState(j);
|
2053 |
|
|
if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
|
2054 |
|
|
ixj_ring_on(j);
|
2055 |
|
|
}
|
2056 |
|
|
}
|
2057 |
|
|
if (j->cardtype == QTI_PHONEJACK_PCI) {
|
2058 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
2059 |
|
|
fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
|
2060 |
|
|
} else
|
2061 |
|
|
fOffHook = j->pld_slicr.bits.det ? 1 : 0;
|
2062 |
|
|
}
|
2063 |
|
|
}
|
2064 |
|
|
break;
|
2065 |
|
|
case QTI_PHONECARD:
|
2066 |
|
|
fOffHook = ixj_pcmcia_cable_check(j);
|
2067 |
|
|
break;
|
2068 |
|
|
}
|
2069 |
|
|
if (j->r_hook != fOffHook) {
|
2070 |
|
|
j->r_hook = fOffHook;
|
2071 |
|
|
if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
|
2072 |
|
|
j->ex.bits.hookstate = 1;
|
2073 |
|
|
ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
|
2074 |
|
|
} else if (!fOffHook) {
|
2075 |
|
|
j->flash_end = jiffies + ((60 * hertz) / 100);
|
2076 |
|
|
}
|
2077 |
|
|
}
|
2078 |
|
|
if (fOffHook) {
|
2079 |
|
|
if(time_before(jiffies, j->flash_end)) {
|
2080 |
|
|
j->ex.bits.flash = 1;
|
2081 |
|
|
j->flash_end = 0;
|
2082 |
|
|
ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
|
2083 |
|
|
}
|
2084 |
|
|
} else {
|
2085 |
|
|
if(time_before(jiffies, j->flash_end)) {
|
2086 |
|
|
fOffHook = 1;
|
2087 |
|
|
}
|
2088 |
|
|
}
|
2089 |
|
|
|
2090 |
|
|
if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
|
2091 |
|
|
fOffHook |= 2;
|
2092 |
|
|
|
2093 |
|
|
if (j->port == PORT_SPEAKER) {
|
2094 |
|
|
if(j->cardtype == QTI_PHONECARD) {
|
2095 |
|
|
if(j->flags.pcmciascp && j->flags.pcmciasct) {
|
2096 |
|
|
fOffHook |= 2;
|
2097 |
|
|
}
|
2098 |
|
|
} else {
|
2099 |
|
|
fOffHook |= 2;
|
2100 |
|
|
}
|
2101 |
|
|
}
|
2102 |
|
|
|
2103 |
|
|
if (j->port == PORT_HANDSET)
|
2104 |
|
|
fOffHook |= 2;
|
2105 |
|
|
|
2106 |
|
|
return fOffHook;
|
2107 |
|
|
}
|
2108 |
|
|
|
2109 |
|
|
static void ixj_ring_off(IXJ *j)
|
2110 |
|
|
{
|
2111 |
|
|
if (j->dsp.low == 0x20) /* Internet PhoneJACK */
|
2112 |
|
|
{
|
2113 |
|
|
if (ixjdebug & 0x0004)
|
2114 |
|
|
printk(KERN_INFO "IXJ Ring Off\n");
|
2115 |
|
|
j->gpio.bytes.high = 0x0B;
|
2116 |
|
|
j->gpio.bytes.low = 0x00;
|
2117 |
|
|
j->gpio.bits.gpio1 = 0;
|
2118 |
|
|
j->gpio.bits.gpio2 = 1;
|
2119 |
|
|
j->gpio.bits.gpio5 = 0;
|
2120 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j);
|
2121 |
|
|
} else /* Internet LineJACK */
|
2122 |
|
|
{
|
2123 |
|
|
if (ixjdebug & 0x0004)
|
2124 |
|
|
printk(KERN_INFO "IXJ Ring Off\n");
|
2125 |
|
|
|
2126 |
|
|
if(!j->flags.cidplay)
|
2127 |
|
|
SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
|
2128 |
|
|
|
2129 |
|
|
SLIC_GetState(j);
|
2130 |
|
|
}
|
2131 |
|
|
}
|
2132 |
|
|
|
2133 |
|
|
static void ixj_ring_start(IXJ *j)
|
2134 |
|
|
{
|
2135 |
|
|
j->flags.cringing = 1;
|
2136 |
|
|
if (ixjdebug & 0x0004)
|
2137 |
|
|
printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
|
2138 |
|
|
if (ixj_hookstate(j) & 1) {
|
2139 |
|
|
if (j->port == PORT_POTS)
|
2140 |
|
|
ixj_ring_off(j);
|
2141 |
|
|
j->flags.cringing = 0;
|
2142 |
|
|
if (ixjdebug & 0x0004)
|
2143 |
|
|
printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
|
2144 |
|
|
} else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
|
2145 |
|
|
j->ring_cadence_jif = jiffies;
|
2146 |
|
|
j->flags.cidsent = j->flags.cidring = 0;
|
2147 |
|
|
j->cadence_f[5].state = 0;
|
2148 |
|
|
if(j->cadence_f[5].on1)
|
2149 |
|
|
ixj_ring_on(j);
|
2150 |
|
|
} else {
|
2151 |
|
|
j->ring_cadence_jif = jiffies;
|
2152 |
|
|
j->ring_cadence_t = 15;
|
2153 |
|
|
if (j->ring_cadence & 1 << j->ring_cadence_t) {
|
2154 |
|
|
ixj_ring_on(j);
|
2155 |
|
|
} else {
|
2156 |
|
|
ixj_ring_off(j);
|
2157 |
|
|
}
|
2158 |
|
|
j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
|
2159 |
|
|
}
|
2160 |
|
|
}
|
2161 |
|
|
|
2162 |
|
|
static int ixj_ring(IXJ *j)
|
2163 |
|
|
{
|
2164 |
|
|
char cntr;
|
2165 |
|
|
unsigned long jif, det;
|
2166 |
|
|
|
2167 |
|
|
j->flags.ringing = 1;
|
2168 |
|
|
if (ixj_hookstate(j) & 1) {
|
2169 |
|
|
ixj_ring_off(j);
|
2170 |
|
|
j->flags.ringing = 0;
|
2171 |
|
|
return 1;
|
2172 |
|
|
}
|
2173 |
|
|
det = 0;
|
2174 |
|
|
for (cntr = 0; cntr < j->maxrings; cntr++) {
|
2175 |
|
|
jif = jiffies + (1 * hertz);
|
2176 |
|
|
ixj_ring_on(j);
|
2177 |
|
|
while (time_before(jiffies, jif)) {
|
2178 |
|
|
if (ixj_hookstate(j) & 1) {
|
2179 |
|
|
ixj_ring_off(j);
|
2180 |
|
|
j->flags.ringing = 0;
|
2181 |
|
|
return 1;
|
2182 |
|
|
}
|
2183 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2184 |
|
|
schedule_timeout(1);
|
2185 |
|
|
if (signal_pending(current))
|
2186 |
|
|
break;
|
2187 |
|
|
}
|
2188 |
|
|
jif = jiffies + (3 * hertz);
|
2189 |
|
|
ixj_ring_off(j);
|
2190 |
|
|
while (time_before(jiffies, jif)) {
|
2191 |
|
|
if (ixj_hookstate(j) & 1) {
|
2192 |
|
|
det = jiffies + (hertz / 100);
|
2193 |
|
|
while (time_before(jiffies, det)) {
|
2194 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2195 |
|
|
schedule_timeout(1);
|
2196 |
|
|
if (signal_pending(current))
|
2197 |
|
|
break;
|
2198 |
|
|
}
|
2199 |
|
|
if (ixj_hookstate(j) & 1) {
|
2200 |
|
|
j->flags.ringing = 0;
|
2201 |
|
|
return 1;
|
2202 |
|
|
}
|
2203 |
|
|
}
|
2204 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2205 |
|
|
schedule_timeout(1);
|
2206 |
|
|
if (signal_pending(current))
|
2207 |
|
|
break;
|
2208 |
|
|
}
|
2209 |
|
|
}
|
2210 |
|
|
ixj_ring_off(j);
|
2211 |
|
|
j->flags.ringing = 0;
|
2212 |
|
|
return 0;
|
2213 |
|
|
}
|
2214 |
|
|
|
2215 |
|
|
static int ixj_open(struct phone_device *p, struct file *file_p)
|
2216 |
|
|
{
|
2217 |
|
|
IXJ *j = get_ixj(p->board);
|
2218 |
|
|
file_p->private_data = j;
|
2219 |
|
|
|
2220 |
|
|
if (!j->DSPbase)
|
2221 |
|
|
return -ENODEV;
|
2222 |
|
|
|
2223 |
|
|
if (file_p->f_mode & FMODE_READ) {
|
2224 |
|
|
if(!j->readers) {
|
2225 |
|
|
j->readers++;
|
2226 |
|
|
} else {
|
2227 |
|
|
return -EBUSY;
|
2228 |
|
|
}
|
2229 |
|
|
}
|
2230 |
|
|
|
2231 |
|
|
if (file_p->f_mode & FMODE_WRITE) {
|
2232 |
|
|
if(!j->writers) {
|
2233 |
|
|
j->writers++;
|
2234 |
|
|
} else {
|
2235 |
|
|
if (file_p->f_mode & FMODE_READ){
|
2236 |
|
|
j->readers--;
|
2237 |
|
|
}
|
2238 |
|
|
return -EBUSY;
|
2239 |
|
|
}
|
2240 |
|
|
}
|
2241 |
|
|
|
2242 |
|
|
if (j->cardtype == QTI_PHONECARD) {
|
2243 |
|
|
j->pslic.bits.powerdown = 0;
|
2244 |
|
|
j->psccr.bits.dev = 3;
|
2245 |
|
|
j->psccr.bits.rw = 0;
|
2246 |
|
|
outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
|
2247 |
|
|
ixj_PCcontrol_wait(j);
|
2248 |
|
|
}
|
2249 |
|
|
|
2250 |
|
|
j->flags.cidplay = 0;
|
2251 |
|
|
j->flags.cidcw_ack = 0;
|
2252 |
|
|
|
2253 |
|
|
MOD_INC_USE_COUNT;
|
2254 |
|
|
|
2255 |
|
|
if (ixjdebug & 0x0002)
|
2256 |
|
|
printk(KERN_INFO "Opening board %d\n", p->board);
|
2257 |
|
|
|
2258 |
|
|
j->framesread = j->frameswritten = 0;
|
2259 |
|
|
return 0;
|
2260 |
|
|
}
|
2261 |
|
|
|
2262 |
|
|
int ixj_release(struct inode *inode, struct file *file_p)
|
2263 |
|
|
{
|
2264 |
|
|
IXJ_TONE ti;
|
2265 |
|
|
int cnt;
|
2266 |
|
|
IXJ *j = file_p->private_data;
|
2267 |
|
|
int board = j->p.board;
|
2268 |
|
|
|
2269 |
|
|
/*
|
2270 |
|
|
* Set up locks to ensure that only one process is talking to the DSP at a time.
|
2271 |
|
|
* This is necessary to keep the DSP from locking up.
|
2272 |
|
|
*/
|
2273 |
|
|
while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
|
2274 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2275 |
|
|
schedule_timeout(1);
|
2276 |
|
|
}
|
2277 |
|
|
if (ixjdebug & 0x0002)
|
2278 |
|
|
printk(KERN_INFO "Closing board %d\n", NUM(inode->i_rdev));
|
2279 |
|
|
|
2280 |
|
|
if (j->cardtype == QTI_PHONECARD)
|
2281 |
|
|
ixj_set_port(j, PORT_SPEAKER);
|
2282 |
|
|
else
|
2283 |
|
|
ixj_set_port(j, PORT_POTS);
|
2284 |
|
|
|
2285 |
|
|
aec_stop(j);
|
2286 |
|
|
ixj_play_stop(j);
|
2287 |
|
|
ixj_record_stop(j);
|
2288 |
|
|
set_play_volume(j, 0x100);
|
2289 |
|
|
set_rec_volume(j, 0x100);
|
2290 |
|
|
ixj_ring_off(j);
|
2291 |
|
|
|
2292 |
|
|
/* Restore the tone table to default settings. */
|
2293 |
|
|
ti.tone_index = 10;
|
2294 |
|
|
ti.gain0 = 1;
|
2295 |
|
|
ti.freq0 = hz941;
|
2296 |
|
|
ti.gain1 = 0;
|
2297 |
|
|
ti.freq1 = hz1209;
|
2298 |
|
|
ixj_init_tone(j, &ti);
|
2299 |
|
|
ti.tone_index = 11;
|
2300 |
|
|
ti.gain0 = 1;
|
2301 |
|
|
ti.freq0 = hz941;
|
2302 |
|
|
ti.gain1 = 0;
|
2303 |
|
|
ti.freq1 = hz1336;
|
2304 |
|
|
ixj_init_tone(j, &ti);
|
2305 |
|
|
ti.tone_index = 12;
|
2306 |
|
|
ti.gain0 = 1;
|
2307 |
|
|
ti.freq0 = hz941;
|
2308 |
|
|
ti.gain1 = 0;
|
2309 |
|
|
ti.freq1 = hz1477;
|
2310 |
|
|
ixj_init_tone(j, &ti);
|
2311 |
|
|
ti.tone_index = 13;
|
2312 |
|
|
ti.gain0 = 1;
|
2313 |
|
|
ti.freq0 = hz800;
|
2314 |
|
|
ti.gain1 = 0;
|
2315 |
|
|
ti.freq1 = 0;
|
2316 |
|
|
ixj_init_tone(j, &ti);
|
2317 |
|
|
ti.tone_index = 14;
|
2318 |
|
|
ti.gain0 = 1;
|
2319 |
|
|
ti.freq0 = hz1000;
|
2320 |
|
|
ti.gain1 = 0;
|
2321 |
|
|
ti.freq1 = 0;
|
2322 |
|
|
ixj_init_tone(j, &ti);
|
2323 |
|
|
ti.tone_index = 15;
|
2324 |
|
|
ti.gain0 = 1;
|
2325 |
|
|
ti.freq0 = hz1250;
|
2326 |
|
|
ti.gain1 = 0;
|
2327 |
|
|
ti.freq1 = 0;
|
2328 |
|
|
ixj_init_tone(j, &ti);
|
2329 |
|
|
ti.tone_index = 16;
|
2330 |
|
|
ti.gain0 = 1;
|
2331 |
|
|
ti.freq0 = hz950;
|
2332 |
|
|
ti.gain1 = 0;
|
2333 |
|
|
ti.freq1 = 0;
|
2334 |
|
|
ixj_init_tone(j, &ti);
|
2335 |
|
|
ti.tone_index = 17;
|
2336 |
|
|
ti.gain0 = 1;
|
2337 |
|
|
ti.freq0 = hz1100;
|
2338 |
|
|
ti.gain1 = 0;
|
2339 |
|
|
ti.freq1 = 0;
|
2340 |
|
|
ixj_init_tone(j, &ti);
|
2341 |
|
|
ti.tone_index = 18;
|
2342 |
|
|
ti.gain0 = 1;
|
2343 |
|
|
ti.freq0 = hz1400;
|
2344 |
|
|
ti.gain1 = 0;
|
2345 |
|
|
ti.freq1 = 0;
|
2346 |
|
|
ixj_init_tone(j, &ti);
|
2347 |
|
|
ti.tone_index = 19;
|
2348 |
|
|
ti.gain0 = 1;
|
2349 |
|
|
ti.freq0 = hz1500;
|
2350 |
|
|
ti.gain1 = 0;
|
2351 |
|
|
ti.freq1 = 0;
|
2352 |
|
|
ixj_init_tone(j, &ti);
|
2353 |
|
|
ti.tone_index = 20;
|
2354 |
|
|
ti.gain0 = 1;
|
2355 |
|
|
ti.freq0 = hz1600;
|
2356 |
|
|
ti.gain1 = 0;
|
2357 |
|
|
ti.freq1 = 0;
|
2358 |
|
|
ixj_init_tone(j, &ti);
|
2359 |
|
|
ti.tone_index = 21;
|
2360 |
|
|
ti.gain0 = 1;
|
2361 |
|
|
ti.freq0 = hz1800;
|
2362 |
|
|
ti.gain1 = 0;
|
2363 |
|
|
ti.freq1 = 0;
|
2364 |
|
|
ixj_init_tone(j, &ti);
|
2365 |
|
|
ti.tone_index = 22;
|
2366 |
|
|
ti.gain0 = 1;
|
2367 |
|
|
ti.freq0 = hz2100;
|
2368 |
|
|
ti.gain1 = 0;
|
2369 |
|
|
ti.freq1 = 0;
|
2370 |
|
|
ixj_init_tone(j, &ti);
|
2371 |
|
|
ti.tone_index = 23;
|
2372 |
|
|
ti.gain0 = 1;
|
2373 |
|
|
ti.freq0 = hz1300;
|
2374 |
|
|
ti.gain1 = 0;
|
2375 |
|
|
ti.freq1 = 0;
|
2376 |
|
|
ixj_init_tone(j, &ti);
|
2377 |
|
|
ti.tone_index = 24;
|
2378 |
|
|
ti.gain0 = 1;
|
2379 |
|
|
ti.freq0 = hz2450;
|
2380 |
|
|
ti.gain1 = 0;
|
2381 |
|
|
ti.freq1 = 0;
|
2382 |
|
|
ixj_init_tone(j, &ti);
|
2383 |
|
|
ti.tone_index = 25;
|
2384 |
|
|
ti.gain0 = 1;
|
2385 |
|
|
ti.freq0 = hz350;
|
2386 |
|
|
ti.gain1 = 0;
|
2387 |
|
|
ti.freq1 = hz440;
|
2388 |
|
|
ixj_init_tone(j, &ti);
|
2389 |
|
|
ti.tone_index = 26;
|
2390 |
|
|
ti.gain0 = 1;
|
2391 |
|
|
ti.freq0 = hz440;
|
2392 |
|
|
ti.gain1 = 0;
|
2393 |
|
|
ti.freq1 = hz480;
|
2394 |
|
|
ixj_init_tone(j, &ti);
|
2395 |
|
|
ti.tone_index = 27;
|
2396 |
|
|
ti.gain0 = 1;
|
2397 |
|
|
ti.freq0 = hz480;
|
2398 |
|
|
ti.gain1 = 0;
|
2399 |
|
|
ti.freq1 = hz620;
|
2400 |
|
|
ixj_init_tone(j, &ti);
|
2401 |
|
|
|
2402 |
|
|
set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
|
2403 |
|
|
|
2404 |
|
|
set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
|
2405 |
|
|
|
2406 |
|
|
j->ex.bits.dtmf_ready = 0;
|
2407 |
|
|
j->dtmf_state = 0;
|
2408 |
|
|
j->dtmf_wp = j->dtmf_rp = 0;
|
2409 |
|
|
j->rec_mode = j->play_mode = -1;
|
2410 |
|
|
j->flags.ringing = 0;
|
2411 |
|
|
j->maxrings = MAXRINGS;
|
2412 |
|
|
j->ring_cadence = USA_RING_CADENCE;
|
2413 |
|
|
if(j->cadence_f[5].enable) {
|
2414 |
|
|
j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
|
2415 |
|
|
}
|
2416 |
|
|
j->drybuffer = 0;
|
2417 |
|
|
j->winktime = 320;
|
2418 |
|
|
j->flags.dtmf_oob = 0;
|
2419 |
|
|
for (cnt = 0; cnt < 4; cnt++)
|
2420 |
|
|
j->cadence_f[cnt].enable = 0;
|
2421 |
|
|
|
2422 |
|
|
idle(j);
|
2423 |
|
|
|
2424 |
|
|
if(j->cardtype == QTI_PHONECARD) {
|
2425 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OC, j);
|
2426 |
|
|
}
|
2427 |
|
|
|
2428 |
|
|
if (file_p->f_mode & FMODE_READ)
|
2429 |
|
|
j->readers--;
|
2430 |
|
|
if (file_p->f_mode & FMODE_WRITE)
|
2431 |
|
|
j->writers--;
|
2432 |
|
|
|
2433 |
|
|
if (j->read_buffer && !j->readers) {
|
2434 |
|
|
kfree(j->read_buffer);
|
2435 |
|
|
j->read_buffer = NULL;
|
2436 |
|
|
j->read_buffer_size = 0;
|
2437 |
|
|
}
|
2438 |
|
|
if (j->write_buffer && !j->writers) {
|
2439 |
|
|
kfree(j->write_buffer);
|
2440 |
|
|
j->write_buffer = NULL;
|
2441 |
|
|
j->write_buffer_size = 0;
|
2442 |
|
|
}
|
2443 |
|
|
j->rec_codec = j->play_codec = 0;
|
2444 |
|
|
j->rec_frame_size = j->play_frame_size = 0;
|
2445 |
|
|
j->flags.cidsent = j->flags.cidring = 0;
|
2446 |
|
|
ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
|
2447 |
|
|
|
2448 |
|
|
if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
|
2449 |
|
|
ixj_set_port(j, PORT_PSTN);
|
2450 |
|
|
daa_set_mode(j, SOP_PU_SLEEP);
|
2451 |
|
|
ixj_set_pots(j, 1);
|
2452 |
|
|
}
|
2453 |
|
|
ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
|
2454 |
|
|
|
2455 |
|
|
/* Set up the default signals for events */
|
2456 |
|
|
for (cnt = 0; cnt < 35; cnt++)
|
2457 |
|
|
j->ixj_signals[cnt] = SIGIO;
|
2458 |
|
|
|
2459 |
|
|
/* Set the excetion signal enable flags */
|
2460 |
|
|
j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
|
2461 |
|
|
j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
|
2462 |
|
|
j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
|
2463 |
|
|
|
2464 |
|
|
file_p->private_data = NULL;
|
2465 |
|
|
clear_bit(board, &j->busyflags);
|
2466 |
|
|
MOD_DEC_USE_COUNT;
|
2467 |
|
|
return 0;
|
2468 |
|
|
}
|
2469 |
|
|
|
2470 |
|
|
static int read_filters(IXJ *j)
|
2471 |
|
|
{
|
2472 |
|
|
unsigned short fc, cnt, trg;
|
2473 |
|
|
int var;
|
2474 |
|
|
|
2475 |
|
|
trg = 0;
|
2476 |
|
|
if (ixj_WriteDSPCommand(0x5144, j)) {
|
2477 |
|
|
if(ixjdebug & 0x0001) {
|
2478 |
|
|
printk(KERN_INFO "Read Frame Counter failed!\n");
|
2479 |
|
|
}
|
2480 |
|
|
return -1;
|
2481 |
|
|
}
|
2482 |
|
|
fc = j->ssr.high << 8 | j->ssr.low;
|
2483 |
|
|
if (fc == j->frame_count)
|
2484 |
|
|
return 1;
|
2485 |
|
|
|
2486 |
|
|
j->frame_count = fc;
|
2487 |
|
|
|
2488 |
|
|
if (j->dtmf_proc)
|
2489 |
|
|
return 1;
|
2490 |
|
|
|
2491 |
|
|
var = 10;
|
2492 |
|
|
|
2493 |
|
|
for (cnt = 0; cnt < 4; cnt++) {
|
2494 |
|
|
if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
|
2495 |
|
|
if(ixjdebug & 0x0001) {
|
2496 |
|
|
printk(KERN_INFO "Select Filter %d failed!\n", cnt);
|
2497 |
|
|
}
|
2498 |
|
|
return -1;
|
2499 |
|
|
}
|
2500 |
|
|
if (ixj_WriteDSPCommand(0x515C, j)) {
|
2501 |
|
|
if(ixjdebug & 0x0001) {
|
2502 |
|
|
printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
|
2503 |
|
|
}
|
2504 |
|
|
return -1;
|
2505 |
|
|
}
|
2506 |
|
|
j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
|
2507 |
|
|
|
2508 |
|
|
if (j->cadence_f[cnt].enable) {
|
2509 |
|
|
if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
|
2510 |
|
|
if (j->cadence_f[cnt].state == 0) {
|
2511 |
|
|
j->cadence_f[cnt].state = 1;
|
2512 |
|
|
j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
|
2513 |
|
|
j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
|
2514 |
|
|
j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
|
2515 |
|
|
} else if (j->cadence_f[cnt].state == 2 &&
|
2516 |
|
|
(time_after(jiffies, j->cadence_f[cnt].off1min) &&
|
2517 |
|
|
time_before(jiffies, j->cadence_f[cnt].off1max))) {
|
2518 |
|
|
if (j->cadence_f[cnt].on2) {
|
2519 |
|
|
j->cadence_f[cnt].state = 3;
|
2520 |
|
|
j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
|
2521 |
|
|
j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
|
2522 |
|
|
j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
|
2523 |
|
|
} else {
|
2524 |
|
|
j->cadence_f[cnt].state = 7;
|
2525 |
|
|
}
|
2526 |
|
|
} else if (j->cadence_f[cnt].state == 4 &&
|
2527 |
|
|
(time_after(jiffies, j->cadence_f[cnt].off2min) &&
|
2528 |
|
|
time_before(jiffies, j->cadence_f[cnt].off2max))) {
|
2529 |
|
|
if (j->cadence_f[cnt].on3) {
|
2530 |
|
|
j->cadence_f[cnt].state = 5;
|
2531 |
|
|
j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
|
2532 |
|
|
j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
|
2533 |
|
|
j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
|
2534 |
|
|
} else {
|
2535 |
|
|
j->cadence_f[cnt].state = 7;
|
2536 |
|
|
}
|
2537 |
|
|
} else {
|
2538 |
|
|
j->cadence_f[cnt].state = 0;
|
2539 |
|
|
}
|
2540 |
|
|
} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
|
2541 |
|
|
if (j->cadence_f[cnt].state == 1) {
|
2542 |
|
|
if(!j->cadence_f[cnt].on1) {
|
2543 |
|
|
j->cadence_f[cnt].state = 7;
|
2544 |
|
|
} else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
|
2545 |
|
|
time_before(jiffies, j->cadence_f[cnt].on1max))) {
|
2546 |
|
|
if(j->cadence_f[cnt].off1) {
|
2547 |
|
|
j->cadence_f[cnt].state = 2;
|
2548 |
|
|
j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
|
2549 |
|
|
j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
|
2550 |
|
|
j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
|
2551 |
|
|
} else {
|
2552 |
|
|
j->cadence_f[cnt].state = 7;
|
2553 |
|
|
}
|
2554 |
|
|
} else {
|
2555 |
|
|
j->cadence_f[cnt].state = 0;
|
2556 |
|
|
}
|
2557 |
|
|
} else if (j->cadence_f[cnt].state == 3) {
|
2558 |
|
|
if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
|
2559 |
|
|
time_before(jiffies, j->cadence_f[cnt].on2max))) {
|
2560 |
|
|
if(j->cadence_f[cnt].off2) {
|
2561 |
|
|
j->cadence_f[cnt].state = 4;
|
2562 |
|
|
j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
|
2563 |
|
|
j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
|
2564 |
|
|
j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
|
2565 |
|
|
} else {
|
2566 |
|
|
j->cadence_f[cnt].state = 7;
|
2567 |
|
|
}
|
2568 |
|
|
} else {
|
2569 |
|
|
j->cadence_f[cnt].state = 0;
|
2570 |
|
|
}
|
2571 |
|
|
} else if (j->cadence_f[cnt].state == 5) {
|
2572 |
|
|
if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
|
2573 |
|
|
time_before(jiffies, j->cadence_f[cnt].on3max))) {
|
2574 |
|
|
if(j->cadence_f[cnt].off3) {
|
2575 |
|
|
j->cadence_f[cnt].state = 6;
|
2576 |
|
|
j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
|
2577 |
|
|
j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
|
2578 |
|
|
j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
|
2579 |
|
|
} else {
|
2580 |
|
|
j->cadence_f[cnt].state = 7;
|
2581 |
|
|
}
|
2582 |
|
|
} else {
|
2583 |
|
|
j->cadence_f[cnt].state = 0;
|
2584 |
|
|
}
|
2585 |
|
|
} else {
|
2586 |
|
|
j->cadence_f[cnt].state = 0;
|
2587 |
|
|
}
|
2588 |
|
|
} else {
|
2589 |
|
|
switch(j->cadence_f[cnt].state) {
|
2590 |
|
|
case 1:
|
2591 |
|
|
if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
|
2592 |
|
|
!j->cadence_f[cnt].off1 &&
|
2593 |
|
|
!j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
|
2594 |
|
|
!j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
|
2595 |
|
|
j->cadence_f[cnt].state = 7;
|
2596 |
|
|
}
|
2597 |
|
|
break;
|
2598 |
|
|
case 3:
|
2599 |
|
|
if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
|
2600 |
|
|
!j->cadence_f[cnt].off2 &&
|
2601 |
|
|
!j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
|
2602 |
|
|
j->cadence_f[cnt].state = 7;
|
2603 |
|
|
}
|
2604 |
|
|
break;
|
2605 |
|
|
case 5:
|
2606 |
|
|
if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
|
2607 |
|
|
!j->cadence_f[cnt].off3) {
|
2608 |
|
|
j->cadence_f[cnt].state = 7;
|
2609 |
|
|
}
|
2610 |
|
|
break;
|
2611 |
|
|
}
|
2612 |
|
|
}
|
2613 |
|
|
|
2614 |
|
|
if (ixjdebug & 0x0040) {
|
2615 |
|
|
printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
|
2616 |
|
|
switch(j->cadence_f[cnt].state) {
|
2617 |
|
|
case 0:
|
2618 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
|
2619 |
|
|
break;
|
2620 |
|
|
case 1:
|
2621 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
|
2622 |
|
|
j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
|
2623 |
|
|
break;
|
2624 |
|
|
case 2:
|
2625 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
|
2626 |
|
|
j->cadence_f[cnt].off1max);
|
2627 |
|
|
break;
|
2628 |
|
|
case 3:
|
2629 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
|
2630 |
|
|
j->cadence_f[cnt].on2max);
|
2631 |
|
|
break;
|
2632 |
|
|
case 4:
|
2633 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
|
2634 |
|
|
j->cadence_f[cnt].off2max);
|
2635 |
|
|
break;
|
2636 |
|
|
case 5:
|
2637 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
|
2638 |
|
|
j->cadence_f[cnt].on3max);
|
2639 |
|
|
break;
|
2640 |
|
|
case 6:
|
2641 |
|
|
printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
|
2642 |
|
|
j->cadence_f[cnt].off3max);
|
2643 |
|
|
break;
|
2644 |
|
|
}
|
2645 |
|
|
}
|
2646 |
|
|
}
|
2647 |
|
|
if (j->cadence_f[cnt].state == 7) {
|
2648 |
|
|
j->cadence_f[cnt].state = 0;
|
2649 |
|
|
if (j->cadence_f[cnt].enable == 1)
|
2650 |
|
|
j->cadence_f[cnt].enable = 0;
|
2651 |
|
|
switch (cnt) {
|
2652 |
|
|
case 0:
|
2653 |
|
|
if(ixjdebug & 0x0020) {
|
2654 |
|
|
printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
|
2655 |
|
|
}
|
2656 |
|
|
j->ex.bits.fc0 = 1;
|
2657 |
|
|
ixj_kill_fasync(j, SIG_FC0, POLL_IN);
|
2658 |
|
|
break;
|
2659 |
|
|
case 1:
|
2660 |
|
|
if(ixjdebug & 0x0020) {
|
2661 |
|
|
printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
|
2662 |
|
|
}
|
2663 |
|
|
j->ex.bits.fc1 = 1;
|
2664 |
|
|
ixj_kill_fasync(j, SIG_FC1, POLL_IN);
|
2665 |
|
|
break;
|
2666 |
|
|
case 2:
|
2667 |
|
|
if(ixjdebug & 0x0020) {
|
2668 |
|
|
printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
|
2669 |
|
|
}
|
2670 |
|
|
j->ex.bits.fc2 = 1;
|
2671 |
|
|
ixj_kill_fasync(j, SIG_FC2, POLL_IN);
|
2672 |
|
|
break;
|
2673 |
|
|
case 3:
|
2674 |
|
|
if(ixjdebug & 0x0020) {
|
2675 |
|
|
printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
|
2676 |
|
|
}
|
2677 |
|
|
j->ex.bits.fc3 = 1;
|
2678 |
|
|
ixj_kill_fasync(j, SIG_FC3, POLL_IN);
|
2679 |
|
|
break;
|
2680 |
|
|
}
|
2681 |
|
|
}
|
2682 |
|
|
if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
|
2683 |
|
|
(j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
|
2684 |
|
|
if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
|
2685 |
|
|
trg = 1;
|
2686 |
|
|
} else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
|
2687 |
|
|
trg = 0;
|
2688 |
|
|
}
|
2689 |
|
|
switch (cnt) {
|
2690 |
|
|
case 0:
|
2691 |
|
|
if(ixjdebug & 0x0020) {
|
2692 |
|
|
printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
|
2693 |
|
|
}
|
2694 |
|
|
j->ex.bits.f0 = 1;
|
2695 |
|
|
ixj_kill_fasync(j, SIG_F0, POLL_IN);
|
2696 |
|
|
break;
|
2697 |
|
|
case 1:
|
2698 |
|
|
if(ixjdebug & 0x0020) {
|
2699 |
|
|
printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
|
2700 |
|
|
}
|
2701 |
|
|
j->ex.bits.f1 = 1;
|
2702 |
|
|
ixj_kill_fasync(j, SIG_F1, POLL_IN);
|
2703 |
|
|
break;
|
2704 |
|
|
case 2:
|
2705 |
|
|
if(ixjdebug & 0x0020) {
|
2706 |
|
|
printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
|
2707 |
|
|
}
|
2708 |
|
|
j->ex.bits.f2 = 1;
|
2709 |
|
|
ixj_kill_fasync(j, SIG_F2, POLL_IN);
|
2710 |
|
|
break;
|
2711 |
|
|
case 3:
|
2712 |
|
|
if(ixjdebug & 0x0020) {
|
2713 |
|
|
printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
|
2714 |
|
|
}
|
2715 |
|
|
j->ex.bits.f3 = 1;
|
2716 |
|
|
ixj_kill_fasync(j, SIG_F3, POLL_IN);
|
2717 |
|
|
break;
|
2718 |
|
|
}
|
2719 |
|
|
}
|
2720 |
|
|
}
|
2721 |
|
|
return 0;
|
2722 |
|
|
}
|
2723 |
|
|
|
2724 |
|
|
static int LineMonitor(IXJ *j)
|
2725 |
|
|
{
|
2726 |
|
|
if (j->dtmf_proc) {
|
2727 |
|
|
return -1;
|
2728 |
|
|
}
|
2729 |
|
|
j->dtmf_proc = 1;
|
2730 |
|
|
|
2731 |
|
|
if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
|
2732 |
|
|
return -1;
|
2733 |
|
|
|
2734 |
|
|
j->dtmf.bytes.high = j->ssr.high;
|
2735 |
|
|
j->dtmf.bytes.low = j->ssr.low;
|
2736 |
|
|
if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
|
2737 |
|
|
j->dtmf_state = 1;
|
2738 |
|
|
j->dtmf_current = j->dtmf.bits.digit;
|
2739 |
|
|
}
|
2740 |
|
|
if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
|
2741 |
|
|
{
|
2742 |
|
|
if(!j->cidcw_wait) {
|
2743 |
|
|
j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
|
2744 |
|
|
j->dtmf_wp++;
|
2745 |
|
|
if (j->dtmf_wp == 79)
|
2746 |
|
|
j->dtmf_wp = 0;
|
2747 |
|
|
j->ex.bits.dtmf_ready = 1;
|
2748 |
|
|
if(j->ex_sig.bits.dtmf_ready) {
|
2749 |
|
|
ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
|
2750 |
|
|
}
|
2751 |
|
|
}
|
2752 |
|
|
else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
|
2753 |
|
|
if(ixjdebug & 0x0020) {
|
2754 |
|
|
printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
|
2755 |
|
|
}
|
2756 |
|
|
j->flags.cidcw_ack = 1;
|
2757 |
|
|
}
|
2758 |
|
|
j->dtmf_state = 0;
|
2759 |
|
|
}
|
2760 |
|
|
j->dtmf_proc = 0;
|
2761 |
|
|
|
2762 |
|
|
return 0;
|
2763 |
|
|
}
|
2764 |
|
|
|
2765 |
|
|
/************************************************************************
|
2766 |
|
|
*
|
2767 |
|
|
* Functions to allow alaw <-> ulaw conversions.
|
2768 |
|
|
*
|
2769 |
|
|
************************************************************************/
|
2770 |
|
|
|
2771 |
|
|
static void ulaw2alaw(unsigned char *buff, unsigned long len)
|
2772 |
|
|
{
|
2773 |
|
|
static unsigned char table_ulaw2alaw[] =
|
2774 |
|
|
{
|
2775 |
|
|
0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
|
2776 |
|
|
0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
|
2777 |
|
|
0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
|
2778 |
|
|
0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
|
2779 |
|
|
0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
|
2780 |
|
|
0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
|
2781 |
|
|
0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
|
2782 |
|
|
0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
|
2783 |
|
|
0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
|
2784 |
|
|
0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
|
2785 |
|
|
0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
|
2786 |
|
|
0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
|
2787 |
|
|
0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
|
2788 |
|
|
0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
|
2789 |
|
|
0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
|
2790 |
|
|
0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
|
2791 |
|
|
0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
|
2792 |
|
|
0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
|
2793 |
|
|
0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
|
2794 |
|
|
0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
|
2795 |
|
|
0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
|
2796 |
|
|
0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
|
2797 |
|
|
0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
|
2798 |
|
|
0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
|
2799 |
|
|
0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
|
2800 |
|
|
0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
|
2801 |
|
|
0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
|
2802 |
|
|
0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
|
2803 |
|
|
0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
|
2804 |
|
|
0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
|
2805 |
|
|
0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
|
2806 |
|
|
0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
|
2807 |
|
|
};
|
2808 |
|
|
|
2809 |
|
|
while (len--)
|
2810 |
|
|
{
|
2811 |
|
|
*buff = table_ulaw2alaw[*(unsigned char *)buff];
|
2812 |
|
|
buff++;
|
2813 |
|
|
}
|
2814 |
|
|
}
|
2815 |
|
|
|
2816 |
|
|
static void alaw2ulaw(unsigned char *buff, unsigned long len)
|
2817 |
|
|
{
|
2818 |
|
|
static unsigned char table_alaw2ulaw[] =
|
2819 |
|
|
{
|
2820 |
|
|
0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
|
2821 |
|
|
0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
|
2822 |
|
|
0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
|
2823 |
|
|
0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
|
2824 |
|
|
0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
|
2825 |
|
|
0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
|
2826 |
|
|
0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
|
2827 |
|
|
0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
|
2828 |
|
|
0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
|
2829 |
|
|
0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
|
2830 |
|
|
0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
|
2831 |
|
|
0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
|
2832 |
|
|
0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
|
2833 |
|
|
0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
|
2834 |
|
|
0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
|
2835 |
|
|
0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
|
2836 |
|
|
0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
|
2837 |
|
|
0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
|
2838 |
|
|
0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
|
2839 |
|
|
0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
|
2840 |
|
|
0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
|
2841 |
|
|
0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
|
2842 |
|
|
0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
|
2843 |
|
|
0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
|
2844 |
|
|
0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
|
2845 |
|
|
0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
|
2846 |
|
|
0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
|
2847 |
|
|
0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
|
2848 |
|
|
0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
|
2849 |
|
|
0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
|
2850 |
|
|
0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
|
2851 |
|
|
0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
|
2852 |
|
|
};
|
2853 |
|
|
|
2854 |
|
|
while (len--)
|
2855 |
|
|
{
|
2856 |
|
|
*buff = table_alaw2ulaw[*(unsigned char *)buff];
|
2857 |
|
|
buff++;
|
2858 |
|
|
}
|
2859 |
|
|
}
|
2860 |
|
|
|
2861 |
|
|
static ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
|
2862 |
|
|
{
|
2863 |
|
|
unsigned long i = *ppos;
|
2864 |
|
|
IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
|
2865 |
|
|
|
2866 |
|
|
DECLARE_WAITQUEUE(wait, current);
|
2867 |
|
|
|
2868 |
|
|
if (j->flags.inread)
|
2869 |
|
|
return -EALREADY;
|
2870 |
|
|
|
2871 |
|
|
j->flags.inread = 1;
|
2872 |
|
|
|
2873 |
|
|
add_wait_queue(&j->read_q, &wait);
|
2874 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2875 |
|
|
mb();
|
2876 |
|
|
|
2877 |
|
|
while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
|
2878 |
|
|
++j->read_wait;
|
2879 |
|
|
if (file_p->f_flags & O_NONBLOCK) {
|
2880 |
|
|
set_current_state(TASK_RUNNING);
|
2881 |
|
|
remove_wait_queue(&j->read_q, &wait);
|
2882 |
|
|
j->flags.inread = 0;
|
2883 |
|
|
return -EAGAIN;
|
2884 |
|
|
}
|
2885 |
|
|
if (!ixj_hookstate(j)) {
|
2886 |
|
|
set_current_state(TASK_RUNNING);
|
2887 |
|
|
remove_wait_queue(&j->read_q, &wait);
|
2888 |
|
|
j->flags.inread = 0;
|
2889 |
|
|
return 0;
|
2890 |
|
|
}
|
2891 |
|
|
interruptible_sleep_on(&j->read_q);
|
2892 |
|
|
if (signal_pending(current)) {
|
2893 |
|
|
set_current_state(TASK_RUNNING);
|
2894 |
|
|
remove_wait_queue(&j->read_q, &wait);
|
2895 |
|
|
j->flags.inread = 0;
|
2896 |
|
|
return -EINTR;
|
2897 |
|
|
}
|
2898 |
|
|
}
|
2899 |
|
|
|
2900 |
|
|
remove_wait_queue(&j->read_q, &wait);
|
2901 |
|
|
set_current_state(TASK_RUNNING);
|
2902 |
|
|
/* Don't ever copy more than the user asks */
|
2903 |
|
|
if(j->rec_codec == ALAW)
|
2904 |
|
|
ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
|
2905 |
|
|
i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
|
2906 |
|
|
j->read_buffer_ready = 0;
|
2907 |
|
|
if (i) {
|
2908 |
|
|
j->flags.inread = 0;
|
2909 |
|
|
return -EFAULT;
|
2910 |
|
|
} else {
|
2911 |
|
|
j->flags.inread = 0;
|
2912 |
|
|
return min(length, j->read_buffer_size);
|
2913 |
|
|
}
|
2914 |
|
|
}
|
2915 |
|
|
|
2916 |
|
|
static ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
|
2917 |
|
|
loff_t * ppos)
|
2918 |
|
|
{
|
2919 |
|
|
int pre_retval;
|
2920 |
|
|
ssize_t read_retval = 0;
|
2921 |
|
|
IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
|
2922 |
|
|
|
2923 |
|
|
pre_retval = ixj_PreRead(j, 0L);
|
2924 |
|
|
switch (pre_retval) {
|
2925 |
|
|
case NORMAL:
|
2926 |
|
|
read_retval = ixj_read(file_p, buf, length, ppos);
|
2927 |
|
|
ixj_PostRead(j, 0L);
|
2928 |
|
|
break;
|
2929 |
|
|
case NOPOST:
|
2930 |
|
|
read_retval = ixj_read(file_p, buf, length, ppos);
|
2931 |
|
|
break;
|
2932 |
|
|
case POSTONLY:
|
2933 |
|
|
ixj_PostRead(j, 0L);
|
2934 |
|
|
break;
|
2935 |
|
|
default:
|
2936 |
|
|
read_retval = pre_retval;
|
2937 |
|
|
}
|
2938 |
|
|
return read_retval;
|
2939 |
|
|
}
|
2940 |
|
|
|
2941 |
|
|
static ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
|
2942 |
|
|
{
|
2943 |
|
|
unsigned long i = *ppos;
|
2944 |
|
|
IXJ *j = file_p->private_data;
|
2945 |
|
|
|
2946 |
|
|
DECLARE_WAITQUEUE(wait, current);
|
2947 |
|
|
|
2948 |
|
|
if (j->flags.inwrite)
|
2949 |
|
|
return -EALREADY;
|
2950 |
|
|
|
2951 |
|
|
j->flags.inwrite = 1;
|
2952 |
|
|
|
2953 |
|
|
add_wait_queue(&j->write_q, &wait);
|
2954 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
2955 |
|
|
mb();
|
2956 |
|
|
|
2957 |
|
|
|
2958 |
|
|
while (!j->write_buffers_empty) {
|
2959 |
|
|
++j->write_wait;
|
2960 |
|
|
if (file_p->f_flags & O_NONBLOCK) {
|
2961 |
|
|
set_current_state(TASK_RUNNING);
|
2962 |
|
|
remove_wait_queue(&j->write_q, &wait);
|
2963 |
|
|
j->flags.inwrite = 0;
|
2964 |
|
|
return -EAGAIN;
|
2965 |
|
|
}
|
2966 |
|
|
if (!ixj_hookstate(j)) {
|
2967 |
|
|
set_current_state(TASK_RUNNING);
|
2968 |
|
|
remove_wait_queue(&j->write_q, &wait);
|
2969 |
|
|
j->flags.inwrite = 0;
|
2970 |
|
|
return 0;
|
2971 |
|
|
}
|
2972 |
|
|
interruptible_sleep_on(&j->write_q);
|
2973 |
|
|
if (signal_pending(current)) {
|
2974 |
|
|
set_current_state(TASK_RUNNING);
|
2975 |
|
|
remove_wait_queue(&j->write_q, &wait);
|
2976 |
|
|
j->flags.inwrite = 0;
|
2977 |
|
|
return -EINTR;
|
2978 |
|
|
}
|
2979 |
|
|
}
|
2980 |
|
|
set_current_state(TASK_RUNNING);
|
2981 |
|
|
remove_wait_queue(&j->write_q, &wait);
|
2982 |
|
|
if (j->write_buffer_wp + count >= j->write_buffer_end)
|
2983 |
|
|
j->write_buffer_wp = j->write_buffer;
|
2984 |
|
|
i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
|
2985 |
|
|
if (i) {
|
2986 |
|
|
j->flags.inwrite = 0;
|
2987 |
|
|
return -EFAULT;
|
2988 |
|
|
}
|
2989 |
|
|
if(j->play_codec == ALAW)
|
2990 |
|
|
alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
|
2991 |
|
|
j->flags.inwrite = 0;
|
2992 |
|
|
return min(count, j->write_buffer_size);
|
2993 |
|
|
}
|
2994 |
|
|
|
2995 |
|
|
static ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
|
2996 |
|
|
{
|
2997 |
|
|
int pre_retval;
|
2998 |
|
|
ssize_t write_retval = 0;
|
2999 |
|
|
|
3000 |
|
|
IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
|
3001 |
|
|
|
3002 |
|
|
pre_retval = ixj_PreWrite(j, 0L);
|
3003 |
|
|
switch (pre_retval) {
|
3004 |
|
|
case NORMAL:
|
3005 |
|
|
write_retval = ixj_write(file_p, buf, count, ppos);
|
3006 |
|
|
if (write_retval > 0) {
|
3007 |
|
|
ixj_PostWrite(j, 0L);
|
3008 |
|
|
j->write_buffer_wp += write_retval;
|
3009 |
|
|
j->write_buffers_empty--;
|
3010 |
|
|
}
|
3011 |
|
|
break;
|
3012 |
|
|
case NOPOST:
|
3013 |
|
|
write_retval = ixj_write(file_p, buf, count, ppos);
|
3014 |
|
|
if (write_retval > 0) {
|
3015 |
|
|
j->write_buffer_wp += write_retval;
|
3016 |
|
|
j->write_buffers_empty--;
|
3017 |
|
|
}
|
3018 |
|
|
break;
|
3019 |
|
|
case POSTONLY:
|
3020 |
|
|
ixj_PostWrite(j, 0L);
|
3021 |
|
|
break;
|
3022 |
|
|
default:
|
3023 |
|
|
write_retval = pre_retval;
|
3024 |
|
|
}
|
3025 |
|
|
return write_retval;
|
3026 |
|
|
}
|
3027 |
|
|
|
3028 |
|
|
static void ixj_read_frame(IXJ *j)
|
3029 |
|
|
{
|
3030 |
|
|
int cnt, dly;
|
3031 |
|
|
|
3032 |
|
|
if (j->read_buffer) {
|
3033 |
|
|
for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
|
3034 |
|
|
if (!(cnt % 16) && !IsRxReady(j)) {
|
3035 |
|
|
dly = 0;
|
3036 |
|
|
while (!IsRxReady(j)) {
|
3037 |
|
|
if (dly++ > 5) {
|
3038 |
|
|
dly = 0;
|
3039 |
|
|
break;
|
3040 |
|
|
}
|
3041 |
|
|
udelay(10);
|
3042 |
|
|
}
|
3043 |
|
|
}
|
3044 |
|
|
/* Throw away word 0 of the 8021 compressed format to get standard G.729. */
|
3045 |
|
|
if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
|
3046 |
|
|
inb_p(j->DSPbase + 0x0E);
|
3047 |
|
|
inb_p(j->DSPbase + 0x0F);
|
3048 |
|
|
}
|
3049 |
|
|
*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
|
3050 |
|
|
*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
|
3051 |
|
|
}
|
3052 |
|
|
++j->framesread;
|
3053 |
|
|
if (j->intercom != -1) {
|
3054 |
|
|
if (IsTxReady(get_ixj(j->intercom))) {
|
3055 |
|
|
for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
|
3056 |
|
|
if (!(cnt % 16) && !IsTxReady(j)) {
|
3057 |
|
|
dly = 0;
|
3058 |
|
|
while (!IsTxReady(j)) {
|
3059 |
|
|
if (dly++ > 5) {
|
3060 |
|
|
dly = 0;
|
3061 |
|
|
break;
|
3062 |
|
|
}
|
3063 |
|
|
udelay(10);
|
3064 |
|
|
}
|
3065 |
|
|
}
|
3066 |
|
|
outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
|
3067 |
|
|
outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
|
3068 |
|
|
}
|
3069 |
|
|
get_ixj(j->intercom)->frameswritten++;
|
3070 |
|
|
}
|
3071 |
|
|
} else {
|
3072 |
|
|
j->read_buffer_ready = 1;
|
3073 |
|
|
wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
|
3074 |
|
|
|
3075 |
|
|
wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
|
3076 |
|
|
|
3077 |
|
|
if(j->ixj_signals[SIG_READ_READY])
|
3078 |
|
|
ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
|
3079 |
|
|
}
|
3080 |
|
|
}
|
3081 |
|
|
}
|
3082 |
|
|
|
3083 |
|
|
static short fsk[][6][20] =
|
3084 |
|
|
{
|
3085 |
|
|
{
|
3086 |
|
|
{
|
3087 |
|
|
0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
|
3088 |
|
|
-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
|
3089 |
|
|
},
|
3090 |
|
|
{
|
3091 |
|
|
-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
|
3092 |
|
|
-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
|
3093 |
|
|
},
|
3094 |
|
|
{
|
3095 |
|
|
-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
|
3096 |
|
|
-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
|
3097 |
|
|
},
|
3098 |
|
|
{
|
3099 |
|
|
0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
|
3100 |
|
|
16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
|
3101 |
|
|
},
|
3102 |
|
|
{
|
3103 |
|
|
28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
|
3104 |
|
|
32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
|
3105 |
|
|
},
|
3106 |
|
|
{
|
3107 |
|
|
28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
|
3108 |
|
|
16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
|
3109 |
|
|
}
|
3110 |
|
|
},
|
3111 |
|
|
{
|
3112 |
|
|
{
|
3113 |
|
|
0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
|
3114 |
|
|
0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
|
3115 |
|
|
},
|
3116 |
|
|
{
|
3117 |
|
|
-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
|
3118 |
|
|
28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
|
3119 |
|
|
},
|
3120 |
|
|
{
|
3121 |
|
|
-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
|
3122 |
|
|
28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
|
3123 |
|
|
},
|
3124 |
|
|
{
|
3125 |
|
|
0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
|
3126 |
|
|
0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
|
3127 |
|
|
},
|
3128 |
|
|
{
|
3129 |
|
|
28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
|
3130 |
|
|
-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
|
3131 |
|
|
},
|
3132 |
|
|
{
|
3133 |
|
|
28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
|
3134 |
|
|
-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
|
3135 |
|
|
}
|
3136 |
|
|
}
|
3137 |
|
|
};
|
3138 |
|
|
|
3139 |
|
|
|
3140 |
|
|
static void ixj_write_cid_bit(IXJ *j, int bit)
|
3141 |
|
|
{
|
3142 |
|
|
while (j->fskcnt < 20) {
|
3143 |
|
|
if(j->fskdcnt < (j->fsksize - 1))
|
3144 |
|
|
j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
|
3145 |
|
|
|
3146 |
|
|
j->fskcnt += 3;
|
3147 |
|
|
}
|
3148 |
|
|
j->fskcnt %= 20;
|
3149 |
|
|
|
3150 |
|
|
if (!bit)
|
3151 |
|
|
j->fskz++;
|
3152 |
|
|
if (j->fskz >= 6)
|
3153 |
|
|
j->fskz = 0;
|
3154 |
|
|
|
3155 |
|
|
}
|
3156 |
|
|
|
3157 |
|
|
static void ixj_write_cid_byte(IXJ *j, char byte)
|
3158 |
|
|
{
|
3159 |
|
|
IXJ_CBYTE cb;
|
3160 |
|
|
|
3161 |
|
|
cb.cbyte = byte;
|
3162 |
|
|
ixj_write_cid_bit(j, 0);
|
3163 |
|
|
ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
|
3164 |
|
|
ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
|
3165 |
|
|
ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
|
3166 |
|
|
ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
|
3167 |
|
|
ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
|
3168 |
|
|
ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
|
3169 |
|
|
ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
|
3170 |
|
|
ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
|
3171 |
|
|
ixj_write_cid_bit(j, 1);
|
3172 |
|
|
}
|
3173 |
|
|
|
3174 |
|
|
static void ixj_write_cid_seize(IXJ *j)
|
3175 |
|
|
{
|
3176 |
|
|
int cnt;
|
3177 |
|
|
|
3178 |
|
|
for (cnt = 0; cnt < 150; cnt++) {
|
3179 |
|
|
ixj_write_cid_bit(j, 0);
|
3180 |
|
|
ixj_write_cid_bit(j, 1);
|
3181 |
|
|
}
|
3182 |
|
|
for (cnt = 0; cnt < 180; cnt++) {
|
3183 |
|
|
ixj_write_cid_bit(j, 1);
|
3184 |
|
|
}
|
3185 |
|
|
}
|
3186 |
|
|
|
3187 |
|
|
static void ixj_write_cidcw_seize(IXJ *j)
|
3188 |
|
|
{
|
3189 |
|
|
int cnt;
|
3190 |
|
|
|
3191 |
|
|
for (cnt = 0; cnt < 80; cnt++) {
|
3192 |
|
|
ixj_write_cid_bit(j, 1);
|
3193 |
|
|
}
|
3194 |
|
|
}
|
3195 |
|
|
|
3196 |
|
|
static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
|
3197 |
|
|
{
|
3198 |
|
|
int cnt;
|
3199 |
|
|
|
3200 |
|
|
for (cnt = 0; cnt < strlen(s); cnt++) {
|
3201 |
|
|
ixj_write_cid_byte(j, s[cnt]);
|
3202 |
|
|
checksum = (checksum + s[cnt]);
|
3203 |
|
|
}
|
3204 |
|
|
return checksum;
|
3205 |
|
|
}
|
3206 |
|
|
|
3207 |
|
|
static void ixj_pad_fsk(IXJ *j, int pad)
|
3208 |
|
|
{
|
3209 |
|
|
int cnt;
|
3210 |
|
|
|
3211 |
|
|
for (cnt = 0; cnt < pad; cnt++) {
|
3212 |
|
|
if(j->fskdcnt < (j->fsksize - 1))
|
3213 |
|
|
j->fskdata[j->fskdcnt++] = 0x0000;
|
3214 |
|
|
}
|
3215 |
|
|
for (cnt = 0; cnt < 720; cnt++) {
|
3216 |
|
|
if(j->fskdcnt < (j->fsksize - 1))
|
3217 |
|
|
j->fskdata[j->fskdcnt++] = 0x0000;
|
3218 |
|
|
}
|
3219 |
|
|
}
|
3220 |
|
|
|
3221 |
|
|
static void ixj_pre_cid(IXJ *j)
|
3222 |
|
|
{
|
3223 |
|
|
j->cid_play_codec = j->play_codec;
|
3224 |
|
|
j->cid_play_frame_size = j->play_frame_size;
|
3225 |
|
|
j->cid_play_volume = get_play_volume(j);
|
3226 |
|
|
j->cid_play_flag = j->flags.playing;
|
3227 |
|
|
|
3228 |
|
|
j->cid_rec_codec = j->rec_codec;
|
3229 |
|
|
j->cid_rec_volume = get_rec_volume(j);
|
3230 |
|
|
j->cid_rec_flag = j->flags.recording;
|
3231 |
|
|
|
3232 |
|
|
j->cid_play_aec_level = j->aec_level;
|
3233 |
|
|
|
3234 |
|
|
switch(j->baseframe.low) {
|
3235 |
|
|
case 0xA0:
|
3236 |
|
|
j->cid_base_frame_size = 20;
|
3237 |
|
|
break;
|
3238 |
|
|
case 0x50:
|
3239 |
|
|
j->cid_base_frame_size = 10;
|
3240 |
|
|
break;
|
3241 |
|
|
case 0xF0:
|
3242 |
|
|
j->cid_base_frame_size = 30;
|
3243 |
|
|
break;
|
3244 |
|
|
}
|
3245 |
|
|
|
3246 |
|
|
ixj_play_stop(j);
|
3247 |
|
|
ixj_cpt_stop(j);
|
3248 |
|
|
|
3249 |
|
|
j->flags.cidplay = 1;
|
3250 |
|
|
|
3251 |
|
|
set_base_frame(j, 30);
|
3252 |
|
|
set_play_codec(j, LINEAR16);
|
3253 |
|
|
set_play_volume(j, 0x1B);
|
3254 |
|
|
ixj_play_start(j);
|
3255 |
|
|
}
|
3256 |
|
|
|
3257 |
|
|
static void ixj_post_cid(IXJ *j)
|
3258 |
|
|
{
|
3259 |
|
|
ixj_play_stop(j);
|
3260 |
|
|
|
3261 |
|
|
if(j->cidsize > 5000) {
|
3262 |
|
|
SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
|
3263 |
|
|
}
|
3264 |
|
|
j->flags.cidplay = 0;
|
3265 |
|
|
if(ixjdebug & 0x0200) {
|
3266 |
|
|
printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
|
3267 |
|
|
}
|
3268 |
|
|
|
3269 |
|
|
ixj_fsk_free(j);
|
3270 |
|
|
|
3271 |
|
|
j->fskdcnt = 0;
|
3272 |
|
|
set_base_frame(j, j->cid_base_frame_size);
|
3273 |
|
|
set_play_codec(j, j->cid_play_codec);
|
3274 |
|
|
ixj_aec_start(j, j->cid_play_aec_level);
|
3275 |
|
|
set_play_volume(j, j->cid_play_volume);
|
3276 |
|
|
|
3277 |
|
|
set_rec_codec(j, j->cid_rec_codec);
|
3278 |
|
|
set_rec_volume(j, j->cid_rec_volume);
|
3279 |
|
|
|
3280 |
|
|
if(j->cid_rec_flag)
|
3281 |
|
|
ixj_record_start(j);
|
3282 |
|
|
|
3283 |
|
|
if(j->cid_play_flag)
|
3284 |
|
|
ixj_play_start(j);
|
3285 |
|
|
|
3286 |
|
|
if(j->cid_play_flag) {
|
3287 |
|
|
wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
|
3288 |
|
|
}
|
3289 |
|
|
}
|
3290 |
|
|
|
3291 |
|
|
static void ixj_write_cid(IXJ *j)
|
3292 |
|
|
{
|
3293 |
|
|
char sdmf1[50];
|
3294 |
|
|
char sdmf2[50];
|
3295 |
|
|
char sdmf3[80];
|
3296 |
|
|
char mdmflen, len1, len2, len3;
|
3297 |
|
|
int pad;
|
3298 |
|
|
|
3299 |
|
|
int checksum = 0;
|
3300 |
|
|
|
3301 |
|
|
if (j->dsp.low == 0x20 || j->flags.cidplay)
|
3302 |
|
|
return;
|
3303 |
|
|
|
3304 |
|
|
j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
|
3305 |
|
|
j->cidsize = j->cidcnt = 0;
|
3306 |
|
|
|
3307 |
|
|
ixj_fsk_alloc(j);
|
3308 |
|
|
|
3309 |
|
|
strcpy(sdmf1, j->cid_send.month);
|
3310 |
|
|
strcat(sdmf1, j->cid_send.day);
|
3311 |
|
|
strcat(sdmf1, j->cid_send.hour);
|
3312 |
|
|
strcat(sdmf1, j->cid_send.min);
|
3313 |
|
|
strcpy(sdmf2, j->cid_send.number);
|
3314 |
|
|
strcpy(sdmf3, j->cid_send.name);
|
3315 |
|
|
|
3316 |
|
|
len1 = strlen(sdmf1);
|
3317 |
|
|
len2 = strlen(sdmf2);
|
3318 |
|
|
len3 = strlen(sdmf3);
|
3319 |
|
|
mdmflen = len1 + len2 + len3 + 6;
|
3320 |
|
|
|
3321 |
|
|
while(1){
|
3322 |
|
|
ixj_write_cid_seize(j);
|
3323 |
|
|
|
3324 |
|
|
ixj_write_cid_byte(j, 0x80);
|
3325 |
|
|
checksum = 0x80;
|
3326 |
|
|
ixj_write_cid_byte(j, mdmflen);
|
3327 |
|
|
checksum = checksum + mdmflen;
|
3328 |
|
|
|
3329 |
|
|
ixj_write_cid_byte(j, 0x01);
|
3330 |
|
|
checksum = checksum + 0x01;
|
3331 |
|
|
ixj_write_cid_byte(j, len1);
|
3332 |
|
|
checksum = checksum + len1;
|
3333 |
|
|
checksum = ixj_write_cid_string(j, sdmf1, checksum);
|
3334 |
|
|
if(ixj_hookstate(j) & 1)
|
3335 |
|
|
break;
|
3336 |
|
|
|
3337 |
|
|
ixj_write_cid_byte(j, 0x02);
|
3338 |
|
|
checksum = checksum + 0x02;
|
3339 |
|
|
ixj_write_cid_byte(j, len2);
|
3340 |
|
|
checksum = checksum + len2;
|
3341 |
|
|
checksum = ixj_write_cid_string(j, sdmf2, checksum);
|
3342 |
|
|
if(ixj_hookstate(j) & 1)
|
3343 |
|
|
break;
|
3344 |
|
|
|
3345 |
|
|
ixj_write_cid_byte(j, 0x07);
|
3346 |
|
|
checksum = checksum + 0x07;
|
3347 |
|
|
ixj_write_cid_byte(j, len3);
|
3348 |
|
|
checksum = checksum + len3;
|
3349 |
|
|
checksum = ixj_write_cid_string(j, sdmf3, checksum);
|
3350 |
|
|
if(ixj_hookstate(j) & 1)
|
3351 |
|
|
break;
|
3352 |
|
|
|
3353 |
|
|
checksum %= 256;
|
3354 |
|
|
checksum ^= 0xFF;
|
3355 |
|
|
checksum += 1;
|
3356 |
|
|
|
3357 |
|
|
ixj_write_cid_byte(j, (char) checksum);
|
3358 |
|
|
|
3359 |
|
|
pad = j->fskdcnt % 240;
|
3360 |
|
|
if (pad) {
|
3361 |
|
|
pad = 240 - pad;
|
3362 |
|
|
}
|
3363 |
|
|
ixj_pad_fsk(j, pad);
|
3364 |
|
|
break;
|
3365 |
|
|
}
|
3366 |
|
|
|
3367 |
|
|
ixj_write_frame(j);
|
3368 |
|
|
}
|
3369 |
|
|
|
3370 |
|
|
static void ixj_write_cidcw(IXJ *j)
|
3371 |
|
|
{
|
3372 |
|
|
IXJ_TONE ti;
|
3373 |
|
|
|
3374 |
|
|
char sdmf1[50];
|
3375 |
|
|
char sdmf2[50];
|
3376 |
|
|
char sdmf3[80];
|
3377 |
|
|
char mdmflen, len1, len2, len3;
|
3378 |
|
|
int pad;
|
3379 |
|
|
|
3380 |
|
|
int checksum = 0;
|
3381 |
|
|
|
3382 |
|
|
if (j->dsp.low == 0x20 || j->flags.cidplay)
|
3383 |
|
|
return;
|
3384 |
|
|
|
3385 |
|
|
j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
|
3386 |
|
|
j->cidsize = j->cidcnt = 0;
|
3387 |
|
|
|
3388 |
|
|
ixj_fsk_alloc(j);
|
3389 |
|
|
|
3390 |
|
|
j->flags.cidcw_ack = 0;
|
3391 |
|
|
|
3392 |
|
|
ti.tone_index = 23;
|
3393 |
|
|
ti.gain0 = 1;
|
3394 |
|
|
ti.freq0 = hz440;
|
3395 |
|
|
ti.gain1 = 0;
|
3396 |
|
|
ti.freq1 = 0;
|
3397 |
|
|
ixj_init_tone(j, &ti);
|
3398 |
|
|
|
3399 |
|
|
ixj_set_tone_on(1500, j);
|
3400 |
|
|
ixj_set_tone_off(32, j);
|
3401 |
|
|
if(ixjdebug & 0x0200) {
|
3402 |
|
|
printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
|
3403 |
|
|
}
|
3404 |
|
|
ixj_play_tone(j, 23);
|
3405 |
|
|
|
3406 |
|
|
clear_bit(j->board, &j->busyflags);
|
3407 |
|
|
while(j->tone_state) {
|
3408 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3409 |
|
|
schedule_timeout(1);
|
3410 |
|
|
}
|
3411 |
|
|
while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
|
3412 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3413 |
|
|
schedule_timeout(1);
|
3414 |
|
|
}
|
3415 |
|
|
if(ixjdebug & 0x0200) {
|
3416 |
|
|
printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
|
3417 |
|
|
}
|
3418 |
|
|
|
3419 |
|
|
ti.tone_index = 24;
|
3420 |
|
|
ti.gain0 = 1;
|
3421 |
|
|
ti.freq0 = hz2130;
|
3422 |
|
|
ti.gain1 = 0;
|
3423 |
|
|
ti.freq1 = hz2750;
|
3424 |
|
|
ixj_init_tone(j, &ti);
|
3425 |
|
|
|
3426 |
|
|
ixj_set_tone_off(10, j);
|
3427 |
|
|
ixj_set_tone_on(600, j);
|
3428 |
|
|
if(ixjdebug & 0x0200) {
|
3429 |
|
|
printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
|
3430 |
|
|
}
|
3431 |
|
|
ixj_play_tone(j, 24);
|
3432 |
|
|
|
3433 |
|
|
clear_bit(j->board, &j->busyflags);
|
3434 |
|
|
while(j->tone_state) {
|
3435 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3436 |
|
|
schedule_timeout(1);
|
3437 |
|
|
}
|
3438 |
|
|
while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
|
3439 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3440 |
|
|
schedule_timeout(1);
|
3441 |
|
|
}
|
3442 |
|
|
if(ixjdebug & 0x0200) {
|
3443 |
|
|
printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
|
3444 |
|
|
}
|
3445 |
|
|
|
3446 |
|
|
j->cidcw_wait = jiffies + ((50 * hertz) / 100);
|
3447 |
|
|
|
3448 |
|
|
clear_bit(j->board, &j->busyflags);
|
3449 |
|
|
while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
|
3450 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3451 |
|
|
schedule_timeout(1);
|
3452 |
|
|
}
|
3453 |
|
|
while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
|
3454 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
3455 |
|
|
schedule_timeout(1);
|
3456 |
|
|
}
|
3457 |
|
|
j->cidcw_wait = 0;
|
3458 |
|
|
if(!j->flags.cidcw_ack) {
|
3459 |
|
|
if(ixjdebug & 0x0200) {
|
3460 |
|
|
printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
|
3461 |
|
|
}
|
3462 |
|
|
ixj_post_cid(j);
|
3463 |
|
|
if(j->cid_play_flag) {
|
3464 |
|
|
wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
|
3465 |
|
|
}
|
3466 |
|
|
return;
|
3467 |
|
|
} else {
|
3468 |
|
|
ixj_pre_cid(j);
|
3469 |
|
|
}
|
3470 |
|
|
j->flags.cidcw_ack = 0;
|
3471 |
|
|
strcpy(sdmf1, j->cid_send.month);
|
3472 |
|
|
strcat(sdmf1, j->cid_send.day);
|
3473 |
|
|
strcat(sdmf1, j->cid_send.hour);
|
3474 |
|
|
strcat(sdmf1, j->cid_send.min);
|
3475 |
|
|
strcpy(sdmf2, j->cid_send.number);
|
3476 |
|
|
strcpy(sdmf3, j->cid_send.name);
|
3477 |
|
|
|
3478 |
|
|
len1 = strlen(sdmf1);
|
3479 |
|
|
len2 = strlen(sdmf2);
|
3480 |
|
|
len3 = strlen(sdmf3);
|
3481 |
|
|
mdmflen = len1 + len2 + len3 + 6;
|
3482 |
|
|
|
3483 |
|
|
ixj_write_cidcw_seize(j);
|
3484 |
|
|
|
3485 |
|
|
ixj_write_cid_byte(j, 0x80);
|
3486 |
|
|
checksum = 0x80;
|
3487 |
|
|
ixj_write_cid_byte(j, mdmflen);
|
3488 |
|
|
checksum = checksum + mdmflen;
|
3489 |
|
|
|
3490 |
|
|
ixj_write_cid_byte(j, 0x01);
|
3491 |
|
|
checksum = checksum + 0x01;
|
3492 |
|
|
ixj_write_cid_byte(j, len1);
|
3493 |
|
|
checksum = checksum + len1;
|
3494 |
|
|
checksum = ixj_write_cid_string(j, sdmf1, checksum);
|
3495 |
|
|
|
3496 |
|
|
ixj_write_cid_byte(j, 0x02);
|
3497 |
|
|
checksum = checksum + 0x02;
|
3498 |
|
|
ixj_write_cid_byte(j, len2);
|
3499 |
|
|
checksum = checksum + len2;
|
3500 |
|
|
checksum = ixj_write_cid_string(j, sdmf2, checksum);
|
3501 |
|
|
|
3502 |
|
|
ixj_write_cid_byte(j, 0x07);
|
3503 |
|
|
checksum = checksum + 0x07;
|
3504 |
|
|
ixj_write_cid_byte(j, len3);
|
3505 |
|
|
checksum = checksum + len3;
|
3506 |
|
|
checksum = ixj_write_cid_string(j, sdmf3, checksum);
|
3507 |
|
|
|
3508 |
|
|
checksum %= 256;
|
3509 |
|
|
checksum ^= 0xFF;
|
3510 |
|
|
checksum += 1;
|
3511 |
|
|
|
3512 |
|
|
ixj_write_cid_byte(j, (char) checksum);
|
3513 |
|
|
|
3514 |
|
|
pad = j->fskdcnt % 240;
|
3515 |
|
|
if (pad) {
|
3516 |
|
|
pad = 240 - pad;
|
3517 |
|
|
}
|
3518 |
|
|
ixj_pad_fsk(j, pad);
|
3519 |
|
|
if(ixjdebug & 0x0200) {
|
3520 |
|
|
printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
|
3521 |
|
|
}
|
3522 |
|
|
}
|
3523 |
|
|
|
3524 |
|
|
static void ixj_write_vmwi(IXJ *j, int msg)
|
3525 |
|
|
{
|
3526 |
|
|
char mdmflen;
|
3527 |
|
|
int pad;
|
3528 |
|
|
|
3529 |
|
|
int checksum = 0;
|
3530 |
|
|
|
3531 |
|
|
if (j->dsp.low == 0x20 || j->flags.cidplay)
|
3532 |
|
|
return;
|
3533 |
|
|
|
3534 |
|
|
j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
|
3535 |
|
|
j->cidsize = j->cidcnt = 0;
|
3536 |
|
|
|
3537 |
|
|
ixj_fsk_alloc(j);
|
3538 |
|
|
|
3539 |
|
|
mdmflen = 3;
|
3540 |
|
|
|
3541 |
|
|
if (j->port == PORT_POTS)
|
3542 |
|
|
SLIC_SetState(PLD_SLIC_STATE_OHT, j);
|
3543 |
|
|
|
3544 |
|
|
ixj_write_cid_seize(j);
|
3545 |
|
|
|
3546 |
|
|
ixj_write_cid_byte(j, 0x82);
|
3547 |
|
|
checksum = 0x82;
|
3548 |
|
|
ixj_write_cid_byte(j, mdmflen);
|
3549 |
|
|
checksum = checksum + mdmflen;
|
3550 |
|
|
|
3551 |
|
|
ixj_write_cid_byte(j, 0x0B);
|
3552 |
|
|
checksum = checksum + 0x0B;
|
3553 |
|
|
ixj_write_cid_byte(j, 1);
|
3554 |
|
|
checksum = checksum + 1;
|
3555 |
|
|
|
3556 |
|
|
if(msg) {
|
3557 |
|
|
ixj_write_cid_byte(j, 0xFF);
|
3558 |
|
|
checksum = checksum + 0xFF;
|
3559 |
|
|
}
|
3560 |
|
|
else {
|
3561 |
|
|
ixj_write_cid_byte(j, 0x00);
|
3562 |
|
|
checksum = checksum + 0x00;
|
3563 |
|
|
}
|
3564 |
|
|
|
3565 |
|
|
checksum %= 256;
|
3566 |
|
|
checksum ^= 0xFF;
|
3567 |
|
|
checksum += 1;
|
3568 |
|
|
|
3569 |
|
|
ixj_write_cid_byte(j, (char) checksum);
|
3570 |
|
|
|
3571 |
|
|
pad = j->fskdcnt % 240;
|
3572 |
|
|
if (pad) {
|
3573 |
|
|
pad = 240 - pad;
|
3574 |
|
|
}
|
3575 |
|
|
ixj_pad_fsk(j, pad);
|
3576 |
|
|
}
|
3577 |
|
|
|
3578 |
|
|
static void ixj_write_frame(IXJ *j)
|
3579 |
|
|
{
|
3580 |
|
|
int cnt, frame_count, dly;
|
3581 |
|
|
IXJ_WORD dat;
|
3582 |
|
|
BYTES blankword;
|
3583 |
|
|
|
3584 |
|
|
frame_count = 0;
|
3585 |
|
|
if(j->flags.cidplay) {
|
3586 |
|
|
for(cnt = 0; cnt < 480; cnt++) {
|
3587 |
|
|
if (!(cnt % 16) && !IsTxReady(j)) {
|
3588 |
|
|
dly = 0;
|
3589 |
|
|
while (!IsTxReady(j)) {
|
3590 |
|
|
if (dly++ > 5) {
|
3591 |
|
|
dly = 0;
|
3592 |
|
|
break;
|
3593 |
|
|
}
|
3594 |
|
|
udelay(10);
|
3595 |
|
|
}
|
3596 |
|
|
}
|
3597 |
|
|
dat.word = j->fskdata[j->cidcnt++];
|
3598 |
|
|
outb_p(dat.bytes.low, j->DSPbase + 0x0C);
|
3599 |
|
|
outb_p(dat.bytes.high, j->DSPbase + 0x0D);
|
3600 |
|
|
cnt++;
|
3601 |
|
|
}
|
3602 |
|
|
if(j->cidcnt >= j->fskdcnt) {
|
3603 |
|
|
ixj_post_cid(j);
|
3604 |
|
|
}
|
3605 |
|
|
/* This may seem rude, but if we just played one frame of FSK data for CallerID
|
3606 |
|
|
and there is real audio data in the buffer, we need to throw it away because
|
3607 |
|
|
we just used it's time slot */
|
3608 |
|
|
if (j->write_buffer_rp > j->write_buffer_wp) {
|
3609 |
|
|
j->write_buffer_rp += j->cid_play_frame_size * 2;
|
3610 |
|
|
if (j->write_buffer_rp >= j->write_buffer_end) {
|
3611 |
|
|
j->write_buffer_rp = j->write_buffer;
|
3612 |
|
|
}
|
3613 |
|
|
j->write_buffers_empty++;
|
3614 |
|
|
wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
|
3615 |
|
|
|
3616 |
|
|
wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
|
3617 |
|
|
}
|
3618 |
|
|
} else if (j->write_buffer && j->write_buffers_empty < 1) {
|
3619 |
|
|
if (j->write_buffer_wp > j->write_buffer_rp) {
|
3620 |
|
|
frame_count =
|
3621 |
|
|
(j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
|
3622 |
|
|
}
|
3623 |
|
|
if (j->write_buffer_rp > j->write_buffer_wp) {
|
3624 |
|
|
frame_count =
|
3625 |
|
|
(j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
|
3626 |
|
|
(j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
|
3627 |
|
|
}
|
3628 |
|
|
if (frame_count >= 1) {
|
3629 |
|
|
if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
|
3630 |
|
|
switch (j->play_mode) {
|
3631 |
|
|
case PLAYBACK_MODE_ULAW:
|
3632 |
|
|
case PLAYBACK_MODE_ALAW:
|
3633 |
|
|
blankword.low = blankword.high = 0xFF;
|
3634 |
|
|
break;
|
3635 |
|
|
case PLAYBACK_MODE_8LINEAR:
|
3636 |
|
|
case PLAYBACK_MODE_16LINEAR:
|
3637 |
|
|
blankword.low = blankword.high = 0x00;
|
3638 |
|
|
break;
|
3639 |
|
|
case PLAYBACK_MODE_8LINEAR_WSS:
|
3640 |
|
|
blankword.low = blankword.high = 0x80;
|
3641 |
|
|
break;
|
3642 |
|
|
}
|
3643 |
|
|
for (cnt = 0; cnt < 16; cnt++) {
|
3644 |
|
|
if (!(cnt % 16) && !IsTxReady(j)) {
|
3645 |
|
|
dly = 0;
|
3646 |
|
|
while (!IsTxReady(j)) {
|
3647 |
|
|
if (dly++ > 5) {
|
3648 |
|
|
dly = 0;
|
3649 |
|
|
break;
|
3650 |
|
|
}
|
3651 |
|
|
udelay(10);
|
3652 |
|
|
}
|
3653 |
|
|
}
|
3654 |
|
|
outb_p((blankword.low), j->DSPbase + 0x0C);
|
3655 |
|
|
outb_p((blankword.high), j->DSPbase + 0x0D);
|
3656 |
|
|
}
|
3657 |
|
|
j->flags.play_first_frame = 0;
|
3658 |
|
|
} else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
|
3659 |
|
|
for (cnt = 0; cnt < 24; cnt++) {
|
3660 |
|
|
if(cnt == 12) {
|
3661 |
|
|
blankword.low = 0x02;
|
3662 |
|
|
blankword.high = 0x00;
|
3663 |
|
|
}
|
3664 |
|
|
else {
|
3665 |
|
|
blankword.low = blankword.high = 0x00;
|
3666 |
|
|
}
|
3667 |
|
|
if (!(cnt % 16) && !IsTxReady(j)) {
|
3668 |
|
|
dly = 0;
|
3669 |
|
|
while (!IsTxReady(j)) {
|
3670 |
|
|
if (dly++ > 5) {
|
3671 |
|
|
dly = 0;
|
3672 |
|
|
break;
|
3673 |
|
|
}
|
3674 |
|
|
udelay(10);
|
3675 |
|
|
}
|
3676 |
|
|
}
|
3677 |
|
|
outb_p((blankword.low), j->DSPbase + 0x0C);
|
3678 |
|
|
outb_p((blankword.high), j->DSPbase + 0x0D);
|
3679 |
|
|
}
|
3680 |
|
|
j->flags.play_first_frame = 0;
|
3681 |
|
|
}
|
3682 |
|
|
for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
|
3683 |
|
|
if (!(cnt % 16) && !IsTxReady(j)) {
|
3684 |
|
|
dly = 0;
|
3685 |
|
|
while (!IsTxReady(j)) {
|
3686 |
|
|
if (dly++ > 5) {
|
3687 |
|
|
dly = 0;
|
3688 |
|
|
break;
|
3689 |
|
|
}
|
3690 |
|
|
udelay(10);
|
3691 |
|
|
}
|
3692 |
|
|
}
|
3693 |
|
|
/* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
|
3694 |
|
|
if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
|
3695 |
|
|
if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
|
3696 |
|
|
j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
|
3697 |
|
|
j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
|
3698 |
|
|
j->write_buffer_rp + cnt + 9 == 0) {
|
3699 |
|
|
/* someone is trying to write silence lets make this a type 0 frame. */
|
3700 |
|
|
outb_p(0x00, j->DSPbase + 0x0C);
|
3701 |
|
|
outb_p(0x00, j->DSPbase + 0x0D);
|
3702 |
|
|
} else {
|
3703 |
|
|
/* so all other frames are type 1. */
|
3704 |
|
|
outb_p(0x01, j->DSPbase + 0x0C);
|
3705 |
|
|
outb_p(0x00, j->DSPbase + 0x0D);
|
3706 |
|
|
}
|
3707 |
|
|
}
|
3708 |
|
|
outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
|
3709 |
|
|
outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
|
3710 |
|
|
*(j->write_buffer_rp + cnt) = 0;
|
3711 |
|
|
*(j->write_buffer_rp + cnt + 1) = 0;
|
3712 |
|
|
}
|
3713 |
|
|
j->write_buffer_rp += j->play_frame_size * 2;
|
3714 |
|
|
if (j->write_buffer_rp >= j->write_buffer_end) {
|
3715 |
|
|
j->write_buffer_rp = j->write_buffer;
|
3716 |
|
|
}
|
3717 |
|
|
j->write_buffers_empty++;
|
3718 |
|
|
wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
|
3719 |
|
|
|
3720 |
|
|
wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
|
3721 |
|
|
|
3722 |
|
|
++j->frameswritten;
|
3723 |
|
|
}
|
3724 |
|
|
} else {
|
3725 |
|
|
j->drybuffer++;
|
3726 |
|
|
}
|
3727 |
|
|
if(j->ixj_signals[SIG_WRITE_READY]) {
|
3728 |
|
|
ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
|
3729 |
|
|
}
|
3730 |
|
|
}
|
3731 |
|
|
|
3732 |
|
|
static int idle(IXJ *j)
|
3733 |
|
|
{
|
3734 |
|
|
if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
|
3735 |
|
|
|
3736 |
|
|
return 0;
|
3737 |
|
|
|
3738 |
|
|
if (j->ssr.high || j->ssr.low) {
|
3739 |
|
|
return 0;
|
3740 |
|
|
} else {
|
3741 |
|
|
j->play_mode = -1;
|
3742 |
|
|
j->flags.playing = 0;
|
3743 |
|
|
j->rec_mode = -1;
|
3744 |
|
|
j->flags.recording = 0;
|
3745 |
|
|
return 1;
|
3746 |
|
|
}
|
3747 |
|
|
}
|
3748 |
|
|
|
3749 |
|
|
static int set_base_frame(IXJ *j, int size)
|
3750 |
|
|
{
|
3751 |
|
|
unsigned short cmd;
|
3752 |
|
|
int cnt;
|
3753 |
|
|
|
3754 |
|
|
idle(j);
|
3755 |
|
|
j->cid_play_aec_level = j->aec_level;
|
3756 |
|
|
aec_stop(j);
|
3757 |
|
|
for (cnt = 0; cnt < 10; cnt++) {
|
3758 |
|
|
if (idle(j))
|
3759 |
|
|
break;
|
3760 |
|
|
}
|
3761 |
|
|
if (j->ssr.high || j->ssr.low)
|
3762 |
|
|
return -1;
|
3763 |
|
|
if (j->dsp.low != 0x20) {
|
3764 |
|
|
switch (size) {
|
3765 |
|
|
case 30:
|
3766 |
|
|
cmd = 0x07F0;
|
3767 |
|
|
/* Set Base Frame Size to 240 pg9-10 8021 */
|
3768 |
|
|
break;
|
3769 |
|
|
case 20:
|
3770 |
|
|
cmd = 0x07A0;
|
3771 |
|
|
/* Set Base Frame Size to 160 pg9-10 8021 */
|
3772 |
|
|
break;
|
3773 |
|
|
case 10:
|
3774 |
|
|
cmd = 0x0750;
|
3775 |
|
|
/* Set Base Frame Size to 80 pg9-10 8021 */
|
3776 |
|
|
break;
|
3777 |
|
|
default:
|
3778 |
|
|
return -1;
|
3779 |
|
|
}
|
3780 |
|
|
} else {
|
3781 |
|
|
if (size == 30)
|
3782 |
|
|
return size;
|
3783 |
|
|
else
|
3784 |
|
|
return -1;
|
3785 |
|
|
}
|
3786 |
|
|
if (ixj_WriteDSPCommand(cmd, j)) {
|
3787 |
|
|
j->baseframe.high = j->baseframe.low = 0xFF;
|
3788 |
|
|
return -1;
|
3789 |
|
|
} else {
|
3790 |
|
|
j->baseframe.high = j->ssr.high;
|
3791 |
|
|
j->baseframe.low = j->ssr.low;
|
3792 |
|
|
/* If the status returned is 0x0000 (pg9-9 8021) the call failed */
|
3793 |
|
|
if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
|
3794 |
|
|
return -1;
|
3795 |
|
|
}
|
3796 |
|
|
}
|
3797 |
|
|
ixj_aec_start(j, j->cid_play_aec_level);
|
3798 |
|
|
return size;
|
3799 |
|
|
}
|
3800 |
|
|
|
3801 |
|
|
static int set_rec_codec(IXJ *j, int rate)
|
3802 |
|
|
{
|
3803 |
|
|
int retval = 0;
|
3804 |
|
|
|
3805 |
|
|
j->rec_codec = rate;
|
3806 |
|
|
|
3807 |
|
|
switch (rate) {
|
3808 |
|
|
case G723_63:
|
3809 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
3810 |
|
|
j->rec_frame_size = 12;
|
3811 |
|
|
j->rec_mode = 0;
|
3812 |
|
|
} else {
|
3813 |
|
|
retval = 1;
|
3814 |
|
|
}
|
3815 |
|
|
break;
|
3816 |
|
|
case G723_53:
|
3817 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
3818 |
|
|
j->rec_frame_size = 10;
|
3819 |
|
|
j->rec_mode = 0;
|
3820 |
|
|
} else {
|
3821 |
|
|
retval = 1;
|
3822 |
|
|
}
|
3823 |
|
|
break;
|
3824 |
|
|
case TS85:
|
3825 |
|
|
if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
|
3826 |
|
|
j->rec_frame_size = 16;
|
3827 |
|
|
j->rec_mode = 0;
|
3828 |
|
|
} else {
|
3829 |
|
|
retval = 1;
|
3830 |
|
|
}
|
3831 |
|
|
break;
|
3832 |
|
|
case TS48:
|
3833 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
3834 |
|
|
j->rec_frame_size = 9;
|
3835 |
|
|
j->rec_mode = 0;
|
3836 |
|
|
} else {
|
3837 |
|
|
retval = 1;
|
3838 |
|
|
}
|
3839 |
|
|
break;
|
3840 |
|
|
case TS41:
|
3841 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
3842 |
|
|
j->rec_frame_size = 8;
|
3843 |
|
|
j->rec_mode = 0;
|
3844 |
|
|
} else {
|
3845 |
|
|
retval = 1;
|
3846 |
|
|
}
|
3847 |
|
|
break;
|
3848 |
|
|
case G728:
|
3849 |
|
|
if (j->dsp.low != 0x20) {
|
3850 |
|
|
j->rec_frame_size = 48;
|
3851 |
|
|
j->rec_mode = 0;
|
3852 |
|
|
} else {
|
3853 |
|
|
retval = 1;
|
3854 |
|
|
}
|
3855 |
|
|
break;
|
3856 |
|
|
case G729:
|
3857 |
|
|
if (j->dsp.low != 0x20) {
|
3858 |
|
|
if (!j->flags.g729_loaded) {
|
3859 |
|
|
retval = 1;
|
3860 |
|
|
break;
|
3861 |
|
|
}
|
3862 |
|
|
switch (j->baseframe.low) {
|
3863 |
|
|
case 0xA0:
|
3864 |
|
|
j->rec_frame_size = 10;
|
3865 |
|
|
break;
|
3866 |
|
|
case 0x50:
|
3867 |
|
|
j->rec_frame_size = 5;
|
3868 |
|
|
break;
|
3869 |
|
|
default:
|
3870 |
|
|
j->rec_frame_size = 15;
|
3871 |
|
|
break;
|
3872 |
|
|
}
|
3873 |
|
|
j->rec_mode = 0;
|
3874 |
|
|
} else {
|
3875 |
|
|
retval = 1;
|
3876 |
|
|
}
|
3877 |
|
|
break;
|
3878 |
|
|
case G729B:
|
3879 |
|
|
if (j->dsp.low != 0x20) {
|
3880 |
|
|
if (!j->flags.g729_loaded) {
|
3881 |
|
|
retval = 1;
|
3882 |
|
|
break;
|
3883 |
|
|
}
|
3884 |
|
|
switch (j->baseframe.low) {
|
3885 |
|
|
case 0xA0:
|
3886 |
|
|
j->rec_frame_size = 12;
|
3887 |
|
|
break;
|
3888 |
|
|
case 0x50:
|
3889 |
|
|
j->rec_frame_size = 6;
|
3890 |
|
|
break;
|
3891 |
|
|
default:
|
3892 |
|
|
j->rec_frame_size = 18;
|
3893 |
|
|
break;
|
3894 |
|
|
}
|
3895 |
|
|
j->rec_mode = 0;
|
3896 |
|
|
} else {
|
3897 |
|
|
retval = 1;
|
3898 |
|
|
}
|
3899 |
|
|
break;
|
3900 |
|
|
case ULAW:
|
3901 |
|
|
switch (j->baseframe.low) {
|
3902 |
|
|
case 0xA0:
|
3903 |
|
|
j->rec_frame_size = 80;
|
3904 |
|
|
break;
|
3905 |
|
|
case 0x50:
|
3906 |
|
|
j->rec_frame_size = 40;
|
3907 |
|
|
break;
|
3908 |
|
|
default:
|
3909 |
|
|
j->rec_frame_size = 120;
|
3910 |
|
|
break;
|
3911 |
|
|
}
|
3912 |
|
|
j->rec_mode = 4;
|
3913 |
|
|
break;
|
3914 |
|
|
case ALAW:
|
3915 |
|
|
switch (j->baseframe.low) {
|
3916 |
|
|
case 0xA0:
|
3917 |
|
|
j->rec_frame_size = 80;
|
3918 |
|
|
break;
|
3919 |
|
|
case 0x50:
|
3920 |
|
|
j->rec_frame_size = 40;
|
3921 |
|
|
break;
|
3922 |
|
|
default:
|
3923 |
|
|
j->rec_frame_size = 120;
|
3924 |
|
|
break;
|
3925 |
|
|
}
|
3926 |
|
|
j->rec_mode = 4;
|
3927 |
|
|
break;
|
3928 |
|
|
case LINEAR16:
|
3929 |
|
|
switch (j->baseframe.low) {
|
3930 |
|
|
case 0xA0:
|
3931 |
|
|
j->rec_frame_size = 160;
|
3932 |
|
|
break;
|
3933 |
|
|
case 0x50:
|
3934 |
|
|
j->rec_frame_size = 80;
|
3935 |
|
|
break;
|
3936 |
|
|
default:
|
3937 |
|
|
j->rec_frame_size = 240;
|
3938 |
|
|
break;
|
3939 |
|
|
}
|
3940 |
|
|
j->rec_mode = 5;
|
3941 |
|
|
break;
|
3942 |
|
|
case LINEAR8:
|
3943 |
|
|
switch (j->baseframe.low) {
|
3944 |
|
|
case 0xA0:
|
3945 |
|
|
j->rec_frame_size = 80;
|
3946 |
|
|
break;
|
3947 |
|
|
case 0x50:
|
3948 |
|
|
j->rec_frame_size = 40;
|
3949 |
|
|
break;
|
3950 |
|
|
default:
|
3951 |
|
|
j->rec_frame_size = 120;
|
3952 |
|
|
break;
|
3953 |
|
|
}
|
3954 |
|
|
j->rec_mode = 6;
|
3955 |
|
|
break;
|
3956 |
|
|
case WSS:
|
3957 |
|
|
switch (j->baseframe.low) {
|
3958 |
|
|
case 0xA0:
|
3959 |
|
|
j->rec_frame_size = 80;
|
3960 |
|
|
break;
|
3961 |
|
|
case 0x50:
|
3962 |
|
|
j->rec_frame_size = 40;
|
3963 |
|
|
break;
|
3964 |
|
|
default:
|
3965 |
|
|
j->rec_frame_size = 120;
|
3966 |
|
|
break;
|
3967 |
|
|
}
|
3968 |
|
|
j->rec_mode = 7;
|
3969 |
|
|
break;
|
3970 |
|
|
default:
|
3971 |
|
|
j->rec_frame_size = 0;
|
3972 |
|
|
j->rec_mode = -1;
|
3973 |
|
|
if (j->read_buffer) {
|
3974 |
|
|
kfree(j->read_buffer);
|
3975 |
|
|
j->read_buffer = NULL;
|
3976 |
|
|
j->read_buffer_size = 0;
|
3977 |
|
|
}
|
3978 |
|
|
retval = 1;
|
3979 |
|
|
break;
|
3980 |
|
|
}
|
3981 |
|
|
return retval;
|
3982 |
|
|
}
|
3983 |
|
|
|
3984 |
|
|
static int ixj_record_start(IXJ *j)
|
3985 |
|
|
{
|
3986 |
|
|
unsigned short cmd = 0x0000;
|
3987 |
|
|
|
3988 |
|
|
if (j->read_buffer) {
|
3989 |
|
|
ixj_record_stop(j);
|
3990 |
|
|
}
|
3991 |
|
|
j->flags.recording = 1;
|
3992 |
|
|
ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
|
3993 |
|
|
|
3994 |
|
|
if(ixjdebug & 0x0002)
|
3995 |
|
|
printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
|
3996 |
|
|
|
3997 |
|
|
if (!j->rec_mode) {
|
3998 |
|
|
switch (j->rec_codec) {
|
3999 |
|
|
case G723_63:
|
4000 |
|
|
cmd = 0x5131;
|
4001 |
|
|
break;
|
4002 |
|
|
case G723_53:
|
4003 |
|
|
cmd = 0x5132;
|
4004 |
|
|
break;
|
4005 |
|
|
case TS85:
|
4006 |
|
|
cmd = 0x5130; /* TrueSpeech 8.5 */
|
4007 |
|
|
|
4008 |
|
|
break;
|
4009 |
|
|
case TS48:
|
4010 |
|
|
cmd = 0x5133; /* TrueSpeech 4.8 */
|
4011 |
|
|
|
4012 |
|
|
break;
|
4013 |
|
|
case TS41:
|
4014 |
|
|
cmd = 0x5134; /* TrueSpeech 4.1 */
|
4015 |
|
|
|
4016 |
|
|
break;
|
4017 |
|
|
case G728:
|
4018 |
|
|
cmd = 0x5135;
|
4019 |
|
|
break;
|
4020 |
|
|
case G729:
|
4021 |
|
|
case G729B:
|
4022 |
|
|
cmd = 0x5136;
|
4023 |
|
|
break;
|
4024 |
|
|
default:
|
4025 |
|
|
return 1;
|
4026 |
|
|
}
|
4027 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
4028 |
|
|
return -1;
|
4029 |
|
|
}
|
4030 |
|
|
if (!j->read_buffer) {
|
4031 |
|
|
if (!j->read_buffer)
|
4032 |
|
|
j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
|
4033 |
|
|
if (!j->read_buffer) {
|
4034 |
|
|
printk("Read buffer allocation for ixj board %d failed!\n", j->board);
|
4035 |
|
|
return -ENOMEM;
|
4036 |
|
|
}
|
4037 |
|
|
}
|
4038 |
|
|
j->read_buffer_size = j->rec_frame_size * 2;
|
4039 |
|
|
|
4040 |
|
|
if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
|
4041 |
|
|
|
4042 |
|
|
return -1;
|
4043 |
|
|
|
4044 |
|
|
switch (j->rec_mode) {
|
4045 |
|
|
case 0:
|
4046 |
|
|
cmd = 0x1C03; /* Record C1 */
|
4047 |
|
|
|
4048 |
|
|
break;
|
4049 |
|
|
case 4:
|
4050 |
|
|
if (j->ver.low == 0x12) {
|
4051 |
|
|
cmd = 0x1E03; /* Record C1 */
|
4052 |
|
|
|
4053 |
|
|
} else {
|
4054 |
|
|
cmd = 0x1E01; /* Record C1 */
|
4055 |
|
|
|
4056 |
|
|
}
|
4057 |
|
|
break;
|
4058 |
|
|
case 5:
|
4059 |
|
|
if (j->ver.low == 0x12) {
|
4060 |
|
|
cmd = 0x1E83; /* Record C1 */
|
4061 |
|
|
|
4062 |
|
|
} else {
|
4063 |
|
|
cmd = 0x1E81; /* Record C1 */
|
4064 |
|
|
|
4065 |
|
|
}
|
4066 |
|
|
break;
|
4067 |
|
|
case 6:
|
4068 |
|
|
if (j->ver.low == 0x12) {
|
4069 |
|
|
cmd = 0x1F03; /* Record C1 */
|
4070 |
|
|
|
4071 |
|
|
} else {
|
4072 |
|
|
cmd = 0x1F01; /* Record C1 */
|
4073 |
|
|
|
4074 |
|
|
}
|
4075 |
|
|
break;
|
4076 |
|
|
case 7:
|
4077 |
|
|
if (j->ver.low == 0x12) {
|
4078 |
|
|
cmd = 0x1F83; /* Record C1 */
|
4079 |
|
|
} else {
|
4080 |
|
|
cmd = 0x1F81; /* Record C1 */
|
4081 |
|
|
}
|
4082 |
|
|
break;
|
4083 |
|
|
}
|
4084 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
4085 |
|
|
return -1;
|
4086 |
|
|
|
4087 |
|
|
if (j->flags.playing) {
|
4088 |
|
|
ixj_aec_start(j, j->aec_level);
|
4089 |
|
|
}
|
4090 |
|
|
return 0;
|
4091 |
|
|
}
|
4092 |
|
|
|
4093 |
|
|
static void ixj_record_stop(IXJ *j)
|
4094 |
|
|
{
|
4095 |
|
|
if(ixjdebug & 0x0002)
|
4096 |
|
|
printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
|
4097 |
|
|
|
4098 |
|
|
if (j->read_buffer) {
|
4099 |
|
|
kfree(j->read_buffer);
|
4100 |
|
|
j->read_buffer = NULL;
|
4101 |
|
|
j->read_buffer_size = 0;
|
4102 |
|
|
}
|
4103 |
|
|
if (j->rec_mode > -1) {
|
4104 |
|
|
ixj_WriteDSPCommand(0x5120, j);
|
4105 |
|
|
j->rec_mode = -1;
|
4106 |
|
|
}
|
4107 |
|
|
j->flags.recording = 0;
|
4108 |
|
|
}
|
4109 |
|
|
static void ixj_vad(IXJ *j, int arg)
|
4110 |
|
|
{
|
4111 |
|
|
if (arg)
|
4112 |
|
|
ixj_WriteDSPCommand(0x513F, j);
|
4113 |
|
|
else
|
4114 |
|
|
ixj_WriteDSPCommand(0x513E, j);
|
4115 |
|
|
}
|
4116 |
|
|
|
4117 |
|
|
static void set_rec_depth(IXJ *j, int depth)
|
4118 |
|
|
{
|
4119 |
|
|
if (depth > 60)
|
4120 |
|
|
depth = 60;
|
4121 |
|
|
if (depth < 0)
|
4122 |
|
|
depth = 0;
|
4123 |
|
|
ixj_WriteDSPCommand(0x5180 + depth, j);
|
4124 |
|
|
}
|
4125 |
|
|
|
4126 |
|
|
static void set_dtmf_prescale(IXJ *j, int volume)
|
4127 |
|
|
{
|
4128 |
|
|
ixj_WriteDSPCommand(0xCF07, j);
|
4129 |
|
|
ixj_WriteDSPCommand(volume, j);
|
4130 |
|
|
}
|
4131 |
|
|
|
4132 |
|
|
static int get_dtmf_prescale(IXJ *j)
|
4133 |
|
|
{
|
4134 |
|
|
ixj_WriteDSPCommand(0xCF05, j);
|
4135 |
|
|
return j->ssr.high << 8 | j->ssr.low;
|
4136 |
|
|
}
|
4137 |
|
|
|
4138 |
|
|
static void set_rec_volume(IXJ *j, int volume)
|
4139 |
|
|
{
|
4140 |
|
|
if(j->aec_level == AEC_AGC) {
|
4141 |
|
|
if (ixjdebug & 0x0002)
|
4142 |
|
|
printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
|
4143 |
|
|
ixj_WriteDSPCommand(0xCF96, j);
|
4144 |
|
|
ixj_WriteDSPCommand(volume, j);
|
4145 |
|
|
} else {
|
4146 |
|
|
if (ixjdebug & 0x0002)
|
4147 |
|
|
printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
|
4148 |
|
|
ixj_WriteDSPCommand(0xCF03, j);
|
4149 |
|
|
ixj_WriteDSPCommand(volume, j);
|
4150 |
|
|
}
|
4151 |
|
|
}
|
4152 |
|
|
|
4153 |
|
|
static int set_rec_volume_linear(IXJ *j, int volume)
|
4154 |
|
|
{
|
4155 |
|
|
int newvolume, dsprecmax;
|
4156 |
|
|
|
4157 |
|
|
if (ixjdebug & 0x0002)
|
4158 |
|
|
printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
|
4159 |
|
|
if(volume > 100 || volume < 0) {
|
4160 |
|
|
return -1;
|
4161 |
|
|
}
|
4162 |
|
|
|
4163 |
|
|
/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
|
4164 |
|
|
switch (j->cardtype) {
|
4165 |
|
|
case QTI_PHONEJACK:
|
4166 |
|
|
dsprecmax = 0x440;
|
4167 |
|
|
break;
|
4168 |
|
|
case QTI_LINEJACK:
|
4169 |
|
|
dsprecmax = 0x180;
|
4170 |
|
|
ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
|
4171 |
|
|
ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
|
4172 |
|
|
ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
|
4173 |
|
|
break;
|
4174 |
|
|
case QTI_PHONEJACK_LITE:
|
4175 |
|
|
dsprecmax = 0x4C0;
|
4176 |
|
|
break;
|
4177 |
|
|
case QTI_PHONEJACK_PCI:
|
4178 |
|
|
dsprecmax = 0x100;
|
4179 |
|
|
break;
|
4180 |
|
|
case QTI_PHONECARD:
|
4181 |
|
|
dsprecmax = 0x400;
|
4182 |
|
|
break;
|
4183 |
|
|
default:
|
4184 |
|
|
return -1;
|
4185 |
|
|
}
|
4186 |
|
|
newvolume = (dsprecmax * volume) / 100;
|
4187 |
|
|
set_rec_volume(j, newvolume);
|
4188 |
|
|
return 0;
|
4189 |
|
|
}
|
4190 |
|
|
|
4191 |
|
|
static int get_rec_volume(IXJ *j)
|
4192 |
|
|
{
|
4193 |
|
|
if(j->aec_level == AEC_AGC) {
|
4194 |
|
|
if (ixjdebug & 0x0002)
|
4195 |
|
|
printk(KERN_INFO "Getting AGC Threshold\n");
|
4196 |
|
|
ixj_WriteDSPCommand(0xCF86, j);
|
4197 |
|
|
if (ixjdebug & 0x0002)
|
4198 |
|
|
printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
|
4199 |
|
|
return j->ssr.high << 8 | j->ssr.low;
|
4200 |
|
|
} else {
|
4201 |
|
|
if (ixjdebug & 0x0002)
|
4202 |
|
|
printk(KERN_INFO "Getting Record Volume\n");
|
4203 |
|
|
ixj_WriteDSPCommand(0xCF01, j);
|
4204 |
|
|
return j->ssr.high << 8 | j->ssr.low;
|
4205 |
|
|
}
|
4206 |
|
|
}
|
4207 |
|
|
|
4208 |
|
|
static int get_rec_volume_linear(IXJ *j)
|
4209 |
|
|
{
|
4210 |
|
|
int volume, newvolume, dsprecmax;
|
4211 |
|
|
|
4212 |
|
|
switch (j->cardtype) {
|
4213 |
|
|
case QTI_PHONEJACK:
|
4214 |
|
|
dsprecmax = 0x440;
|
4215 |
|
|
break;
|
4216 |
|
|
case QTI_LINEJACK:
|
4217 |
|
|
dsprecmax = 0x180;
|
4218 |
|
|
break;
|
4219 |
|
|
case QTI_PHONEJACK_LITE:
|
4220 |
|
|
dsprecmax = 0x4C0;
|
4221 |
|
|
break;
|
4222 |
|
|
case QTI_PHONEJACK_PCI:
|
4223 |
|
|
dsprecmax = 0x100;
|
4224 |
|
|
break;
|
4225 |
|
|
case QTI_PHONECARD:
|
4226 |
|
|
dsprecmax = 0x400;
|
4227 |
|
|
break;
|
4228 |
|
|
default:
|
4229 |
|
|
return -1;
|
4230 |
|
|
}
|
4231 |
|
|
volume = get_rec_volume(j);
|
4232 |
|
|
newvolume = (volume * 100) / dsprecmax;
|
4233 |
|
|
if(newvolume > 100)
|
4234 |
|
|
newvolume = 100;
|
4235 |
|
|
return newvolume;
|
4236 |
|
|
}
|
4237 |
|
|
|
4238 |
|
|
static int get_rec_level(IXJ *j)
|
4239 |
|
|
{
|
4240 |
|
|
int retval;
|
4241 |
|
|
|
4242 |
|
|
ixj_WriteDSPCommand(0xCF88, j);
|
4243 |
|
|
|
4244 |
|
|
retval = j->ssr.high << 8 | j->ssr.low;
|
4245 |
|
|
retval = (retval * 256) / 240;
|
4246 |
|
|
return retval;
|
4247 |
|
|
}
|
4248 |
|
|
|
4249 |
|
|
static void ixj_aec_start(IXJ *j, int level)
|
4250 |
|
|
{
|
4251 |
|
|
j->aec_level = level;
|
4252 |
|
|
if (ixjdebug & 0x0002)
|
4253 |
|
|
printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
|
4254 |
|
|
if (!level) {
|
4255 |
|
|
aec_stop(j);
|
4256 |
|
|
} else {
|
4257 |
|
|
if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
|
4258 |
|
|
ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
|
4259 |
|
|
|
4260 |
|
|
ixj_WriteDSPCommand(0x0300, j);
|
4261 |
|
|
}
|
4262 |
|
|
ixj_WriteDSPCommand(0xB001, j); /* AEC On */
|
4263 |
|
|
|
4264 |
|
|
ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
|
4265 |
|
|
|
4266 |
|
|
switch (level) {
|
4267 |
|
|
case AEC_LOW:
|
4268 |
|
|
ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
|
4269 |
|
|
|
4270 |
|
|
ixj_WriteDSPCommand(0xE011, j);
|
4271 |
|
|
ixj_WriteDSPCommand(0xFFFF, j);
|
4272 |
|
|
|
4273 |
|
|
ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
|
4274 |
|
|
ixj_WriteDSPCommand(0x0000, j); /* to off */
|
4275 |
|
|
|
4276 |
|
|
break;
|
4277 |
|
|
|
4278 |
|
|
case AEC_MED:
|
4279 |
|
|
ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
|
4280 |
|
|
|
4281 |
|
|
ixj_WriteDSPCommand(0xE011, j);
|
4282 |
|
|
ixj_WriteDSPCommand(0x0080, j);
|
4283 |
|
|
|
4284 |
|
|
ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
|
4285 |
|
|
ixj_WriteDSPCommand(0x0000, j); /* to off */
|
4286 |
|
|
|
4287 |
|
|
break;
|
4288 |
|
|
|
4289 |
|
|
case AEC_HIGH:
|
4290 |
|
|
ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
|
4291 |
|
|
|
4292 |
|
|
ixj_WriteDSPCommand(0xE011, j);
|
4293 |
|
|
ixj_WriteDSPCommand(0x0080, j);
|
4294 |
|
|
|
4295 |
|
|
ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
|
4296 |
|
|
ixj_WriteDSPCommand(0x0000, j); /* to off */
|
4297 |
|
|
|
4298 |
|
|
break;
|
4299 |
|
|
|
4300 |
|
|
case AEC_AGC:
|
4301 |
|
|
/* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
|
4302 |
|
|
ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
|
4303 |
|
|
|
4304 |
|
|
ixj_WriteDSPCommand(0xE011, j);
|
4305 |
|
|
ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
|
4306 |
|
|
|
4307 |
|
|
ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
|
4308 |
|
|
|
4309 |
|
|
if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
|
4310 |
|
|
ixj_WriteDSPCommand(0x0224, j);
|
4311 |
|
|
else
|
4312 |
|
|
ixj_WriteDSPCommand(0x1224, j);
|
4313 |
|
|
|
4314 |
|
|
ixj_WriteDSPCommand(0xE014, j);
|
4315 |
|
|
ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
|
4316 |
|
|
|
4317 |
|
|
ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
|
4318 |
|
|
|
4319 |
|
|
/* Now we can set the AGC initial parameters and turn it on */
|
4320 |
|
|
ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
|
4321 |
|
|
ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
|
4322 |
|
|
|
4323 |
|
|
ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
|
4324 |
|
|
ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
|
4325 |
|
|
|
4326 |
|
|
ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
|
4327 |
|
|
ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
|
4328 |
|
|
|
4329 |
|
|
ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
|
4330 |
|
|
ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
|
4331 |
|
|
|
4332 |
|
|
ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
|
4333 |
|
|
ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
|
4334 |
|
|
|
4335 |
|
|
ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
|
4336 |
|
|
ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
|
4337 |
|
|
|
4338 |
|
|
ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
|
4339 |
|
|
ixj_WriteDSPCommand(0x1200, j); /* to 25% */
|
4340 |
|
|
|
4341 |
|
|
ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
|
4342 |
|
|
ixj_WriteDSPCommand(0x0001, j); /* to on */
|
4343 |
|
|
|
4344 |
|
|
break;
|
4345 |
|
|
|
4346 |
|
|
case AEC_AUTO:
|
4347 |
|
|
ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
|
4348 |
|
|
|
4349 |
|
|
ixj_WriteDSPCommand(0xE011, j);
|
4350 |
|
|
ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
|
4351 |
|
|
|
4352 |
|
|
ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
|
4353 |
|
|
|
4354 |
|
|
if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
|
4355 |
|
|
ixj_WriteDSPCommand(0x0224, j);
|
4356 |
|
|
else
|
4357 |
|
|
ixj_WriteDSPCommand(0x1224, j);
|
4358 |
|
|
|
4359 |
|
|
ixj_WriteDSPCommand(0xE014, j);
|
4360 |
|
|
ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
|
4361 |
|
|
|
4362 |
|
|
ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
|
4363 |
|
|
|
4364 |
|
|
break;
|
4365 |
|
|
}
|
4366 |
|
|
}
|
4367 |
|
|
}
|
4368 |
|
|
|
4369 |
|
|
static void aec_stop(IXJ *j)
|
4370 |
|
|
{
|
4371 |
|
|
j->aec_level = AEC_OFF;
|
4372 |
|
|
if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
|
4373 |
|
|
ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
|
4374 |
|
|
|
4375 |
|
|
ixj_WriteDSPCommand(0x0700, j);
|
4376 |
|
|
}
|
4377 |
|
|
if (j->play_mode != -1 && j->rec_mode != -1)
|
4378 |
|
|
{
|
4379 |
|
|
ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
|
4380 |
|
|
}
|
4381 |
|
|
}
|
4382 |
|
|
|
4383 |
|
|
static int set_play_codec(IXJ *j, int rate)
|
4384 |
|
|
{
|
4385 |
|
|
int retval = 0;
|
4386 |
|
|
|
4387 |
|
|
j->play_codec = rate;
|
4388 |
|
|
|
4389 |
|
|
switch (rate) {
|
4390 |
|
|
case G723_63:
|
4391 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
4392 |
|
|
j->play_frame_size = 12;
|
4393 |
|
|
j->play_mode = 0;
|
4394 |
|
|
} else {
|
4395 |
|
|
retval = 1;
|
4396 |
|
|
}
|
4397 |
|
|
break;
|
4398 |
|
|
case G723_53:
|
4399 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
4400 |
|
|
j->play_frame_size = 10;
|
4401 |
|
|
j->play_mode = 0;
|
4402 |
|
|
} else {
|
4403 |
|
|
retval = 1;
|
4404 |
|
|
}
|
4405 |
|
|
break;
|
4406 |
|
|
case TS85:
|
4407 |
|
|
if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
|
4408 |
|
|
j->play_frame_size = 16;
|
4409 |
|
|
j->play_mode = 0;
|
4410 |
|
|
} else {
|
4411 |
|
|
retval = 1;
|
4412 |
|
|
}
|
4413 |
|
|
break;
|
4414 |
|
|
case TS48:
|
4415 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
4416 |
|
|
j->play_frame_size = 9;
|
4417 |
|
|
j->play_mode = 0;
|
4418 |
|
|
} else {
|
4419 |
|
|
retval = 1;
|
4420 |
|
|
}
|
4421 |
|
|
break;
|
4422 |
|
|
case TS41:
|
4423 |
|
|
if (j->ver.low != 0x12 || ixj_convert_loaded) {
|
4424 |
|
|
j->play_frame_size = 8;
|
4425 |
|
|
j->play_mode = 0;
|
4426 |
|
|
} else {
|
4427 |
|
|
retval = 1;
|
4428 |
|
|
}
|
4429 |
|
|
break;
|
4430 |
|
|
case G728:
|
4431 |
|
|
if (j->dsp.low != 0x20) {
|
4432 |
|
|
j->play_frame_size = 48;
|
4433 |
|
|
j->play_mode = 0;
|
4434 |
|
|
} else {
|
4435 |
|
|
retval = 1;
|
4436 |
|
|
}
|
4437 |
|
|
break;
|
4438 |
|
|
case G729:
|
4439 |
|
|
if (j->dsp.low != 0x20) {
|
4440 |
|
|
if (!j->flags.g729_loaded) {
|
4441 |
|
|
retval = 1;
|
4442 |
|
|
break;
|
4443 |
|
|
}
|
4444 |
|
|
switch (j->baseframe.low) {
|
4445 |
|
|
case 0xA0:
|
4446 |
|
|
j->play_frame_size = 10;
|
4447 |
|
|
break;
|
4448 |
|
|
case 0x50:
|
4449 |
|
|
j->play_frame_size = 5;
|
4450 |
|
|
break;
|
4451 |
|
|
default:
|
4452 |
|
|
j->play_frame_size = 15;
|
4453 |
|
|
break;
|
4454 |
|
|
}
|
4455 |
|
|
j->play_mode = 0;
|
4456 |
|
|
} else {
|
4457 |
|
|
retval = 1;
|
4458 |
|
|
}
|
4459 |
|
|
break;
|
4460 |
|
|
case G729B:
|
4461 |
|
|
if (j->dsp.low != 0x20) {
|
4462 |
|
|
if (!j->flags.g729_loaded) {
|
4463 |
|
|
retval = 1;
|
4464 |
|
|
break;
|
4465 |
|
|
}
|
4466 |
|
|
switch (j->baseframe.low) {
|
4467 |
|
|
case 0xA0:
|
4468 |
|
|
j->play_frame_size = 12;
|
4469 |
|
|
break;
|
4470 |
|
|
case 0x50:
|
4471 |
|
|
j->play_frame_size = 6;
|
4472 |
|
|
break;
|
4473 |
|
|
default:
|
4474 |
|
|
j->play_frame_size = 18;
|
4475 |
|
|
break;
|
4476 |
|
|
}
|
4477 |
|
|
j->play_mode = 0;
|
4478 |
|
|
} else {
|
4479 |
|
|
retval = 1;
|
4480 |
|
|
}
|
4481 |
|
|
break;
|
4482 |
|
|
case ULAW:
|
4483 |
|
|
switch (j->baseframe.low) {
|
4484 |
|
|
case 0xA0:
|
4485 |
|
|
j->play_frame_size = 80;
|
4486 |
|
|
break;
|
4487 |
|
|
case 0x50:
|
4488 |
|
|
j->play_frame_size = 40;
|
4489 |
|
|
break;
|
4490 |
|
|
default:
|
4491 |
|
|
j->play_frame_size = 120;
|
4492 |
|
|
break;
|
4493 |
|
|
}
|
4494 |
|
|
j->play_mode = 2;
|
4495 |
|
|
break;
|
4496 |
|
|
case ALAW:
|
4497 |
|
|
switch (j->baseframe.low) {
|
4498 |
|
|
case 0xA0:
|
4499 |
|
|
j->play_frame_size = 80;
|
4500 |
|
|
break;
|
4501 |
|
|
case 0x50:
|
4502 |
|
|
j->play_frame_size = 40;
|
4503 |
|
|
break;
|
4504 |
|
|
default:
|
4505 |
|
|
j->play_frame_size = 120;
|
4506 |
|
|
break;
|
4507 |
|
|
}
|
4508 |
|
|
j->play_mode = 2;
|
4509 |
|
|
break;
|
4510 |
|
|
case LINEAR16:
|
4511 |
|
|
switch (j->baseframe.low) {
|
4512 |
|
|
case 0xA0:
|
4513 |
|
|
j->play_frame_size = 160;
|
4514 |
|
|
break;
|
4515 |
|
|
case 0x50:
|
4516 |
|
|
j->play_frame_size = 80;
|
4517 |
|
|
break;
|
4518 |
|
|
default:
|
4519 |
|
|
j->play_frame_size = 240;
|
4520 |
|
|
break;
|
4521 |
|
|
}
|
4522 |
|
|
j->play_mode = 6;
|
4523 |
|
|
break;
|
4524 |
|
|
case LINEAR8:
|
4525 |
|
|
switch (j->baseframe.low) {
|
4526 |
|
|
case 0xA0:
|
4527 |
|
|
j->play_frame_size = 80;
|
4528 |
|
|
break;
|
4529 |
|
|
case 0x50:
|
4530 |
|
|
j->play_frame_size = 40;
|
4531 |
|
|
break;
|
4532 |
|
|
default:
|
4533 |
|
|
j->play_frame_size = 120;
|
4534 |
|
|
break;
|
4535 |
|
|
}
|
4536 |
|
|
j->play_mode = 4;
|
4537 |
|
|
break;
|
4538 |
|
|
case WSS:
|
4539 |
|
|
switch (j->baseframe.low) {
|
4540 |
|
|
case 0xA0:
|
4541 |
|
|
j->play_frame_size = 80;
|
4542 |
|
|
break;
|
4543 |
|
|
case 0x50:
|
4544 |
|
|
j->play_frame_size = 40;
|
4545 |
|
|
break;
|
4546 |
|
|
default:
|
4547 |
|
|
j->play_frame_size = 120;
|
4548 |
|
|
break;
|
4549 |
|
|
}
|
4550 |
|
|
j->play_mode = 5;
|
4551 |
|
|
break;
|
4552 |
|
|
default:
|
4553 |
|
|
j->play_frame_size = 0;
|
4554 |
|
|
j->play_mode = -1;
|
4555 |
|
|
if (j->write_buffer) {
|
4556 |
|
|
kfree(j->write_buffer);
|
4557 |
|
|
j->write_buffer = NULL;
|
4558 |
|
|
j->write_buffer_size = 0;
|
4559 |
|
|
}
|
4560 |
|
|
retval = 1;
|
4561 |
|
|
break;
|
4562 |
|
|
}
|
4563 |
|
|
return retval;
|
4564 |
|
|
}
|
4565 |
|
|
|
4566 |
|
|
static int ixj_play_start(IXJ *j)
|
4567 |
|
|
{
|
4568 |
|
|
unsigned short cmd = 0x0000;
|
4569 |
|
|
|
4570 |
|
|
if (j->write_buffer) {
|
4571 |
|
|
ixj_play_stop(j);
|
4572 |
|
|
}
|
4573 |
|
|
|
4574 |
|
|
if(ixjdebug & 0x0002)
|
4575 |
|
|
printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
|
4576 |
|
|
|
4577 |
|
|
j->flags.playing = 1;
|
4578 |
|
|
ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
|
4579 |
|
|
|
4580 |
|
|
j->flags.play_first_frame = 1;
|
4581 |
|
|
j->drybuffer = 0;
|
4582 |
|
|
|
4583 |
|
|
if (!j->play_mode) {
|
4584 |
|
|
switch (j->play_codec) {
|
4585 |
|
|
case G723_63:
|
4586 |
|
|
cmd = 0x5231;
|
4587 |
|
|
break;
|
4588 |
|
|
case G723_53:
|
4589 |
|
|
cmd = 0x5232;
|
4590 |
|
|
break;
|
4591 |
|
|
case TS85:
|
4592 |
|
|
cmd = 0x5230; /* TrueSpeech 8.5 */
|
4593 |
|
|
|
4594 |
|
|
break;
|
4595 |
|
|
case TS48:
|
4596 |
|
|
cmd = 0x5233; /* TrueSpeech 4.8 */
|
4597 |
|
|
|
4598 |
|
|
break;
|
4599 |
|
|
case TS41:
|
4600 |
|
|
cmd = 0x5234; /* TrueSpeech 4.1 */
|
4601 |
|
|
|
4602 |
|
|
break;
|
4603 |
|
|
case G728:
|
4604 |
|
|
cmd = 0x5235;
|
4605 |
|
|
break;
|
4606 |
|
|
case G729:
|
4607 |
|
|
case G729B:
|
4608 |
|
|
cmd = 0x5236;
|
4609 |
|
|
break;
|
4610 |
|
|
default:
|
4611 |
|
|
return 1;
|
4612 |
|
|
}
|
4613 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
4614 |
|
|
return -1;
|
4615 |
|
|
}
|
4616 |
|
|
j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
|
4617 |
|
|
if (!j->write_buffer) {
|
4618 |
|
|
printk("Write buffer allocation for ixj board %d failed!\n", j->board);
|
4619 |
|
|
return -ENOMEM;
|
4620 |
|
|
}
|
4621 |
|
|
/* j->write_buffers_empty = 2; */
|
4622 |
|
|
j->write_buffers_empty = 1;
|
4623 |
|
|
j->write_buffer_size = j->play_frame_size * 2;
|
4624 |
|
|
j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
|
4625 |
|
|
j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
|
4626 |
|
|
|
4627 |
|
|
if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
|
4628 |
|
|
|
4629 |
|
|
return -1;
|
4630 |
|
|
|
4631 |
|
|
switch (j->play_mode) {
|
4632 |
|
|
case 0:
|
4633 |
|
|
cmd = 0x2C03;
|
4634 |
|
|
break;
|
4635 |
|
|
case 2:
|
4636 |
|
|
if (j->ver.low == 0x12) {
|
4637 |
|
|
cmd = 0x2C23;
|
4638 |
|
|
} else {
|
4639 |
|
|
cmd = 0x2C21;
|
4640 |
|
|
}
|
4641 |
|
|
break;
|
4642 |
|
|
case 4:
|
4643 |
|
|
if (j->ver.low == 0x12) {
|
4644 |
|
|
cmd = 0x2C43;
|
4645 |
|
|
} else {
|
4646 |
|
|
cmd = 0x2C41;
|
4647 |
|
|
}
|
4648 |
|
|
break;
|
4649 |
|
|
case 5:
|
4650 |
|
|
if (j->ver.low == 0x12) {
|
4651 |
|
|
cmd = 0x2C53;
|
4652 |
|
|
} else {
|
4653 |
|
|
cmd = 0x2C51;
|
4654 |
|
|
}
|
4655 |
|
|
break;
|
4656 |
|
|
case 6:
|
4657 |
|
|
if (j->ver.low == 0x12) {
|
4658 |
|
|
cmd = 0x2C63;
|
4659 |
|
|
} else {
|
4660 |
|
|
cmd = 0x2C61;
|
4661 |
|
|
}
|
4662 |
|
|
break;
|
4663 |
|
|
}
|
4664 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
4665 |
|
|
return -1;
|
4666 |
|
|
|
4667 |
|
|
if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
|
4668 |
|
|
return -1;
|
4669 |
|
|
|
4670 |
|
|
if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
|
4671 |
|
|
return -1;
|
4672 |
|
|
|
4673 |
|
|
if (j->flags.recording) {
|
4674 |
|
|
ixj_aec_start(j, j->aec_level);
|
4675 |
|
|
}
|
4676 |
|
|
|
4677 |
|
|
return 0;
|
4678 |
|
|
}
|
4679 |
|
|
|
4680 |
|
|
static void ixj_play_stop(IXJ *j)
|
4681 |
|
|
{
|
4682 |
|
|
if(ixjdebug & 0x0002)
|
4683 |
|
|
printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
|
4684 |
|
|
|
4685 |
|
|
if (j->write_buffer) {
|
4686 |
|
|
kfree(j->write_buffer);
|
4687 |
|
|
j->write_buffer = NULL;
|
4688 |
|
|
j->write_buffer_size = 0;
|
4689 |
|
|
}
|
4690 |
|
|
if (j->play_mode > -1) {
|
4691 |
|
|
ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
|
4692 |
|
|
|
4693 |
|
|
j->play_mode = -1;
|
4694 |
|
|
}
|
4695 |
|
|
j->flags.playing = 0;
|
4696 |
|
|
}
|
4697 |
|
|
|
4698 |
|
|
static inline int get_play_level(IXJ *j)
|
4699 |
|
|
{
|
4700 |
|
|
int retval;
|
4701 |
|
|
|
4702 |
|
|
ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
|
4703 |
|
|
return j->ssr.high << 8 | j->ssr.low;
|
4704 |
|
|
retval = j->ssr.high << 8 | j->ssr.low;
|
4705 |
|
|
retval = (retval * 256) / 240;
|
4706 |
|
|
return retval;
|
4707 |
|
|
}
|
4708 |
|
|
|
4709 |
|
|
static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
|
4710 |
|
|
{
|
4711 |
|
|
unsigned int mask = 0;
|
4712 |
|
|
|
4713 |
|
|
IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
|
4714 |
|
|
|
4715 |
|
|
poll_wait(file_p, &(j->poll_q), wait);
|
4716 |
|
|
if (j->read_buffer_ready > 0)
|
4717 |
|
|
mask |= POLLIN | POLLRDNORM; /* readable */
|
4718 |
|
|
if (j->write_buffers_empty > 0)
|
4719 |
|
|
mask |= POLLOUT | POLLWRNORM; /* writable */
|
4720 |
|
|
if (j->ex.bytes)
|
4721 |
|
|
mask |= POLLPRI;
|
4722 |
|
|
return mask;
|
4723 |
|
|
}
|
4724 |
|
|
|
4725 |
|
|
static int ixj_play_tone(IXJ *j, char tone)
|
4726 |
|
|
{
|
4727 |
|
|
if (!j->tone_state) {
|
4728 |
|
|
if(ixjdebug & 0x0002) {
|
4729 |
|
|
printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
|
4730 |
|
|
}
|
4731 |
|
|
if (j->dsp.low == 0x20) {
|
4732 |
|
|
idle(j);
|
4733 |
|
|
}
|
4734 |
|
|
j->tone_start_jif = jiffies;
|
4735 |
|
|
|
4736 |
|
|
j->tone_state = 1;
|
4737 |
|
|
}
|
4738 |
|
|
|
4739 |
|
|
j->tone_index = tone;
|
4740 |
|
|
if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
|
4741 |
|
|
return -1;
|
4742 |
|
|
|
4743 |
|
|
return 0;
|
4744 |
|
|
}
|
4745 |
|
|
|
4746 |
|
|
static int ixj_set_tone_on(unsigned short arg, IXJ *j)
|
4747 |
|
|
{
|
4748 |
|
|
j->tone_on_time = arg;
|
4749 |
|
|
|
4750 |
|
|
if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
|
4751 |
|
|
|
4752 |
|
|
return -1;
|
4753 |
|
|
|
4754 |
|
|
if (ixj_WriteDSPCommand(arg, j))
|
4755 |
|
|
return -1;
|
4756 |
|
|
|
4757 |
|
|
return 0;
|
4758 |
|
|
}
|
4759 |
|
|
|
4760 |
|
|
static int SCI_WaitHighSCI(IXJ *j)
|
4761 |
|
|
{
|
4762 |
|
|
int cnt;
|
4763 |
|
|
|
4764 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
4765 |
|
|
if (!j->pld_scrr.bits.sci) {
|
4766 |
|
|
for (cnt = 0; cnt < 10; cnt++) {
|
4767 |
|
|
udelay(32);
|
4768 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
4769 |
|
|
|
4770 |
|
|
if ((j->pld_scrr.bits.sci))
|
4771 |
|
|
return 1;
|
4772 |
|
|
}
|
4773 |
|
|
if (ixjdebug & 0x0001)
|
4774 |
|
|
printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
|
4775 |
|
|
return 0;
|
4776 |
|
|
} else
|
4777 |
|
|
return 1;
|
4778 |
|
|
}
|
4779 |
|
|
|
4780 |
|
|
static int SCI_WaitLowSCI(IXJ *j)
|
4781 |
|
|
{
|
4782 |
|
|
int cnt;
|
4783 |
|
|
|
4784 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
4785 |
|
|
if (j->pld_scrr.bits.sci) {
|
4786 |
|
|
for (cnt = 0; cnt < 10; cnt++) {
|
4787 |
|
|
udelay(32);
|
4788 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
4789 |
|
|
|
4790 |
|
|
if (!(j->pld_scrr.bits.sci))
|
4791 |
|
|
return 1;
|
4792 |
|
|
}
|
4793 |
|
|
if (ixjdebug & 0x0001)
|
4794 |
|
|
printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
|
4795 |
|
|
return 0;
|
4796 |
|
|
} else
|
4797 |
|
|
return 1;
|
4798 |
|
|
}
|
4799 |
|
|
|
4800 |
|
|
static int SCI_Control(IXJ *j, int control)
|
4801 |
|
|
{
|
4802 |
|
|
switch (control) {
|
4803 |
|
|
case SCI_End:
|
4804 |
|
|
j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
|
4805 |
|
|
|
4806 |
|
|
j->pld_scrw.bits.c1 = 0; /* to no selection */
|
4807 |
|
|
|
4808 |
|
|
break;
|
4809 |
|
|
case SCI_Enable_DAA:
|
4810 |
|
|
j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
|
4811 |
|
|
|
4812 |
|
|
j->pld_scrw.bits.c1 = 0; /* to write to DAA */
|
4813 |
|
|
|
4814 |
|
|
break;
|
4815 |
|
|
case SCI_Enable_Mixer:
|
4816 |
|
|
j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
|
4817 |
|
|
|
4818 |
|
|
j->pld_scrw.bits.c1 = 1; /* to write to mixer */
|
4819 |
|
|
|
4820 |
|
|
break;
|
4821 |
|
|
case SCI_Enable_EEPROM:
|
4822 |
|
|
j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
|
4823 |
|
|
|
4824 |
|
|
j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
|
4825 |
|
|
|
4826 |
|
|
break;
|
4827 |
|
|
default:
|
4828 |
|
|
return 0;
|
4829 |
|
|
break;
|
4830 |
|
|
}
|
4831 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
4832 |
|
|
|
4833 |
|
|
switch (control) {
|
4834 |
|
|
case SCI_End:
|
4835 |
|
|
return 1;
|
4836 |
|
|
break;
|
4837 |
|
|
case SCI_Enable_DAA:
|
4838 |
|
|
case SCI_Enable_Mixer:
|
4839 |
|
|
case SCI_Enable_EEPROM:
|
4840 |
|
|
if (!SCI_WaitHighSCI(j))
|
4841 |
|
|
return 0;
|
4842 |
|
|
break;
|
4843 |
|
|
default:
|
4844 |
|
|
return 0;
|
4845 |
|
|
break;
|
4846 |
|
|
}
|
4847 |
|
|
return 1;
|
4848 |
|
|
}
|
4849 |
|
|
|
4850 |
|
|
static int SCI_Prepare(IXJ *j)
|
4851 |
|
|
{
|
4852 |
|
|
if (!SCI_Control(j, SCI_End))
|
4853 |
|
|
return 0;
|
4854 |
|
|
|
4855 |
|
|
if (!SCI_WaitLowSCI(j))
|
4856 |
|
|
return 0;
|
4857 |
|
|
|
4858 |
|
|
return 1;
|
4859 |
|
|
}
|
4860 |
|
|
|
4861 |
|
|
static int ixj_get_mixer(long val, IXJ *j)
|
4862 |
|
|
{
|
4863 |
|
|
int reg = (val & 0x1F00) >> 8;
|
4864 |
|
|
return j->mix.vol[reg];
|
4865 |
|
|
}
|
4866 |
|
|
|
4867 |
|
|
static int ixj_mixer(long val, IXJ *j)
|
4868 |
|
|
{
|
4869 |
|
|
BYTES bytes;
|
4870 |
|
|
|
4871 |
|
|
bytes.high = (val & 0x1F00) >> 8;
|
4872 |
|
|
bytes.low = val & 0x00FF;
|
4873 |
|
|
|
4874 |
|
|
/* save mixer value so we can get back later on */
|
4875 |
|
|
j->mix.vol[bytes.high] = bytes.low;
|
4876 |
|
|
|
4877 |
|
|
outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
|
4878 |
|
|
|
4879 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
|
4880 |
|
|
|
4881 |
|
|
SCI_Control(j, SCI_Enable_Mixer);
|
4882 |
|
|
|
4883 |
|
|
SCI_Control(j, SCI_End);
|
4884 |
|
|
|
4885 |
|
|
return 0;
|
4886 |
|
|
}
|
4887 |
|
|
|
4888 |
|
|
static int daa_load(BYTES * p_bytes, IXJ *j)
|
4889 |
|
|
{
|
4890 |
|
|
outb_p(p_bytes->high, j->XILINXbase + 0x03);
|
4891 |
|
|
outb_p(p_bytes->low, j->XILINXbase + 0x02);
|
4892 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
4893 |
|
|
return 0;
|
4894 |
|
|
else
|
4895 |
|
|
return 1;
|
4896 |
|
|
}
|
4897 |
|
|
|
4898 |
|
|
static int ixj_daa_cr4(IXJ *j, char reg)
|
4899 |
|
|
{
|
4900 |
|
|
BYTES bytes;
|
4901 |
|
|
|
4902 |
|
|
switch (j->daa_mode) {
|
4903 |
|
|
case SOP_PU_SLEEP:
|
4904 |
|
|
bytes.high = 0x14;
|
4905 |
|
|
break;
|
4906 |
|
|
case SOP_PU_RINGING:
|
4907 |
|
|
bytes.high = 0x54;
|
4908 |
|
|
break;
|
4909 |
|
|
case SOP_PU_CONVERSATION:
|
4910 |
|
|
bytes.high = 0x94;
|
4911 |
|
|
break;
|
4912 |
|
|
case SOP_PU_PULSEDIALING:
|
4913 |
|
|
bytes.high = 0xD4;
|
4914 |
|
|
break;
|
4915 |
|
|
}
|
4916 |
|
|
|
4917 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
|
4918 |
|
|
|
4919 |
|
|
switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
|
4920 |
|
|
case 0:
|
4921 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
|
4922 |
|
|
break;
|
4923 |
|
|
case 1:
|
4924 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
|
4925 |
|
|
break;
|
4926 |
|
|
case 2:
|
4927 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
|
4928 |
|
|
break;
|
4929 |
|
|
case 3:
|
4930 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
|
4931 |
|
|
break;
|
4932 |
|
|
}
|
4933 |
|
|
|
4934 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
|
4935 |
|
|
|
4936 |
|
|
if (!daa_load(&bytes, j))
|
4937 |
|
|
return 0;
|
4938 |
|
|
|
4939 |
|
|
if (!SCI_Prepare(j))
|
4940 |
|
|
return 0;
|
4941 |
|
|
|
4942 |
|
|
return 1;
|
4943 |
|
|
}
|
4944 |
|
|
|
4945 |
|
|
static char daa_int_read(IXJ *j)
|
4946 |
|
|
{
|
4947 |
|
|
BYTES bytes;
|
4948 |
|
|
|
4949 |
|
|
if (!SCI_Prepare(j))
|
4950 |
|
|
return 0;
|
4951 |
|
|
|
4952 |
|
|
bytes.high = 0x38;
|
4953 |
|
|
bytes.low = 0x00;
|
4954 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
4955 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
4956 |
|
|
|
4957 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
4958 |
|
|
return 0;
|
4959 |
|
|
|
4960 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
4961 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
4962 |
|
|
if (bytes.low != ALISDAA_ID_BYTE) {
|
4963 |
|
|
if (ixjdebug & 0x0001)
|
4964 |
|
|
printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
|
4965 |
|
|
return 0;
|
4966 |
|
|
}
|
4967 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
4968 |
|
|
return 0;
|
4969 |
|
|
if (!SCI_Control(j, SCI_End))
|
4970 |
|
|
return 0;
|
4971 |
|
|
|
4972 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
4973 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
4974 |
|
|
|
4975 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
|
4976 |
|
|
|
4977 |
|
|
return 1;
|
4978 |
|
|
}
|
4979 |
|
|
|
4980 |
|
|
static char daa_CR_read(IXJ *j, int cr)
|
4981 |
|
|
{
|
4982 |
|
|
IXJ_WORD wdata;
|
4983 |
|
|
BYTES bytes;
|
4984 |
|
|
|
4985 |
|
|
if (!SCI_Prepare(j))
|
4986 |
|
|
return 0;
|
4987 |
|
|
|
4988 |
|
|
switch (j->daa_mode) {
|
4989 |
|
|
case SOP_PU_SLEEP:
|
4990 |
|
|
bytes.high = 0x30 + cr;
|
4991 |
|
|
break;
|
4992 |
|
|
case SOP_PU_RINGING:
|
4993 |
|
|
bytes.high = 0x70 + cr;
|
4994 |
|
|
break;
|
4995 |
|
|
case SOP_PU_CONVERSATION:
|
4996 |
|
|
bytes.high = 0xB0 + cr;
|
4997 |
|
|
break;
|
4998 |
|
|
case SOP_PU_PULSEDIALING:
|
4999 |
|
|
bytes.high = 0xF0 + cr;
|
5000 |
|
|
break;
|
5001 |
|
|
}
|
5002 |
|
|
|
5003 |
|
|
bytes.low = 0x00;
|
5004 |
|
|
|
5005 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5006 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5007 |
|
|
|
5008 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5009 |
|
|
return 0;
|
5010 |
|
|
|
5011 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
5012 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
5013 |
|
|
if (bytes.low != ALISDAA_ID_BYTE) {
|
5014 |
|
|
if (ixjdebug & 0x0001)
|
5015 |
|
|
printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
|
5016 |
|
|
return 0;
|
5017 |
|
|
}
|
5018 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5019 |
|
|
return 0;
|
5020 |
|
|
if (!SCI_Control(j, SCI_End))
|
5021 |
|
|
return 0;
|
5022 |
|
|
|
5023 |
|
|
wdata.word = inw_p(j->XILINXbase + 0x02);
|
5024 |
|
|
|
5025 |
|
|
switch(cr){
|
5026 |
|
|
case 5:
|
5027 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
|
5028 |
|
|
break;
|
5029 |
|
|
case 4:
|
5030 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
|
5031 |
|
|
break;
|
5032 |
|
|
case 3:
|
5033 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
|
5034 |
|
|
break;
|
5035 |
|
|
case 2:
|
5036 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
|
5037 |
|
|
break;
|
5038 |
|
|
case 1:
|
5039 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
|
5040 |
|
|
break;
|
5041 |
|
|
case 0:
|
5042 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
|
5043 |
|
|
break;
|
5044 |
|
|
default:
|
5045 |
|
|
return 0;
|
5046 |
|
|
}
|
5047 |
|
|
return 1;
|
5048 |
|
|
}
|
5049 |
|
|
|
5050 |
|
|
static int ixj_daa_cid_reset(IXJ *j)
|
5051 |
|
|
{
|
5052 |
|
|
int i;
|
5053 |
|
|
BYTES bytes;
|
5054 |
|
|
|
5055 |
|
|
if (ixjdebug & 0x0002)
|
5056 |
|
|
printk("DAA Clearing CID ram\n");
|
5057 |
|
|
|
5058 |
|
|
if (!SCI_Prepare(j))
|
5059 |
|
|
return 0;
|
5060 |
|
|
|
5061 |
|
|
bytes.high = 0x58;
|
5062 |
|
|
bytes.low = 0x00;
|
5063 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5064 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5065 |
|
|
|
5066 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5067 |
|
|
return 0;
|
5068 |
|
|
|
5069 |
|
|
if (!SCI_WaitHighSCI(j))
|
5070 |
|
|
return 0;
|
5071 |
|
|
|
5072 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
|
5073 |
|
|
bytes.high = bytes.low = 0x00;
|
5074 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5075 |
|
|
|
5076 |
|
|
if (i < ALISDAA_CALLERID_SIZE - 1)
|
5077 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5078 |
|
|
|
5079 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5080 |
|
|
return 0;
|
5081 |
|
|
|
5082 |
|
|
if (!SCI_WaitHighSCI(j))
|
5083 |
|
|
return 0;
|
5084 |
|
|
|
5085 |
|
|
}
|
5086 |
|
|
|
5087 |
|
|
if (!SCI_Control(j, SCI_End))
|
5088 |
|
|
return 0;
|
5089 |
|
|
|
5090 |
|
|
if (ixjdebug & 0x0002)
|
5091 |
|
|
printk("DAA CID ram cleared\n");
|
5092 |
|
|
|
5093 |
|
|
return 1;
|
5094 |
|
|
}
|
5095 |
|
|
|
5096 |
|
|
static int ixj_daa_cid_read(IXJ *j)
|
5097 |
|
|
{
|
5098 |
|
|
int i;
|
5099 |
|
|
BYTES bytes;
|
5100 |
|
|
char CID[ALISDAA_CALLERID_SIZE], mContinue;
|
5101 |
|
|
char *pIn, *pOut;
|
5102 |
|
|
|
5103 |
|
|
if (!SCI_Prepare(j))
|
5104 |
|
|
return 0;
|
5105 |
|
|
|
5106 |
|
|
bytes.high = 0x78;
|
5107 |
|
|
bytes.low = 0x00;
|
5108 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5109 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5110 |
|
|
|
5111 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5112 |
|
|
return 0;
|
5113 |
|
|
|
5114 |
|
|
if (!SCI_WaitHighSCI(j))
|
5115 |
|
|
return 0;
|
5116 |
|
|
|
5117 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
5118 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
5119 |
|
|
if (bytes.low != ALISDAA_ID_BYTE) {
|
5120 |
|
|
if (ixjdebug & 0x0001)
|
5121 |
|
|
printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
|
5122 |
|
|
return 0;
|
5123 |
|
|
}
|
5124 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
|
5125 |
|
|
bytes.high = bytes.low = 0x00;
|
5126 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5127 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5128 |
|
|
|
5129 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5130 |
|
|
return 0;
|
5131 |
|
|
|
5132 |
|
|
if (!SCI_WaitHighSCI(j))
|
5133 |
|
|
return 0;
|
5134 |
|
|
|
5135 |
|
|
CID[i + 0] = inb_p(j->XILINXbase + 0x03);
|
5136 |
|
|
CID[i + 1] = inb_p(j->XILINXbase + 0x02);
|
5137 |
|
|
}
|
5138 |
|
|
|
5139 |
|
|
if (!SCI_Control(j, SCI_End))
|
5140 |
|
|
return 0;
|
5141 |
|
|
|
5142 |
|
|
pIn = CID;
|
5143 |
|
|
pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
|
5144 |
|
|
mContinue = 1;
|
5145 |
|
|
while (mContinue) {
|
5146 |
|
|
if ((pIn[1] & 0x03) == 0x01) {
|
5147 |
|
|
pOut[0] = pIn[0];
|
5148 |
|
|
}
|
5149 |
|
|
if ((pIn[2] & 0x0c) == 0x04) {
|
5150 |
|
|
pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
|
5151 |
|
|
}
|
5152 |
|
|
if ((pIn[3] & 0x30) == 0x10) {
|
5153 |
|
|
pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
|
5154 |
|
|
}
|
5155 |
|
|
if ((pIn[4] & 0xc0) == 0x40) {
|
5156 |
|
|
pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
|
5157 |
|
|
} else {
|
5158 |
|
|
mContinue = FALSE;
|
5159 |
|
|
}
|
5160 |
|
|
pIn += 5, pOut += 4;
|
5161 |
|
|
}
|
5162 |
|
|
memset(&j->cid, 0, sizeof(PHONE_CID));
|
5163 |
|
|
pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
|
5164 |
|
|
pOut += 4;
|
5165 |
|
|
strncpy(j->cid.month, pOut, 2);
|
5166 |
|
|
pOut += 2;
|
5167 |
|
|
strncpy(j->cid.day, pOut, 2);
|
5168 |
|
|
pOut += 2;
|
5169 |
|
|
strncpy(j->cid.hour, pOut, 2);
|
5170 |
|
|
pOut += 2;
|
5171 |
|
|
strncpy(j->cid.min, pOut, 2);
|
5172 |
|
|
pOut += 3;
|
5173 |
|
|
j->cid.numlen = *pOut;
|
5174 |
|
|
pOut += 1;
|
5175 |
|
|
strncpy(j->cid.number, pOut, j->cid.numlen);
|
5176 |
|
|
pOut += j->cid.numlen + 1;
|
5177 |
|
|
j->cid.namelen = *pOut;
|
5178 |
|
|
pOut += 1;
|
5179 |
|
|
strncpy(j->cid.name, pOut, j->cid.namelen);
|
5180 |
|
|
|
5181 |
|
|
ixj_daa_cid_reset(j);
|
5182 |
|
|
return 1;
|
5183 |
|
|
}
|
5184 |
|
|
|
5185 |
|
|
static char daa_get_version(IXJ *j)
|
5186 |
|
|
{
|
5187 |
|
|
BYTES bytes;
|
5188 |
|
|
|
5189 |
|
|
if (!SCI_Prepare(j))
|
5190 |
|
|
return 0;
|
5191 |
|
|
|
5192 |
|
|
bytes.high = 0x35;
|
5193 |
|
|
bytes.low = 0x00;
|
5194 |
|
|
outb_p(bytes.high, j->XILINXbase + 0x03);
|
5195 |
|
|
outb_p(bytes.low, j->XILINXbase + 0x02);
|
5196 |
|
|
|
5197 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5198 |
|
|
return 0;
|
5199 |
|
|
|
5200 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
5201 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
5202 |
|
|
if (bytes.low != ALISDAA_ID_BYTE) {
|
5203 |
|
|
if (ixjdebug & 0x0001)
|
5204 |
|
|
printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
|
5205 |
|
|
return 0;
|
5206 |
|
|
}
|
5207 |
|
|
if (!SCI_Control(j, SCI_Enable_DAA))
|
5208 |
|
|
return 0;
|
5209 |
|
|
|
5210 |
|
|
if (!SCI_Control(j, SCI_End))
|
5211 |
|
|
return 0;
|
5212 |
|
|
|
5213 |
|
|
bytes.high = inb_p(j->XILINXbase + 0x03);
|
5214 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
5215 |
|
|
if (ixjdebug & 0x0002)
|
5216 |
|
|
printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
|
5217 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
|
5218 |
|
|
return bytes.high;
|
5219 |
|
|
}
|
5220 |
|
|
|
5221 |
|
|
static int daa_set_mode(IXJ *j, int mode)
|
5222 |
|
|
{
|
5223 |
|
|
/* NOTE:
|
5224 |
|
|
The DAA *MUST* be in the conversation mode if the
|
5225 |
|
|
PSTN line is to be seized (PSTN line off-hook).
|
5226 |
|
|
Taking the PSTN line off-hook while the DAA is in
|
5227 |
|
|
a mode other than conversation mode will cause a
|
5228 |
|
|
hardware failure of the ALIS-A part.
|
5229 |
|
|
|
5230 |
|
|
NOTE:
|
5231 |
|
|
The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
|
5232 |
|
|
if the PSTN line is on-hook. Failure to have the PSTN line
|
5233 |
|
|
in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
|
5234 |
|
|
ALIS-A part.
|
5235 |
|
|
*/
|
5236 |
|
|
|
5237 |
|
|
BYTES bytes;
|
5238 |
|
|
|
5239 |
|
|
j->flags.pstn_rmr = 0;
|
5240 |
|
|
|
5241 |
|
|
if (!SCI_Prepare(j))
|
5242 |
|
|
return 0;
|
5243 |
|
|
|
5244 |
|
|
switch (mode) {
|
5245 |
|
|
case SOP_PU_RESET:
|
5246 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
5247 |
|
|
|
5248 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5249 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
5250 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5251 |
|
|
bytes.high = 0x10;
|
5252 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5253 |
|
|
daa_load(&bytes, j);
|
5254 |
|
|
if (!SCI_Prepare(j))
|
5255 |
|
|
return 0;
|
5256 |
|
|
|
5257 |
|
|
j->daa_mode = SOP_PU_SLEEP;
|
5258 |
|
|
break;
|
5259 |
|
|
case SOP_PU_SLEEP:
|
5260 |
|
|
if(j->daa_mode == SOP_PU_SLEEP)
|
5261 |
|
|
{
|
5262 |
|
|
break;
|
5263 |
|
|
}
|
5264 |
|
|
if (ixjdebug & 0x0008)
|
5265 |
|
|
printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
|
5266 |
|
|
/* if(j->daa_mode == SOP_PU_CONVERSATION) */
|
5267 |
|
|
{
|
5268 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
5269 |
|
|
|
5270 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5271 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
5272 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5273 |
|
|
bytes.high = 0x10;
|
5274 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5275 |
|
|
daa_load(&bytes, j);
|
5276 |
|
|
if (!SCI_Prepare(j))
|
5277 |
|
|
return 0;
|
5278 |
|
|
}
|
5279 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
5280 |
|
|
|
5281 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5282 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
5283 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5284 |
|
|
bytes.high = 0x10;
|
5285 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5286 |
|
|
daa_load(&bytes, j);
|
5287 |
|
|
if (!SCI_Prepare(j))
|
5288 |
|
|
return 0;
|
5289 |
|
|
|
5290 |
|
|
j->daa_mode = SOP_PU_SLEEP;
|
5291 |
|
|
j->flags.pstn_ringing = 0;
|
5292 |
|
|
j->ex.bits.pstn_ring = 0;
|
5293 |
|
|
j->pstn_sleeptil = jiffies + (hertz / 4);
|
5294 |
|
|
wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
|
5295 |
|
|
wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
|
5296 |
|
|
wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
|
5297 |
|
|
break;
|
5298 |
|
|
case SOP_PU_RINGING:
|
5299 |
|
|
if (ixjdebug & 0x0008)
|
5300 |
|
|
printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
|
5301 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
5302 |
|
|
|
5303 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5304 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
5305 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5306 |
|
|
bytes.high = 0x50;
|
5307 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5308 |
|
|
daa_load(&bytes, j);
|
5309 |
|
|
if (!SCI_Prepare(j))
|
5310 |
|
|
return 0;
|
5311 |
|
|
j->daa_mode = SOP_PU_RINGING;
|
5312 |
|
|
break;
|
5313 |
|
|
case SOP_PU_CONVERSATION:
|
5314 |
|
|
if (ixjdebug & 0x0008)
|
5315 |
|
|
printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
|
5316 |
|
|
bytes.high = 0x90;
|
5317 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5318 |
|
|
daa_load(&bytes, j);
|
5319 |
|
|
if (!SCI_Prepare(j))
|
5320 |
|
|
return 0;
|
5321 |
|
|
j->pld_slicw.bits.rly2 = 1;
|
5322 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5323 |
|
|
j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
|
5324 |
|
|
|
5325 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5326 |
|
|
j->daa_mode = SOP_PU_CONVERSATION;
|
5327 |
|
|
j->flags.pstn_ringing = 0;
|
5328 |
|
|
j->ex.bits.pstn_ring = 0;
|
5329 |
|
|
j->pstn_sleeptil = jiffies;
|
5330 |
|
|
j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
|
5331 |
|
|
break;
|
5332 |
|
|
case SOP_PU_PULSEDIALING:
|
5333 |
|
|
if (ixjdebug & 0x0008)
|
5334 |
|
|
printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
|
5335 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
5336 |
|
|
|
5337 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5338 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
5339 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
5340 |
|
|
bytes.high = 0xD0;
|
5341 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5342 |
|
|
daa_load(&bytes, j);
|
5343 |
|
|
if (!SCI_Prepare(j))
|
5344 |
|
|
return 0;
|
5345 |
|
|
j->daa_mode = SOP_PU_PULSEDIALING;
|
5346 |
|
|
break;
|
5347 |
|
|
default:
|
5348 |
|
|
break;
|
5349 |
|
|
}
|
5350 |
|
|
return 1;
|
5351 |
|
|
}
|
5352 |
|
|
|
5353 |
|
|
static int ixj_daa_write(IXJ *j)
|
5354 |
|
|
{
|
5355 |
|
|
BYTES bytes;
|
5356 |
|
|
|
5357 |
|
|
j->flags.pstncheck = 1;
|
5358 |
|
|
|
5359 |
|
|
daa_set_mode(j, SOP_PU_SLEEP);
|
5360 |
|
|
|
5361 |
|
|
if (!SCI_Prepare(j))
|
5362 |
|
|
return 0;
|
5363 |
|
|
|
5364 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5365 |
|
|
|
5366 |
|
|
bytes.high = 0x14;
|
5367 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
|
5368 |
|
|
if (!daa_load(&bytes, j))
|
5369 |
|
|
return 0;
|
5370 |
|
|
|
5371 |
|
|
bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
|
5372 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
|
5373 |
|
|
if (!daa_load(&bytes, j))
|
5374 |
|
|
return 0;
|
5375 |
|
|
|
5376 |
|
|
bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
|
5377 |
|
|
bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
|
5378 |
|
|
if (!daa_load(&bytes, j))
|
5379 |
|
|
return 0;
|
5380 |
|
|
|
5381 |
|
|
if (!SCI_Prepare(j))
|
5382 |
|
|
return 0;
|
5383 |
|
|
|
5384 |
|
|
bytes.high = 0x1F;
|
5385 |
|
|
bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
|
5386 |
|
|
if (!daa_load(&bytes, j))
|
5387 |
|
|
return 0;
|
5388 |
|
|
|
5389 |
|
|
bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
|
5390 |
|
|
bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
|
5391 |
|
|
if (!daa_load(&bytes, j))
|
5392 |
|
|
return 0;
|
5393 |
|
|
|
5394 |
|
|
bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
|
5395 |
|
|
bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
|
5396 |
|
|
if (!daa_load(&bytes, j))
|
5397 |
|
|
return 0;
|
5398 |
|
|
|
5399 |
|
|
bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
|
5400 |
|
|
bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
|
5401 |
|
|
if (!daa_load(&bytes, j))
|
5402 |
|
|
return 0;
|
5403 |
|
|
|
5404 |
|
|
bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
|
5405 |
|
|
bytes.low = 0x00;
|
5406 |
|
|
if (!daa_load(&bytes, j))
|
5407 |
|
|
return 0;
|
5408 |
|
|
|
5409 |
|
|
if (!SCI_Prepare(j))
|
5410 |
|
|
return 0;
|
5411 |
|
|
|
5412 |
|
|
bytes.high = 0x00;
|
5413 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
|
5414 |
|
|
if (!daa_load(&bytes, j))
|
5415 |
|
|
return 0;
|
5416 |
|
|
|
5417 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
|
5418 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
|
5419 |
|
|
if (!daa_load(&bytes, j))
|
5420 |
|
|
return 0;
|
5421 |
|
|
|
5422 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
|
5423 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
|
5424 |
|
|
if (!daa_load(&bytes, j))
|
5425 |
|
|
return 0;
|
5426 |
|
|
|
5427 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
|
5428 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
|
5429 |
|
|
if (!daa_load(&bytes, j))
|
5430 |
|
|
return 0;
|
5431 |
|
|
|
5432 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
|
5433 |
|
|
bytes.low = 0x00;
|
5434 |
|
|
if (!daa_load(&bytes, j))
|
5435 |
|
|
return 0;
|
5436 |
|
|
|
5437 |
|
|
if (!SCI_Control(j, SCI_End))
|
5438 |
|
|
return 0;
|
5439 |
|
|
if (!SCI_WaitLowSCI(j))
|
5440 |
|
|
return 0;
|
5441 |
|
|
|
5442 |
|
|
bytes.high = 0x01;
|
5443 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
|
5444 |
|
|
if (!daa_load(&bytes, j))
|
5445 |
|
|
return 0;
|
5446 |
|
|
|
5447 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
|
5448 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
|
5449 |
|
|
if (!daa_load(&bytes, j))
|
5450 |
|
|
return 0;
|
5451 |
|
|
|
5452 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
|
5453 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
|
5454 |
|
|
if (!daa_load(&bytes, j))
|
5455 |
|
|
return 0;
|
5456 |
|
|
|
5457 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
|
5458 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
|
5459 |
|
|
if (!daa_load(&bytes, j))
|
5460 |
|
|
return 0;
|
5461 |
|
|
|
5462 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
|
5463 |
|
|
bytes.low = 0x00;
|
5464 |
|
|
if (!daa_load(&bytes, j))
|
5465 |
|
|
return 0;
|
5466 |
|
|
|
5467 |
|
|
if (!SCI_Control(j, SCI_End))
|
5468 |
|
|
return 0;
|
5469 |
|
|
if (!SCI_WaitLowSCI(j))
|
5470 |
|
|
return 0;
|
5471 |
|
|
|
5472 |
|
|
bytes.high = 0x02;
|
5473 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
|
5474 |
|
|
if (!daa_load(&bytes, j))
|
5475 |
|
|
return 0;
|
5476 |
|
|
|
5477 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
|
5478 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
|
5479 |
|
|
if (!daa_load(&bytes, j))
|
5480 |
|
|
return 0;
|
5481 |
|
|
|
5482 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
|
5483 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
|
5484 |
|
|
if (!daa_load(&bytes, j))
|
5485 |
|
|
return 0;
|
5486 |
|
|
|
5487 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
|
5488 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
|
5489 |
|
|
if (!daa_load(&bytes, j))
|
5490 |
|
|
return 0;
|
5491 |
|
|
|
5492 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
|
5493 |
|
|
bytes.low = 0x00;
|
5494 |
|
|
if (!daa_load(&bytes, j))
|
5495 |
|
|
return 0;
|
5496 |
|
|
|
5497 |
|
|
if (!SCI_Control(j, SCI_End))
|
5498 |
|
|
return 0;
|
5499 |
|
|
if (!SCI_WaitLowSCI(j))
|
5500 |
|
|
return 0;
|
5501 |
|
|
|
5502 |
|
|
bytes.high = 0x03;
|
5503 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
|
5504 |
|
|
if (!daa_load(&bytes, j))
|
5505 |
|
|
return 0;
|
5506 |
|
|
|
5507 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
|
5508 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
|
5509 |
|
|
if (!daa_load(&bytes, j))
|
5510 |
|
|
return 0;
|
5511 |
|
|
|
5512 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
|
5513 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
|
5514 |
|
|
if (!daa_load(&bytes, j))
|
5515 |
|
|
return 0;
|
5516 |
|
|
|
5517 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
|
5518 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
|
5519 |
|
|
if (!daa_load(&bytes, j))
|
5520 |
|
|
return 0;
|
5521 |
|
|
|
5522 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
|
5523 |
|
|
bytes.low = 0x00;
|
5524 |
|
|
if (!daa_load(&bytes, j))
|
5525 |
|
|
return 0;
|
5526 |
|
|
|
5527 |
|
|
if (!SCI_Control(j, SCI_End))
|
5528 |
|
|
return 0;
|
5529 |
|
|
if (!SCI_WaitLowSCI(j))
|
5530 |
|
|
return 0;
|
5531 |
|
|
|
5532 |
|
|
bytes.high = 0x04;
|
5533 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
|
5534 |
|
|
if (!daa_load(&bytes, j))
|
5535 |
|
|
return 0;
|
5536 |
|
|
|
5537 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
|
5538 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
|
5539 |
|
|
if (!daa_load(&bytes, j))
|
5540 |
|
|
return 0;
|
5541 |
|
|
|
5542 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
|
5543 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
|
5544 |
|
|
if (!daa_load(&bytes, j))
|
5545 |
|
|
return 0;
|
5546 |
|
|
|
5547 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
|
5548 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
|
5549 |
|
|
if (!daa_load(&bytes, j))
|
5550 |
|
|
return 0;
|
5551 |
|
|
|
5552 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
|
5553 |
|
|
bytes.low = 0x00;
|
5554 |
|
|
if (!daa_load(&bytes, j))
|
5555 |
|
|
return 0;
|
5556 |
|
|
|
5557 |
|
|
if (!SCI_Control(j, SCI_End))
|
5558 |
|
|
return 0;
|
5559 |
|
|
if (!SCI_WaitLowSCI(j))
|
5560 |
|
|
return 0;
|
5561 |
|
|
|
5562 |
|
|
bytes.high = 0x05;
|
5563 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
|
5564 |
|
|
if (!daa_load(&bytes, j))
|
5565 |
|
|
return 0;
|
5566 |
|
|
|
5567 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
|
5568 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
|
5569 |
|
|
if (!daa_load(&bytes, j))
|
5570 |
|
|
return 0;
|
5571 |
|
|
|
5572 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
|
5573 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
|
5574 |
|
|
if (!daa_load(&bytes, j))
|
5575 |
|
|
return 0;
|
5576 |
|
|
|
5577 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
|
5578 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
|
5579 |
|
|
if (!daa_load(&bytes, j))
|
5580 |
|
|
return 0;
|
5581 |
|
|
|
5582 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
|
5583 |
|
|
bytes.low = 0x00;
|
5584 |
|
|
if (!daa_load(&bytes, j))
|
5585 |
|
|
return 0;
|
5586 |
|
|
|
5587 |
|
|
if (!SCI_Control(j, SCI_End))
|
5588 |
|
|
return 0;
|
5589 |
|
|
if (!SCI_WaitLowSCI(j))
|
5590 |
|
|
return 0;
|
5591 |
|
|
|
5592 |
|
|
bytes.high = 0x06;
|
5593 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
|
5594 |
|
|
if (!daa_load(&bytes, j))
|
5595 |
|
|
return 0;
|
5596 |
|
|
|
5597 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
|
5598 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
|
5599 |
|
|
if (!daa_load(&bytes, j))
|
5600 |
|
|
return 0;
|
5601 |
|
|
|
5602 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
|
5603 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
|
5604 |
|
|
if (!daa_load(&bytes, j))
|
5605 |
|
|
return 0;
|
5606 |
|
|
|
5607 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
|
5608 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
|
5609 |
|
|
if (!daa_load(&bytes, j))
|
5610 |
|
|
return 0;
|
5611 |
|
|
|
5612 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
|
5613 |
|
|
bytes.low = 0x00;
|
5614 |
|
|
if (!daa_load(&bytes, j))
|
5615 |
|
|
return 0;
|
5616 |
|
|
|
5617 |
|
|
if (!SCI_Control(j, SCI_End))
|
5618 |
|
|
return 0;
|
5619 |
|
|
if (!SCI_WaitLowSCI(j))
|
5620 |
|
|
return 0;
|
5621 |
|
|
|
5622 |
|
|
bytes.high = 0x07;
|
5623 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
|
5624 |
|
|
if (!daa_load(&bytes, j))
|
5625 |
|
|
return 0;
|
5626 |
|
|
|
5627 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
|
5628 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
|
5629 |
|
|
if (!daa_load(&bytes, j))
|
5630 |
|
|
return 0;
|
5631 |
|
|
|
5632 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
|
5633 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
|
5634 |
|
|
if (!daa_load(&bytes, j))
|
5635 |
|
|
return 0;
|
5636 |
|
|
|
5637 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
|
5638 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
|
5639 |
|
|
if (!daa_load(&bytes, j))
|
5640 |
|
|
return 0;
|
5641 |
|
|
|
5642 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
|
5643 |
|
|
bytes.low = 0x00;
|
5644 |
|
|
if (!daa_load(&bytes, j))
|
5645 |
|
|
return 0;
|
5646 |
|
|
|
5647 |
|
|
if (!SCI_Control(j, SCI_End))
|
5648 |
|
|
return 0;
|
5649 |
|
|
if (!SCI_WaitLowSCI(j))
|
5650 |
|
|
return 0;
|
5651 |
|
|
|
5652 |
|
|
bytes.high = 0x08;
|
5653 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
|
5654 |
|
|
if (!daa_load(&bytes, j))
|
5655 |
|
|
return 0;
|
5656 |
|
|
|
5657 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
|
5658 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
|
5659 |
|
|
if (!daa_load(&bytes, j))
|
5660 |
|
|
return 0;
|
5661 |
|
|
|
5662 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
|
5663 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
|
5664 |
|
|
if (!daa_load(&bytes, j))
|
5665 |
|
|
return 0;
|
5666 |
|
|
|
5667 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
|
5668 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
|
5669 |
|
|
if (!daa_load(&bytes, j))
|
5670 |
|
|
return 0;
|
5671 |
|
|
|
5672 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
|
5673 |
|
|
bytes.low = 0x00;
|
5674 |
|
|
if (!daa_load(&bytes, j))
|
5675 |
|
|
return 0;
|
5676 |
|
|
|
5677 |
|
|
if (!SCI_Control(j, SCI_End))
|
5678 |
|
|
return 0;
|
5679 |
|
|
if (!SCI_WaitLowSCI(j))
|
5680 |
|
|
return 0;
|
5681 |
|
|
|
5682 |
|
|
bytes.high = 0x09;
|
5683 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
|
5684 |
|
|
if (!daa_load(&bytes, j))
|
5685 |
|
|
return 0;
|
5686 |
|
|
|
5687 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
|
5688 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
|
5689 |
|
|
if (!daa_load(&bytes, j))
|
5690 |
|
|
return 0;
|
5691 |
|
|
|
5692 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
|
5693 |
|
|
bytes.low = 0x00;
|
5694 |
|
|
if (!daa_load(&bytes, j))
|
5695 |
|
|
return 0;
|
5696 |
|
|
|
5697 |
|
|
if (!SCI_Control(j, SCI_End))
|
5698 |
|
|
return 0;
|
5699 |
|
|
if (!SCI_WaitLowSCI(j))
|
5700 |
|
|
return 0;
|
5701 |
|
|
|
5702 |
|
|
bytes.high = 0x0A;
|
5703 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
|
5704 |
|
|
if (!daa_load(&bytes, j))
|
5705 |
|
|
return 0;
|
5706 |
|
|
|
5707 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
|
5708 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
|
5709 |
|
|
if (!daa_load(&bytes, j))
|
5710 |
|
|
return 0;
|
5711 |
|
|
|
5712 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
|
5713 |
|
|
bytes.low = 0x00;
|
5714 |
|
|
if (!daa_load(&bytes, j))
|
5715 |
|
|
return 0;
|
5716 |
|
|
|
5717 |
|
|
if (!SCI_Control(j, SCI_End))
|
5718 |
|
|
return 0;
|
5719 |
|
|
if (!SCI_WaitLowSCI(j))
|
5720 |
|
|
return 0;
|
5721 |
|
|
|
5722 |
|
|
bytes.high = 0x0B;
|
5723 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
|
5724 |
|
|
if (!daa_load(&bytes, j))
|
5725 |
|
|
return 0;
|
5726 |
|
|
|
5727 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
|
5728 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
|
5729 |
|
|
if (!daa_load(&bytes, j))
|
5730 |
|
|
return 0;
|
5731 |
|
|
|
5732 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
|
5733 |
|
|
bytes.low = 0x00;
|
5734 |
|
|
if (!daa_load(&bytes, j))
|
5735 |
|
|
return 0;
|
5736 |
|
|
|
5737 |
|
|
if (!SCI_Control(j, SCI_End))
|
5738 |
|
|
return 0;
|
5739 |
|
|
if (!SCI_WaitLowSCI(j))
|
5740 |
|
|
return 0;
|
5741 |
|
|
|
5742 |
|
|
bytes.high = 0x0C;
|
5743 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
|
5744 |
|
|
if (!daa_load(&bytes, j))
|
5745 |
|
|
return 0;
|
5746 |
|
|
|
5747 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
|
5748 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
|
5749 |
|
|
if (!daa_load(&bytes, j))
|
5750 |
|
|
return 0;
|
5751 |
|
|
|
5752 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
|
5753 |
|
|
bytes.low = 0x00;
|
5754 |
|
|
if (!daa_load(&bytes, j))
|
5755 |
|
|
return 0;
|
5756 |
|
|
|
5757 |
|
|
if (!SCI_Control(j, SCI_End))
|
5758 |
|
|
return 0;
|
5759 |
|
|
if (!SCI_WaitLowSCI(j))
|
5760 |
|
|
return 0;
|
5761 |
|
|
|
5762 |
|
|
bytes.high = 0x0D;
|
5763 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
|
5764 |
|
|
if (!daa_load(&bytes, j))
|
5765 |
|
|
return 0;
|
5766 |
|
|
|
5767 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
|
5768 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
|
5769 |
|
|
if (!daa_load(&bytes, j))
|
5770 |
|
|
return 0;
|
5771 |
|
|
|
5772 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
|
5773 |
|
|
bytes.low = 0x00;
|
5774 |
|
|
if (!daa_load(&bytes, j))
|
5775 |
|
|
return 0;
|
5776 |
|
|
|
5777 |
|
|
if (!SCI_Control(j, SCI_End))
|
5778 |
|
|
return 0;
|
5779 |
|
|
if (!SCI_WaitLowSCI(j))
|
5780 |
|
|
return 0;
|
5781 |
|
|
|
5782 |
|
|
bytes.high = 0x0E;
|
5783 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
|
5784 |
|
|
if (!daa_load(&bytes, j))
|
5785 |
|
|
return 0;
|
5786 |
|
|
|
5787 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
|
5788 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
|
5789 |
|
|
if (!daa_load(&bytes, j))
|
5790 |
|
|
return 0;
|
5791 |
|
|
|
5792 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
|
5793 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
|
5794 |
|
|
if (!daa_load(&bytes, j))
|
5795 |
|
|
return 0;
|
5796 |
|
|
|
5797 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
|
5798 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
|
5799 |
|
|
if (!daa_load(&bytes, j))
|
5800 |
|
|
return 0;
|
5801 |
|
|
|
5802 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
|
5803 |
|
|
bytes.low = 0x00;
|
5804 |
|
|
if (!daa_load(&bytes, j))
|
5805 |
|
|
return 0;
|
5806 |
|
|
|
5807 |
|
|
if (!SCI_Control(j, SCI_End))
|
5808 |
|
|
return 0;
|
5809 |
|
|
if (!SCI_WaitLowSCI(j))
|
5810 |
|
|
return 0;
|
5811 |
|
|
|
5812 |
|
|
bytes.high = 0x0F;
|
5813 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
|
5814 |
|
|
if (!daa_load(&bytes, j))
|
5815 |
|
|
return 0;
|
5816 |
|
|
|
5817 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
|
5818 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
|
5819 |
|
|
if (!daa_load(&bytes, j))
|
5820 |
|
|
return 0;
|
5821 |
|
|
|
5822 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
|
5823 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
|
5824 |
|
|
if (!daa_load(&bytes, j))
|
5825 |
|
|
return 0;
|
5826 |
|
|
|
5827 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
|
5828 |
|
|
bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
|
5829 |
|
|
if (!daa_load(&bytes, j))
|
5830 |
|
|
return 0;
|
5831 |
|
|
|
5832 |
|
|
bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
|
5833 |
|
|
bytes.low = 0x00;
|
5834 |
|
|
if (!daa_load(&bytes, j))
|
5835 |
|
|
return 0;
|
5836 |
|
|
|
5837 |
|
|
udelay(32);
|
5838 |
|
|
j->pld_scrr.byte = inb_p(j->XILINXbase);
|
5839 |
|
|
if (!SCI_Control(j, SCI_End))
|
5840 |
|
|
return 0;
|
5841 |
|
|
|
5842 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
5843 |
|
|
|
5844 |
|
|
if (ixjdebug & 0x0002)
|
5845 |
|
|
printk("DAA Coefficients Loaded\n");
|
5846 |
|
|
|
5847 |
|
|
j->flags.pstncheck = 0;
|
5848 |
|
|
return 1;
|
5849 |
|
|
}
|
5850 |
|
|
|
5851 |
|
|
int ixj_set_tone_off(unsigned short arg, IXJ *j)
|
5852 |
|
|
{
|
5853 |
|
|
j->tone_off_time = arg;
|
5854 |
|
|
if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
|
5855 |
|
|
|
5856 |
|
|
return -1;
|
5857 |
|
|
if (ixj_WriteDSPCommand(arg, j))
|
5858 |
|
|
return -1;
|
5859 |
|
|
return 0;
|
5860 |
|
|
}
|
5861 |
|
|
|
5862 |
|
|
static int ixj_get_tone_on(IXJ *j)
|
5863 |
|
|
{
|
5864 |
|
|
if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
|
5865 |
|
|
|
5866 |
|
|
return -1;
|
5867 |
|
|
return 0;
|
5868 |
|
|
}
|
5869 |
|
|
|
5870 |
|
|
static int ixj_get_tone_off(IXJ *j)
|
5871 |
|
|
{
|
5872 |
|
|
if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
|
5873 |
|
|
|
5874 |
|
|
return -1;
|
5875 |
|
|
return 0;
|
5876 |
|
|
}
|
5877 |
|
|
|
5878 |
|
|
static void ixj_busytone(IXJ *j)
|
5879 |
|
|
{
|
5880 |
|
|
j->flags.ringback = 0;
|
5881 |
|
|
j->flags.dialtone = 0;
|
5882 |
|
|
j->flags.busytone = 1;
|
5883 |
|
|
ixj_set_tone_on(0x07D0, j);
|
5884 |
|
|
ixj_set_tone_off(0x07D0, j);
|
5885 |
|
|
ixj_play_tone(j, 27);
|
5886 |
|
|
}
|
5887 |
|
|
|
5888 |
|
|
static void ixj_dialtone(IXJ *j)
|
5889 |
|
|
{
|
5890 |
|
|
j->flags.ringback = 0;
|
5891 |
|
|
j->flags.dialtone = 1;
|
5892 |
|
|
j->flags.busytone = 0;
|
5893 |
|
|
if (j->dsp.low == 0x20) {
|
5894 |
|
|
return;
|
5895 |
|
|
} else {
|
5896 |
|
|
ixj_set_tone_on(0xFFFF, j);
|
5897 |
|
|
ixj_set_tone_off(0x0000, j);
|
5898 |
|
|
ixj_play_tone(j, 25);
|
5899 |
|
|
}
|
5900 |
|
|
}
|
5901 |
|
|
|
5902 |
|
|
static void ixj_cpt_stop(IXJ *j)
|
5903 |
|
|
{
|
5904 |
|
|
if(j->tone_state || j->tone_cadence_state)
|
5905 |
|
|
{
|
5906 |
|
|
j->flags.dialtone = 0;
|
5907 |
|
|
j->flags.busytone = 0;
|
5908 |
|
|
j->flags.ringback = 0;
|
5909 |
|
|
ixj_set_tone_on(0x0001, j);
|
5910 |
|
|
ixj_set_tone_off(0x0000, j);
|
5911 |
|
|
ixj_play_tone(j, 0);
|
5912 |
|
|
j->tone_state = j->tone_cadence_state = 0;
|
5913 |
|
|
if (j->cadence_t) {
|
5914 |
|
|
if (j->cadence_t->ce) {
|
5915 |
|
|
kfree(j->cadence_t->ce);
|
5916 |
|
|
}
|
5917 |
|
|
kfree(j->cadence_t);
|
5918 |
|
|
j->cadence_t = NULL;
|
5919 |
|
|
}
|
5920 |
|
|
}
|
5921 |
|
|
if (j->play_mode == -1 && j->rec_mode == -1)
|
5922 |
|
|
idle(j);
|
5923 |
|
|
if (j->play_mode != -1 && j->dsp.low == 0x20)
|
5924 |
|
|
ixj_play_start(j);
|
5925 |
|
|
if (j->rec_mode != -1 && j->dsp.low == 0x20)
|
5926 |
|
|
ixj_record_start(j);
|
5927 |
|
|
}
|
5928 |
|
|
|
5929 |
|
|
static void ixj_ringback(IXJ *j)
|
5930 |
|
|
{
|
5931 |
|
|
j->flags.busytone = 0;
|
5932 |
|
|
j->flags.dialtone = 0;
|
5933 |
|
|
j->flags.ringback = 1;
|
5934 |
|
|
ixj_set_tone_on(0x0FA0, j);
|
5935 |
|
|
ixj_set_tone_off(0x2EE0, j);
|
5936 |
|
|
ixj_play_tone(j, 26);
|
5937 |
|
|
}
|
5938 |
|
|
|
5939 |
|
|
static void ixj_testram(IXJ *j)
|
5940 |
|
|
{
|
5941 |
|
|
ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
|
5942 |
|
|
}
|
5943 |
|
|
|
5944 |
|
|
static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp)
|
5945 |
|
|
{
|
5946 |
|
|
IXJ_CADENCE *lcp;
|
5947 |
|
|
IXJ_CADENCE_ELEMENT *lcep;
|
5948 |
|
|
IXJ_TONE ti;
|
5949 |
|
|
|
5950 |
|
|
lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
|
5951 |
|
|
if (lcp == NULL)
|
5952 |
|
|
return -ENOMEM;
|
5953 |
|
|
if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) || (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT) )
|
5954 |
|
|
{
|
5955 |
|
|
kfree(lcp);
|
5956 |
|
|
return -EFAULT;
|
5957 |
|
|
}
|
5958 |
|
|
lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
|
5959 |
|
|
if (lcep == NULL) {
|
5960 |
|
|
kfree(lcp);
|
5961 |
|
|
return -ENOMEM;
|
5962 |
|
|
}
|
5963 |
|
|
if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
|
5964 |
|
|
{
|
5965 |
|
|
kfree(lcep);
|
5966 |
|
|
kfree(lcp);
|
5967 |
|
|
return -EFAULT;
|
5968 |
|
|
}
|
5969 |
|
|
if (j->cadence_t) {
|
5970 |
|
|
kfree(j->cadence_t->ce);
|
5971 |
|
|
kfree(j->cadence_t);
|
5972 |
|
|
}
|
5973 |
|
|
lcp->ce = (void *) lcep;
|
5974 |
|
|
j->cadence_t = lcp;
|
5975 |
|
|
j->tone_cadence_state = 0;
|
5976 |
|
|
ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
|
5977 |
|
|
ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
|
5978 |
|
|
if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
|
5979 |
|
|
ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
|
5980 |
|
|
ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
|
5981 |
|
|
ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
|
5982 |
|
|
ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
|
5983 |
|
|
ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
|
5984 |
|
|
ixj_init_tone(j, &ti);
|
5985 |
|
|
}
|
5986 |
|
|
ixj_play_tone(j, lcp->ce[0].index);
|
5987 |
|
|
return 1;
|
5988 |
|
|
}
|
5989 |
|
|
|
5990 |
|
|
static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp)
|
5991 |
|
|
{
|
5992 |
|
|
IXJ_FILTER_CADENCE *lcp;
|
5993 |
|
|
lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
|
5994 |
|
|
if (lcp == NULL) {
|
5995 |
|
|
if(ixjdebug & 0x0001) {
|
5996 |
|
|
printk(KERN_INFO "Could not allocate memory for cadence\n");
|
5997 |
|
|
}
|
5998 |
|
|
return -ENOMEM;
|
5999 |
|
|
}
|
6000 |
|
|
if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE))) {
|
6001 |
|
|
if(ixjdebug & 0x0001) {
|
6002 |
|
|
printk(KERN_INFO "Could not copy cadence to kernel\n");
|
6003 |
|
|
}
|
6004 |
|
|
kfree(lcp);
|
6005 |
|
|
return -EFAULT;
|
6006 |
|
|
}
|
6007 |
|
|
if (lcp->filter > 5) {
|
6008 |
|
|
if(ixjdebug & 0x0001) {
|
6009 |
|
|
printk(KERN_INFO "Cadence out of range\n");
|
6010 |
|
|
}
|
6011 |
|
|
kfree(lcp);
|
6012 |
|
|
return -1;
|
6013 |
|
|
}
|
6014 |
|
|
j->cadence_f[lcp->filter].state = 0;
|
6015 |
|
|
j->cadence_f[lcp->filter].enable = lcp->enable;
|
6016 |
|
|
j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
|
6017 |
|
|
j->cadence_f[lcp->filter].on1 = lcp->on1;
|
6018 |
|
|
j->cadence_f[lcp->filter].on1min = 0;
|
6019 |
|
|
j->cadence_f[lcp->filter].on1max = 0;
|
6020 |
|
|
j->cadence_f[lcp->filter].off1 = lcp->off1;
|
6021 |
|
|
j->cadence_f[lcp->filter].off1min = 0;
|
6022 |
|
|
j->cadence_f[lcp->filter].off1max = 0;
|
6023 |
|
|
j->cadence_f[lcp->filter].on2 = lcp->on2;
|
6024 |
|
|
j->cadence_f[lcp->filter].on2min = 0;
|
6025 |
|
|
j->cadence_f[lcp->filter].on2max = 0;
|
6026 |
|
|
j->cadence_f[lcp->filter].off2 = lcp->off2;
|
6027 |
|
|
j->cadence_f[lcp->filter].off2min = 0;
|
6028 |
|
|
j->cadence_f[lcp->filter].off2max = 0;
|
6029 |
|
|
j->cadence_f[lcp->filter].on3 = lcp->on3;
|
6030 |
|
|
j->cadence_f[lcp->filter].on3min = 0;
|
6031 |
|
|
j->cadence_f[lcp->filter].on3max = 0;
|
6032 |
|
|
j->cadence_f[lcp->filter].off3 = lcp->off3;
|
6033 |
|
|
j->cadence_f[lcp->filter].off3min = 0;
|
6034 |
|
|
j->cadence_f[lcp->filter].off3max = 0;
|
6035 |
|
|
kfree(lcp);
|
6036 |
|
|
if(ixjdebug & 0x0002) {
|
6037 |
|
|
printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
|
6038 |
|
|
}
|
6039 |
|
|
return 0;
|
6040 |
|
|
}
|
6041 |
|
|
|
6042 |
|
|
static void add_caps(IXJ *j)
|
6043 |
|
|
{
|
6044 |
|
|
j->caps = 0;
|
6045 |
|
|
j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
|
6046 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
|
6047 |
|
|
j->caplist[j->caps].captype = vendor;
|
6048 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6049 |
|
|
j->caplist[j->caps].captype = device;
|
6050 |
|
|
switch (j->cardtype) {
|
6051 |
|
|
case QTI_PHONEJACK:
|
6052 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
|
6053 |
|
|
break;
|
6054 |
|
|
case QTI_LINEJACK:
|
6055 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
|
6056 |
|
|
break;
|
6057 |
|
|
case QTI_PHONEJACK_LITE:
|
6058 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
|
6059 |
|
|
break;
|
6060 |
|
|
case QTI_PHONEJACK_PCI:
|
6061 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
|
6062 |
|
|
break;
|
6063 |
|
|
case QTI_PHONECARD:
|
6064 |
|
|
strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
|
6065 |
|
|
break;
|
6066 |
|
|
}
|
6067 |
|
|
j->caplist[j->caps].cap = j->cardtype;
|
6068 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6069 |
|
|
strcpy(j->caplist[j->caps].desc, "POTS");
|
6070 |
|
|
j->caplist[j->caps].captype = port;
|
6071 |
|
|
j->caplist[j->caps].cap = pots;
|
6072 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6073 |
|
|
|
6074 |
|
|
/* add devices that can do speaker/mic */
|
6075 |
|
|
switch (j->cardtype) {
|
6076 |
|
|
case QTI_PHONEJACK:
|
6077 |
|
|
case QTI_LINEJACK:
|
6078 |
|
|
case QTI_PHONEJACK_PCI:
|
6079 |
|
|
case QTI_PHONECARD:
|
6080 |
|
|
strcpy(j->caplist[j->caps].desc, "SPEAKER");
|
6081 |
|
|
j->caplist[j->caps].captype = port;
|
6082 |
|
|
j->caplist[j->caps].cap = speaker;
|
6083 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6084 |
|
|
default:
|
6085 |
|
|
break;
|
6086 |
|
|
}
|
6087 |
|
|
|
6088 |
|
|
/* add devices that can do handset */
|
6089 |
|
|
switch (j->cardtype) {
|
6090 |
|
|
case QTI_PHONEJACK:
|
6091 |
|
|
strcpy(j->caplist[j->caps].desc, "HANDSET");
|
6092 |
|
|
j->caplist[j->caps].captype = port;
|
6093 |
|
|
j->caplist[j->caps].cap = handset;
|
6094 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6095 |
|
|
break;
|
6096 |
|
|
default:
|
6097 |
|
|
break;
|
6098 |
|
|
}
|
6099 |
|
|
|
6100 |
|
|
/* add devices that can do PSTN */
|
6101 |
|
|
switch (j->cardtype) {
|
6102 |
|
|
case QTI_LINEJACK:
|
6103 |
|
|
strcpy(j->caplist[j->caps].desc, "PSTN");
|
6104 |
|
|
j->caplist[j->caps].captype = port;
|
6105 |
|
|
j->caplist[j->caps].cap = pstn;
|
6106 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6107 |
|
|
break;
|
6108 |
|
|
default:
|
6109 |
|
|
break;
|
6110 |
|
|
}
|
6111 |
|
|
|
6112 |
|
|
/* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
|
6113 |
|
|
strcpy(j->caplist[j->caps].desc, "ULAW");
|
6114 |
|
|
j->caplist[j->caps].captype = codec;
|
6115 |
|
|
j->caplist[j->caps].cap = ULAW;
|
6116 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6117 |
|
|
|
6118 |
|
|
strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
|
6119 |
|
|
j->caplist[j->caps].captype = codec;
|
6120 |
|
|
j->caplist[j->caps].cap = LINEAR16;
|
6121 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6122 |
|
|
|
6123 |
|
|
strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
|
6124 |
|
|
j->caplist[j->caps].captype = codec;
|
6125 |
|
|
j->caplist[j->caps].cap = LINEAR8;
|
6126 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6127 |
|
|
|
6128 |
|
|
strcpy(j->caplist[j->caps].desc, "Windows Sound System");
|
6129 |
|
|
j->caplist[j->caps].captype = codec;
|
6130 |
|
|
j->caplist[j->caps].cap = WSS;
|
6131 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6132 |
|
|
|
6133 |
|
|
/* software ALAW codec, made from ULAW */
|
6134 |
|
|
strcpy(j->caplist[j->caps].desc, "ALAW");
|
6135 |
|
|
j->caplist[j->caps].captype = codec;
|
6136 |
|
|
j->caplist[j->caps].cap = ALAW;
|
6137 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6138 |
|
|
|
6139 |
|
|
/* version 12 of the 8020 does the following codecs in a broken way */
|
6140 |
|
|
if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
|
6141 |
|
|
strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
|
6142 |
|
|
j->caplist[j->caps].captype = codec;
|
6143 |
|
|
j->caplist[j->caps].cap = G723_63;
|
6144 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6145 |
|
|
|
6146 |
|
|
strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
|
6147 |
|
|
j->caplist[j->caps].captype = codec;
|
6148 |
|
|
j->caplist[j->caps].cap = G723_53;
|
6149 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6150 |
|
|
|
6151 |
|
|
strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
|
6152 |
|
|
j->caplist[j->caps].captype = codec;
|
6153 |
|
|
j->caplist[j->caps].cap = TS48;
|
6154 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6155 |
|
|
|
6156 |
|
|
strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
|
6157 |
|
|
j->caplist[j->caps].captype = codec;
|
6158 |
|
|
j->caplist[j->caps].cap = TS41;
|
6159 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6160 |
|
|
}
|
6161 |
|
|
|
6162 |
|
|
/* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
|
6163 |
|
|
if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
|
6164 |
|
|
strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
|
6165 |
|
|
j->caplist[j->caps].captype = codec;
|
6166 |
|
|
j->caplist[j->caps].cap = TS85;
|
6167 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6168 |
|
|
}
|
6169 |
|
|
|
6170 |
|
|
/* 8021 chips can do G728 */
|
6171 |
|
|
if (j->dsp.low == 0x21) {
|
6172 |
|
|
strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
|
6173 |
|
|
j->caplist[j->caps].captype = codec;
|
6174 |
|
|
j->caplist[j->caps].cap = G728;
|
6175 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6176 |
|
|
}
|
6177 |
|
|
|
6178 |
|
|
/* 8021/8022 chips can do G729 if loaded */
|
6179 |
|
|
if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
|
6180 |
|
|
strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
|
6181 |
|
|
j->caplist[j->caps].captype = codec;
|
6182 |
|
|
j->caplist[j->caps].cap = G729;
|
6183 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6184 |
|
|
}
|
6185 |
|
|
if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
|
6186 |
|
|
strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
|
6187 |
|
|
j->caplist[j->caps].captype = codec;
|
6188 |
|
|
j->caplist[j->caps].cap = G729B;
|
6189 |
|
|
j->caplist[j->caps].handle = j->caps++;
|
6190 |
|
|
}
|
6191 |
|
|
}
|
6192 |
|
|
|
6193 |
|
|
static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
|
6194 |
|
|
{
|
6195 |
|
|
int cnt;
|
6196 |
|
|
int retval = 0;
|
6197 |
|
|
for (cnt = 0; cnt < j->caps; cnt++) {
|
6198 |
|
|
if (pcreq->captype == j->caplist[cnt].captype
|
6199 |
|
|
&& pcreq->cap == j->caplist[cnt].cap) {
|
6200 |
|
|
retval = 1;
|
6201 |
|
|
break;
|
6202 |
|
|
}
|
6203 |
|
|
}
|
6204 |
|
|
return retval;
|
6205 |
|
|
}
|
6206 |
|
|
|
6207 |
|
|
static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
|
6208 |
|
|
{
|
6209 |
|
|
IXJ_TONE ti;
|
6210 |
|
|
IXJ_FILTER jf;
|
6211 |
|
|
IXJ_FILTER_RAW jfr;
|
6212 |
|
|
|
6213 |
|
|
unsigned int raise, mant;
|
6214 |
|
|
unsigned int minor = MINOR(inode->i_rdev);
|
6215 |
|
|
int board = NUM(inode->i_rdev);
|
6216 |
|
|
|
6217 |
|
|
IXJ *j = get_ixj(NUM(inode->i_rdev));
|
6218 |
|
|
|
6219 |
|
|
int retval = 0;
|
6220 |
|
|
|
6221 |
|
|
/*
|
6222 |
|
|
* Set up locks to ensure that only one process is talking to the DSP at a time.
|
6223 |
|
|
* This is necessary to keep the DSP from locking up.
|
6224 |
|
|
*/
|
6225 |
|
|
while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
|
6226 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
6227 |
|
|
schedule_timeout(1);
|
6228 |
|
|
}
|
6229 |
|
|
if (ixjdebug & 0x0040)
|
6230 |
|
|
printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
|
6231 |
|
|
if (minor >= IXJMAX) {
|
6232 |
|
|
clear_bit(board, &j->busyflags);
|
6233 |
|
|
return -ENODEV;
|
6234 |
|
|
}
|
6235 |
|
|
/*
|
6236 |
|
|
* Check ioctls only root can use.
|
6237 |
|
|
*/
|
6238 |
|
|
if (!capable(CAP_SYS_ADMIN)) {
|
6239 |
|
|
switch (cmd) {
|
6240 |
|
|
case IXJCTL_TESTRAM:
|
6241 |
|
|
case IXJCTL_HZ:
|
6242 |
|
|
retval = -EPERM;
|
6243 |
|
|
}
|
6244 |
|
|
}
|
6245 |
|
|
switch (cmd) {
|
6246 |
|
|
case IXJCTL_TESTRAM:
|
6247 |
|
|
ixj_testram(j);
|
6248 |
|
|
retval = (j->ssr.high << 8) + j->ssr.low;
|
6249 |
|
|
break;
|
6250 |
|
|
case IXJCTL_CARDTYPE:
|
6251 |
|
|
retval = j->cardtype;
|
6252 |
|
|
break;
|
6253 |
|
|
case IXJCTL_SERIAL:
|
6254 |
|
|
retval = j->serial;
|
6255 |
|
|
break;
|
6256 |
|
|
case IXJCTL_VERSION:
|
6257 |
|
|
if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision)))
|
6258 |
|
|
retval = -EFAULT;
|
6259 |
|
|
break;
|
6260 |
|
|
case PHONE_RING_CADENCE:
|
6261 |
|
|
j->ring_cadence = arg;
|
6262 |
|
|
break;
|
6263 |
|
|
case IXJCTL_CIDCW:
|
6264 |
|
|
if(arg) {
|
6265 |
|
|
copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
|
6266 |
|
|
}
|
6267 |
|
|
else {
|
6268 |
|
|
memset(&j->cid_send, 0, sizeof(PHONE_CID));
|
6269 |
|
|
}
|
6270 |
|
|
ixj_write_cidcw(j);
|
6271 |
|
|
break;
|
6272 |
|
|
/* Binary compatbility */
|
6273 |
|
|
case OLD_PHONE_RING_START:
|
6274 |
|
|
arg = 0;
|
6275 |
|
|
/* Fall through */
|
6276 |
|
|
case PHONE_RING_START:
|
6277 |
|
|
if(arg) {
|
6278 |
|
|
if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
|
6279 |
|
|
{
|
6280 |
|
|
retval = -EFAULT;
|
6281 |
|
|
break;
|
6282 |
|
|
}
|
6283 |
|
|
ixj_write_cid(j);
|
6284 |
|
|
}
|
6285 |
|
|
else {
|
6286 |
|
|
memset(&j->cid_send, 0, sizeof(PHONE_CID));
|
6287 |
|
|
}
|
6288 |
|
|
ixj_ring_start(j);
|
6289 |
|
|
break;
|
6290 |
|
|
case PHONE_RING_STOP:
|
6291 |
|
|
j->flags.cringing = 0;
|
6292 |
|
|
if(j->cadence_f[5].enable) {
|
6293 |
|
|
j->cadence_f[5].state = 0;
|
6294 |
|
|
}
|
6295 |
|
|
ixj_ring_off(j);
|
6296 |
|
|
break;
|
6297 |
|
|
case PHONE_RING:
|
6298 |
|
|
retval = ixj_ring(j);
|
6299 |
|
|
break;
|
6300 |
|
|
case PHONE_EXCEPTION:
|
6301 |
|
|
retval = j->ex.bytes;
|
6302 |
|
|
if(j->ex.bits.flash) {
|
6303 |
|
|
j->flash_end = 0;
|
6304 |
|
|
j->ex.bits.flash = 0;
|
6305 |
|
|
}
|
6306 |
|
|
j->ex.bits.pstn_ring = 0;
|
6307 |
|
|
j->ex.bits.caller_id = 0;
|
6308 |
|
|
j->ex.bits.pstn_wink = 0;
|
6309 |
|
|
j->ex.bits.f0 = 0;
|
6310 |
|
|
j->ex.bits.f1 = 0;
|
6311 |
|
|
j->ex.bits.f2 = 0;
|
6312 |
|
|
j->ex.bits.f3 = 0;
|
6313 |
|
|
j->ex.bits.fc0 = 0;
|
6314 |
|
|
j->ex.bits.fc1 = 0;
|
6315 |
|
|
j->ex.bits.fc2 = 0;
|
6316 |
|
|
j->ex.bits.fc3 = 0;
|
6317 |
|
|
j->ex.bits.reserved = 0;
|
6318 |
|
|
break;
|
6319 |
|
|
case PHONE_HOOKSTATE:
|
6320 |
|
|
j->ex.bits.hookstate = 0;
|
6321 |
|
|
retval = j->hookstate; //j->r_hook;
|
6322 |
|
|
break;
|
6323 |
|
|
case IXJCTL_SET_LED:
|
6324 |
|
|
LED_SetState(arg, j);
|
6325 |
|
|
break;
|
6326 |
|
|
case PHONE_FRAME:
|
6327 |
|
|
retval = set_base_frame(j, arg);
|
6328 |
|
|
break;
|
6329 |
|
|
case PHONE_REC_CODEC:
|
6330 |
|
|
retval = set_rec_codec(j, arg);
|
6331 |
|
|
break;
|
6332 |
|
|
case PHONE_VAD:
|
6333 |
|
|
ixj_vad(j, arg);
|
6334 |
|
|
break;
|
6335 |
|
|
case PHONE_REC_START:
|
6336 |
|
|
ixj_record_start(j);
|
6337 |
|
|
break;
|
6338 |
|
|
case PHONE_REC_STOP:
|
6339 |
|
|
ixj_record_stop(j);
|
6340 |
|
|
break;
|
6341 |
|
|
case PHONE_REC_DEPTH:
|
6342 |
|
|
set_rec_depth(j, arg);
|
6343 |
|
|
break;
|
6344 |
|
|
case PHONE_REC_VOLUME:
|
6345 |
|
|
if(arg == -1) {
|
6346 |
|
|
retval = get_rec_volume(j);
|
6347 |
|
|
}
|
6348 |
|
|
else {
|
6349 |
|
|
set_rec_volume(j, arg);
|
6350 |
|
|
retval = arg;
|
6351 |
|
|
}
|
6352 |
|
|
break;
|
6353 |
|
|
case PHONE_REC_VOLUME_LINEAR:
|
6354 |
|
|
if(arg == -1) {
|
6355 |
|
|
retval = get_rec_volume_linear(j);
|
6356 |
|
|
}
|
6357 |
|
|
else {
|
6358 |
|
|
set_rec_volume_linear(j, arg);
|
6359 |
|
|
retval = arg;
|
6360 |
|
|
}
|
6361 |
|
|
break;
|
6362 |
|
|
case IXJCTL_DTMF_PRESCALE:
|
6363 |
|
|
if(arg == -1) {
|
6364 |
|
|
retval = get_dtmf_prescale(j);
|
6365 |
|
|
}
|
6366 |
|
|
else {
|
6367 |
|
|
set_dtmf_prescale(j, arg);
|
6368 |
|
|
retval = arg;
|
6369 |
|
|
}
|
6370 |
|
|
break;
|
6371 |
|
|
case PHONE_REC_LEVEL:
|
6372 |
|
|
retval = get_rec_level(j);
|
6373 |
|
|
break;
|
6374 |
|
|
case IXJCTL_SC_RXG:
|
6375 |
|
|
retval = ixj_siadc(j, arg);
|
6376 |
|
|
break;
|
6377 |
|
|
case IXJCTL_SC_TXG:
|
6378 |
|
|
retval = ixj_sidac(j, arg);
|
6379 |
|
|
break;
|
6380 |
|
|
case IXJCTL_AEC_START:
|
6381 |
|
|
ixj_aec_start(j, arg);
|
6382 |
|
|
break;
|
6383 |
|
|
case IXJCTL_AEC_STOP:
|
6384 |
|
|
aec_stop(j);
|
6385 |
|
|
break;
|
6386 |
|
|
case IXJCTL_AEC_GET_LEVEL:
|
6387 |
|
|
retval = j->aec_level;
|
6388 |
|
|
break;
|
6389 |
|
|
case PHONE_PLAY_CODEC:
|
6390 |
|
|
retval = set_play_codec(j, arg);
|
6391 |
|
|
break;
|
6392 |
|
|
case PHONE_PLAY_START:
|
6393 |
|
|
retval = ixj_play_start(j);
|
6394 |
|
|
break;
|
6395 |
|
|
case PHONE_PLAY_STOP:
|
6396 |
|
|
ixj_play_stop(j);
|
6397 |
|
|
break;
|
6398 |
|
|
case PHONE_PLAY_DEPTH:
|
6399 |
|
|
set_play_depth(j, arg);
|
6400 |
|
|
break;
|
6401 |
|
|
case PHONE_PLAY_VOLUME:
|
6402 |
|
|
if(arg == -1) {
|
6403 |
|
|
retval = get_play_volume(j);
|
6404 |
|
|
}
|
6405 |
|
|
else {
|
6406 |
|
|
set_play_volume(j, arg);
|
6407 |
|
|
retval = arg;
|
6408 |
|
|
}
|
6409 |
|
|
break;
|
6410 |
|
|
case PHONE_PLAY_VOLUME_LINEAR:
|
6411 |
|
|
if(arg == -1) {
|
6412 |
|
|
retval = get_play_volume_linear(j);
|
6413 |
|
|
}
|
6414 |
|
|
else {
|
6415 |
|
|
set_play_volume_linear(j, arg);
|
6416 |
|
|
retval = arg;
|
6417 |
|
|
}
|
6418 |
|
|
break;
|
6419 |
|
|
case PHONE_PLAY_LEVEL:
|
6420 |
|
|
retval = get_play_level(j);
|
6421 |
|
|
break;
|
6422 |
|
|
case IXJCTL_DSP_TYPE:
|
6423 |
|
|
retval = (j->dsp.high << 8) + j->dsp.low;
|
6424 |
|
|
break;
|
6425 |
|
|
case IXJCTL_DSP_VERSION:
|
6426 |
|
|
retval = (j->ver.high << 8) + j->ver.low;
|
6427 |
|
|
break;
|
6428 |
|
|
case IXJCTL_HZ:
|
6429 |
|
|
hertz = arg;
|
6430 |
|
|
break;
|
6431 |
|
|
case IXJCTL_RATE:
|
6432 |
|
|
if (arg > hertz)
|
6433 |
|
|
retval = -1;
|
6434 |
|
|
else
|
6435 |
|
|
samplerate = arg;
|
6436 |
|
|
break;
|
6437 |
|
|
case IXJCTL_DRYBUFFER_READ:
|
6438 |
|
|
put_user(j->drybuffer, (unsigned long *) arg);
|
6439 |
|
|
break;
|
6440 |
|
|
case IXJCTL_DRYBUFFER_CLEAR:
|
6441 |
|
|
j->drybuffer = 0;
|
6442 |
|
|
break;
|
6443 |
|
|
case IXJCTL_FRAMES_READ:
|
6444 |
|
|
put_user(j->framesread, (unsigned long *) arg);
|
6445 |
|
|
break;
|
6446 |
|
|
case IXJCTL_FRAMES_WRITTEN:
|
6447 |
|
|
put_user(j->frameswritten, (unsigned long *) arg);
|
6448 |
|
|
break;
|
6449 |
|
|
case IXJCTL_READ_WAIT:
|
6450 |
|
|
put_user(j->read_wait, (unsigned long *) arg);
|
6451 |
|
|
break;
|
6452 |
|
|
case IXJCTL_WRITE_WAIT:
|
6453 |
|
|
put_user(j->write_wait, (unsigned long *) arg);
|
6454 |
|
|
break;
|
6455 |
|
|
case PHONE_MAXRINGS:
|
6456 |
|
|
j->maxrings = arg;
|
6457 |
|
|
break;
|
6458 |
|
|
case PHONE_SET_TONE_ON_TIME:
|
6459 |
|
|
ixj_set_tone_on(arg, j);
|
6460 |
|
|
break;
|
6461 |
|
|
case PHONE_SET_TONE_OFF_TIME:
|
6462 |
|
|
ixj_set_tone_off(arg, j);
|
6463 |
|
|
break;
|
6464 |
|
|
case PHONE_GET_TONE_ON_TIME:
|
6465 |
|
|
if (ixj_get_tone_on(j)) {
|
6466 |
|
|
retval = -1;
|
6467 |
|
|
} else {
|
6468 |
|
|
retval = (j->ssr.high << 8) + j->ssr.low;
|
6469 |
|
|
}
|
6470 |
|
|
break;
|
6471 |
|
|
case PHONE_GET_TONE_OFF_TIME:
|
6472 |
|
|
if (ixj_get_tone_off(j)) {
|
6473 |
|
|
retval = -1;
|
6474 |
|
|
} else {
|
6475 |
|
|
retval = (j->ssr.high << 8) + j->ssr.low;
|
6476 |
|
|
}
|
6477 |
|
|
break;
|
6478 |
|
|
case PHONE_PLAY_TONE:
|
6479 |
|
|
if (!j->tone_state)
|
6480 |
|
|
retval = ixj_play_tone(j, arg);
|
6481 |
|
|
else
|
6482 |
|
|
retval = -1;
|
6483 |
|
|
break;
|
6484 |
|
|
case PHONE_GET_TONE_STATE:
|
6485 |
|
|
retval = j->tone_state;
|
6486 |
|
|
break;
|
6487 |
|
|
case PHONE_DTMF_READY:
|
6488 |
|
|
retval = j->ex.bits.dtmf_ready;
|
6489 |
|
|
break;
|
6490 |
|
|
case PHONE_GET_DTMF:
|
6491 |
|
|
if (ixj_hookstate(j)) {
|
6492 |
|
|
if (j->dtmf_rp != j->dtmf_wp) {
|
6493 |
|
|
retval = j->dtmfbuffer[j->dtmf_rp];
|
6494 |
|
|
j->dtmf_rp++;
|
6495 |
|
|
if (j->dtmf_rp == 79)
|
6496 |
|
|
j->dtmf_rp = 0;
|
6497 |
|
|
if (j->dtmf_rp == j->dtmf_wp) {
|
6498 |
|
|
j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
|
6499 |
|
|
}
|
6500 |
|
|
}
|
6501 |
|
|
}
|
6502 |
|
|
break;
|
6503 |
|
|
case PHONE_GET_DTMF_ASCII:
|
6504 |
|
|
if (ixj_hookstate(j)) {
|
6505 |
|
|
if (j->dtmf_rp != j->dtmf_wp) {
|
6506 |
|
|
switch (j->dtmfbuffer[j->dtmf_rp]) {
|
6507 |
|
|
case 10:
|
6508 |
|
|
retval = 42; /* '*'; */
|
6509 |
|
|
|
6510 |
|
|
break;
|
6511 |
|
|
case 11:
|
6512 |
|
|
retval = 48; /*'0'; */
|
6513 |
|
|
|
6514 |
|
|
break;
|
6515 |
|
|
case 12:
|
6516 |
|
|
retval = 35; /*'#'; */
|
6517 |
|
|
|
6518 |
|
|
break;
|
6519 |
|
|
case 28:
|
6520 |
|
|
retval = 65; /*'A'; */
|
6521 |
|
|
|
6522 |
|
|
break;
|
6523 |
|
|
case 29:
|
6524 |
|
|
retval = 66; /*'B'; */
|
6525 |
|
|
|
6526 |
|
|
break;
|
6527 |
|
|
case 30:
|
6528 |
|
|
retval = 67; /*'C'; */
|
6529 |
|
|
|
6530 |
|
|
break;
|
6531 |
|
|
case 31:
|
6532 |
|
|
retval = 68; /*'D'; */
|
6533 |
|
|
|
6534 |
|
|
break;
|
6535 |
|
|
default:
|
6536 |
|
|
retval = 48 + j->dtmfbuffer[j->dtmf_rp];
|
6537 |
|
|
break;
|
6538 |
|
|
}
|
6539 |
|
|
j->dtmf_rp++;
|
6540 |
|
|
if (j->dtmf_rp == 79)
|
6541 |
|
|
j->dtmf_rp = 0;
|
6542 |
|
|
if(j->dtmf_rp == j->dtmf_wp)
|
6543 |
|
|
{
|
6544 |
|
|
j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
|
6545 |
|
|
}
|
6546 |
|
|
}
|
6547 |
|
|
}
|
6548 |
|
|
break;
|
6549 |
|
|
case PHONE_DTMF_OOB:
|
6550 |
|
|
j->flags.dtmf_oob = arg;
|
6551 |
|
|
break;
|
6552 |
|
|
case PHONE_DIALTONE:
|
6553 |
|
|
ixj_dialtone(j);
|
6554 |
|
|
break;
|
6555 |
|
|
case PHONE_BUSY:
|
6556 |
|
|
ixj_busytone(j);
|
6557 |
|
|
break;
|
6558 |
|
|
case PHONE_RINGBACK:
|
6559 |
|
|
ixj_ringback(j);
|
6560 |
|
|
break;
|
6561 |
|
|
case PHONE_WINK:
|
6562 |
|
|
if(j->cardtype == QTI_PHONEJACK)
|
6563 |
|
|
retval = -1;
|
6564 |
|
|
else
|
6565 |
|
|
retval = ixj_wink(j);
|
6566 |
|
|
break;
|
6567 |
|
|
case PHONE_CPT_STOP:
|
6568 |
|
|
ixj_cpt_stop(j);
|
6569 |
|
|
break;
|
6570 |
|
|
case PHONE_QUERY_CODEC:
|
6571 |
|
|
{
|
6572 |
|
|
struct phone_codec_data pd;
|
6573 |
|
|
int val;
|
6574 |
|
|
int proto_size[] = {
|
6575 |
|
|
-1,
|
6576 |
|
|
12, 10, 16, 9, 8, 48, 5,
|
6577 |
|
|
40, 40, 80, 40, 40, 6
|
6578 |
|
|
};
|
6579 |
|
|
if(copy_from_user(&pd, (void *)arg, sizeof(pd))) {
|
6580 |
|
|
retval = -EFAULT;
|
6581 |
|
|
break;
|
6582 |
|
|
}
|
6583 |
|
|
if(pd.type<1 || pd.type>13) {
|
6584 |
|
|
retval = -EPROTONOSUPPORT;
|
6585 |
|
|
break;
|
6586 |
|
|
}
|
6587 |
|
|
if(pd.type<G729)
|
6588 |
|
|
val=proto_size[pd.type];
|
6589 |
|
|
else switch(j->baseframe.low)
|
6590 |
|
|
{
|
6591 |
|
|
case 0xA0:val=2*proto_size[pd.type];break;
|
6592 |
|
|
case 0x50:val=proto_size[pd.type];break;
|
6593 |
|
|
default:val=proto_size[pd.type]*3;break;
|
6594 |
|
|
}
|
6595 |
|
|
pd.buf_min=pd.buf_max=pd.buf_opt=val;
|
6596 |
|
|
if(copy_to_user((void *)arg, &pd, sizeof(pd)))
|
6597 |
|
|
retval = -EFAULT;
|
6598 |
|
|
break;
|
6599 |
|
|
}
|
6600 |
|
|
case IXJCTL_DSP_IDLE:
|
6601 |
|
|
idle(j);
|
6602 |
|
|
break;
|
6603 |
|
|
case IXJCTL_MIXER:
|
6604 |
|
|
if ((arg & 0xff) == 0xff)
|
6605 |
|
|
retval = ixj_get_mixer(arg, j);
|
6606 |
|
|
else
|
6607 |
|
|
ixj_mixer(arg, j);
|
6608 |
|
|
break;
|
6609 |
|
|
case IXJCTL_DAA_COEFF_SET:
|
6610 |
|
|
switch (arg) {
|
6611 |
|
|
case DAA_US:
|
6612 |
|
|
DAA_Coeff_US(j);
|
6613 |
|
|
retval = ixj_daa_write(j);
|
6614 |
|
|
break;
|
6615 |
|
|
case DAA_UK:
|
6616 |
|
|
DAA_Coeff_UK(j);
|
6617 |
|
|
retval = ixj_daa_write(j);
|
6618 |
|
|
break;
|
6619 |
|
|
case DAA_FRANCE:
|
6620 |
|
|
DAA_Coeff_France(j);
|
6621 |
|
|
retval = ixj_daa_write(j);
|
6622 |
|
|
break;
|
6623 |
|
|
case DAA_GERMANY:
|
6624 |
|
|
DAA_Coeff_Germany(j);
|
6625 |
|
|
retval = ixj_daa_write(j);
|
6626 |
|
|
break;
|
6627 |
|
|
case DAA_AUSTRALIA:
|
6628 |
|
|
DAA_Coeff_Australia(j);
|
6629 |
|
|
retval = ixj_daa_write(j);
|
6630 |
|
|
break;
|
6631 |
|
|
case DAA_JAPAN:
|
6632 |
|
|
DAA_Coeff_Japan(j);
|
6633 |
|
|
retval = ixj_daa_write(j);
|
6634 |
|
|
break;
|
6635 |
|
|
default:
|
6636 |
|
|
retval = 1;
|
6637 |
|
|
break;
|
6638 |
|
|
}
|
6639 |
|
|
break;
|
6640 |
|
|
case IXJCTL_DAA_AGAIN:
|
6641 |
|
|
ixj_daa_cr4(j, arg | 0x02);
|
6642 |
|
|
break;
|
6643 |
|
|
case IXJCTL_PSTN_LINETEST:
|
6644 |
|
|
retval = ixj_linetest(j);
|
6645 |
|
|
break;
|
6646 |
|
|
case IXJCTL_VMWI:
|
6647 |
|
|
ixj_write_vmwi(j, arg);
|
6648 |
|
|
break;
|
6649 |
|
|
case IXJCTL_CID:
|
6650 |
|
|
if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID)))
|
6651 |
|
|
retval = -EFAULT;
|
6652 |
|
|
j->ex.bits.caller_id = 0;
|
6653 |
|
|
break;
|
6654 |
|
|
case IXJCTL_WINK_DURATION:
|
6655 |
|
|
j->winktime = arg;
|
6656 |
|
|
break;
|
6657 |
|
|
case IXJCTL_PORT:
|
6658 |
|
|
if (arg)
|
6659 |
|
|
retval = ixj_set_port(j, arg);
|
6660 |
|
|
else
|
6661 |
|
|
retval = j->port;
|
6662 |
|
|
break;
|
6663 |
|
|
case IXJCTL_POTS_PSTN:
|
6664 |
|
|
retval = ixj_set_pots(j, arg);
|
6665 |
|
|
break;
|
6666 |
|
|
case PHONE_CAPABILITIES:
|
6667 |
|
|
add_caps(j);
|
6668 |
|
|
retval = j->caps;
|
6669 |
|
|
break;
|
6670 |
|
|
case PHONE_CAPABILITIES_LIST:
|
6671 |
|
|
add_caps(j);
|
6672 |
|
|
if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
|
6673 |
|
|
retval = -EFAULT;
|
6674 |
|
|
break;
|
6675 |
|
|
case PHONE_CAPABILITIES_CHECK:
|
6676 |
|
|
{
|
6677 |
|
|
struct phone_capability cap;
|
6678 |
|
|
if (copy_from_user(&cap, (char *) arg, sizeof(cap)))
|
6679 |
|
|
retval = -EFAULT;
|
6680 |
|
|
else {
|
6681 |
|
|
add_caps(j);
|
6682 |
|
|
retval = capabilities_check(j, &cap);
|
6683 |
|
|
}
|
6684 |
|
|
}
|
6685 |
|
|
break;
|
6686 |
|
|
case PHONE_PSTN_SET_STATE:
|
6687 |
|
|
daa_set_mode(j, arg);
|
6688 |
|
|
break;
|
6689 |
|
|
case PHONE_PSTN_GET_STATE:
|
6690 |
|
|
retval = j->daa_mode;
|
6691 |
|
|
j->ex.bits.pstn_ring = 0;
|
6692 |
|
|
break;
|
6693 |
|
|
case IXJCTL_SET_FILTER:
|
6694 |
|
|
if (copy_from_user(&jf, (char *) arg, sizeof(jf)))
|
6695 |
|
|
retval = -EFAULT;
|
6696 |
|
|
retval = ixj_init_filter(j, &jf);
|
6697 |
|
|
break;
|
6698 |
|
|
case IXJCTL_SET_FILTER_RAW:
|
6699 |
|
|
if (copy_from_user(&jfr, (char *) arg, sizeof(jfr)))
|
6700 |
|
|
retval = -EFAULT;
|
6701 |
|
|
retval = ixj_init_filter_raw(j, &jfr);
|
6702 |
|
|
break;
|
6703 |
|
|
case IXJCTL_GET_FILTER_HIST:
|
6704 |
|
|
if(arg<0||arg>3)
|
6705 |
|
|
retval = -EINVAL;
|
6706 |
|
|
else
|
6707 |
|
|
retval = j->filter_hist[arg];
|
6708 |
|
|
break;
|
6709 |
|
|
case IXJCTL_INIT_TONE:
|
6710 |
|
|
copy_from_user(&ti, (char *) arg, sizeof(ti));
|
6711 |
|
|
retval = ixj_init_tone(j, &ti);
|
6712 |
|
|
break;
|
6713 |
|
|
case IXJCTL_TONE_CADENCE:
|
6714 |
|
|
retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
|
6715 |
|
|
break;
|
6716 |
|
|
case IXJCTL_FILTER_CADENCE:
|
6717 |
|
|
retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
|
6718 |
|
|
break;
|
6719 |
|
|
case IXJCTL_SIGCTL:
|
6720 |
|
|
if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
|
6721 |
|
|
retval = -EFAULT;
|
6722 |
|
|
j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
|
6723 |
|
|
if(j->sigdef.event < 33) {
|
6724 |
|
|
raise = 1;
|
6725 |
|
|
for(mant = 0; mant < j->sigdef.event; mant++){
|
6726 |
|
|
raise *= 2;
|
6727 |
|
|
}
|
6728 |
|
|
if(j->sigdef.signal)
|
6729 |
|
|
j->ex_sig.bytes |= raise;
|
6730 |
|
|
else
|
6731 |
|
|
j->ex_sig.bytes &= (raise^0xffff);
|
6732 |
|
|
}
|
6733 |
|
|
break;
|
6734 |
|
|
case IXJCTL_INTERCOM_STOP:
|
6735 |
|
|
if(arg < 0 || arg >= IXJMAX)
|
6736 |
|
|
return -EINVAL;
|
6737 |
|
|
j->intercom = -1;
|
6738 |
|
|
ixj_record_stop(j);
|
6739 |
|
|
ixj_play_stop(j);
|
6740 |
|
|
idle(j);
|
6741 |
|
|
get_ixj(arg)->intercom = -1;
|
6742 |
|
|
ixj_record_stop(get_ixj(arg));
|
6743 |
|
|
ixj_play_stop(get_ixj(arg));
|
6744 |
|
|
idle(get_ixj(arg));
|
6745 |
|
|
break;
|
6746 |
|
|
case IXJCTL_INTERCOM_START:
|
6747 |
|
|
if(arg < 0 || arg >= IXJMAX)
|
6748 |
|
|
return -EINVAL;
|
6749 |
|
|
j->intercom = arg;
|
6750 |
|
|
ixj_record_start(j);
|
6751 |
|
|
ixj_play_start(j);
|
6752 |
|
|
get_ixj(arg)->intercom = board;
|
6753 |
|
|
ixj_play_start(get_ixj(arg));
|
6754 |
|
|
ixj_record_start(get_ixj(arg));
|
6755 |
|
|
break;
|
6756 |
|
|
}
|
6757 |
|
|
if (ixjdebug & 0x0040)
|
6758 |
|
|
printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
|
6759 |
|
|
clear_bit(board, &j->busyflags);
|
6760 |
|
|
return retval;
|
6761 |
|
|
}
|
6762 |
|
|
|
6763 |
|
|
static int ixj_fasync(int fd, struct file *file_p, int mode)
|
6764 |
|
|
{
|
6765 |
|
|
IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
|
6766 |
|
|
|
6767 |
|
|
return fasync_helper(fd, file_p, mode, &j->async_queue);
|
6768 |
|
|
}
|
6769 |
|
|
|
6770 |
|
|
struct file_operations ixj_fops =
|
6771 |
|
|
{
|
6772 |
|
|
owner: THIS_MODULE,
|
6773 |
|
|
read: ixj_enhanced_read,
|
6774 |
|
|
write: ixj_enhanced_write,
|
6775 |
|
|
poll: ixj_poll,
|
6776 |
|
|
ioctl: ixj_ioctl,
|
6777 |
|
|
release: ixj_release,
|
6778 |
|
|
fasync: ixj_fasync
|
6779 |
|
|
};
|
6780 |
|
|
|
6781 |
|
|
static int ixj_linetest(IXJ *j)
|
6782 |
|
|
{
|
6783 |
|
|
unsigned long jifwait;
|
6784 |
|
|
|
6785 |
|
|
j->flags.pstncheck = 1; /* Testing */
|
6786 |
|
|
j->flags.pstn_present = 0; /* Assume the line is not there */
|
6787 |
|
|
|
6788 |
|
|
daa_int_read(j); /*Clear DAA Interrupt flags */
|
6789 |
|
|
/* */
|
6790 |
|
|
/* Hold all relays in the normally de-energized position. */
|
6791 |
|
|
/* */
|
6792 |
|
|
|
6793 |
|
|
j->pld_slicw.bits.rly1 = 0;
|
6794 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
6795 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
6796 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
6797 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
6798 |
|
|
|
6799 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
6800 |
|
|
j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
|
6801 |
|
|
if (j->pld_slicr.bits.potspstn) {
|
6802 |
|
|
j->flags.pots_pstn = 1;
|
6803 |
|
|
j->flags.pots_correct = 0;
|
6804 |
|
|
LED_SetState(0x4, j);
|
6805 |
|
|
} else {
|
6806 |
|
|
j->flags.pots_pstn = 0;
|
6807 |
|
|
j->pld_slicw.bits.rly1 = 0;
|
6808 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
6809 |
|
|
j->pld_slicw.bits.rly3 = 1;
|
6810 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
6811 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
6812 |
|
|
|
6813 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
6814 |
|
|
daa_set_mode(j, SOP_PU_CONVERSATION);
|
6815 |
|
|
jifwait = jiffies + hertz;
|
6816 |
|
|
while (time_before(jiffies, jifwait)) {
|
6817 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
6818 |
|
|
schedule_timeout(1);
|
6819 |
|
|
}
|
6820 |
|
|
daa_int_read(j);
|
6821 |
|
|
daa_set_mode(j, SOP_PU_RESET);
|
6822 |
|
|
if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
|
6823 |
|
|
j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
|
6824 |
|
|
LED_SetState(0x4, j);
|
6825 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
6826 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
6827 |
|
|
} else {
|
6828 |
|
|
j->flags.pots_correct = 1;
|
6829 |
|
|
LED_SetState(0x8, j);
|
6830 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
6831 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
6832 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
6833 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
6834 |
|
|
}
|
6835 |
|
|
}
|
6836 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
6837 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
6838 |
|
|
daa_set_mode(j, SOP_PU_CONVERSATION);
|
6839 |
|
|
jifwait = jiffies + hertz;
|
6840 |
|
|
while (time_before(jiffies, jifwait)) {
|
6841 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
6842 |
|
|
schedule_timeout(1);
|
6843 |
|
|
}
|
6844 |
|
|
daa_int_read(j);
|
6845 |
|
|
daa_set_mode(j, SOP_PU_RESET);
|
6846 |
|
|
if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
|
6847 |
|
|
j->pstn_sleeptil = jiffies + (hertz / 4);
|
6848 |
|
|
j->flags.pstn_present = 1;
|
6849 |
|
|
} else {
|
6850 |
|
|
j->flags.pstn_present = 0;
|
6851 |
|
|
}
|
6852 |
|
|
if (j->flags.pstn_present) {
|
6853 |
|
|
if (j->flags.pots_correct) {
|
6854 |
|
|
LED_SetState(0xA, j);
|
6855 |
|
|
} else {
|
6856 |
|
|
LED_SetState(0x6, j);
|
6857 |
|
|
}
|
6858 |
|
|
} else {
|
6859 |
|
|
if (j->flags.pots_correct) {
|
6860 |
|
|
LED_SetState(0x9, j);
|
6861 |
|
|
} else {
|
6862 |
|
|
LED_SetState(0x5, j);
|
6863 |
|
|
}
|
6864 |
|
|
}
|
6865 |
|
|
j->flags.pstncheck = 0; /* Testing */
|
6866 |
|
|
return j->flags.pstn_present;
|
6867 |
|
|
}
|
6868 |
|
|
|
6869 |
|
|
static int ixj_selfprobe(IXJ *j)
|
6870 |
|
|
{
|
6871 |
|
|
unsigned short cmd;
|
6872 |
|
|
unsigned long jif;
|
6873 |
|
|
int cnt;
|
6874 |
|
|
BYTES bytes;
|
6875 |
|
|
|
6876 |
|
|
init_waitqueue_head(&j->poll_q);
|
6877 |
|
|
init_waitqueue_head(&j->read_q);
|
6878 |
|
|
init_waitqueue_head(&j->write_q);
|
6879 |
|
|
|
6880 |
|
|
while(atomic_read(&j->DSPWrite) > 0)
|
6881 |
|
|
atomic_dec(&j->DSPWrite);
|
6882 |
|
|
if (ixjdebug & 0x0002)
|
6883 |
|
|
printk(KERN_INFO "Write IDLE to Software Control Register\n");
|
6884 |
|
|
ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
|
6885 |
|
|
|
6886 |
|
|
if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
|
6887 |
|
|
return -1;
|
6888 |
|
|
/* The read values of the SSR should be 0x00 for the IDLE command */
|
6889 |
|
|
if (j->ssr.low || j->ssr.high)
|
6890 |
|
|
return -1;
|
6891 |
|
|
if (ixjdebug & 0x0002)
|
6892 |
|
|
printk(KERN_INFO "Get Device ID Code\n");
|
6893 |
|
|
if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
|
6894 |
|
|
return -1;
|
6895 |
|
|
j->dsp.low = j->ssr.low;
|
6896 |
|
|
j->dsp.high = j->ssr.high;
|
6897 |
|
|
if (ixjdebug & 0x0002)
|
6898 |
|
|
printk(KERN_INFO "Get Device Version Code\n");
|
6899 |
|
|
if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
|
6900 |
|
|
return -1;
|
6901 |
|
|
j->ver.low = j->ssr.low;
|
6902 |
|
|
j->ver.high = j->ssr.high;
|
6903 |
|
|
if (!j->cardtype) {
|
6904 |
|
|
if (j->dsp.low == 0x21) {
|
6905 |
|
|
bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
|
6906 |
|
|
outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
|
6907 |
|
|
/* Test for Internet LineJACK or Internet PhoneJACK Lite */
|
6908 |
|
|
bytes.low = inb_p(j->XILINXbase + 0x02);
|
6909 |
|
|
if (bytes.low == bytes.high) /* Register is read only on */
|
6910 |
|
|
/* Internet PhoneJack Lite */
|
6911 |
|
|
{
|
6912 |
|
|
j->cardtype = QTI_PHONEJACK_LITE;
|
6913 |
|
|
if (check_region(j->XILINXbase, 4)) {
|
6914 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
|
6915 |
|
|
return -1;
|
6916 |
|
|
}
|
6917 |
|
|
request_region(j->XILINXbase, 4, "ixj control");
|
6918 |
|
|
j->pld_slicw.pcib.e1 = 1;
|
6919 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase);
|
6920 |
|
|
} else {
|
6921 |
|
|
j->cardtype = QTI_LINEJACK;
|
6922 |
|
|
|
6923 |
|
|
if (check_region(j->XILINXbase, 8)) {
|
6924 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
|
6925 |
|
|
return -1;
|
6926 |
|
|
}
|
6927 |
|
|
request_region(j->XILINXbase, 8, "ixj control");
|
6928 |
|
|
}
|
6929 |
|
|
} else if (j->dsp.low == 0x22) {
|
6930 |
|
|
j->cardtype = QTI_PHONEJACK_PCI;
|
6931 |
|
|
request_region(j->XILINXbase, 4, "ixj control");
|
6932 |
|
|
j->pld_slicw.pcib.e1 = 1;
|
6933 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase);
|
6934 |
|
|
} else
|
6935 |
|
|
j->cardtype = QTI_PHONEJACK;
|
6936 |
|
|
} else {
|
6937 |
|
|
switch (j->cardtype) {
|
6938 |
|
|
case QTI_PHONEJACK:
|
6939 |
|
|
if (!j->dsp.low != 0x20) {
|
6940 |
|
|
j->dsp.high = 0x80;
|
6941 |
|
|
j->dsp.low = 0x20;
|
6942 |
|
|
ixj_WriteDSPCommand(0x3800, j);
|
6943 |
|
|
j->ver.low = j->ssr.low;
|
6944 |
|
|
j->ver.high = j->ssr.high;
|
6945 |
|
|
}
|
6946 |
|
|
break;
|
6947 |
|
|
case QTI_LINEJACK:
|
6948 |
|
|
if (check_region(j->XILINXbase, 8)) {
|
6949 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
|
6950 |
|
|
return -1;
|
6951 |
|
|
}
|
6952 |
|
|
request_region(j->XILINXbase, 8, "ixj control");
|
6953 |
|
|
break;
|
6954 |
|
|
case QTI_PHONEJACK_LITE:
|
6955 |
|
|
case QTI_PHONEJACK_PCI:
|
6956 |
|
|
if (check_region(j->XILINXbase, 4)) {
|
6957 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
|
6958 |
|
|
return -1;
|
6959 |
|
|
}
|
6960 |
|
|
request_region(j->XILINXbase, 4, "ixj control");
|
6961 |
|
|
j->pld_slicw.pcib.e1 = 1;
|
6962 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase);
|
6963 |
|
|
break;
|
6964 |
|
|
case QTI_PHONECARD:
|
6965 |
|
|
break;
|
6966 |
|
|
}
|
6967 |
|
|
}
|
6968 |
|
|
if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
|
6969 |
|
|
if (ixjdebug & 0x0002)
|
6970 |
|
|
printk(KERN_INFO "Write CODEC config to Software Control Register\n");
|
6971 |
|
|
if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
|
6972 |
|
|
return -1;
|
6973 |
|
|
if (ixjdebug & 0x0002)
|
6974 |
|
|
printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
|
6975 |
|
|
if (j->cardtype == QTI_PHONEJACK) {
|
6976 |
|
|
cmd = 0x9FF2;
|
6977 |
|
|
} else {
|
6978 |
|
|
cmd = 0x9FF5;
|
6979 |
|
|
}
|
6980 |
|
|
if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
|
6981 |
|
|
return -1;
|
6982 |
|
|
} else {
|
6983 |
|
|
if (set_base_frame(j, 30) != 30)
|
6984 |
|
|
return -1;
|
6985 |
|
|
if (ixjdebug & 0x0002)
|
6986 |
|
|
printk(KERN_INFO "Write CODEC config to Software Control Register\n");
|
6987 |
|
|
if (j->cardtype == QTI_PHONECARD) {
|
6988 |
|
|
if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
|
6989 |
|
|
return -1;
|
6990 |
|
|
}
|
6991 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
6992 |
|
|
if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
|
6993 |
|
|
return -1;
|
6994 |
|
|
if (ixjdebug & 0x0002)
|
6995 |
|
|
printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
|
6996 |
|
|
j->pld_clock.byte = 0;
|
6997 |
|
|
outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
|
6998 |
|
|
}
|
6999 |
|
|
}
|
7000 |
|
|
|
7001 |
|
|
if (j->dsp.low == 0x20) {
|
7002 |
|
|
if (ixjdebug & 0x0002)
|
7003 |
|
|
printk(KERN_INFO "Configure GPIO pins\n");
|
7004 |
|
|
j->gpio.bytes.high = 0x09;
|
7005 |
|
|
/* bytes.low = 0xEF; 0xF7 */
|
7006 |
|
|
j->gpio.bits.gpio1 = 1;
|
7007 |
|
|
j->gpio.bits.gpio2 = 1;
|
7008 |
|
|
j->gpio.bits.gpio3 = 0;
|
7009 |
|
|
j->gpio.bits.gpio4 = 1;
|
7010 |
|
|
j->gpio.bits.gpio5 = 1;
|
7011 |
|
|
j->gpio.bits.gpio6 = 1;
|
7012 |
|
|
j->gpio.bits.gpio7 = 1;
|
7013 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
|
7014 |
|
|
if (ixjdebug & 0x0002)
|
7015 |
|
|
printk(KERN_INFO "Enable SLIC\n");
|
7016 |
|
|
j->gpio.bytes.high = 0x0B;
|
7017 |
|
|
j->gpio.bytes.low = 0x00;
|
7018 |
|
|
j->gpio.bits.gpio1 = 0;
|
7019 |
|
|
j->gpio.bits.gpio2 = 1;
|
7020 |
|
|
j->gpio.bits.gpio5 = 0;
|
7021 |
|
|
ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
|
7022 |
|
|
j->port = PORT_POTS;
|
7023 |
|
|
} else {
|
7024 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
7025 |
|
|
LED_SetState(0x1, j);
|
7026 |
|
|
jif = jiffies + (hertz / 10);
|
7027 |
|
|
while (time_before(jiffies, jif)) {
|
7028 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
7029 |
|
|
schedule_timeout(1);
|
7030 |
|
|
}
|
7031 |
|
|
LED_SetState(0x2, j);
|
7032 |
|
|
jif = jiffies + (hertz / 10);
|
7033 |
|
|
while (time_before(jiffies, jif)) {
|
7034 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
7035 |
|
|
schedule_timeout(1);
|
7036 |
|
|
}
|
7037 |
|
|
LED_SetState(0x4, j);
|
7038 |
|
|
jif = jiffies + (hertz / 10);
|
7039 |
|
|
while (time_before(jiffies, jif)) {
|
7040 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
7041 |
|
|
schedule_timeout(1);
|
7042 |
|
|
}
|
7043 |
|
|
LED_SetState(0x8, j);
|
7044 |
|
|
jif = jiffies + (hertz / 10);
|
7045 |
|
|
while (time_before(jiffies, jif)) {
|
7046 |
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
7047 |
|
|
schedule_timeout(1);
|
7048 |
|
|
}
|
7049 |
|
|
LED_SetState(0x0, j);
|
7050 |
|
|
daa_get_version(j);
|
7051 |
|
|
if (ixjdebug & 0x0002)
|
7052 |
|
|
printk("Loading DAA Coefficients\n");
|
7053 |
|
|
DAA_Coeff_US(j);
|
7054 |
|
|
if (!ixj_daa_write(j)) {
|
7055 |
|
|
printk("DAA write failed on board %d\n", j->board);
|
7056 |
|
|
return -1;
|
7057 |
|
|
}
|
7058 |
|
|
if(!ixj_daa_cid_reset(j)) {
|
7059 |
|
|
printk("DAA CID reset failed on board %d\n", j->board);
|
7060 |
|
|
return -1;
|
7061 |
|
|
}
|
7062 |
|
|
j->flags.pots_correct = 0;
|
7063 |
|
|
j->flags.pstn_present = 0;
|
7064 |
|
|
ixj_linetest(j);
|
7065 |
|
|
if (j->flags.pots_correct) {
|
7066 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
7067 |
|
|
|
7068 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
7069 |
|
|
j->pld_slicw.bits.rly1 = 1;
|
7070 |
|
|
j->pld_slicw.bits.spken = 1;
|
7071 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
7072 |
|
|
SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
|
7073 |
|
|
/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
|
7074 |
|
|
j->port = PORT_POTS;
|
7075 |
|
|
}
|
7076 |
|
|
ixj_set_port(j, PORT_PSTN);
|
7077 |
|
|
ixj_set_pots(j, 1);
|
7078 |
|
|
if (ixjdebug & 0x0002)
|
7079 |
|
|
printk(KERN_INFO "Enable Mixer\n");
|
7080 |
|
|
ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
|
7081 |
|
|
ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
|
7082 |
|
|
|
7083 |
|
|
ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
|
7084 |
|
|
ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
|
7085 |
|
|
|
7086 |
|
|
ixj_mixer(0x0480, j); /*FM Left mute */
|
7087 |
|
|
ixj_mixer(0x0580, j); /*FM Right mute */
|
7088 |
|
|
|
7089 |
|
|
ixj_mixer(0x0680, j); /*CD Left mute */
|
7090 |
|
|
ixj_mixer(0x0780, j); /*CD Right mute */
|
7091 |
|
|
|
7092 |
|
|
ixj_mixer(0x0880, j); /*Line Left mute */
|
7093 |
|
|
ixj_mixer(0x0980, j); /*Line Right mute */
|
7094 |
|
|
|
7095 |
|
|
ixj_mixer(0x0A80, j); /*Aux left mute */
|
7096 |
|
|
ixj_mixer(0x0B80, j); /*Aux right mute */
|
7097 |
|
|
|
7098 |
|
|
ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
|
7099 |
|
|
ixj_mixer(0x0D80, j); /*Mono2 mute */
|
7100 |
|
|
|
7101 |
|
|
ixj_mixer(0x0E80, j); /*Mic mute */
|
7102 |
|
|
|
7103 |
|
|
ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
|
7104 |
|
|
|
7105 |
|
|
ixj_mixer(0x1000, j); /*Voice Left and Right out only */
|
7106 |
|
|
ixj_mixer(0x110C, j);
|
7107 |
|
|
|
7108 |
|
|
|
7109 |
|
|
ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
|
7110 |
|
|
ixj_mixer(0x1401, j);
|
7111 |
|
|
|
7112 |
|
|
ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
|
7113 |
|
|
ixj_mixer(0x1501, j);
|
7114 |
|
|
|
7115 |
|
|
ixj_mixer(0x1700, j); /*Clock select */
|
7116 |
|
|
|
7117 |
|
|
ixj_mixer(0x1800, j); /*ADC input from mixer */
|
7118 |
|
|
|
7119 |
|
|
ixj_mixer(0x1901, j); /*Mic gain 30db */
|
7120 |
|
|
|
7121 |
|
|
if (ixjdebug & 0x0002)
|
7122 |
|
|
printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
|
7123 |
|
|
j->cadence_f[4].state = 0;
|
7124 |
|
|
j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
|
7125 |
|
|
j->cadence_f[4].off1 = 0;
|
7126 |
|
|
j->cadence_f[4].on2 = 0;
|
7127 |
|
|
j->cadence_f[4].off2 = 0;
|
7128 |
|
|
j->cadence_f[4].on3 = 0;
|
7129 |
|
|
j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
|
7130 |
|
|
j->pstn_last_rmr = jiffies;
|
7131 |
|
|
|
7132 |
|
|
} else {
|
7133 |
|
|
if (j->cardtype == QTI_PHONECARD) {
|
7134 |
|
|
ixj_WriteDSPCommand(0xCF07, j);
|
7135 |
|
|
ixj_WriteDSPCommand(0x00B0, j);
|
7136 |
|
|
ixj_set_port(j, PORT_SPEAKER);
|
7137 |
|
|
} else {
|
7138 |
|
|
ixj_set_port(j, PORT_POTS);
|
7139 |
|
|
SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
|
7140 |
|
|
/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
|
7141 |
|
|
}
|
7142 |
|
|
}
|
7143 |
|
|
}
|
7144 |
|
|
|
7145 |
|
|
j->intercom = -1;
|
7146 |
|
|
j->framesread = j->frameswritten = 0;
|
7147 |
|
|
j->read_wait = j->write_wait = 0;
|
7148 |
|
|
j->rxreadycheck = j->txreadycheck = 0;
|
7149 |
|
|
|
7150 |
|
|
/* initialise the DTMF prescale to a sensible value */
|
7151 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
7152 |
|
|
set_dtmf_prescale(j, 0x10);
|
7153 |
|
|
} else {
|
7154 |
|
|
set_dtmf_prescale(j, 0x40);
|
7155 |
|
|
}
|
7156 |
|
|
set_play_volume(j, 0x100);
|
7157 |
|
|
set_rec_volume(j, 0x100);
|
7158 |
|
|
|
7159 |
|
|
if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
|
7160 |
|
|
return -1;
|
7161 |
|
|
/* The read values of the SSR should be 0x00 for the IDLE command */
|
7162 |
|
|
if (j->ssr.low || j->ssr.high)
|
7163 |
|
|
return -1;
|
7164 |
|
|
|
7165 |
|
|
if (ixjdebug & 0x0002)
|
7166 |
|
|
printk(KERN_INFO "Enable Line Monitor\n");
|
7167 |
|
|
|
7168 |
|
|
if (ixjdebug & 0x0002)
|
7169 |
|
|
printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
|
7170 |
|
|
|
7171 |
|
|
if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
|
7172 |
|
|
return -1;
|
7173 |
|
|
|
7174 |
|
|
if (ixjdebug & 0x002)
|
7175 |
|
|
printk(KERN_INFO "Enable DTMF Detectors\n");
|
7176 |
|
|
|
7177 |
|
|
if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
|
7178 |
|
|
return -1;
|
7179 |
|
|
|
7180 |
|
|
if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
|
7181 |
|
|
return -1;
|
7182 |
|
|
|
7183 |
|
|
set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
|
7184 |
|
|
|
7185 |
|
|
set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
|
7186 |
|
|
|
7187 |
|
|
j->ex.bits.dtmf_ready = 0;
|
7188 |
|
|
j->dtmf_state = 0;
|
7189 |
|
|
j->dtmf_wp = j->dtmf_rp = 0;
|
7190 |
|
|
j->rec_mode = j->play_mode = -1;
|
7191 |
|
|
j->flags.ringing = 0;
|
7192 |
|
|
j->maxrings = MAXRINGS;
|
7193 |
|
|
j->ring_cadence = USA_RING_CADENCE;
|
7194 |
|
|
j->drybuffer = 0;
|
7195 |
|
|
j->winktime = 320;
|
7196 |
|
|
j->flags.dtmf_oob = 0;
|
7197 |
|
|
for (cnt = 0; cnt < 4; cnt++)
|
7198 |
|
|
j->cadence_f[cnt].enable = 0;
|
7199 |
|
|
/* must be a device on the specified address */
|
7200 |
|
|
ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
|
7201 |
|
|
|
7202 |
|
|
/* Set up the default signals for events */
|
7203 |
|
|
for (cnt = 0; cnt < 35; cnt++)
|
7204 |
|
|
j->ixj_signals[cnt] = SIGIO;
|
7205 |
|
|
|
7206 |
|
|
/* Set the excetion signal enable flags */
|
7207 |
|
|
j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
|
7208 |
|
|
j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
|
7209 |
|
|
j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
|
7210 |
|
|
#ifdef IXJ_DYN_ALLOC
|
7211 |
|
|
j->fskdata = NULL;
|
7212 |
|
|
#endif
|
7213 |
|
|
j->fskdcnt = 0;
|
7214 |
|
|
j->cidcw_wait = 0;
|
7215 |
|
|
|
7216 |
|
|
/* Register with the Telephony for Linux subsystem */
|
7217 |
|
|
j->p.f_op = &ixj_fops;
|
7218 |
|
|
j->p.open = ixj_open;
|
7219 |
|
|
j->p.board = j->board;
|
7220 |
|
|
phone_register_device(&j->p, PHONE_UNIT_ANY);
|
7221 |
|
|
|
7222 |
|
|
ixj_init_timer(j);
|
7223 |
|
|
ixj_add_timer(j);
|
7224 |
|
|
return 0;
|
7225 |
|
|
}
|
7226 |
|
|
|
7227 |
|
|
/*
|
7228 |
|
|
* Exported service for pcmcia card handling
|
7229 |
|
|
*/
|
7230 |
|
|
|
7231 |
|
|
IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
|
7232 |
|
|
{
|
7233 |
|
|
IXJ *j = ixj_alloc();
|
7234 |
|
|
|
7235 |
|
|
j->board = 0;
|
7236 |
|
|
|
7237 |
|
|
j->DSPbase = dsp;
|
7238 |
|
|
j->XILINXbase = xilinx;
|
7239 |
|
|
j->cardtype = QTI_PHONECARD;
|
7240 |
|
|
ixj_selfprobe(j);
|
7241 |
|
|
return j;
|
7242 |
|
|
}
|
7243 |
|
|
|
7244 |
|
|
EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
|
7245 |
|
|
|
7246 |
|
|
static int ixj_get_status_proc(char *buf)
|
7247 |
|
|
{
|
7248 |
|
|
int len;
|
7249 |
|
|
int cnt;
|
7250 |
|
|
IXJ *j;
|
7251 |
|
|
len = 0;
|
7252 |
|
|
len += sprintf(buf + len, "%s", ixj_c_rcsid);
|
7253 |
|
|
len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
|
7254 |
|
|
len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
|
7255 |
|
|
len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
|
7256 |
|
|
len += sprintf(buf + len, "\nsizeof IXJ struct %d bytes", sizeof(IXJ));
|
7257 |
|
|
len += sprintf(buf + len, "\nsizeof DAA struct %d bytes", sizeof(DAA_REGS));
|
7258 |
|
|
len += sprintf(buf + len, "\nUsing old telephony API");
|
7259 |
|
|
len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
|
7260 |
|
|
|
7261 |
|
|
for (cnt = 0; cnt < IXJMAX; cnt++) {
|
7262 |
|
|
j = get_ixj(cnt);
|
7263 |
|
|
if(j==NULL)
|
7264 |
|
|
continue;
|
7265 |
|
|
if (j->DSPbase) {
|
7266 |
|
|
len += sprintf(buf + len, "\nCard Num %d", cnt);
|
7267 |
|
|
len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
|
7268 |
|
|
if (j->cardtype != QTI_PHONEJACK)
|
7269 |
|
|
len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
|
7270 |
|
|
len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
|
7271 |
|
|
len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
|
7272 |
|
|
len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
|
7273 |
|
|
switch (j->cardtype) {
|
7274 |
|
|
case (QTI_PHONEJACK):
|
7275 |
|
|
len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
|
7276 |
|
|
break;
|
7277 |
|
|
case (QTI_LINEJACK):
|
7278 |
|
|
len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
|
7279 |
|
|
if (j->flags.g729_loaded)
|
7280 |
|
|
len += sprintf(buf + len, " w/G.729 A/B");
|
7281 |
|
|
len += sprintf(buf + len, " Country = %d", j->daa_country);
|
7282 |
|
|
break;
|
7283 |
|
|
case (QTI_PHONEJACK_LITE):
|
7284 |
|
|
len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
|
7285 |
|
|
if (j->flags.g729_loaded)
|
7286 |
|
|
len += sprintf(buf + len, " w/G.729 A/B");
|
7287 |
|
|
break;
|
7288 |
|
|
case (QTI_PHONEJACK_PCI):
|
7289 |
|
|
len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
|
7290 |
|
|
if (j->flags.g729_loaded)
|
7291 |
|
|
len += sprintf(buf + len, " w/G.729 A/B");
|
7292 |
|
|
break;
|
7293 |
|
|
case (QTI_PHONECARD):
|
7294 |
|
|
len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
|
7295 |
|
|
if (j->flags.g729_loaded)
|
7296 |
|
|
len += sprintf(buf + len, " w/G.729 A/B");
|
7297 |
|
|
len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
|
7298 |
|
|
if (!j->pccr1.bits.drf)
|
7299 |
|
|
len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
|
7300 |
|
|
len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
|
7301 |
|
|
break;
|
7302 |
|
|
default:
|
7303 |
|
|
len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
|
7304 |
|
|
break;
|
7305 |
|
|
}
|
7306 |
|
|
len += sprintf(buf + len, "\nReaders %d", j->readers);
|
7307 |
|
|
len += sprintf(buf + len, "\nWriters %d", j->writers);
|
7308 |
|
|
add_caps(j);
|
7309 |
|
|
len += sprintf(buf + len, "\nCapabilities %d", j->caps);
|
7310 |
|
|
if (j->dsp.low != 0x20)
|
7311 |
|
|
len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
|
7312 |
|
|
if (j->flags.cidsent)
|
7313 |
|
|
len += sprintf(buf + len, "\nCaller ID data sent");
|
7314 |
|
|
else
|
7315 |
|
|
len += sprintf(buf + len, "\nCaller ID data not sent");
|
7316 |
|
|
|
7317 |
|
|
len += sprintf(buf + len, "\nPlay CODEC ");
|
7318 |
|
|
switch (j->play_codec) {
|
7319 |
|
|
case G723_63:
|
7320 |
|
|
len += sprintf(buf + len, "G.723.1 6.3");
|
7321 |
|
|
break;
|
7322 |
|
|
case G723_53:
|
7323 |
|
|
len += sprintf(buf + len, "G.723.1 5.3");
|
7324 |
|
|
break;
|
7325 |
|
|
case TS85:
|
7326 |
|
|
len += sprintf(buf + len, "TrueSpeech 8.5");
|
7327 |
|
|
break;
|
7328 |
|
|
case TS48:
|
7329 |
|
|
len += sprintf(buf + len, "TrueSpeech 4.8");
|
7330 |
|
|
break;
|
7331 |
|
|
case TS41:
|
7332 |
|
|
len += sprintf(buf + len, "TrueSpeech 4.1");
|
7333 |
|
|
break;
|
7334 |
|
|
case G728:
|
7335 |
|
|
len += sprintf(buf + len, "G.728");
|
7336 |
|
|
break;
|
7337 |
|
|
case G729:
|
7338 |
|
|
len += sprintf(buf + len, "G.729");
|
7339 |
|
|
break;
|
7340 |
|
|
case G729B:
|
7341 |
|
|
len += sprintf(buf + len, "G.729B");
|
7342 |
|
|
break;
|
7343 |
|
|
case ULAW:
|
7344 |
|
|
len += sprintf(buf + len, "uLaw");
|
7345 |
|
|
break;
|
7346 |
|
|
case ALAW:
|
7347 |
|
|
len += sprintf(buf + len, "aLaw");
|
7348 |
|
|
break;
|
7349 |
|
|
case LINEAR16:
|
7350 |
|
|
len += sprintf(buf + len, "16 bit Linear");
|
7351 |
|
|
break;
|
7352 |
|
|
case LINEAR8:
|
7353 |
|
|
len += sprintf(buf + len, "8 bit Linear");
|
7354 |
|
|
break;
|
7355 |
|
|
case WSS:
|
7356 |
|
|
len += sprintf(buf + len, "Windows Sound System");
|
7357 |
|
|
break;
|
7358 |
|
|
default:
|
7359 |
|
|
len += sprintf(buf + len, "NO CODEC CHOSEN");
|
7360 |
|
|
break;
|
7361 |
|
|
}
|
7362 |
|
|
len += sprintf(buf + len, "\nRecord CODEC ");
|
7363 |
|
|
switch (j->rec_codec) {
|
7364 |
|
|
case G723_63:
|
7365 |
|
|
len += sprintf(buf + len, "G.723.1 6.3");
|
7366 |
|
|
break;
|
7367 |
|
|
case G723_53:
|
7368 |
|
|
len += sprintf(buf + len, "G.723.1 5.3");
|
7369 |
|
|
break;
|
7370 |
|
|
case TS85:
|
7371 |
|
|
len += sprintf(buf + len, "TrueSpeech 8.5");
|
7372 |
|
|
break;
|
7373 |
|
|
case TS48:
|
7374 |
|
|
len += sprintf(buf + len, "TrueSpeech 4.8");
|
7375 |
|
|
break;
|
7376 |
|
|
case TS41:
|
7377 |
|
|
len += sprintf(buf + len, "TrueSpeech 4.1");
|
7378 |
|
|
break;
|
7379 |
|
|
case G728:
|
7380 |
|
|
len += sprintf(buf + len, "G.728");
|
7381 |
|
|
break;
|
7382 |
|
|
case G729:
|
7383 |
|
|
len += sprintf(buf + len, "G.729");
|
7384 |
|
|
break;
|
7385 |
|
|
case G729B:
|
7386 |
|
|
len += sprintf(buf + len, "G.729B");
|
7387 |
|
|
break;
|
7388 |
|
|
case ULAW:
|
7389 |
|
|
len += sprintf(buf + len, "uLaw");
|
7390 |
|
|
break;
|
7391 |
|
|
case ALAW:
|
7392 |
|
|
len += sprintf(buf + len, "aLaw");
|
7393 |
|
|
break;
|
7394 |
|
|
case LINEAR16:
|
7395 |
|
|
len += sprintf(buf + len, "16 bit Linear");
|
7396 |
|
|
break;
|
7397 |
|
|
case LINEAR8:
|
7398 |
|
|
len += sprintf(buf + len, "8 bit Linear");
|
7399 |
|
|
break;
|
7400 |
|
|
case WSS:
|
7401 |
|
|
len += sprintf(buf + len, "Windows Sound System");
|
7402 |
|
|
break;
|
7403 |
|
|
default:
|
7404 |
|
|
len += sprintf(buf + len, "NO CODEC CHOSEN");
|
7405 |
|
|
break;
|
7406 |
|
|
}
|
7407 |
|
|
len += sprintf(buf + len, "\nAEC ");
|
7408 |
|
|
switch (j->aec_level) {
|
7409 |
|
|
case AEC_OFF:
|
7410 |
|
|
len += sprintf(buf + len, "Off");
|
7411 |
|
|
break;
|
7412 |
|
|
case AEC_LOW:
|
7413 |
|
|
len += sprintf(buf + len, "Low");
|
7414 |
|
|
break;
|
7415 |
|
|
case AEC_MED:
|
7416 |
|
|
len += sprintf(buf + len, "Med");
|
7417 |
|
|
break;
|
7418 |
|
|
case AEC_HIGH:
|
7419 |
|
|
len += sprintf(buf + len, "High");
|
7420 |
|
|
break;
|
7421 |
|
|
case AEC_AUTO:
|
7422 |
|
|
len += sprintf(buf + len, "Auto");
|
7423 |
|
|
break;
|
7424 |
|
|
case AEC_AGC:
|
7425 |
|
|
len += sprintf(buf + len, "AEC/AGC");
|
7426 |
|
|
break;
|
7427 |
|
|
default:
|
7428 |
|
|
len += sprintf(buf + len, "unknown(%i)", j->aec_level);
|
7429 |
|
|
break;
|
7430 |
|
|
}
|
7431 |
|
|
|
7432 |
|
|
len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
|
7433 |
|
|
len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
|
7434 |
|
|
len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
|
7435 |
|
|
|
7436 |
|
|
len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
|
7437 |
|
|
|
7438 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
7439 |
|
|
len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
|
7440 |
|
|
len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
|
7441 |
|
|
len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
|
7442 |
|
|
len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
|
7443 |
|
|
switch (j->daa_mode) {
|
7444 |
|
|
case SOP_PU_SLEEP:
|
7445 |
|
|
len += sprintf(buf + len, "\nDAA PSTN On Hook");
|
7446 |
|
|
break;
|
7447 |
|
|
case SOP_PU_RINGING:
|
7448 |
|
|
len += sprintf(buf + len, "\nDAA PSTN Ringing");
|
7449 |
|
|
len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
|
7450 |
|
|
break;
|
7451 |
|
|
case SOP_PU_CONVERSATION:
|
7452 |
|
|
len += sprintf(buf + len, "\nDAA PSTN Off Hook");
|
7453 |
|
|
break;
|
7454 |
|
|
case SOP_PU_PULSEDIALING:
|
7455 |
|
|
len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
|
7456 |
|
|
break;
|
7457 |
|
|
}
|
7458 |
|
|
len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
|
7459 |
|
|
len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
|
7460 |
|
|
len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
|
7461 |
|
|
len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
|
7462 |
|
|
len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
|
7463 |
|
|
len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
|
7464 |
|
|
len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
|
7465 |
|
|
len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
|
7466 |
|
|
len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
|
7467 |
|
|
len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
|
7468 |
|
|
}
|
7469 |
|
|
switch (j->port) {
|
7470 |
|
|
case PORT_POTS:
|
7471 |
|
|
len += sprintf(buf + len, "\nPort POTS");
|
7472 |
|
|
break;
|
7473 |
|
|
case PORT_PSTN:
|
7474 |
|
|
len += sprintf(buf + len, "\nPort PSTN");
|
7475 |
|
|
break;
|
7476 |
|
|
case PORT_SPEAKER:
|
7477 |
|
|
len += sprintf(buf + len, "\nPort SPEAKER/MIC");
|
7478 |
|
|
break;
|
7479 |
|
|
case PORT_HANDSET:
|
7480 |
|
|
len += sprintf(buf + len, "\nPort HANDSET");
|
7481 |
|
|
break;
|
7482 |
|
|
}
|
7483 |
|
|
if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
|
7484 |
|
|
len += sprintf(buf + len, "\nSLIC state ");
|
7485 |
|
|
switch (SLIC_GetState(j)) {
|
7486 |
|
|
case PLD_SLIC_STATE_OC:
|
7487 |
|
|
len += sprintf(buf + len, "OC");
|
7488 |
|
|
break;
|
7489 |
|
|
case PLD_SLIC_STATE_RINGING:
|
7490 |
|
|
len += sprintf(buf + len, "RINGING");
|
7491 |
|
|
break;
|
7492 |
|
|
case PLD_SLIC_STATE_ACTIVE:
|
7493 |
|
|
len += sprintf(buf + len, "ACTIVE");
|
7494 |
|
|
break;
|
7495 |
|
|
case PLD_SLIC_STATE_OHT: /* On-hook transmit */
|
7496 |
|
|
len += sprintf(buf + len, "OHT");
|
7497 |
|
|
break;
|
7498 |
|
|
case PLD_SLIC_STATE_TIPOPEN:
|
7499 |
|
|
len += sprintf(buf + len, "TIPOPEN");
|
7500 |
|
|
break;
|
7501 |
|
|
case PLD_SLIC_STATE_STANDBY:
|
7502 |
|
|
len += sprintf(buf + len, "STANDBY");
|
7503 |
|
|
break;
|
7504 |
|
|
case PLD_SLIC_STATE_APR: /* Active polarity reversal */
|
7505 |
|
|
len += sprintf(buf + len, "APR");
|
7506 |
|
|
break;
|
7507 |
|
|
case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
|
7508 |
|
|
len += sprintf(buf + len, "OHTPR");
|
7509 |
|
|
break;
|
7510 |
|
|
default:
|
7511 |
|
|
len += sprintf(buf + len, "%d", SLIC_GetState(j));
|
7512 |
|
|
break;
|
7513 |
|
|
}
|
7514 |
|
|
}
|
7515 |
|
|
len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
|
7516 |
|
|
len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
|
7517 |
|
|
#ifdef PERFMON_STATS
|
7518 |
|
|
len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
|
7519 |
|
|
len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
|
7520 |
|
|
len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
|
7521 |
|
|
len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
|
7522 |
|
|
len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
|
7523 |
|
|
len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
|
7524 |
|
|
len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
|
7525 |
|
|
len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
|
7526 |
|
|
len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
|
7527 |
|
|
len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
|
7528 |
|
|
len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
|
7529 |
|
|
len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
|
7530 |
|
|
len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
|
7531 |
|
|
len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
|
7532 |
|
|
|
7533 |
|
|
#endif
|
7534 |
|
|
len += sprintf(buf + len, "\n");
|
7535 |
|
|
}
|
7536 |
|
|
}
|
7537 |
|
|
return len;
|
7538 |
|
|
}
|
7539 |
|
|
|
7540 |
|
|
static int ixj_read_proc(char *page, char **start, off_t off,
|
7541 |
|
|
int count, int *eof, void *data)
|
7542 |
|
|
{
|
7543 |
|
|
int len = ixj_get_status_proc(page);
|
7544 |
|
|
if (len <= off+count) *eof = 1;
|
7545 |
|
|
*start = page + off;
|
7546 |
|
|
len -= off;
|
7547 |
|
|
if (len>count) len = count;
|
7548 |
|
|
if (len<0) len = 0;
|
7549 |
|
|
return len;
|
7550 |
|
|
}
|
7551 |
|
|
|
7552 |
|
|
|
7553 |
|
|
static void cleanup(void)
|
7554 |
|
|
{
|
7555 |
|
|
int cnt;
|
7556 |
|
|
IXJ *j;
|
7557 |
|
|
|
7558 |
|
|
for (cnt = 0; cnt < IXJMAX; cnt++) {
|
7559 |
|
|
j = get_ixj(cnt);
|
7560 |
|
|
if(j != NULL && j->DSPbase) {
|
7561 |
|
|
if (ixjdebug & 0x0002)
|
7562 |
|
|
printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
|
7563 |
|
|
del_timer(&j->timer);
|
7564 |
|
|
if (j->cardtype == QTI_LINEJACK) {
|
7565 |
|
|
j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
|
7566 |
|
|
|
7567 |
|
|
outb_p(j->pld_scrw.byte, j->XILINXbase);
|
7568 |
|
|
j->pld_slicw.bits.rly1 = 0;
|
7569 |
|
|
j->pld_slicw.bits.rly2 = 0;
|
7570 |
|
|
j->pld_slicw.bits.rly3 = 0;
|
7571 |
|
|
outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
|
7572 |
|
|
LED_SetState(0x0, j);
|
7573 |
|
|
if (ixjdebug & 0x0002)
|
7574 |
|
|
printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
|
7575 |
|
|
release_region(j->XILINXbase, 8);
|
7576 |
|
|
} else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
|
7577 |
|
|
if (ixjdebug & 0x0002)
|
7578 |
|
|
printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
|
7579 |
|
|
release_region(j->XILINXbase, 4);
|
7580 |
|
|
}
|
7581 |
|
|
if (j->read_buffer)
|
7582 |
|
|
kfree(j->read_buffer);
|
7583 |
|
|
if (j->write_buffer)
|
7584 |
|
|
kfree(j->write_buffer);
|
7585 |
|
|
if (j->dev && j->dev->deactivate)
|
7586 |
|
|
j->dev->deactivate(j->dev);
|
7587 |
|
|
if (ixjdebug & 0x0002)
|
7588 |
|
|
printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
|
7589 |
|
|
phone_unregister_device(&j->p);
|
7590 |
|
|
if (ixjdebug & 0x0002)
|
7591 |
|
|
printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
|
7592 |
|
|
release_region(j->DSPbase, 16);
|
7593 |
|
|
#ifdef IXJ_DYN_ALLOC
|
7594 |
|
|
if (ixjdebug & 0x0002)
|
7595 |
|
|
printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
|
7596 |
|
|
kfree(j);
|
7597 |
|
|
ixj[cnt] = NULL;
|
7598 |
|
|
#endif
|
7599 |
|
|
}
|
7600 |
|
|
}
|
7601 |
|
|
if (ixjdebug & 0x0002)
|
7602 |
|
|
printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
|
7603 |
|
|
remove_proc_entry ("ixj", NULL);
|
7604 |
|
|
}
|
7605 |
|
|
|
7606 |
|
|
/* Typedefs */
|
7607 |
|
|
typedef struct {
|
7608 |
|
|
BYTE length;
|
7609 |
|
|
DWORD bits;
|
7610 |
|
|
} DATABLOCK;
|
7611 |
|
|
|
7612 |
|
|
static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
|
7613 |
|
|
{
|
7614 |
|
|
lastLCC = lastLCC & 0xfb;
|
7615 |
|
|
lastLCC = lastLCC | (byData ? 4 : 0);
|
7616 |
|
|
outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
|
7617 |
|
|
|
7618 |
|
|
mdelay(1);
|
7619 |
|
|
lastLCC = lastLCC | 0x01;
|
7620 |
|
|
outb(lastLCC, wEEPROMAddress); /*SK rising edge */
|
7621 |
|
|
|
7622 |
|
|
byData = byData << 1;
|
7623 |
|
|
lastLCC = lastLCC & 0xfe;
|
7624 |
|
|
mdelay(1);
|
7625 |
|
|
outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
|
7626 |
|
|
|
7627 |
|
|
}
|
7628 |
|
|
|
7629 |
|
|
static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
|
7630 |
|
|
{
|
7631 |
|
|
mdelay(1);
|
7632 |
|
|
lastLCC = lastLCC | 0x01;
|
7633 |
|
|
outb(lastLCC, wEEPROMAddress); /*SK rising edge */
|
7634 |
|
|
|
7635 |
|
|
lastLCC = lastLCC & 0xfe;
|
7636 |
|
|
mdelay(1);
|
7637 |
|
|
outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
|
7638 |
|
|
|
7639 |
|
|
return ((inb(wEEPROMAddress) >> 3) & 1);
|
7640 |
|
|
}
|
7641 |
|
|
|
7642 |
|
|
static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
|
7643 |
|
|
{
|
7644 |
|
|
BYTE lastLCC;
|
7645 |
|
|
WORD wEEPROMAddress = wAddress + 3;
|
7646 |
|
|
DWORD i;
|
7647 |
|
|
BYTE byResult;
|
7648 |
|
|
*pwResult = 0;
|
7649 |
|
|
lastLCC = inb(wEEPROMAddress);
|
7650 |
|
|
lastLCC = lastLCC | 0x02;
|
7651 |
|
|
lastLCC = lastLCC & 0xfe;
|
7652 |
|
|
outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
|
7653 |
|
|
|
7654 |
|
|
mdelay(1); /* delay */
|
7655 |
|
|
|
7656 |
|
|
PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
|
7657 |
|
|
PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
|
7658 |
|
|
PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
|
7659 |
|
|
for (i = 0; i < 8; i++) {
|
7660 |
|
|
PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
|
7661 |
|
|
wLoc <<= 1;
|
7662 |
|
|
}
|
7663 |
|
|
|
7664 |
|
|
for (i = 0; i < 16; i++) {
|
7665 |
|
|
byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
|
7666 |
|
|
*pwResult = (*pwResult << 1) | byResult;
|
7667 |
|
|
}
|
7668 |
|
|
|
7669 |
|
|
mdelay(1); /* another delay */
|
7670 |
|
|
|
7671 |
|
|
lastLCC = lastLCC & 0xfd;
|
7672 |
|
|
outb(lastLCC, wEEPROMAddress); /* negate CS */
|
7673 |
|
|
|
7674 |
|
|
return 0;
|
7675 |
|
|
}
|
7676 |
|
|
|
7677 |
|
|
static DWORD PCIEE_GetSerialNumber(WORD wAddress)
|
7678 |
|
|
{
|
7679 |
|
|
WORD wLo, wHi;
|
7680 |
|
|
if (PCIEE_ReadWord(wAddress, 62, &wLo))
|
7681 |
|
|
return 0;
|
7682 |
|
|
if (PCIEE_ReadWord(wAddress, 63, &wHi))
|
7683 |
|
|
return 0;
|
7684 |
|
|
return (((DWORD) wHi << 16) | wLo);
|
7685 |
|
|
}
|
7686 |
|
|
|
7687 |
|
|
static int dspio[IXJMAX + 1] =
|
7688 |
|
|
{
|
7689 |
|
|
0,
|
7690 |
|
|
};
|
7691 |
|
|
static int xio[IXJMAX + 1] =
|
7692 |
|
|
{
|
7693 |
|
|
0,
|
7694 |
|
|
};
|
7695 |
|
|
|
7696 |
|
|
MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
|
7697 |
|
|
MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
|
7698 |
|
|
MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
|
7699 |
|
|
MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
|
7700 |
|
|
MODULE_LICENSE("GPL");
|
7701 |
|
|
|
7702 |
|
|
void ixj_exit(void)
|
7703 |
|
|
{
|
7704 |
|
|
cleanup();
|
7705 |
|
|
}
|
7706 |
|
|
|
7707 |
|
|
int __init ixj_probe_isapnp(int *cnt)
|
7708 |
|
|
{
|
7709 |
|
|
int probe = 0;
|
7710 |
|
|
int func = 0x110;
|
7711 |
|
|
struct pci_dev *dev = NULL, *old_dev = NULL;
|
7712 |
|
|
|
7713 |
|
|
while (1) {
|
7714 |
|
|
do {
|
7715 |
|
|
IXJ *j;
|
7716 |
|
|
int result;
|
7717 |
|
|
|
7718 |
|
|
old_dev = dev;
|
7719 |
|
|
dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
|
7720 |
|
|
ISAPNP_FUNCTION(func), old_dev);
|
7721 |
|
|
if (!dev)
|
7722 |
|
|
break;
|
7723 |
|
|
result = dev->prepare(dev);
|
7724 |
|
|
if (result < 0) {
|
7725 |
|
|
printk("preparing failed %d \n", result);
|
7726 |
|
|
break;
|
7727 |
|
|
}
|
7728 |
|
|
|
7729 |
|
|
if (!(dev->resource[0].flags & IORESOURCE_IO))
|
7730 |
|
|
return -ENODEV;
|
7731 |
|
|
|
7732 |
|
|
dev->resource[0].flags |= IORESOURCE_AUTO;
|
7733 |
|
|
if (func != 0x110)
|
7734 |
|
|
dev->resource[1].flags |= IORESOURCE_AUTO;
|
7735 |
|
|
if (dev->activate(dev) < 0) {
|
7736 |
|
|
printk("isapnp configure failed (out of resources?)\n");
|
7737 |
|
|
return -ENOMEM;
|
7738 |
|
|
}
|
7739 |
|
|
|
7740 |
|
|
result = check_region(dev->resource[0].start, 16);
|
7741 |
|
|
if (result) {
|
7742 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", dev->resource[0].start);
|
7743 |
|
|
break;
|
7744 |
|
|
}
|
7745 |
|
|
|
7746 |
|
|
j = ixj_alloc();
|
7747 |
|
|
request_region(j->DSPbase, 16, "ixj DSP");
|
7748 |
|
|
|
7749 |
|
|
if (func != 0x110)
|
7750 |
|
|
j->XILINXbase = dev->resource[1].start; /* get real port */
|
7751 |
|
|
|
7752 |
|
|
switch (func) {
|
7753 |
|
|
case (0x110):
|
7754 |
|
|
j->cardtype = QTI_PHONEJACK;
|
7755 |
|
|
break;
|
7756 |
|
|
case (0x310):
|
7757 |
|
|
j->cardtype = QTI_LINEJACK;
|
7758 |
|
|
break;
|
7759 |
|
|
case (0x410):
|
7760 |
|
|
j->cardtype = QTI_PHONEJACK_LITE;
|
7761 |
|
|
break;
|
7762 |
|
|
}
|
7763 |
|
|
j->board = *cnt;
|
7764 |
|
|
probe = ixj_selfprobe(j);
|
7765 |
|
|
if(!probe) {
|
7766 |
|
|
j->serial = dev->bus->serial;
|
7767 |
|
|
j->dev = dev;
|
7768 |
|
|
switch (func) {
|
7769 |
|
|
case 0x110:
|
7770 |
|
|
printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
|
7771 |
|
|
break;
|
7772 |
|
|
case 0x310:
|
7773 |
|
|
printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
|
7774 |
|
|
break;
|
7775 |
|
|
case 0x410:
|
7776 |
|
|
printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
|
7777 |
|
|
break;
|
7778 |
|
|
}
|
7779 |
|
|
}
|
7780 |
|
|
++*cnt;
|
7781 |
|
|
} while (dev);
|
7782 |
|
|
if (func == 0x410)
|
7783 |
|
|
break;
|
7784 |
|
|
if (func == 0x310)
|
7785 |
|
|
func = 0x410;
|
7786 |
|
|
if (func == 0x110)
|
7787 |
|
|
func = 0x310;
|
7788 |
|
|
dev = NULL;
|
7789 |
|
|
}
|
7790 |
|
|
return probe;
|
7791 |
|
|
}
|
7792 |
|
|
|
7793 |
|
|
int __init ixj_probe_isa(int *cnt)
|
7794 |
|
|
{
|
7795 |
|
|
int i, result, probe;
|
7796 |
|
|
|
7797 |
|
|
/* Use passed parameters for older kernels without PnP */
|
7798 |
|
|
for (i = 0; i < IXJMAX; i++) {
|
7799 |
|
|
if (dspio[i]) {
|
7800 |
|
|
IXJ *j;
|
7801 |
|
|
|
7802 |
|
|
if ((result = check_region(ixj[*cnt].DSPbase, 16)) < 0) {
|
7803 |
|
|
printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[*cnt].DSPbase);
|
7804 |
|
|
break;
|
7805 |
|
|
}
|
7806 |
|
|
|
7807 |
|
|
j = ixj_alloc();
|
7808 |
|
|
|
7809 |
|
|
j->DSPbase = dspio[i];
|
7810 |
|
|
request_region(j->DSPbase, 16, "ixj DSP");
|
7811 |
|
|
|
7812 |
|
|
j->XILINXbase = xio[i];
|
7813 |
|
|
j->cardtype = 0;
|
7814 |
|
|
|
7815 |
|
|
j->board = *cnt;
|
7816 |
|
|
probe = ixj_selfprobe(j);
|
7817 |
|
|
j->dev = NULL;
|
7818 |
|
|
++*cnt;
|
7819 |
|
|
}
|
7820 |
|
|
}
|
7821 |
|
|
return 0;
|
7822 |
|
|
}
|
7823 |
|
|
|
7824 |
|
|
int __init ixj_probe_pci(int *cnt)
|
7825 |
|
|
{
|
7826 |
|
|
struct pci_dev *pci = NULL;
|
7827 |
|
|
int i, probe = 0;
|
7828 |
|
|
IXJ *j = NULL;
|
7829 |
|
|
int result;
|
7830 |
|
|
|
7831 |
|
|
if(!pci_present())
|
7832 |
|
|
return 0;
|
7833 |
|
|
|
7834 |
|
|
for (i = 0; i < IXJMAX - *cnt; i++) {
|
7835 |
|
|
pci = pci_find_device(0x15E2, 0x0500, pci);
|
7836 |
|
|
if (!pci)
|
7837 |
|
|
break;
|
7838 |
|
|
|
7839 |
|
|
if (pci_enable_device(pci))
|
7840 |
|
|
break;
|
7841 |
|
|
if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
|
7842 |
|
|
printk(KERN_INFO "ixj: can't get I/O address\n");
|
7843 |
|
|
break;
|
7844 |
|
|
}
|
7845 |
|
|
|
7846 |
|
|
/* Grab a device slot */
|
7847 |
|
|
j = ixj_alloc();
|
7848 |
|
|
if(j == NULL)
|
7849 |
|
|
break;
|
7850 |
|
|
|
7851 |
|
|
j->DSPbase = pci_resource_start(pci, 0);
|
7852 |
|
|
j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
|
7853 |
|
|
j->XILINXbase = j->DSPbase + 0x10;
|
7854 |
|
|
request_region(j->DSPbase, 16, "ixj DSP");
|
7855 |
|
|
j->cardtype = QTI_PHONEJACK_PCI;
|
7856 |
|
|
j->board = *cnt;
|
7857 |
|
|
probe = ixj_selfprobe(j);
|
7858 |
|
|
if (!probe)
|
7859 |
|
|
printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
|
7860 |
|
|
++*cnt;
|
7861 |
|
|
}
|
7862 |
|
|
return probe;
|
7863 |
|
|
}
|
7864 |
|
|
|
7865 |
|
|
int __init ixj_init(void)
|
7866 |
|
|
{
|
7867 |
|
|
int cnt = 0;
|
7868 |
|
|
int probe = 0;
|
7869 |
|
|
|
7870 |
|
|
cnt = 0;
|
7871 |
|
|
|
7872 |
|
|
/* These might be no-ops, see above. */
|
7873 |
|
|
if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
|
7874 |
|
|
return probe;
|
7875 |
|
|
}
|
7876 |
|
|
if ((probe = ixj_probe_isa(&cnt)) < 0) {
|
7877 |
|
|
return probe;
|
7878 |
|
|
}
|
7879 |
|
|
if (pci_present()) {
|
7880 |
|
|
if ((probe = ixj_probe_pci(&cnt)) < 0) {
|
7881 |
|
|
return probe;
|
7882 |
|
|
}
|
7883 |
|
|
}
|
7884 |
|
|
printk("%s\n", ixj_c_rcsid);
|
7885 |
|
|
create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
|
7886 |
|
|
return probe;
|
7887 |
|
|
}
|
7888 |
|
|
|
7889 |
|
|
module_init(ixj_init);
|
7890 |
|
|
module_exit(ixj_exit);
|
7891 |
|
|
|
7892 |
|
|
static void DAA_Coeff_US(IXJ *j)
|
7893 |
|
|
{
|
7894 |
|
|
int i;
|
7895 |
|
|
|
7896 |
|
|
j->daa_country = DAA_US;
|
7897 |
|
|
/*----------------------------------------------- */
|
7898 |
|
|
/* CAO */
|
7899 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
7900 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
7901 |
|
|
}
|
7902 |
|
|
|
7903 |
|
|
/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
|
7904 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
|
7905 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
|
7906 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
|
7907 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
|
7908 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
|
7909 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
|
7910 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
|
7911 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
7912 |
|
|
/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
|
7913 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
|
7914 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
|
7915 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
7916 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
|
7917 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
|
7918 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
|
7919 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
|
7920 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
7921 |
|
|
/* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
|
7922 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
|
7923 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
|
7924 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
|
7925 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
|
7926 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
|
7927 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
|
7928 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
|
7929 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
7930 |
|
|
/* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
|
7931 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
|
7932 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
|
7933 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
|
7934 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
|
7935 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
|
7936 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
|
7937 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
|
7938 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
7939 |
|
|
/* Bytes for AX-filter (0A): 16,55,DD,CA */
|
7940 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
|
7941 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
|
7942 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
7943 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
7944 |
|
|
/* Bytes for AR-filter (09): 52,D3,11,42 */
|
7945 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
|
7946 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
|
7947 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
|
7948 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
|
7949 |
|
|
/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
|
7950 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
|
7951 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
|
7952 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
|
7953 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
|
7954 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
|
7955 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
|
7956 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
7957 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
7958 |
|
|
/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
|
7959 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
7960 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
|
7961 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
|
7962 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
|
7963 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
|
7964 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
|
7965 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
|
7966 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
|
7967 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
|
7968 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
7969 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
7970 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
|
7971 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
|
7972 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
|
7973 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
|
7974 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
|
7975 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
|
7976 |
|
|
/* ; (10K, 0.68uF) */
|
7977 |
|
|
/* */
|
7978 |
|
|
/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
|
7979 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
7980 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
|
7981 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
|
7982 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
|
7983 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
|
7984 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
|
7985 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
|
7986 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
7987 |
|
|
/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
|
7988 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
|
7989 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
|
7990 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
7991 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
7992 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
|
7993 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
|
7994 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
|
7995 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
7996 |
|
|
|
7997 |
|
|
/* Levelmetering Ringing (0D):B2,45,0F,8E */
|
7998 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
|
7999 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
|
8000 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
|
8001 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
|
8002 |
|
|
|
8003 |
|
|
/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
|
8004 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
|
8005 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
|
8006 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
|
8007 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
|
8008 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
|
8009 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
|
8010 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
|
8011 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
|
8012 |
|
|
/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
|
8013 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
|
8014 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
|
8015 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
|
8016 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
|
8017 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
|
8018 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
|
8019 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
|
8020 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
|
8021 |
|
|
/* */
|
8022 |
|
|
/* Levelmetering Ringing (0D):B2,45,0F,8E */
|
8023 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
|
8024 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
|
8025 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
|
8026 |
|
|
/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
|
8027 |
|
|
|
8028 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8029 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8030 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8031 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8032 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8033 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8034 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8035 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8036 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8037 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8038 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8039 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8040 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8041 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8042 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8043 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8044 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8045 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8046 |
|
|
/* */
|
8047 |
|
|
/* ;CR Registers */
|
8048 |
|
|
/* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
|
8049 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8050 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 */
|
8051 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8052 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 */
|
8053 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8054 |
|
|
/* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
|
8055 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8056 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8057 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8058 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8059 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8060 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8061 |
|
|
/* */
|
8062 |
|
|
/* ;xr Registers */
|
8063 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8064 |
|
|
|
8065 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8066 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
|
8067 |
|
|
|
8068 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
|
8069 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8070 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8071 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
|
8072 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
|
8073 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8074 |
|
|
|
8075 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8076 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8077 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8078 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8079 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8080 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):40 */
|
8081 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
|
8082 |
|
|
/* */
|
8083 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8084 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8085 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8086 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8087 |
|
|
|
8088 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8089 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8090 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8091 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8092 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8093 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8094 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8095 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8096 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8097 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8098 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8099 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8100 |
|
|
}
|
8101 |
|
|
|
8102 |
|
|
static void DAA_Coeff_UK(IXJ *j)
|
8103 |
|
|
{
|
8104 |
|
|
int i;
|
8105 |
|
|
|
8106 |
|
|
j->daa_country = DAA_UK;
|
8107 |
|
|
/*----------------------------------------------- */
|
8108 |
|
|
/* CAO */
|
8109 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
8110 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
8111 |
|
|
}
|
8112 |
|
|
|
8113 |
|
|
/* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
|
8114 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
|
8115 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
|
8116 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
|
8117 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
|
8118 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
|
8119 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
|
8120 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
|
8121 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
8122 |
|
|
/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
|
8123 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
|
8124 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
|
8125 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
8126 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
|
8127 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
|
8128 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
|
8129 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
|
8130 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
8131 |
|
|
/* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
|
8132 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
|
8133 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
|
8134 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
|
8135 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
|
8136 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
|
8137 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
|
8138 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
|
8139 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
8140 |
|
|
/* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
|
8141 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
|
8142 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
|
8143 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
|
8144 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
|
8145 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
|
8146 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
|
8147 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
|
8148 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
8149 |
|
|
/* Bytes for AX-filter (0A): 1B,A5,DD,CA */
|
8150 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
|
8151 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
|
8152 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
8153 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
8154 |
|
|
/* Bytes for AR-filter (09): E2,27,10,D6 */
|
8155 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
|
8156 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
|
8157 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
|
8158 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
|
8159 |
|
|
/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
|
8160 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
|
8161 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
|
8162 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
|
8163 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
|
8164 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
|
8165 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
|
8166 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
8167 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
8168 |
|
|
/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
|
8169 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
8170 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
|
8171 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
|
8172 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
|
8173 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
|
8174 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
|
8175 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
|
8176 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
|
8177 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
|
8178 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
8179 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
8180 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
|
8181 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
|
8182 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
|
8183 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
|
8184 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
|
8185 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
|
8186 |
|
|
/* ; idle */
|
8187 |
|
|
/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
|
8188 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
8189 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
|
8190 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
|
8191 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
|
8192 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
|
8193 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
|
8194 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
|
8195 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
8196 |
|
|
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
|
8197 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
|
8198 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
|
8199 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
8200 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
8201 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
|
8202 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
|
8203 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
|
8204 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
8205 |
|
|
/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
|
8206 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
|
8207 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
|
8208 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
|
8209 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
|
8210 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8211 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8212 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8213 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8214 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8215 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8216 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8217 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8218 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8219 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8220 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8221 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8222 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8223 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8224 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8225 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8226 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8227 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8228 |
|
|
/* ;CR Registers */
|
8229 |
|
|
/* Config. Reg. 0 (filters) (cr0):FF */
|
8230 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8231 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 */
|
8232 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8233 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 */
|
8234 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8235 |
|
|
/* Config. Reg. 3 (testloops) (cr3):00 ; */
|
8236 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8237 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8238 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8239 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8240 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8241 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8242 |
|
|
/* ;xr Registers */
|
8243 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8244 |
|
|
|
8245 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8246 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
|
8247 |
|
|
|
8248 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
|
8249 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8250 |
|
|
|
8251 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8252 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
|
8253 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
|
8254 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8255 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8256 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8257 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8258 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8259 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8260 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):46 */
|
8261 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
|
8262 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8263 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8264 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8265 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8266 |
|
|
|
8267 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8268 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8269 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8270 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8271 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8272 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8273 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8274 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8275 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8276 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8277 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8278 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8279 |
|
|
}
|
8280 |
|
|
|
8281 |
|
|
|
8282 |
|
|
static void DAA_Coeff_France(IXJ *j)
|
8283 |
|
|
{
|
8284 |
|
|
int i;
|
8285 |
|
|
|
8286 |
|
|
j->daa_country = DAA_FRANCE;
|
8287 |
|
|
/*----------------------------------------------- */
|
8288 |
|
|
/* CAO */
|
8289 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
8290 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
8291 |
|
|
}
|
8292 |
|
|
|
8293 |
|
|
/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
|
8294 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
|
8295 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
|
8296 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
|
8297 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
|
8298 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
|
8299 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
|
8300 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
|
8301 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
8302 |
|
|
/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
|
8303 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
|
8304 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
|
8305 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
8306 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
|
8307 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
|
8308 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
|
8309 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
|
8310 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
8311 |
|
|
/* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
|
8312 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
|
8313 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
|
8314 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
|
8315 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
|
8316 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
|
8317 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
|
8318 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
|
8319 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
8320 |
|
|
/* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
|
8321 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
|
8322 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
|
8323 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
|
8324 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
|
8325 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
|
8326 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
|
8327 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
|
8328 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
8329 |
|
|
/* Bytes for AX-filter (0A): 16,B5,DD,CA */
|
8330 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
|
8331 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
|
8332 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
8333 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
8334 |
|
|
/* Bytes for AR-filter (09): 52,C7,10,D6 */
|
8335 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
|
8336 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
|
8337 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
|
8338 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
|
8339 |
|
|
/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
|
8340 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
|
8341 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
|
8342 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
|
8343 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
|
8344 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
|
8345 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
|
8346 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
8347 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
8348 |
|
|
/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
|
8349 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
8350 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
|
8351 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
|
8352 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
|
8353 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
|
8354 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
|
8355 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
|
8356 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
|
8357 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
|
8358 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
8359 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
8360 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
|
8361 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
|
8362 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
|
8363 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
|
8364 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
|
8365 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
|
8366 |
|
|
/* ; idle */
|
8367 |
|
|
/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
|
8368 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
8369 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
|
8370 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
|
8371 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
|
8372 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
|
8373 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
|
8374 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
|
8375 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
8376 |
|
|
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
|
8377 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
|
8378 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
|
8379 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
8380 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
8381 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
|
8382 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
|
8383 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
|
8384 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
8385 |
|
|
/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
|
8386 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
|
8387 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
|
8388 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
|
8389 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
|
8390 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8391 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8392 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8393 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8394 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8395 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8396 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8397 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8398 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8399 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8400 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8401 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8402 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8403 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8404 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8405 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8406 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8407 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8408 |
|
|
/* ;CR Registers */
|
8409 |
|
|
/* Config. Reg. 0 (filters) (cr0):FF */
|
8410 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8411 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 */
|
8412 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8413 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 */
|
8414 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8415 |
|
|
/* Config. Reg. 3 (testloops) (cr3):00 ; */
|
8416 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8417 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8418 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8419 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8420 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8421 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8422 |
|
|
/* ;xr Registers */
|
8423 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8424 |
|
|
|
8425 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8426 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
|
8427 |
|
|
|
8428 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
|
8429 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8430 |
|
|
|
8431 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8432 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
|
8433 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
|
8434 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8435 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8436 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8437 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8438 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8439 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8440 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):46 */
|
8441 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
|
8442 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8443 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8444 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8445 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8446 |
|
|
|
8447 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8448 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8449 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8450 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8451 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8452 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8453 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8454 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8455 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8456 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8457 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8458 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8459 |
|
|
}
|
8460 |
|
|
|
8461 |
|
|
|
8462 |
|
|
static void DAA_Coeff_Germany(IXJ *j)
|
8463 |
|
|
{
|
8464 |
|
|
int i;
|
8465 |
|
|
|
8466 |
|
|
j->daa_country = DAA_GERMANY;
|
8467 |
|
|
/*----------------------------------------------- */
|
8468 |
|
|
/* CAO */
|
8469 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
8470 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
8471 |
|
|
}
|
8472 |
|
|
|
8473 |
|
|
/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
|
8474 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
|
8475 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
|
8476 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
|
8477 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
|
8478 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
|
8479 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
|
8480 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
|
8481 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
8482 |
|
|
/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
|
8483 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
|
8484 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
|
8485 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
8486 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
|
8487 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
|
8488 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
|
8489 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
|
8490 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
8491 |
|
|
/* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
|
8492 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
|
8493 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
|
8494 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
|
8495 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
|
8496 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
|
8497 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
|
8498 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
|
8499 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
8500 |
|
|
/* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
|
8501 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
|
8502 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
|
8503 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
|
8504 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
|
8505 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
|
8506 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
|
8507 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
|
8508 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
8509 |
|
|
/* Bytes for AX-filter (0A): 72,D5,DD,CA */
|
8510 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
|
8511 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
|
8512 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
8513 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
8514 |
|
|
/* Bytes for AR-filter (09): 72,42,13,4B */
|
8515 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
|
8516 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
|
8517 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
|
8518 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
|
8519 |
|
|
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
|
8520 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
|
8521 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
|
8522 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
|
8523 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
|
8524 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
|
8525 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
|
8526 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
8527 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
8528 |
|
|
/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
|
8529 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
8530 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
|
8531 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
|
8532 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
|
8533 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
|
8534 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
|
8535 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
|
8536 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
|
8537 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
|
8538 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
8539 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
8540 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
|
8541 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
|
8542 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
|
8543 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
|
8544 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
|
8545 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
|
8546 |
|
|
/* ; (10K, 0.68uF) */
|
8547 |
|
|
/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
|
8548 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
8549 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
|
8550 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
|
8551 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
|
8552 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
|
8553 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
|
8554 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
|
8555 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
8556 |
|
|
/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
|
8557 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
|
8558 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
|
8559 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
8560 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
8561 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
|
8562 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
|
8563 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
|
8564 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
8565 |
|
|
/* Levelmetering Ringing (0D):B2,45,0F,8E */
|
8566 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
|
8567 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
|
8568 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
|
8569 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
|
8570 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8571 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8572 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8573 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8574 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8575 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8576 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8577 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8578 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8579 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8580 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8581 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8582 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8583 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8584 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8585 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8586 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8587 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8588 |
|
|
/* ;CR Registers */
|
8589 |
|
|
/* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
|
8590 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8591 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
|
8592 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8593 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
|
8594 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8595 |
|
|
/* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
|
8596 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8597 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8598 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8599 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8600 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8601 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8602 |
|
|
/* ;xr Registers */
|
8603 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8604 |
|
|
|
8605 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8606 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
|
8607 |
|
|
|
8608 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
|
8609 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8610 |
|
|
|
8611 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8612 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
|
8613 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
|
8614 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8615 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8616 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8617 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8618 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8619 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8620 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
|
8621 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
|
8622 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8623 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8624 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8625 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8626 |
|
|
|
8627 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8628 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8629 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8630 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8631 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8632 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8633 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8634 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8635 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8636 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8637 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8638 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8639 |
|
|
}
|
8640 |
|
|
|
8641 |
|
|
|
8642 |
|
|
static void DAA_Coeff_Australia(IXJ *j)
|
8643 |
|
|
{
|
8644 |
|
|
int i;
|
8645 |
|
|
|
8646 |
|
|
j->daa_country = DAA_AUSTRALIA;
|
8647 |
|
|
/*----------------------------------------------- */
|
8648 |
|
|
/* CAO */
|
8649 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
8650 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
8651 |
|
|
}
|
8652 |
|
|
|
8653 |
|
|
/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
|
8654 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
|
8655 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
|
8656 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
|
8657 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
|
8658 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
|
8659 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
|
8660 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
|
8661 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
8662 |
|
|
/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
|
8663 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
|
8664 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
|
8665 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
8666 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
|
8667 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
|
8668 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
|
8669 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
|
8670 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
8671 |
|
|
/* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
|
8672 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
|
8673 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
|
8674 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
|
8675 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
|
8676 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
|
8677 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
|
8678 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
|
8679 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
8680 |
|
|
/* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
|
8681 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
|
8682 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
|
8683 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
|
8684 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
|
8685 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
|
8686 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
|
8687 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
|
8688 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
8689 |
|
|
/* Bytes for AX-filter (0A): CB,45,DD,CA */
|
8690 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
|
8691 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
|
8692 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
8693 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
8694 |
|
|
/* Bytes for AR-filter (09): 1B,67,10,D6 */
|
8695 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
|
8696 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
|
8697 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
|
8698 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
|
8699 |
|
|
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
|
8700 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
|
8701 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
|
8702 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
|
8703 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
|
8704 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
|
8705 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
|
8706 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
8707 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
8708 |
|
|
/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
|
8709 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
8710 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
|
8711 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
|
8712 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
|
8713 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
|
8714 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
|
8715 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
|
8716 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
|
8717 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
|
8718 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
8719 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
8720 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
|
8721 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
|
8722 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
|
8723 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
|
8724 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
|
8725 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
|
8726 |
|
|
/* ; idle */
|
8727 |
|
|
/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
|
8728 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
8729 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
|
8730 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
|
8731 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
|
8732 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
|
8733 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
|
8734 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
|
8735 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
8736 |
|
|
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
|
8737 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
|
8738 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
|
8739 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
8740 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
8741 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
|
8742 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
|
8743 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
|
8744 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
8745 |
|
|
/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
|
8746 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
|
8747 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
|
8748 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
|
8749 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
|
8750 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8751 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8752 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8753 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8754 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8755 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8756 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8757 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8758 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8759 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8760 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8761 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8762 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8763 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8764 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8765 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8766 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8767 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8768 |
|
|
/* ;CR Registers */
|
8769 |
|
|
/* Config. Reg. 0 (filters) (cr0):FF */
|
8770 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8771 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 */
|
8772 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8773 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 */
|
8774 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8775 |
|
|
/* Config. Reg. 3 (testloops) (cr3):00 ; */
|
8776 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8777 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8778 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8779 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8780 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8781 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8782 |
|
|
/* ;xr Registers */
|
8783 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8784 |
|
|
|
8785 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8786 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
|
8787 |
|
|
|
8788 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
|
8789 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8790 |
|
|
|
8791 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8792 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):2B ; */
|
8793 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
|
8794 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8795 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8796 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8797 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8798 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8799 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8800 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):40 */
|
8801 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
|
8802 |
|
|
|
8803 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8804 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8805 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8806 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8807 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8808 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8809 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8810 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8811 |
|
|
|
8812 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8813 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8814 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8815 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8816 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8817 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8818 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8819 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8820 |
|
|
}
|
8821 |
|
|
|
8822 |
|
|
static void DAA_Coeff_Japan(IXJ *j)
|
8823 |
|
|
{
|
8824 |
|
|
int i;
|
8825 |
|
|
|
8826 |
|
|
j->daa_country = DAA_JAPAN;
|
8827 |
|
|
/*----------------------------------------------- */
|
8828 |
|
|
/* CAO */
|
8829 |
|
|
for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
|
8830 |
|
|
j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
|
8831 |
|
|
}
|
8832 |
|
|
|
8833 |
|
|
/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
|
8834 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
|
8835 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
|
8836 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
|
8837 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
|
8838 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
|
8839 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
|
8840 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
|
8841 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
|
8842 |
|
|
/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
|
8843 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
|
8844 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
|
8845 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
|
8846 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
|
8847 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
|
8848 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
|
8849 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
|
8850 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
|
8851 |
|
|
/* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
|
8852 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
|
8853 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
|
8854 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
|
8855 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
|
8856 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
|
8857 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
|
8858 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
|
8859 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
|
8860 |
|
|
/* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
|
8861 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
|
8862 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
|
8863 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
|
8864 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
|
8865 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
|
8866 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
|
8867 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
|
8868 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
|
8869 |
|
|
/* Bytes for AX-filter (0A): 51,C5,DD,CA */
|
8870 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
|
8871 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
|
8872 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
|
8873 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
|
8874 |
|
|
/* Bytes for AR-filter (09): 25,A7,10,D6 */
|
8875 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
|
8876 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
|
8877 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
|
8878 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
|
8879 |
|
|
/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
|
8880 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
|
8881 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
|
8882 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
|
8883 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
|
8884 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
|
8885 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
|
8886 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
|
8887 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
|
8888 |
|
|
/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
|
8889 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
|
8890 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
|
8891 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
|
8892 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
|
8893 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
|
8894 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
|
8895 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
|
8896 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
|
8897 |
|
|
/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
|
8898 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
|
8899 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
|
8900 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
|
8901 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
|
8902 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
|
8903 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
|
8904 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
|
8905 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
|
8906 |
|
|
/* ; idle */
|
8907 |
|
|
/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
|
8908 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
|
8909 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
|
8910 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
|
8911 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
|
8912 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
|
8913 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
|
8914 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
|
8915 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
|
8916 |
|
|
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
|
8917 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
|
8918 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
|
8919 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
|
8920 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
|
8921 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
|
8922 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
|
8923 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
|
8924 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
|
8925 |
|
|
/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
|
8926 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
|
8927 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
|
8928 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
|
8929 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
|
8930 |
|
|
/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
|
8931 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
|
8932 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
|
8933 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
|
8934 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
|
8935 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
|
8936 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
|
8937 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
|
8938 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
|
8939 |
|
|
/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
|
8940 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
|
8941 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
|
8942 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
|
8943 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
|
8944 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
|
8945 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
|
8946 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
|
8947 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
|
8948 |
|
|
/* ;CR Registers */
|
8949 |
|
|
/* Config. Reg. 0 (filters) (cr0):FF */
|
8950 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
|
8951 |
|
|
/* Config. Reg. 1 (dialing) (cr1):05 */
|
8952 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
|
8953 |
|
|
/* Config. Reg. 2 (caller ID) (cr2):04 */
|
8954 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
|
8955 |
|
|
/* Config. Reg. 3 (testloops) (cr3):00 ; */
|
8956 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
|
8957 |
|
|
/* Config. Reg. 4 (analog gain) (cr4):02 */
|
8958 |
|
|
j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
|
8959 |
|
|
/* Config. Reg. 5 (Version) (cr5):02 */
|
8960 |
|
|
/* Config. Reg. 6 (Reserved) (cr6):00 */
|
8961 |
|
|
/* Config. Reg. 7 (Reserved) (cr7):00 */
|
8962 |
|
|
/* ;xr Registers */
|
8963 |
|
|
/* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
|
8964 |
|
|
|
8965 |
|
|
j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
|
8966 |
|
|
/* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
|
8967 |
|
|
|
8968 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
|
8969 |
|
|
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
|
8970 |
|
|
|
8971 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
|
8972 |
|
|
/* Ext. Reg. 3 (DC Char) (xr3):22 ; */
|
8973 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
|
8974 |
|
|
/* Ext. Reg. 4 (Cadence) (xr4):00 */
|
8975 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
|
8976 |
|
|
/* Ext. Reg. 5 (Ring timer) (xr5):22 */
|
8977 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
|
8978 |
|
|
/* Ext. Reg. 6 (Power State) (xr6):00 */
|
8979 |
|
|
j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
|
8980 |
|
|
/* Ext. Reg. 7 (Vdd) (xr7):40 */
|
8981 |
|
|
j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
|
8982 |
|
|
/* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
|
8983 |
|
|
/* 12,33,5A,C3 ; 770 Hz */
|
8984 |
|
|
/* 13,3C,5B,32 ; 852 Hz */
|
8985 |
|
|
/* 1D,1B,5C,CC ; 941 Hz */
|
8986 |
|
|
|
8987 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
|
8988 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
|
8989 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
|
8990 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
|
8991 |
|
|
/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
|
8992 |
|
|
/* EC,1D,52,22 ; 1336 Hz */
|
8993 |
|
|
/* AA,AC,51,D2 ; 1477 Hz */
|
8994 |
|
|
/* 9B,3B,51,25 ; 1633 Hz */
|
8995 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
|
8996 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
|
8997 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
|
8998 |
|
|
j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
|
8999 |
|
|
}
|
9000 |
|
|
|
9001 |
|
|
static s16 tone_table[][19] =
|
9002 |
|
|
{
|
9003 |
|
|
{ /* f20_50[] 11 */
|
9004 |
|
|
32538, /* A1 = 1.985962 */
|
9005 |
|
|
-32325, /* A2 = -0.986511 */
|
9006 |
|
|
-343, /* B2 = -0.010493 */
|
9007 |
|
|
0, /* B1 = 0 */
|
9008 |
|
|
343, /* B0 = 0.010493 */
|
9009 |
|
|
32619, /* A1 = 1.990906 */
|
9010 |
|
|
-32520, /* A2 = -0.992462 */
|
9011 |
|
|
19179, /* B2 = 0.585327 */
|
9012 |
|
|
-19178, /* B1 = -1.170593 */
|
9013 |
|
|
19179, /* B0 = 0.585327 */
|
9014 |
|
|
32723, /* A1 = 1.997314 */
|
9015 |
|
|
-32686, /* A2 = -0.997528 */
|
9016 |
|
|
9973, /* B2 = 0.304352 */
|
9017 |
|
|
-9955, /* B1 = -0.607605 */
|
9018 |
|
|
9973, /* B0 = 0.304352 */
|
9019 |
|
|
7, /* Internal filter scaling */
|
9020 |
|
|
159, /* Minimum in-band energy threshold */
|
9021 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9022 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9023 |
|
|
},
|
9024 |
|
|
{ /* f133_200[] 12 */
|
9025 |
|
|
32072, /* A1 = 1.95752 */
|
9026 |
|
|
-31896, /* A2 = -0.973419 */
|
9027 |
|
|
-435, /* B2 = -0.013294 */
|
9028 |
|
|
0, /* B1 = 0 */
|
9029 |
|
|
435, /* B0 = 0.013294 */
|
9030 |
|
|
32188, /* A1 = 1.9646 */
|
9031 |
|
|
-32400, /* A2 = -0.98877 */
|
9032 |
|
|
15139, /* B2 = 0.462036 */
|
9033 |
|
|
-14882, /* B1 = -0.908356 */
|
9034 |
|
|
15139, /* B0 = 0.462036 */
|
9035 |
|
|
32473, /* A1 = 1.981995 */
|
9036 |
|
|
-32524, /* A2 = -0.992584 */
|
9037 |
|
|
23200, /* B2 = 0.708008 */
|
9038 |
|
|
-23113, /* B1 = -1.410706 */
|
9039 |
|
|
23200, /* B0 = 0.708008 */
|
9040 |
|
|
7, /* Internal filter scaling */
|
9041 |
|
|
159, /* Minimum in-band energy threshold */
|
9042 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9043 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9044 |
|
|
},
|
9045 |
|
|
{ /* f300 13 */
|
9046 |
|
|
31769, /* A1 = -1.939026 */
|
9047 |
|
|
-32584, /* A2 = 0.994385 */
|
9048 |
|
|
-475, /* B2 = -0.014522 */
|
9049 |
|
|
0, /* B1 = 0.000000 */
|
9050 |
|
|
475, /* B0 = 0.014522 */
|
9051 |
|
|
31789, /* A1 = -1.940247 */
|
9052 |
|
|
-32679, /* A2 = 0.997284 */
|
9053 |
|
|
17280, /* B2 = 0.527344 */
|
9054 |
|
|
-16865, /* B1 = -1.029358 */
|
9055 |
|
|
17280, /* B0 = 0.527344 */
|
9056 |
|
|
31841, /* A1 = -1.943481 */
|
9057 |
|
|
-32681, /* A2 = 0.997345 */
|
9058 |
|
|
543, /* B2 = 0.016579 */
|
9059 |
|
|
-525, /* B1 = -0.032097 */
|
9060 |
|
|
543, /* B0 = 0.016579 */
|
9061 |
|
|
5, /* Internal filter scaling */
|
9062 |
|
|
159, /* Minimum in-band energy threshold */
|
9063 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9064 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9065 |
|
|
},
|
9066 |
|
|
{ /* f300_420[] 14 */
|
9067 |
|
|
30750, /* A1 = 1.876892 */
|
9068 |
|
|
-31212, /* A2 = -0.952515 */
|
9069 |
|
|
-804, /* B2 = -0.024541 */
|
9070 |
|
|
0, /* B1 = 0 */
|
9071 |
|
|
804, /* B0 = 0.024541 */
|
9072 |
|
|
30686, /* A1 = 1.872925 */
|
9073 |
|
|
-32145, /* A2 = -0.980988 */
|
9074 |
|
|
14747, /* B2 = 0.450043 */
|
9075 |
|
|
-13703, /* B1 = -0.836395 */
|
9076 |
|
|
14747, /* B0 = 0.450043 */
|
9077 |
|
|
31651, /* A1 = 1.931824 */
|
9078 |
|
|
-32321, /* A2 = -0.986389 */
|
9079 |
|
|
24425, /* B2 = 0.745422 */
|
9080 |
|
|
-23914, /* B1 = -1.459595 */
|
9081 |
|
|
24427, /* B0 = 0.745483 */
|
9082 |
|
|
7, /* Internal filter scaling */
|
9083 |
|
|
159, /* Minimum in-band energy threshold */
|
9084 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9085 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9086 |
|
|
},
|
9087 |
|
|
{ /* f330 15 */
|
9088 |
|
|
31613, /* A1 = -1.929565 */
|
9089 |
|
|
-32646, /* A2 = 0.996277 */
|
9090 |
|
|
-185, /* B2 = -0.005657 */
|
9091 |
|
|
0, /* B1 = 0.000000 */
|
9092 |
|
|
185, /* B0 = 0.005657 */
|
9093 |
|
|
31620, /* A1 = -1.929932 */
|
9094 |
|
|
-32713, /* A2 = 0.998352 */
|
9095 |
|
|
19253, /* B2 = 0.587585 */
|
9096 |
|
|
-18566, /* B1 = -1.133179 */
|
9097 |
|
|
19253, /* B0 = 0.587585 */
|
9098 |
|
|
31674, /* A1 = -1.933228 */
|
9099 |
|
|
-32715, /* A2 = 0.998413 */
|
9100 |
|
|
2575, /* B2 = 0.078590 */
|
9101 |
|
|
-2495, /* B1 = -0.152283 */
|
9102 |
|
|
2575, /* B0 = 0.078590 */
|
9103 |
|
|
5, /* Internal filter scaling */
|
9104 |
|
|
159, /* Minimum in-band energy threshold */
|
9105 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9106 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9107 |
|
|
},
|
9108 |
|
|
{ /* f300_425[] 16 */
|
9109 |
|
|
30741, /* A1 = 1.876282 */
|
9110 |
|
|
-31475, /* A2 = -0.960541 */
|
9111 |
|
|
-703, /* B2 = -0.021484 */
|
9112 |
|
|
0, /* B1 = 0 */
|
9113 |
|
|
703, /* B0 = 0.021484 */
|
9114 |
|
|
30688, /* A1 = 1.873047 */
|
9115 |
|
|
-32248, /* A2 = -0.984161 */
|
9116 |
|
|
14542, /* B2 = 0.443787 */
|
9117 |
|
|
-13523, /* B1 = -0.825439 */
|
9118 |
|
|
14542, /* B0 = 0.443817 */
|
9119 |
|
|
31494, /* A1 = 1.922302 */
|
9120 |
|
|
-32366, /* A2 = -0.987762 */
|
9121 |
|
|
21577, /* B2 = 0.658508 */
|
9122 |
|
|
-21013, /* B1 = -1.282532 */
|
9123 |
|
|
21577, /* B0 = 0.658508 */
|
9124 |
|
|
7, /* Internal filter scaling */
|
9125 |
|
|
159, /* Minimum in-band energy threshold */
|
9126 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9127 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9128 |
|
|
},
|
9129 |
|
|
{ /* f330_440[] 17 */
|
9130 |
|
|
30627, /* A1 = 1.869324 */
|
9131 |
|
|
-31338, /* A2 = -0.95636 */
|
9132 |
|
|
-843, /* B2 = -0.025749 */
|
9133 |
|
|
0, /* B1 = 0 */
|
9134 |
|
|
843, /* B0 = 0.025749 */
|
9135 |
|
|
30550, /* A1 = 1.864685 */
|
9136 |
|
|
-32221, /* A2 = -0.983337 */
|
9137 |
|
|
13594, /* B2 = 0.414886 */
|
9138 |
|
|
-12589, /* B1 = -0.768402 */
|
9139 |
|
|
13594, /* B0 = 0.414886 */
|
9140 |
|
|
31488, /* A1 = 1.921936 */
|
9141 |
|
|
-32358, /* A2 = -0.987518 */
|
9142 |
|
|
24684, /* B2 = 0.753296 */
|
9143 |
|
|
-24029, /* B1 = -1.466614 */
|
9144 |
|
|
24684, /* B0 = 0.753296 */
|
9145 |
|
|
7, /* Internal filter scaling */
|
9146 |
|
|
159, /* Minimum in-band energy threshold */
|
9147 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9148 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9149 |
|
|
},
|
9150 |
|
|
{ /* f340 18 */
|
9151 |
|
|
31546, /* A1 = -1.925476 */
|
9152 |
|
|
-32646, /* A2 = 0.996277 */
|
9153 |
|
|
-445, /* B2 = -0.013588 */
|
9154 |
|
|
0, /* B1 = 0.000000 */
|
9155 |
|
|
445, /* B0 = 0.013588 */
|
9156 |
|
|
31551, /* A1 = -1.925781 */
|
9157 |
|
|
-32713, /* A2 = 0.998352 */
|
9158 |
|
|
23884, /* B2 = 0.728882 */
|
9159 |
|
|
-22979, /* B1 = -1.402527 */
|
9160 |
|
|
23884, /* B0 = 0.728882 */
|
9161 |
|
|
31606, /* A1 = -1.929138 */
|
9162 |
|
|
-32715, /* A2 = 0.998413 */
|
9163 |
|
|
863, /* B2 = 0.026367 */
|
9164 |
|
|
-835, /* B1 = -0.050985 */
|
9165 |
|
|
863, /* B0 = 0.026367 */
|
9166 |
|
|
5, /* Internal filter scaling */
|
9167 |
|
|
159, /* Minimum in-band energy threshold */
|
9168 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9169 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9170 |
|
|
},
|
9171 |
|
|
{ /* f350_400[] 19 */
|
9172 |
|
|
31006, /* A1 = 1.892517 */
|
9173 |
|
|
-32029, /* A2 = -0.977448 */
|
9174 |
|
|
-461, /* B2 = -0.014096 */
|
9175 |
|
|
0, /* B1 = 0 */
|
9176 |
|
|
461, /* B0 = 0.014096 */
|
9177 |
|
|
30999, /* A1 = 1.892029 */
|
9178 |
|
|
-32487, /* A2 = -0.991455 */
|
9179 |
|
|
11325, /* B2 = 0.345612 */
|
9180 |
|
|
-10682, /* B1 = -0.651978 */
|
9181 |
|
|
11325, /* B0 = 0.345612 */
|
9182 |
|
|
31441, /* A1 = 1.919067 */
|
9183 |
|
|
-32526, /* A2 = -0.992615 */
|
9184 |
|
|
24324, /* B2 = 0.74231 */
|
9185 |
|
|
-23535, /* B1 = -1.436523 */
|
9186 |
|
|
24324, /* B0 = 0.74231 */
|
9187 |
|
|
7, /* Internal filter scaling */
|
9188 |
|
|
159, /* Minimum in-band energy threshold */
|
9189 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9190 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9191 |
|
|
},
|
9192 |
|
|
{ /* f350_440[] */
|
9193 |
|
|
30634, /* A1 = 1.869751 */
|
9194 |
|
|
-31533, /* A2 = -0.962341 */
|
9195 |
|
|
-680, /* B2 = -0.020782 */
|
9196 |
|
|
0, /* B1 = 0 */
|
9197 |
|
|
680, /* B0 = 0.020782 */
|
9198 |
|
|
30571, /* A1 = 1.865906 */
|
9199 |
|
|
-32277, /* A2 = -0.985016 */
|
9200 |
|
|
12894, /* B2 = 0.393524 */
|
9201 |
|
|
-11945, /* B1 = -0.729065 */
|
9202 |
|
|
12894, /* B0 = 0.393524 */
|
9203 |
|
|
31367, /* A1 = 1.91449 */
|
9204 |
|
|
-32379, /* A2 = -0.988129 */
|
9205 |
|
|
23820, /* B2 = 0.726929 */
|
9206 |
|
|
-23104, /* B1 = -1.410217 */
|
9207 |
|
|
23820, /* B0 = 0.726929 */
|
9208 |
|
|
7, /* Internal filter scaling */
|
9209 |
|
|
159, /* Minimum in-band energy threshold */
|
9210 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9211 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9212 |
|
|
},
|
9213 |
|
|
{ /* f350_450[] */
|
9214 |
|
|
30552, /* A1 = 1.864807 */
|
9215 |
|
|
-31434, /* A2 = -0.95929 */
|
9216 |
|
|
-690, /* B2 = -0.021066 */
|
9217 |
|
|
0, /* B1 = 0 */
|
9218 |
|
|
690, /* B0 = 0.021066 */
|
9219 |
|
|
30472, /* A1 = 1.859924 */
|
9220 |
|
|
-32248, /* A2 = -0.984161 */
|
9221 |
|
|
13385, /* B2 = 0.408478 */
|
9222 |
|
|
-12357, /* B1 = -0.754242 */
|
9223 |
|
|
13385, /* B0 = 0.408478 */
|
9224 |
|
|
31358, /* A1 = 1.914001 */
|
9225 |
|
|
-32366, /* A2 = -0.987732 */
|
9226 |
|
|
26488, /* B2 = 0.80835 */
|
9227 |
|
|
-25692, /* B1 = -1.568176 */
|
9228 |
|
|
26490, /* B0 = 0.808411 */
|
9229 |
|
|
7, /* Internal filter scaling */
|
9230 |
|
|
159, /* Minimum in-band energy threshold */
|
9231 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9232 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9233 |
|
|
},
|
9234 |
|
|
{ /* f360 */
|
9235 |
|
|
31397, /* A1 = -1.916321 */
|
9236 |
|
|
-32623, /* A2 = 0.995605 */
|
9237 |
|
|
-117, /* B2 = -0.003598 */
|
9238 |
|
|
0, /* B1 = 0.000000 */
|
9239 |
|
|
117, /* B0 = 0.003598 */
|
9240 |
|
|
31403, /* A1 = -1.916687 */
|
9241 |
|
|
-32700, /* A2 = 0.997925 */
|
9242 |
|
|
3388, /* B2 = 0.103401 */
|
9243 |
|
|
-3240, /* B1 = -0.197784 */
|
9244 |
|
|
3388, /* B0 = 0.103401 */
|
9245 |
|
|
31463, /* A1 = -1.920410 */
|
9246 |
|
|
-32702, /* A2 = 0.997986 */
|
9247 |
|
|
13346, /* B2 = 0.407288 */
|
9248 |
|
|
-12863, /* B1 = -0.785126 */
|
9249 |
|
|
13346, /* B0 = 0.407288 */
|
9250 |
|
|
5, /* Internal filter scaling */
|
9251 |
|
|
159, /* Minimum in-band energy threshold */
|
9252 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9253 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9254 |
|
|
},
|
9255 |
|
|
{ /* f380_420[] */
|
9256 |
|
|
30831, /* A1 = 1.881775 */
|
9257 |
|
|
-32064, /* A2 = -0.978546 */
|
9258 |
|
|
-367, /* B2 = -0.01122 */
|
9259 |
|
|
0, /* B1 = 0 */
|
9260 |
|
|
367, /* B0 = 0.01122 */
|
9261 |
|
|
30813, /* A1 = 1.880737 */
|
9262 |
|
|
-32456, /* A2 = -0.990509 */
|
9263 |
|
|
11068, /* B2 = 0.337769 */
|
9264 |
|
|
-10338, /* B1 = -0.631042 */
|
9265 |
|
|
11068, /* B0 = 0.337769 */
|
9266 |
|
|
31214, /* A1 = 1.905212 */
|
9267 |
|
|
-32491, /* A2 = -0.991577 */
|
9268 |
|
|
16374, /* B2 = 0.499695 */
|
9269 |
|
|
-15781, /* B1 = -0.963196 */
|
9270 |
|
|
16374, /* B0 = 0.499695 */
|
9271 |
|
|
7, /* Internal filter scaling */
|
9272 |
|
|
159, /* Minimum in-band energy threshold */
|
9273 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9274 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9275 |
|
|
},
|
9276 |
|
|
{ /* f392 */
|
9277 |
|
|
31152, /* A1 = -1.901428 */
|
9278 |
|
|
-32613, /* A2 = 0.995300 */
|
9279 |
|
|
-314, /* B2 = -0.009605 */
|
9280 |
|
|
0, /* B1 = 0.000000 */
|
9281 |
|
|
314, /* B0 = 0.009605 */
|
9282 |
|
|
31156, /* A1 = -1.901672 */
|
9283 |
|
|
-32694, /* A2 = 0.997742 */
|
9284 |
|
|
28847, /* B2 = 0.880371 */
|
9285 |
|
|
-2734, /* B1 = -0.166901 */
|
9286 |
|
|
28847, /* B0 = 0.880371 */
|
9287 |
|
|
31225, /* A1 = -1.905823 */
|
9288 |
|
|
-32696, /* A2 = 0.997803 */
|
9289 |
|
|
462, /* B2 = 0.014108 */
|
9290 |
|
|
-442, /* B1 = -0.027019 */
|
9291 |
|
|
462, /* B0 = 0.014108 */
|
9292 |
|
|
5, /* Internal filter scaling */
|
9293 |
|
|
159, /* Minimum in-band energy threshold */
|
9294 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9295 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9296 |
|
|
},
|
9297 |
|
|
{ /* f400_425[] */
|
9298 |
|
|
30836, /* A1 = 1.882141 */
|
9299 |
|
|
-32296, /* A2 = -0.985596 */
|
9300 |
|
|
-324, /* B2 = -0.009903 */
|
9301 |
|
|
0, /* B1 = 0 */
|
9302 |
|
|
324, /* B0 = 0.009903 */
|
9303 |
|
|
30825, /* A1 = 1.881409 */
|
9304 |
|
|
-32570, /* A2 = -0.993958 */
|
9305 |
|
|
16847, /* B2 = 0.51416 */
|
9306 |
|
|
-15792, /* B1 = -0.963898 */
|
9307 |
|
|
16847, /* B0 = 0.51416 */
|
9308 |
|
|
31106, /* A1 = 1.89856 */
|
9309 |
|
|
-32584, /* A2 = -0.994415 */
|
9310 |
|
|
9579, /* B2 = 0.292328 */
|
9311 |
|
|
-9164, /* B1 = -0.559357 */
|
9312 |
|
|
9579, /* B0 = 0.292328 */
|
9313 |
|
|
7, /* Internal filter scaling */
|
9314 |
|
|
159, /* Minimum in-band energy threshold */
|
9315 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9316 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9317 |
|
|
},
|
9318 |
|
|
{ /* f400_440[] */
|
9319 |
|
|
30702, /* A1 = 1.873962 */
|
9320 |
|
|
-32134, /* A2 = -0.980682 */
|
9321 |
|
|
-517, /* B2 = -0.015793 */
|
9322 |
|
|
0, /* B1 = 0 */
|
9323 |
|
|
517, /* B0 = 0.015793 */
|
9324 |
|
|
30676, /* A1 = 1.872375 */
|
9325 |
|
|
-32520, /* A2 = -0.992462 */
|
9326 |
|
|
8144, /* B2 = 0.24855 */
|
9327 |
|
|
-7596, /* B1 = -0.463684 */
|
9328 |
|
|
8144, /* B0 = 0.24855 */
|
9329 |
|
|
31084, /* A1 = 1.897217 */
|
9330 |
|
|
-32547, /* A2 = -0.993256 */
|
9331 |
|
|
22713, /* B2 = 0.693176 */
|
9332 |
|
|
-21734, /* B1 = -1.326599 */
|
9333 |
|
|
22713, /* B0 = 0.693176 */
|
9334 |
|
|
7, /* Internal filter scaling */
|
9335 |
|
|
159, /* Minimum in-band energy threshold */
|
9336 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9337 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9338 |
|
|
},
|
9339 |
|
|
{ /* f400_450[] */
|
9340 |
|
|
30613, /* A1 = 1.86853 */
|
9341 |
|
|
-32031, /* A2 = -0.977509 */
|
9342 |
|
|
-618, /* B2 = -0.018866 */
|
9343 |
|
|
0, /* B1 = 0 */
|
9344 |
|
|
618, /* B0 = 0.018866 */
|
9345 |
|
|
30577, /* A1 = 1.866272 */
|
9346 |
|
|
-32491, /* A2 = -0.991577 */
|
9347 |
|
|
9612, /* B2 = 0.293335 */
|
9348 |
|
|
-8935, /* B1 = -0.54541 */
|
9349 |
|
|
9612, /* B0 = 0.293335 */
|
9350 |
|
|
31071, /* A1 = 1.896484 */
|
9351 |
|
|
-32524, /* A2 = -0.992584 */
|
9352 |
|
|
21596, /* B2 = 0.659058 */
|
9353 |
|
|
-20667, /* B1 = -1.261414 */
|
9354 |
|
|
21596, /* B0 = 0.659058 */
|
9355 |
|
|
7, /* Internal filter scaling */
|
9356 |
|
|
159, /* Minimum in-band energy threshold */
|
9357 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9358 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9359 |
|
|
},
|
9360 |
|
|
{ /* f420 */
|
9361 |
|
|
30914, /* A1 = -1.886841 */
|
9362 |
|
|
-32584, /* A2 = 0.994385 */
|
9363 |
|
|
-426, /* B2 = -0.013020 */
|
9364 |
|
|
0, /* B1 = 0.000000 */
|
9365 |
|
|
426, /* B0 = 0.013020 */
|
9366 |
|
|
30914, /* A1 = -1.886841 */
|
9367 |
|
|
-32679, /* A2 = 0.997314 */
|
9368 |
|
|
17520, /* B2 = 0.534668 */
|
9369 |
|
|
-16471, /* B1 = -1.005310 */
|
9370 |
|
|
17520, /* B0 = 0.534668 */
|
9371 |
|
|
31004, /* A1 = -1.892334 */
|
9372 |
|
|
-32683, /* A2 = 0.997406 */
|
9373 |
|
|
819, /* B2 = 0.025023 */
|
9374 |
|
|
-780, /* B1 = -0.047619 */
|
9375 |
|
|
819, /* B0 = 0.025023 */
|
9376 |
|
|
5, /* Internal filter scaling */
|
9377 |
|
|
159, /* Minimum in-band energy threshold */
|
9378 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9379 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9380 |
|
|
},
|
9381 |
|
|
#if 0
|
9382 |
|
|
{ /* f425 */
|
9383 |
|
|
30881, /* A1 = -1.884827 */
|
9384 |
|
|
-32603, /* A2 = 0.994965 */
|
9385 |
|
|
-496, /* B2 = -0.015144 */
|
9386 |
|
|
0, /* B1 = 0.000000 */
|
9387 |
|
|
496, /* B0 = 0.015144 */
|
9388 |
|
|
30880, /* A1 = -1.884766 */
|
9389 |
|
|
-32692, /* A2 = 0.997711 */
|
9390 |
|
|
24767, /* B2 = 0.755859 */
|
9391 |
|
|
-23290, /* B1 = -1.421509 */
|
9392 |
|
|
24767, /* B0 = 0.755859 */
|
9393 |
|
|
30967, /* A1 = -1.890076 */
|
9394 |
|
|
-32694, /* A2 = 0.997772 */
|
9395 |
|
|
728, /* B2 = 0.022232 */
|
9396 |
|
|
-691, /* B1 = -0.042194 */
|
9397 |
|
|
728, /* B0 = 0.022232 */
|
9398 |
|
|
5, /* Internal filter scaling */
|
9399 |
|
|
159, /* Minimum in-band energy threshold */
|
9400 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9401 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9402 |
|
|
},
|
9403 |
|
|
#else
|
9404 |
|
|
{
|
9405 |
|
|
30850,
|
9406 |
|
|
-32534,
|
9407 |
|
|
-504,
|
9408 |
|
|
0,
|
9409 |
|
|
504,
|
9410 |
|
|
30831,
|
9411 |
|
|
-32669,
|
9412 |
|
|
24303,
|
9413 |
|
|
-22080,
|
9414 |
|
|
24303,
|
9415 |
|
|
30994,
|
9416 |
|
|
-32673,
|
9417 |
|
|
1905,
|
9418 |
|
|
-1811,
|
9419 |
|
|
1905,
|
9420 |
|
|
5,
|
9421 |
|
|
129,
|
9422 |
|
|
17,
|
9423 |
|
|
0xff5
|
9424 |
|
|
},
|
9425 |
|
|
#endif
|
9426 |
|
|
{ /* f425_450[] */
|
9427 |
|
|
30646, /* A1 = 1.870544 */
|
9428 |
|
|
-32327, /* A2 = -0.986572 */
|
9429 |
|
|
-287, /* B2 = -0.008769 */
|
9430 |
|
|
0, /* B1 = 0 */
|
9431 |
|
|
287, /* B0 = 0.008769 */
|
9432 |
|
|
30627, /* A1 = 1.869324 */
|
9433 |
|
|
-32607, /* A2 = -0.995087 */
|
9434 |
|
|
13269, /* B2 = 0.404968 */
|
9435 |
|
|
-12376, /* B1 = -0.755432 */
|
9436 |
|
|
13269, /* B0 = 0.404968 */
|
9437 |
|
|
30924, /* A1 = 1.887512 */
|
9438 |
|
|
-32619, /* A2 = -0.995453 */
|
9439 |
|
|
19950, /* B2 = 0.608826 */
|
9440 |
|
|
-18940, /* B1 = -1.156006 */
|
9441 |
|
|
19950, /* B0 = 0.608826 */
|
9442 |
|
|
7, /* Internal filter scaling */
|
9443 |
|
|
159, /* Minimum in-band energy threshold */
|
9444 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9445 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9446 |
|
|
},
|
9447 |
|
|
{ /* f425_475[] */
|
9448 |
|
|
30396, /* A1 = 1.855225 */
|
9449 |
|
|
-32014, /* A2 = -0.97699 */
|
9450 |
|
|
-395, /* B2 = -0.012055 */
|
9451 |
|
|
0, /* B1 = 0 */
|
9452 |
|
|
395, /* B0 = 0.012055 */
|
9453 |
|
|
30343, /* A1 = 1.85199 */
|
9454 |
|
|
-32482, /* A2 = -0.991302 */
|
9455 |
|
|
17823, /* B2 = 0.543945 */
|
9456 |
|
|
-16431, /* B1 = -1.002869 */
|
9457 |
|
|
17823, /* B0 = 0.543945 */
|
9458 |
|
|
30872, /* A1 = 1.884338 */
|
9459 |
|
|
-32516, /* A2 = -0.99231 */
|
9460 |
|
|
18124, /* B2 = 0.553101 */
|
9461 |
|
|
-17246, /* B1 = -1.052673 */
|
9462 |
|
|
18124, /* B0 = 0.553101 */
|
9463 |
|
|
7, /* Internal filter scaling */
|
9464 |
|
|
159, /* Minimum in-band energy threshold */
|
9465 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9466 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9467 |
|
|
},
|
9468 |
|
|
{ /* f435 */
|
9469 |
|
|
30796, /* A1 = -1.879639 */
|
9470 |
|
|
-32603, /* A2 = 0.994965 */
|
9471 |
|
|
-254, /* B2 = -0.007762 */
|
9472 |
|
|
0, /* B1 = 0.000000 */
|
9473 |
|
|
254, /* B0 = 0.007762 */
|
9474 |
|
|
30793, /* A1 = -1.879456 */
|
9475 |
|
|
-32692, /* A2 = 0.997711 */
|
9476 |
|
|
18934, /* B2 = 0.577820 */
|
9477 |
|
|
-17751, /* B1 = -1.083496 */
|
9478 |
|
|
18934, /* B0 = 0.577820 */
|
9479 |
|
|
30882, /* A1 = -1.884888 */
|
9480 |
|
|
-32694, /* A2 = 0.997772 */
|
9481 |
|
|
1858, /* B2 = 0.056713 */
|
9482 |
|
|
-1758, /* B1 = -0.107357 */
|
9483 |
|
|
1858, /* B0 = 0.056713 */
|
9484 |
|
|
5, /* Internal filter scaling */
|
9485 |
|
|
159, /* Minimum in-band energy threshold */
|
9486 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9487 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9488 |
|
|
},
|
9489 |
|
|
{ /* f440_450[] */
|
9490 |
|
|
30641, /* A1 = 1.870239 */
|
9491 |
|
|
-32458, /* A2 = -0.99057 */
|
9492 |
|
|
-155, /* B2 = -0.004735 */
|
9493 |
|
|
0, /* B1 = 0 */
|
9494 |
|
|
155, /* B0 = 0.004735 */
|
9495 |
|
|
30631, /* A1 = 1.869568 */
|
9496 |
|
|
-32630, /* A2 = -0.995789 */
|
9497 |
|
|
11453, /* B2 = 0.349548 */
|
9498 |
|
|
-10666, /* B1 = -0.651001 */
|
9499 |
|
|
11453, /* B0 = 0.349548 */
|
9500 |
|
|
30810, /* A1 = 1.880554 */
|
9501 |
|
|
-32634, /* A2 = -0.995941 */
|
9502 |
|
|
12237, /* B2 = 0.373474 */
|
9503 |
|
|
-11588, /* B1 = -0.707336 */
|
9504 |
|
|
12237, /* B0 = 0.373474 */
|
9505 |
|
|
7, /* Internal filter scaling */
|
9506 |
|
|
159, /* Minimum in-band energy threshold */
|
9507 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9508 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9509 |
|
|
},
|
9510 |
|
|
{ /* f440_480[] */
|
9511 |
|
|
30367, /* A1 = 1.853455 */
|
9512 |
|
|
-32147, /* A2 = -0.981079 */
|
9513 |
|
|
-495, /* B2 = -0.015113 */
|
9514 |
|
|
0, /* B1 = 0 */
|
9515 |
|
|
495, /* B0 = 0.015113 */
|
9516 |
|
|
30322, /* A1 = 1.850769 */
|
9517 |
|
|
-32543, /* A2 = -0.993134 */
|
9518 |
|
|
10031, /* B2 = 0.306152 */
|
9519 |
|
|
-9252, /* B1 = -0.564728 */
|
9520 |
|
|
10031, /* B0 = 0.306152 */
|
9521 |
|
|
30770, /* A1 = 1.878052 */
|
9522 |
|
|
-32563, /* A2 = -0.993774 */
|
9523 |
|
|
22674, /* B2 = 0.691956 */
|
9524 |
|
|
-21465, /* B1 = -1.31012 */
|
9525 |
|
|
22674, /* B0 = 0.691956 */
|
9526 |
|
|
7, /* Internal filter scaling */
|
9527 |
|
|
159, /* Minimum in-band energy threshold */
|
9528 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9529 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9530 |
|
|
},
|
9531 |
|
|
{ /* f445 */
|
9532 |
|
|
30709, /* A1 = -1.874329 */
|
9533 |
|
|
-32603, /* A2 = 0.994965 */
|
9534 |
|
|
-83, /* B2 = -0.002545 */
|
9535 |
|
|
0, /* B1 = 0.000000 */
|
9536 |
|
|
83, /* B0 = 0.002545 */
|
9537 |
|
|
30704, /* A1 = -1.874084 */
|
9538 |
|
|
-32692, /* A2 = 0.997711 */
|
9539 |
|
|
10641, /* B2 = 0.324738 */
|
9540 |
|
|
-9947, /* B1 = -0.607147 */
|
9541 |
|
|
10641, /* B0 = 0.324738 */
|
9542 |
|
|
30796, /* A1 = -1.879639 */
|
9543 |
|
|
-32694, /* A2 = 0.997772 */
|
9544 |
|
|
10079, /* B2 = 0.307587 */
|
9545 |
|
|
9513, /* B1 = 0.580688 */
|
9546 |
|
|
10079, /* B0 = 0.307587 */
|
9547 |
|
|
5, /* Internal filter scaling */
|
9548 |
|
|
159, /* Minimum in-band energy threshold */
|
9549 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9550 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9551 |
|
|
},
|
9552 |
|
|
{ /* f450 */
|
9553 |
|
|
30664, /* A1 = -1.871643 */
|
9554 |
|
|
-32603, /* A2 = 0.994965 */
|
9555 |
|
|
-164, /* B2 = -0.005029 */
|
9556 |
|
|
0, /* B1 = 0.000000 */
|
9557 |
|
|
164, /* B0 = 0.005029 */
|
9558 |
|
|
30661, /* A1 = -1.871399 */
|
9559 |
|
|
-32692, /* A2 = 0.997711 */
|
9560 |
|
|
15294, /* B2 = 0.466736 */
|
9561 |
|
|
-14275, /* B1 = -0.871307 */
|
9562 |
|
|
15294, /* B0 = 0.466736 */
|
9563 |
|
|
30751, /* A1 = -1.876953 */
|
9564 |
|
|
-32694, /* A2 = 0.997772 */
|
9565 |
|
|
3548, /* B2 = 0.108284 */
|
9566 |
|
|
-3344, /* B1 = -0.204155 */
|
9567 |
|
|
3548, /* B0 = 0.108284 */
|
9568 |
|
|
5, /* Internal filter scaling */
|
9569 |
|
|
159, /* Minimum in-band energy threshold */
|
9570 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9571 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9572 |
|
|
},
|
9573 |
|
|
{ /* f452 */
|
9574 |
|
|
30653, /* A1 = -1.870911 */
|
9575 |
|
|
-32615, /* A2 = 0.995361 */
|
9576 |
|
|
-209, /* B2 = -0.006382 */
|
9577 |
|
|
0, /* B1 = 0.000000 */
|
9578 |
|
|
209, /* B0 = 0.006382 */
|
9579 |
|
|
30647, /* A1 = -1.870605 */
|
9580 |
|
|
-32702, /* A2 = 0.997986 */
|
9581 |
|
|
18971, /* B2 = 0.578979 */
|
9582 |
|
|
-17716, /* B1 = -1.081299 */
|
9583 |
|
|
18971, /* B0 = 0.578979 */
|
9584 |
|
|
30738, /* A1 = -1.876099 */
|
9585 |
|
|
-32702, /* A2 = 0.998016 */
|
9586 |
|
|
2967, /* B2 = 0.090561 */
|
9587 |
|
|
-2793, /* B1 = -0.170502 */
|
9588 |
|
|
2967, /* B0 = 0.090561 */
|
9589 |
|
|
5, /* Internal filter scaling */
|
9590 |
|
|
159, /* Minimum in-band energy threshold */
|
9591 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9592 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9593 |
|
|
},
|
9594 |
|
|
{ /* f475 */
|
9595 |
|
|
30437, /* A1 = -1.857727 */
|
9596 |
|
|
-32603, /* A2 = 0.994965 */
|
9597 |
|
|
-264, /* B2 = -0.008062 */
|
9598 |
|
|
0, /* B1 = 0.000000 */
|
9599 |
|
|
264, /* B0 = 0.008062 */
|
9600 |
|
|
30430, /* A1 = -1.857300 */
|
9601 |
|
|
-32692, /* A2 = 0.997711 */
|
9602 |
|
|
21681, /* B2 = 0.661682 */
|
9603 |
|
|
-20082, /* B1 = -1.225708 */
|
9604 |
|
|
21681, /* B0 = 0.661682 */
|
9605 |
|
|
30526, /* A1 = -1.863220 */
|
9606 |
|
|
-32694, /* A2 = 0.997742 */
|
9607 |
|
|
1559, /* B2 = 0.047600 */
|
9608 |
|
|
-1459, /* B1 = -0.089096 */
|
9609 |
|
|
1559, /* B0 = 0.047600 */
|
9610 |
|
|
5, /* Internal filter scaling */
|
9611 |
|
|
159, /* Minimum in-band energy threshold */
|
9612 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9613 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9614 |
|
|
},
|
9615 |
|
|
{ /* f480_620[] */
|
9616 |
|
|
28975, /* A1 = 1.768494 */
|
9617 |
|
|
-30955, /* A2 = -0.944672 */
|
9618 |
|
|
-1026, /* B2 = -0.03133 */
|
9619 |
|
|
0, /* B1 = 0 */
|
9620 |
|
|
1026, /* B0 = 0.03133 */
|
9621 |
|
|
28613, /* A1 = 1.746399 */
|
9622 |
|
|
-32089, /* A2 = -0.979309 */
|
9623 |
|
|
14214, /* B2 = 0.433807 */
|
9624 |
|
|
-12202, /* B1 = -0.744812 */
|
9625 |
|
|
14214, /* B0 = 0.433807 */
|
9626 |
|
|
30243, /* A1 = 1.845947 */
|
9627 |
|
|
-32238, /* A2 = -0.983856 */
|
9628 |
|
|
24825, /* B2 = 0.757629 */
|
9629 |
|
|
-23402, /* B1 = -1.428345 */
|
9630 |
|
|
24825, /* B0 = 0.757629 */
|
9631 |
|
|
7, /* Internal filter scaling */
|
9632 |
|
|
159, /* Minimum in-band energy threshold */
|
9633 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9634 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9635 |
|
|
},
|
9636 |
|
|
{ /* f494 */
|
9637 |
|
|
30257, /* A1 = -1.846741 */
|
9638 |
|
|
-32605, /* A2 = 0.995056 */
|
9639 |
|
|
-249, /* B2 = -0.007625 */
|
9640 |
|
|
0, /* B1 = 0.000000 */
|
9641 |
|
|
249, /* B0 = 0.007625 */
|
9642 |
|
|
30247, /* A1 = -1.846191 */
|
9643 |
|
|
-32694, /* A2 = 0.997772 */
|
9644 |
|
|
18088, /* B2 = 0.552002 */
|
9645 |
|
|
-16652, /* B1 = -1.016418 */
|
9646 |
|
|
18088, /* B0 = 0.552002 */
|
9647 |
|
|
30348, /* A1 = -1.852295 */
|
9648 |
|
|
-32696, /* A2 = 0.997803 */
|
9649 |
|
|
2099, /* B2 = 0.064064 */
|
9650 |
|
|
-1953, /* B1 = -0.119202 */
|
9651 |
|
|
2099, /* B0 = 0.064064 */
|
9652 |
|
|
5, /* Internal filter scaling */
|
9653 |
|
|
159, /* Minimum in-band energy threshold */
|
9654 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9655 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9656 |
|
|
},
|
9657 |
|
|
{ /* f500 */
|
9658 |
|
|
30202, /* A1 = -1.843431 */
|
9659 |
|
|
-32624, /* A2 = 0.995622 */
|
9660 |
|
|
-413, /* B2 = -0.012622 */
|
9661 |
|
|
0, /* B1 = 0.000000 */
|
9662 |
|
|
413, /* B0 = 0.012622 */
|
9663 |
|
|
30191, /* A1 = -1.842721 */
|
9664 |
|
|
-32714, /* A2 = 0.998364 */
|
9665 |
|
|
25954, /* B2 = 0.792057 */
|
9666 |
|
|
-23890, /* B1 = -1.458131 */
|
9667 |
|
|
25954, /* B0 = 0.792057 */
|
9668 |
|
|
30296, /* A1 = -1.849172 */
|
9669 |
|
|
-32715, /* A2 = 0.998397 */
|
9670 |
|
|
2007, /* B2 = 0.061264 */
|
9671 |
|
|
-1860, /* B1 = -0.113568 */
|
9672 |
|
|
2007, /* B0 = 0.061264 */
|
9673 |
|
|
5, /* Internal filter scaling */
|
9674 |
|
|
159, /* Minimum in-band energy threshold */
|
9675 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9676 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9677 |
|
|
},
|
9678 |
|
|
{ /* f520 */
|
9679 |
|
|
30001, /* A1 = -1.831116 */
|
9680 |
|
|
-32613, /* A2 = 0.995270 */
|
9681 |
|
|
-155, /* B2 = -0.004750 */
|
9682 |
|
|
0, /* B1 = 0.000000 */
|
9683 |
|
|
155, /* B0 = 0.004750 */
|
9684 |
|
|
29985, /* A1 = -1.830200 */
|
9685 |
|
|
-32710, /* A2 = 0.998260 */
|
9686 |
|
|
6584, /* B2 = 0.200928 */
|
9687 |
|
|
-6018, /* B1 = -0.367355 */
|
9688 |
|
|
6584, /* B0 = 0.200928 */
|
9689 |
|
|
30105, /* A1 = -1.837524 */
|
9690 |
|
|
-32712, /* A2 = 0.998291 */
|
9691 |
|
|
23812, /* B2 = 0.726685 */
|
9692 |
|
|
-21936, /* B1 = -1.338928 */
|
9693 |
|
|
23812, /* B0 = 0.726685 */
|
9694 |
|
|
5, /* Internal filter scaling */
|
9695 |
|
|
159, /* Minimum in-band energy threshold */
|
9696 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9697 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9698 |
|
|
},
|
9699 |
|
|
{ /* f523 */
|
9700 |
|
|
29964, /* A1 = -1.828918 */
|
9701 |
|
|
-32601, /* A2 = 0.994904 */
|
9702 |
|
|
-101, /* B2 = -0.003110 */
|
9703 |
|
|
0, /* B1 = 0.000000 */
|
9704 |
|
|
101, /* B0 = 0.003110 */
|
9705 |
|
|
29949, /* A1 = -1.827942 */
|
9706 |
|
|
-32700, /* A2 = 0.997925 */
|
9707 |
|
|
11041, /* B2 = 0.336975 */
|
9708 |
|
|
-10075, /* B1 = -0.614960 */
|
9709 |
|
|
11041, /* B0 = 0.336975 */
|
9710 |
|
|
30070, /* A1 = -1.835388 */
|
9711 |
|
|
-32702, /* A2 = 0.997986 */
|
9712 |
|
|
16762, /* B2 = 0.511536 */
|
9713 |
|
|
-15437, /* B1 = -0.942230 */
|
9714 |
|
|
16762, /* B0 = 0.511536 */
|
9715 |
|
|
5, /* Internal filter scaling */
|
9716 |
|
|
159, /* Minimum in-band energy threshold */
|
9717 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9718 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9719 |
|
|
},
|
9720 |
|
|
{ /* f525 */
|
9721 |
|
|
29936, /* A1 = -1.827209 */
|
9722 |
|
|
-32584, /* A2 = 0.994415 */
|
9723 |
|
|
-91, /* B2 = -0.002806 */
|
9724 |
|
|
0, /* B1 = 0.000000 */
|
9725 |
|
|
91, /* B0 = 0.002806 */
|
9726 |
|
|
29921, /* A1 = -1.826233 */
|
9727 |
|
|
-32688, /* A2 = 0.997559 */
|
9728 |
|
|
11449, /* B2 = 0.349396 */
|
9729 |
|
|
-10426, /* B1 = -0.636383 */
|
9730 |
|
|
11449, /* B0 = 0.349396 */
|
9731 |
|
|
30045, /* A1 = -1.833862 */
|
9732 |
|
|
-32688, /* A2 = 0.997589 */
|
9733 |
|
|
13055, /* B2 = 0.398407 */
|
9734 |
|
|
-12028, /* B1 = -0.734161 */
|
9735 |
|
|
13055, /* B0 = 0.398407 */
|
9736 |
|
|
5, /* Internal filter scaling */
|
9737 |
|
|
159, /* Minimum in-band energy threshold */
|
9738 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9739 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9740 |
|
|
},
|
9741 |
|
|
{ /* f540_660[] */
|
9742 |
|
|
28499, /* A1 = 1.739441 */
|
9743 |
|
|
-31129, /* A2 = -0.949982 */
|
9744 |
|
|
-849, /* B2 = -0.025922 */
|
9745 |
|
|
0, /* B1 = 0 */
|
9746 |
|
|
849, /* B0 = 0.025922 */
|
9747 |
|
|
28128, /* A1 = 1.716797 */
|
9748 |
|
|
-32130, /* A2 = -0.98056 */
|
9749 |
|
|
14556, /* B2 = 0.444214 */
|
9750 |
|
|
-12251, /* B1 = -0.747772 */
|
9751 |
|
|
14556, /* B0 = 0.444244 */
|
9752 |
|
|
29667, /* A1 = 1.81073 */
|
9753 |
|
|
-32244, /* A2 = -0.984039 */
|
9754 |
|
|
23038, /* B2 = 0.703064 */
|
9755 |
|
|
-21358, /* B1 = -1.303589 */
|
9756 |
|
|
23040, /* B0 = 0.703125 */
|
9757 |
|
|
7, /* Internal filter scaling */
|
9758 |
|
|
159, /* Minimum in-band energy threshold */
|
9759 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9760 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9761 |
|
|
},
|
9762 |
|
|
{ /* f587 */
|
9763 |
|
|
29271, /* A1 = -1.786560 */
|
9764 |
|
|
-32599, /* A2 = 0.994873 */
|
9765 |
|
|
-490, /* B2 = -0.014957 */
|
9766 |
|
|
0, /* B1 = 0.000000 */
|
9767 |
|
|
490, /* B0 = 0.014957 */
|
9768 |
|
|
29246, /* A1 = -1.785095 */
|
9769 |
|
|
-32700, /* A2 = 0.997925 */
|
9770 |
|
|
28961, /* B2 = 0.883850 */
|
9771 |
|
|
-25796, /* B1 = -1.574463 */
|
9772 |
|
|
28961, /* B0 = 0.883850 */
|
9773 |
|
|
29383, /* A1 = -1.793396 */
|
9774 |
|
|
-32700, /* A2 = 0.997955 */
|
9775 |
|
|
1299, /* B2 = 0.039650 */
|
9776 |
|
|
-1169, /* B1 = -0.071396 */
|
9777 |
|
|
1299, /* B0 = 0.039650 */
|
9778 |
|
|
5, /* Internal filter scaling */
|
9779 |
|
|
159, /* Minimum in-band energy threshold */
|
9780 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9781 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9782 |
|
|
},
|
9783 |
|
|
{ /* f590 */
|
9784 |
|
|
29230, /* A1 = -1.784058 */
|
9785 |
|
|
-32584, /* A2 = 0.994415 */
|
9786 |
|
|
-418, /* B2 = -0.012757 */
|
9787 |
|
|
0, /* B1 = 0.000000 */
|
9788 |
|
|
418, /* B0 = 0.012757 */
|
9789 |
|
|
29206, /* A1 = -1.782593 */
|
9790 |
|
|
-32688, /* A2 = 0.997559 */
|
9791 |
|
|
36556, /* B2 = 1.115601 */
|
9792 |
|
|
-32478, /* B1 = -1.982300 */
|
9793 |
|
|
36556, /* B0 = 1.115601 */
|
9794 |
|
|
29345, /* A1 = -1.791077 */
|
9795 |
|
|
-32688, /* A2 = 0.997589 */
|
9796 |
|
|
897, /* B2 = 0.027397 */
|
9797 |
|
|
-808, /* B1 = -0.049334 */
|
9798 |
|
|
897, /* B0 = 0.027397 */
|
9799 |
|
|
5, /* Internal filter scaling */
|
9800 |
|
|
159, /* Minimum in-band energy threshold */
|
9801 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9802 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9803 |
|
|
},
|
9804 |
|
|
{ /* f600 */
|
9805 |
|
|
29116, /* A1 = -1.777100 */
|
9806 |
|
|
-32603, /* A2 = 0.994965 */
|
9807 |
|
|
-165, /* B2 = -0.005039 */
|
9808 |
|
|
0, /* B1 = 0.000000 */
|
9809 |
|
|
165, /* B0 = 0.005039 */
|
9810 |
|
|
29089, /* A1 = -1.775452 */
|
9811 |
|
|
-32708, /* A2 = 0.998199 */
|
9812 |
|
|
6963, /* B2 = 0.212494 */
|
9813 |
|
|
-6172, /* B1 = -0.376770 */
|
9814 |
|
|
6963, /* B0 = 0.212494 */
|
9815 |
|
|
29237, /* A1 = -1.784485 */
|
9816 |
|
|
-32710, /* A2 = 0.998230 */
|
9817 |
|
|
24197, /* B2 = 0.738464 */
|
9818 |
|
|
-21657, /* B1 = -1.321899 */
|
9819 |
|
|
24197, /* B0 = 0.738464 */
|
9820 |
|
|
5, /* Internal filter scaling */
|
9821 |
|
|
159, /* Minimum in-band energy threshold */
|
9822 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9823 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9824 |
|
|
},
|
9825 |
|
|
{ /* f660 */
|
9826 |
|
|
28376, /* A1 = -1.731934 */
|
9827 |
|
|
-32567, /* A2 = 0.993896 */
|
9828 |
|
|
-363, /* B2 = -0.011102 */
|
9829 |
|
|
0, /* B1 = 0.000000 */
|
9830 |
|
|
363, /* B0 = 0.011102 */
|
9831 |
|
|
28337, /* A1 = -1.729614 */
|
9832 |
|
|
-32683, /* A2 = 0.997434 */
|
9833 |
|
|
21766, /* B2 = 0.664246 */
|
9834 |
|
|
-18761, /* B1 = -1.145081 */
|
9835 |
|
|
21766, /* B0 = 0.664246 */
|
9836 |
|
|
28513, /* A1 = -1.740356 */
|
9837 |
|
|
-32686, /* A2 = 0.997498 */
|
9838 |
|
|
2509, /* B2 = 0.076584 */
|
9839 |
|
|
-2196, /* B1 = -0.134041 */
|
9840 |
|
|
2509, /* B0 = 0.076584 */
|
9841 |
|
|
5, /* Internal filter scaling */
|
9842 |
|
|
159, /* Minimum in-band energy threshold */
|
9843 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9844 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9845 |
|
|
},
|
9846 |
|
|
{ /* f700 */
|
9847 |
|
|
27844, /* A1 = -1.699463 */
|
9848 |
|
|
-32563, /* A2 = 0.993744 */
|
9849 |
|
|
-366, /* B2 = -0.011187 */
|
9850 |
|
|
0, /* B1 = 0.000000 */
|
9851 |
|
|
366, /* B0 = 0.011187 */
|
9852 |
|
|
27797, /* A1 = -1.696655 */
|
9853 |
|
|
-32686, /* A2 = 0.997498 */
|
9854 |
|
|
22748, /* B2 = 0.694214 */
|
9855 |
|
|
-19235, /* B1 = -1.174072 */
|
9856 |
|
|
22748, /* B0 = 0.694214 */
|
9857 |
|
|
27995, /* A1 = -1.708740 */
|
9858 |
|
|
-32688, /* A2 = 0.997559 */
|
9859 |
|
|
2964, /* B2 = 0.090477 */
|
9860 |
|
|
-2546, /* B1 = -0.155449 */
|
9861 |
|
|
2964, /* B0 = 0.090477 */
|
9862 |
|
|
5, /* Internal filter scaling */
|
9863 |
|
|
159, /* Minimum in-band energy threshold */
|
9864 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9865 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9866 |
|
|
},
|
9867 |
|
|
{ /* f740 */
|
9868 |
|
|
27297, /* A1 = -1.666077 */
|
9869 |
|
|
-32551, /* A2 = 0.993408 */
|
9870 |
|
|
-345, /* B2 = -0.010540 */
|
9871 |
|
|
0, /* B1 = 0.000000 */
|
9872 |
|
|
345, /* B0 = 0.010540 */
|
9873 |
|
|
27240, /* A1 = -1.662598 */
|
9874 |
|
|
-32683, /* A2 = 0.997406 */
|
9875 |
|
|
22560, /* B2 = 0.688477 */
|
9876 |
|
|
-18688, /* B1 = -1.140625 */
|
9877 |
|
|
22560, /* B0 = 0.688477 */
|
9878 |
|
|
27461, /* A1 = -1.676147 */
|
9879 |
|
|
-32684, /* A2 = 0.997467 */
|
9880 |
|
|
3541, /* B2 = 0.108086 */
|
9881 |
|
|
-2985, /* B1 = -0.182220 */
|
9882 |
|
|
3541, /* B0 = 0.108086 */
|
9883 |
|
|
5, /* Internal filter scaling */
|
9884 |
|
|
159, /* Minimum in-band energy threshold */
|
9885 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9886 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9887 |
|
|
},
|
9888 |
|
|
{ /* f750 */
|
9889 |
|
|
27155, /* A1 = -1.657410 */
|
9890 |
|
|
-32551, /* A2 = 0.993408 */
|
9891 |
|
|
-462, /* B2 = -0.014117 */
|
9892 |
|
|
0, /* B1 = 0.000000 */
|
9893 |
|
|
462, /* B0 = 0.014117 */
|
9894 |
|
|
27097, /* A1 = -1.653870 */
|
9895 |
|
|
-32683, /* A2 = 0.997406 */
|
9896 |
|
|
32495, /* B2 = 0.991699 */
|
9897 |
|
|
-26776, /* B1 = -1.634338 */
|
9898 |
|
|
32495, /* B0 = 0.991699 */
|
9899 |
|
|
27321, /* A1 = -1.667542 */
|
9900 |
|
|
-32684, /* A2 = 0.997467 */
|
9901 |
|
|
1835, /* B2 = 0.056007 */
|
9902 |
|
|
-1539, /* B1 = -0.093948 */
|
9903 |
|
|
1835, /* B0 = 0.056007 */
|
9904 |
|
|
5, /* Internal filter scaling */
|
9905 |
|
|
159, /* Minimum in-band energy threshold */
|
9906 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9907 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9908 |
|
|
},
|
9909 |
|
|
{ /* f750_1450[] */
|
9910 |
|
|
19298, /* A1 = 1.177917 */
|
9911 |
|
|
-24471, /* A2 = -0.746796 */
|
9912 |
|
|
-4152, /* B2 = -0.126709 */
|
9913 |
|
|
0, /* B1 = 0 */
|
9914 |
|
|
4152, /* B0 = 0.126709 */
|
9915 |
|
|
12902, /* A1 = 0.787476 */
|
9916 |
|
|
-29091, /* A2 = -0.887817 */
|
9917 |
|
|
12491, /* B2 = 0.38121 */
|
9918 |
|
|
-1794, /* B1 = -0.109528 */
|
9919 |
|
|
12494, /* B0 = 0.381317 */
|
9920 |
|
|
26291, /* A1 = 1.604736 */
|
9921 |
|
|
-30470, /* A2 = -0.929901 */
|
9922 |
|
|
28859, /* B2 = 0.880737 */
|
9923 |
|
|
-26084, /* B1 = -1.592102 */
|
9924 |
|
|
28861, /* B0 = 0.880798 */
|
9925 |
|
|
7, /* Internal filter scaling */
|
9926 |
|
|
159, /* Minimum in-band energy threshold */
|
9927 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9928 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9929 |
|
|
},
|
9930 |
|
|
{ /* f770 */
|
9931 |
|
|
26867, /* A1 = -1.639832 */
|
9932 |
|
|
-32551, /* A2 = 0.993408 */
|
9933 |
|
|
-123, /* B2 = -0.003755 */
|
9934 |
|
|
0, /* B1 = 0.000000 */
|
9935 |
|
|
123, /* B0 = 0.003755 */
|
9936 |
|
|
26805, /* A1 = -1.636108 */
|
9937 |
|
|
-32683, /* A2 = 0.997406 */
|
9938 |
|
|
17297, /* B2 = 0.527863 */
|
9939 |
|
|
-14096, /* B1 = -0.860382 */
|
9940 |
|
|
17297, /* B0 = 0.527863 */
|
9941 |
|
|
27034, /* A1 = -1.650085 */
|
9942 |
|
|
-32684, /* A2 = 0.997467 */
|
9943 |
|
|
12958, /* B2 = 0.395477 */
|
9944 |
|
|
-10756, /* B1 = -0.656525 */
|
9945 |
|
|
12958, /* B0 = 0.395477 */
|
9946 |
|
|
5, /* Internal filter scaling */
|
9947 |
|
|
159, /* Minimum in-band energy threshold */
|
9948 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9949 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9950 |
|
|
},
|
9951 |
|
|
{ /* f800 */
|
9952 |
|
|
26413, /* A1 = -1.612122 */
|
9953 |
|
|
-32547, /* A2 = 0.993286 */
|
9954 |
|
|
-223, /* B2 = -0.006825 */
|
9955 |
|
|
0, /* B1 = 0.000000 */
|
9956 |
|
|
223, /* B0 = 0.006825 */
|
9957 |
|
|
26342, /* A1 = -1.607849 */
|
9958 |
|
|
-32686, /* A2 = 0.997498 */
|
9959 |
|
|
6391, /* B2 = 0.195053 */
|
9960 |
|
|
-5120, /* B1 = -0.312531 */
|
9961 |
|
|
6391, /* B0 = 0.195053 */
|
9962 |
|
|
26593, /* A1 = -1.623108 */
|
9963 |
|
|
-32688, /* A2 = 0.997559 */
|
9964 |
|
|
23681, /* B2 = 0.722717 */
|
9965 |
|
|
-19328, /* B1 = -1.179688 */
|
9966 |
|
|
23681, /* B0 = 0.722717 */
|
9967 |
|
|
5, /* Internal filter scaling */
|
9968 |
|
|
159, /* Minimum in-band energy threshold */
|
9969 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9970 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9971 |
|
|
},
|
9972 |
|
|
{ /* f816 */
|
9973 |
|
|
26168, /* A1 = -1.597209 */
|
9974 |
|
|
-32528, /* A2 = 0.992706 */
|
9975 |
|
|
-235, /* B2 = -0.007182 */
|
9976 |
|
|
0, /* B1 = 0.000000 */
|
9977 |
|
|
235, /* B0 = 0.007182 */
|
9978 |
|
|
26092, /* A1 = -1.592590 */
|
9979 |
|
|
-32675, /* A2 = 0.997192 */
|
9980 |
|
|
20823, /* B2 = 0.635498 */
|
9981 |
|
|
-16510, /* B1 = -1.007751 */
|
9982 |
|
|
20823, /* B0 = 0.635498 */
|
9983 |
|
|
26363, /* A1 = -1.609070 */
|
9984 |
|
|
-32677, /* A2 = 0.997253 */
|
9985 |
|
|
6739, /* B2 = 0.205688 */
|
9986 |
|
|
-5459, /* B1 = -0.333206 */
|
9987 |
|
|
6739, /* B0 = 0.205688 */
|
9988 |
|
|
5, /* Internal filter scaling */
|
9989 |
|
|
159, /* Minimum in-band energy threshold */
|
9990 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
9991 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
9992 |
|
|
},
|
9993 |
|
|
{ /* f850 */
|
9994 |
|
|
25641, /* A1 = -1.565063 */
|
9995 |
|
|
-32536, /* A2 = 0.992950 */
|
9996 |
|
|
-121, /* B2 = -0.003707 */
|
9997 |
|
|
0, /* B1 = 0.000000 */
|
9998 |
|
|
121, /* B0 = 0.003707 */
|
9999 |
|
|
25560, /* A1 = -1.560059 */
|
10000 |
|
|
-32684, /* A2 = 0.997437 */
|
10001 |
|
|
18341, /* B2 = 0.559753 */
|
10002 |
|
|
-14252, /* B1 = -0.869904 */
|
10003 |
|
|
18341, /* B0 = 0.559753 */
|
10004 |
|
|
25837, /* A1 = -1.577026 */
|
10005 |
|
|
-32684, /* A2 = 0.997467 */
|
10006 |
|
|
16679, /* B2 = 0.509003 */
|
10007 |
|
|
-13232, /* B1 = -0.807648 */
|
10008 |
|
|
16679, /* B0 = 0.509003 */
|
10009 |
|
|
5, /* Internal filter scaling */
|
10010 |
|
|
159, /* Minimum in-band energy threshold */
|
10011 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10012 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10013 |
|
|
},
|
10014 |
|
|
{ /* f857_1645[] */
|
10015 |
|
|
16415, /* A1 = 1.001953 */
|
10016 |
|
|
-23669, /* A2 = -0.722321 */
|
10017 |
|
|
-4549, /* B2 = -0.138847 */
|
10018 |
|
|
0, /* B1 = 0 */
|
10019 |
|
|
4549, /* B0 = 0.138847 */
|
10020 |
|
|
8456, /* A1 = 0.516174 */
|
10021 |
|
|
-28996, /* A2 = -0.884918 */
|
10022 |
|
|
13753, /* B2 = 0.419724 */
|
10023 |
|
|
-12, /* B1 = -0.000763 */
|
10024 |
|
|
13757, /* B0 = 0.419846 */
|
10025 |
|
|
24632, /* A1 = 1.503418 */
|
10026 |
|
|
-30271, /* A2 = -0.923828 */
|
10027 |
|
|
29070, /* B2 = 0.887146 */
|
10028 |
|
|
-25265, /* B1 = -1.542114 */
|
10029 |
|
|
29073, /* B0 = 0.887268 */
|
10030 |
|
|
7, /* Internal filter scaling */
|
10031 |
|
|
159, /* Minimum in-band energy threshold */
|
10032 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10033 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10034 |
|
|
},
|
10035 |
|
|
{ /* f900 */
|
10036 |
|
|
24806, /* A1 = -1.514099 */
|
10037 |
|
|
-32501, /* A2 = 0.991852 */
|
10038 |
|
|
-326, /* B2 = -0.009969 */
|
10039 |
|
|
0, /* B1 = 0.000000 */
|
10040 |
|
|
326, /* B0 = 0.009969 */
|
10041 |
|
|
24709, /* A1 = -1.508118 */
|
10042 |
|
|
-32659, /* A2 = 0.996674 */
|
10043 |
|
|
20277, /* B2 = 0.618835 */
|
10044 |
|
|
-15182, /* B1 = -0.926636 */
|
10045 |
|
|
20277, /* B0 = 0.618835 */
|
10046 |
|
|
25022, /* A1 = -1.527222 */
|
10047 |
|
|
-32661, /* A2 = 0.996735 */
|
10048 |
|
|
4320, /* B2 = 0.131836 */
|
10049 |
|
|
-3331, /* B1 = -0.203339 */
|
10050 |
|
|
4320, /* B0 = 0.131836 */
|
10051 |
|
|
5, /* Internal filter scaling */
|
10052 |
|
|
159, /* Minimum in-band energy threshold */
|
10053 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10054 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10055 |
|
|
},
|
10056 |
|
|
{ /* f900_1300[] */
|
10057 |
|
|
19776, /* A1 = 1.207092 */
|
10058 |
|
|
-27437, /* A2 = -0.837341 */
|
10059 |
|
|
-2666, /* B2 = -0.081371 */
|
10060 |
|
|
0, /* B1 = 0 */
|
10061 |
|
|
2666, /* B0 = 0.081371 */
|
10062 |
|
|
16302, /* A1 = 0.995026 */
|
10063 |
|
|
-30354, /* A2 = -0.926361 */
|
10064 |
|
|
10389, /* B2 = 0.317062 */
|
10065 |
|
|
-3327, /* B1 = -0.203064 */
|
10066 |
|
|
10389, /* B0 = 0.317062 */
|
10067 |
|
|
24299, /* A1 = 1.483154 */
|
10068 |
|
|
-30930, /* A2 = -0.943909 */
|
10069 |
|
|
25016, /* B2 = 0.763428 */
|
10070 |
|
|
-21171, /* B1 = -1.292236 */
|
10071 |
|
|
25016, /* B0 = 0.763428 */
|
10072 |
|
|
7, /* Internal filter scaling */
|
10073 |
|
|
159, /* Minimum in-band energy threshold */
|
10074 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10075 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10076 |
|
|
},
|
10077 |
|
|
{ /* f935_1215[] */
|
10078 |
|
|
20554, /* A1 = 1.254517 */
|
10079 |
|
|
-28764, /* A2 = -0.877838 */
|
10080 |
|
|
-2048, /* B2 = -0.062515 */
|
10081 |
|
|
0, /* B1 = 0 */
|
10082 |
|
|
2048, /* B0 = 0.062515 */
|
10083 |
|
|
18209, /* A1 = 1.11145 */
|
10084 |
|
|
-30951, /* A2 = -0.94458 */
|
10085 |
|
|
9390, /* B2 = 0.286575 */
|
10086 |
|
|
-3955, /* B1 = -0.241455 */
|
10087 |
|
|
9390, /* B0 = 0.286575 */
|
10088 |
|
|
23902, /* A1 = 1.458923 */
|
10089 |
|
|
-31286, /* A2 = -0.954803 */
|
10090 |
|
|
23252, /* B2 = 0.709595 */
|
10091 |
|
|
-19132, /* B1 = -1.167725 */
|
10092 |
|
|
23252, /* B0 = 0.709595 */
|
10093 |
|
|
7, /* Internal filter scaling */
|
10094 |
|
|
159, /* Minimum in-band energy threshold */
|
10095 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10096 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10097 |
|
|
},
|
10098 |
|
|
{ /* f941_1477[] */
|
10099 |
|
|
17543, /* A1 = 1.07074 */
|
10100 |
|
|
-26220, /* A2 = -0.800201 */
|
10101 |
|
|
-3298, /* B2 = -0.100647 */
|
10102 |
|
|
0, /* B1 = 0 */
|
10103 |
|
|
3298, /* B0 = 0.100647 */
|
10104 |
|
|
12423, /* A1 = 0.75827 */
|
10105 |
|
|
-30036, /* A2 = -0.916626 */
|
10106 |
|
|
12651, /* B2 = 0.386078 */
|
10107 |
|
|
-2444, /* B1 = -0.14917 */
|
10108 |
|
|
12653, /* B0 = 0.386154 */
|
10109 |
|
|
23518, /* A1 = 1.435425 */
|
10110 |
|
|
-30745, /* A2 = -0.938293 */
|
10111 |
|
|
27282, /* B2 = 0.832581 */
|
10112 |
|
|
-22529, /* B1 = -1.375122 */
|
10113 |
|
|
27286, /* B0 = 0.832703 */
|
10114 |
|
|
7, /* Internal filter scaling */
|
10115 |
|
|
159, /* Minimum in-band energy threshold */
|
10116 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10117 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10118 |
|
|
},
|
10119 |
|
|
{ /* f942 */
|
10120 |
|
|
24104, /* A1 = -1.471252 */
|
10121 |
|
|
-32507, /* A2 = 0.992065 */
|
10122 |
|
|
-351, /* B2 = -0.010722 */
|
10123 |
|
|
0, /* B1 = 0.000000 */
|
10124 |
|
|
351, /* B0 = 0.010722 */
|
10125 |
|
|
23996, /* A1 = -1.464600 */
|
10126 |
|
|
-32671, /* A2 = 0.997040 */
|
10127 |
|
|
22848, /* B2 = 0.697266 */
|
10128 |
|
|
-16639, /* B1 = -1.015564 */
|
10129 |
|
|
22848, /* B0 = 0.697266 */
|
10130 |
|
|
24332, /* A1 = -1.485168 */
|
10131 |
|
|
-32673, /* A2 = 0.997101 */
|
10132 |
|
|
4906, /* B2 = 0.149727 */
|
10133 |
|
|
-3672, /* B1 = -0.224174 */
|
10134 |
|
|
4906, /* B0 = 0.149727 */
|
10135 |
|
|
5, /* Internal filter scaling */
|
10136 |
|
|
159, /* Minimum in-band energy threshold */
|
10137 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10138 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10139 |
|
|
},
|
10140 |
|
|
{ /* f950 */
|
10141 |
|
|
23967, /* A1 = -1.462830 */
|
10142 |
|
|
-32507, /* A2 = 0.992065 */
|
10143 |
|
|
-518, /* B2 = -0.015821 */
|
10144 |
|
|
0, /* B1 = 0.000000 */
|
10145 |
|
|
518, /* B0 = 0.015821 */
|
10146 |
|
|
23856, /* A1 = -1.456055 */
|
10147 |
|
|
-32671, /* A2 = 0.997040 */
|
10148 |
|
|
26287, /* B2 = 0.802246 */
|
10149 |
|
|
-19031, /* B1 = -1.161560 */
|
10150 |
|
|
26287, /* B0 = 0.802246 */
|
10151 |
|
|
24195, /* A1 = -1.476746 */
|
10152 |
|
|
-32673, /* A2 = 0.997101 */
|
10153 |
|
|
2890, /* B2 = 0.088196 */
|
10154 |
|
|
-2151, /* B1 = -0.131317 */
|
10155 |
|
|
2890, /* B0 = 0.088196 */
|
10156 |
|
|
5, /* Internal filter scaling */
|
10157 |
|
|
159, /* Minimum in-band energy threshold */
|
10158 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10159 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10160 |
|
|
},
|
10161 |
|
|
{ /* f950_1400[] */
|
10162 |
|
|
18294, /* A1 = 1.116638 */
|
10163 |
|
|
-26962, /* A2 = -0.822845 */
|
10164 |
|
|
-2914, /* B2 = -0.088936 */
|
10165 |
|
|
0, /* B1 = 0 */
|
10166 |
|
|
2914, /* B0 = 0.088936 */
|
10167 |
|
|
14119, /* A1 = 0.861786 */
|
10168 |
|
|
-30227, /* A2 = -0.922455 */
|
10169 |
|
|
11466, /* B2 = 0.349945 */
|
10170 |
|
|
-2833, /* B1 = -0.172943 */
|
10171 |
|
|
11466, /* B0 = 0.349945 */
|
10172 |
|
|
23431, /* A1 = 1.430115 */
|
10173 |
|
|
-30828, /* A2 = -0.940796 */
|
10174 |
|
|
25331, /* B2 = 0.773071 */
|
10175 |
|
|
-20911, /* B1 = -1.276367 */
|
10176 |
|
|
25331, /* B0 = 0.773071 */
|
10177 |
|
|
7, /* Internal filter scaling */
|
10178 |
|
|
159, /* Minimum in-band energy threshold */
|
10179 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10180 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10181 |
|
|
},
|
10182 |
|
|
{ /* f975 */
|
10183 |
|
|
23521, /* A1 = -1.435608 */
|
10184 |
|
|
-32489, /* A2 = 0.991516 */
|
10185 |
|
|
-193, /* B2 = -0.005915 */
|
10186 |
|
|
0, /* B1 = 0.000000 */
|
10187 |
|
|
193, /* B0 = 0.005915 */
|
10188 |
|
|
23404, /* A1 = -1.428467 */
|
10189 |
|
|
-32655, /* A2 = 0.996582 */
|
10190 |
|
|
17740, /* B2 = 0.541412 */
|
10191 |
|
|
-12567, /* B1 = -0.767029 */
|
10192 |
|
|
17740, /* B0 = 0.541412 */
|
10193 |
|
|
23753, /* A1 = -1.449829 */
|
10194 |
|
|
-32657, /* A2 = 0.996613 */
|
10195 |
|
|
9090, /* B2 = 0.277405 */
|
10196 |
|
|
-6662, /* B1 = -0.406647 */
|
10197 |
|
|
9090, /* B0 = 0.277405 */
|
10198 |
|
|
5, /* Internal filter scaling */
|
10199 |
|
|
159, /* Minimum in-band energy threshold */
|
10200 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10201 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10202 |
|
|
},
|
10203 |
|
|
{ /* f1000 */
|
10204 |
|
|
23071, /* A1 = -1.408203 */
|
10205 |
|
|
-32489, /* A2 = 0.991516 */
|
10206 |
|
|
-293, /* B2 = -0.008965 */
|
10207 |
|
|
0, /* B1 = 0.000000 */
|
10208 |
|
|
293, /* B0 = 0.008965 */
|
10209 |
|
|
22951, /* A1 = -1.400818 */
|
10210 |
|
|
-32655, /* A2 = 0.996582 */
|
10211 |
|
|
5689, /* B2 = 0.173645 */
|
10212 |
|
|
-3951, /* B1 = -0.241150 */
|
10213 |
|
|
5689, /* B0 = 0.173645 */
|
10214 |
|
|
23307, /* A1 = -1.422607 */
|
10215 |
|
|
-32657, /* A2 = 0.996613 */
|
10216 |
|
|
18692, /* B2 = 0.570435 */
|
10217 |
|
|
-13447, /* B1 = -0.820770 */
|
10218 |
|
|
18692, /* B0 = 0.570435 */
|
10219 |
|
|
5, /* Internal filter scaling */
|
10220 |
|
|
159, /* Minimum in-band energy threshold */
|
10221 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10222 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10223 |
|
|
},
|
10224 |
|
|
{ /* f1020 */
|
10225 |
|
|
22701, /* A1 = -1.385620 */
|
10226 |
|
|
-32474, /* A2 = 0.991058 */
|
10227 |
|
|
-292, /* B2 = -0.008933 */
|
10228 |
|
|
0, /*163840 , B1 = 10.000000 */
|
10229 |
|
|
292, /* B0 = 0.008933 */
|
10230 |
|
|
22564, /* A1 = -1.377258 */
|
10231 |
|
|
-32655, /* A2 = 0.996552 */
|
10232 |
|
|
20756, /* B2 = 0.633423 */
|
10233 |
|
|
-14176, /* B1 = -0.865295 */
|
10234 |
|
|
20756, /* B0 = 0.633423 */
|
10235 |
|
|
22960, /* A1 = -1.401428 */
|
10236 |
|
|
-32657, /* A2 = 0.996613 */
|
10237 |
|
|
6520, /* B2 = 0.198990 */
|
10238 |
|
|
-4619, /* B1 = -0.281937 */
|
10239 |
|
|
6520, /* B0 = 0.198990 */
|
10240 |
|
|
5, /* Internal filter scaling */
|
10241 |
|
|
159, /* Minimum in-band energy threshold */
|
10242 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10243 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10244 |
|
|
},
|
10245 |
|
|
{ /* f1050 */
|
10246 |
|
|
22142, /* A1 = -1.351501 */
|
10247 |
|
|
-32474, /* A2 = 0.991058 */
|
10248 |
|
|
-147, /* B2 = -0.004493 */
|
10249 |
|
|
0, /* B1 = 0.000000 */
|
10250 |
|
|
147, /* B0 = 0.004493 */
|
10251 |
|
|
22000, /* A1 = -1.342834 */
|
10252 |
|
|
-32655, /* A2 = 0.996552 */
|
10253 |
|
|
15379, /* B2 = 0.469360 */
|
10254 |
|
|
-10237, /* B1 = -0.624847 */
|
10255 |
|
|
15379, /* B0 = 0.469360 */
|
10256 |
|
|
22406, /* A1 = -1.367554 */
|
10257 |
|
|
-32657, /* A2 = 0.996613 */
|
10258 |
|
|
17491, /* B2 = 0.533783 */
|
10259 |
|
|
-12096, /* B1 = -0.738312 */
|
10260 |
|
|
17491, /* B0 = 0.533783 */
|
10261 |
|
|
5, /* Internal filter scaling */
|
10262 |
|
|
159, /* Minimum in-band energy threshold */
|
10263 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10264 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10265 |
|
|
},
|
10266 |
|
|
{ /* f1100_1750[] */
|
10267 |
|
|
12973, /* A1 = 0.79184 */
|
10268 |
|
|
-24916, /* A2 = -0.760376 */
|
10269 |
|
|
6655, /* B2 = 0.203102 */
|
10270 |
|
|
367, /* B1 = 0.0224 */
|
10271 |
|
|
6657, /* B0 = 0.203171 */
|
10272 |
|
|
5915, /* A1 = 0.361053 */
|
10273 |
|
|
-29560, /* A2 = -0.90213 */
|
10274 |
|
|
-7777, /* B2 = -0.23735 */
|
10275 |
|
|
0, /* B1 = 0 */
|
10276 |
|
|
7777, /* B0 = 0.23735 */
|
10277 |
|
|
20510, /* A1 = 1.251892 */
|
10278 |
|
|
-30260, /* A2 = -0.923462 */
|
10279 |
|
|
26662, /* B2 = 0.81366 */
|
10280 |
|
|
-20573, /* B1 = -1.255737 */
|
10281 |
|
|
26668, /* B0 = 0.813843 */
|
10282 |
|
|
7, /* Internal filter scaling */
|
10283 |
|
|
159, /* Minimum in-band energy threshold */
|
10284 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10285 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10286 |
|
|
},
|
10287 |
|
|
{ /* f1140 */
|
10288 |
|
|
20392, /* A1 = -1.244629 */
|
10289 |
|
|
-32460, /* A2 = 0.990601 */
|
10290 |
|
|
-270, /* B2 = -0.008240 */
|
10291 |
|
|
0, /* B1 = 0.000000 */
|
10292 |
|
|
270, /* B0 = 0.008240 */
|
10293 |
|
|
20218, /* A1 = -1.234009 */
|
10294 |
|
|
-32655, /* A2 = 0.996582 */
|
10295 |
|
|
21337, /* B2 = 0.651154 */
|
10296 |
|
|
-13044, /* B1 = -0.796143 */
|
10297 |
|
|
21337, /* B0 = 0.651154 */
|
10298 |
|
|
20684, /* A1 = -1.262512 */
|
10299 |
|
|
-32657, /* A2 = 0.996643 */
|
10300 |
|
|
8572, /* B2 = 0.261612 */
|
10301 |
|
|
-5476, /* B1 = -0.334244 */
|
10302 |
|
|
8572, /* B0 = 0.261612 */
|
10303 |
|
|
5, /* Internal filter scaling */
|
10304 |
|
|
159, /* Minimum in-band energy threshold */
|
10305 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10306 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10307 |
|
|
},
|
10308 |
|
|
{ /* f1200 */
|
10309 |
|
|
19159, /* A1 = -1.169373 */
|
10310 |
|
|
-32456, /* A2 = 0.990509 */
|
10311 |
|
|
-335, /* B2 = -0.010252 */
|
10312 |
|
|
0, /* B1 = 0.000000 */
|
10313 |
|
|
335, /* B0 = 0.010252 */
|
10314 |
|
|
18966, /* A1 = -1.157593 */
|
10315 |
|
|
-32661, /* A2 = 0.996735 */
|
10316 |
|
|
6802, /* B2 = 0.207588 */
|
10317 |
|
|
-3900, /* B1 = -0.238098 */
|
10318 |
|
|
6802, /* B0 = 0.207588 */
|
10319 |
|
|
19467, /* A1 = -1.188232 */
|
10320 |
|
|
-32661, /* A2 = 0.996765 */
|
10321 |
|
|
25035, /* B2 = 0.764008 */
|
10322 |
|
|
-15049, /* B1 = -0.918579 */
|
10323 |
|
|
25035, /* B0 = 0.764008 */
|
10324 |
|
|
5, /* Internal filter scaling */
|
10325 |
|
|
159, /* Minimum in-band energy threshold */
|
10326 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10327 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10328 |
|
|
},
|
10329 |
|
|
{ /* f1209 */
|
10330 |
|
|
18976, /* A1 = -1.158264 */
|
10331 |
|
|
-32439, /* A2 = 0.989990 */
|
10332 |
|
|
-183, /* B2 = -0.005588 */
|
10333 |
|
|
0, /* B1 = 0.000000 */
|
10334 |
|
|
183, /* B0 = 0.005588 */
|
10335 |
|
|
18774, /* A1 = -1.145874 */
|
10336 |
|
|
-32650, /* A2 = 0.996429 */
|
10337 |
|
|
15468, /* B2 = 0.472076 */
|
10338 |
|
|
-8768, /* B1 = -0.535217 */
|
10339 |
|
|
15468, /* B0 = 0.472076 */
|
10340 |
|
|
19300, /* A1 = -1.177979 */
|
10341 |
|
|
-32652, /* A2 = 0.996490 */
|
10342 |
|
|
19840, /* B2 = 0.605499 */
|
10343 |
|
|
-11842, /* B1 = -0.722809 */
|
10344 |
|
|
19840, /* B0 = 0.605499 */
|
10345 |
|
|
5, /* Internal filter scaling */
|
10346 |
|
|
159, /* Minimum in-band energy threshold */
|
10347 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10348 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10349 |
|
|
},
|
10350 |
|
|
{ /* f1330 */
|
10351 |
|
|
16357, /* A1 = -0.998413 */
|
10352 |
|
|
-32368, /* A2 = 0.987793 */
|
10353 |
|
|
-217, /* B2 = -0.006652 */
|
10354 |
|
|
0, /* B1 = 0.000000 */
|
10355 |
|
|
217, /* B0 = 0.006652 */
|
10356 |
|
|
16107, /* A1 = -0.983126 */
|
10357 |
|
|
-32601, /* A2 = 0.994904 */
|
10358 |
|
|
11602, /* B2 = 0.354065 */
|
10359 |
|
|
-5555, /* B1 = -0.339111 */
|
10360 |
|
|
11602, /* B0 = 0.354065 */
|
10361 |
|
|
16722, /* A1 = -1.020630 */
|
10362 |
|
|
-32603, /* A2 = 0.994965 */
|
10363 |
|
|
15574, /* B2 = 0.475311 */
|
10364 |
|
|
-8176, /* B1 = -0.499069 */
|
10365 |
|
|
15574, /* B0 = 0.475311 */
|
10366 |
|
|
5, /* Internal filter scaling */
|
10367 |
|
|
159, /* Minimum in-band energy threshold */
|
10368 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10369 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10370 |
|
|
},
|
10371 |
|
|
{ /* f1336 */
|
10372 |
|
|
16234, /* A1 = -0.990875 */
|
10373 |
|
|
32404, /* A2 = -0.988922 */
|
10374 |
|
|
-193, /* B2 = -0.005908 */
|
10375 |
|
|
0, /* B1 = 0.000000 */
|
10376 |
|
|
193, /* B0 = 0.005908 */
|
10377 |
|
|
15986, /* A1 = -0.975769 */
|
10378 |
|
|
-32632, /* A2 = 0.995880 */
|
10379 |
|
|
18051, /* B2 = 0.550903 */
|
10380 |
|
|
-8658, /* B1 = -0.528473 */
|
10381 |
|
|
18051, /* B0 = 0.550903 */
|
10382 |
|
|
16591, /* A1 = -1.012695 */
|
10383 |
|
|
-32634, /* A2 = 0.995941 */
|
10384 |
|
|
15736, /* B2 = 0.480240 */
|
10385 |
|
|
-8125, /* B1 = -0.495926 */
|
10386 |
|
|
15736, /* B0 = 0.480240 */
|
10387 |
|
|
5, /* Internal filter scaling */
|
10388 |
|
|
159, /* Minimum in-band energy threshold */
|
10389 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10390 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10391 |
|
|
},
|
10392 |
|
|
{ /* f1366 */
|
10393 |
|
|
15564, /* A1 = -0.949982 */
|
10394 |
|
|
-32404, /* A2 = 0.988922 */
|
10395 |
|
|
-269, /* B2 = -0.008216 */
|
10396 |
|
|
0, /* B1 = 0.000000 */
|
10397 |
|
|
269, /* B0 = 0.008216 */
|
10398 |
|
|
15310, /* A1 = -0.934479 */
|
10399 |
|
|
-32632, /* A2 = 0.995880 */
|
10400 |
|
|
10815, /* B2 = 0.330063 */
|
10401 |
|
|
-4962, /* B1 = -0.302887 */
|
10402 |
|
|
10815, /* B0 = 0.330063 */
|
10403 |
|
|
15924, /* A1 = -0.971924 */
|
10404 |
|
|
-32634, /* A2 = 0.995941 */
|
10405 |
|
|
18880, /* B2 = 0.576172 */
|
10406 |
|
|
-9364, /* B1 = -0.571594 */
|
10407 |
|
|
18880, /* B0 = 0.576172 */
|
10408 |
|
|
5, /* Internal filter scaling */
|
10409 |
|
|
159, /* Minimum in-band energy threshold */
|
10410 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10411 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10412 |
|
|
},
|
10413 |
|
|
{ /* f1380 */
|
10414 |
|
|
15247, /* A1 = -0.930603 */
|
10415 |
|
|
-32397, /* A2 = 0.988708 */
|
10416 |
|
|
-244, /* B2 = -0.007451 */
|
10417 |
|
|
0, /* B1 = 0.000000 */
|
10418 |
|
|
244, /* B0 = 0.007451 */
|
10419 |
|
|
14989, /* A1 = -0.914886 */
|
10420 |
|
|
-32627, /* A2 = 0.995697 */
|
10421 |
|
|
18961, /* B2 = 0.578644 */
|
10422 |
|
|
-8498, /* B1 = -0.518707 */
|
10423 |
|
|
18961, /* B0 = 0.578644 */
|
10424 |
|
|
15608, /* A1 = -0.952667 */
|
10425 |
|
|
-32628, /* A2 = 0.995758 */
|
10426 |
|
|
11145, /* B2 = 0.340134 */
|
10427 |
|
|
-5430, /* B1 = -0.331467 */
|
10428 |
|
|
11145, /* B0 = 0.340134 */
|
10429 |
|
|
5, /* Internal filter scaling */
|
10430 |
|
|
159, /* Minimum in-band energy threshold */
|
10431 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10432 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10433 |
|
|
},
|
10434 |
|
|
{ /* f1400 */
|
10435 |
|
|
14780, /* A1 = -0.902130 */
|
10436 |
|
|
-32393, /* A2 = 0.988586 */
|
10437 |
|
|
-396, /* B2 = -0.012086 */
|
10438 |
|
|
0, /* B1 = 0.000000 */
|
10439 |
|
|
396, /* B0 = 0.012086 */
|
10440 |
|
|
14510, /* A1 = -0.885651 */
|
10441 |
|
|
-32630, /* A2 = 0.995819 */
|
10442 |
|
|
6326, /* B2 = 0.193069 */
|
10443 |
|
|
-2747, /* B1 = -0.167671 */
|
10444 |
|
|
6326, /* B0 = 0.193069 */
|
10445 |
|
|
15154, /* A1 = -0.924957 */
|
10446 |
|
|
-32632, /* A2 = 0.995850 */
|
10447 |
|
|
23235, /* B2 = 0.709076 */
|
10448 |
|
|
-10983, /* B1 = -0.670380 */
|
10449 |
|
|
23235, /* B0 = 0.709076 */
|
10450 |
|
|
5, /* Internal filter scaling */
|
10451 |
|
|
159, /* Minimum in-band energy threshold */
|
10452 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10453 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10454 |
|
|
},
|
10455 |
|
|
{ /* f1477 */
|
10456 |
|
|
13005, /* A1 = -0.793793 */
|
10457 |
|
|
-32368, /* A2 = 0.987823 */
|
10458 |
|
|
-500, /* B2 = -0.015265 */
|
10459 |
|
|
0, /* B1 = 0.000000 */
|
10460 |
|
|
500, /* B0 = 0.015265 */
|
10461 |
|
|
12708, /* A1 = -0.775665 */
|
10462 |
|
|
-32615, /* A2 = 0.995331 */
|
10463 |
|
|
11420, /* B2 = 0.348526 */
|
10464 |
|
|
-4306, /* B1 = -0.262833 */
|
10465 |
|
|
11420, /* B0 = 0.348526 */
|
10466 |
|
|
13397, /* A1 = -0.817688 */
|
10467 |
|
|
-32615, /* A2 = 0.995361 */
|
10468 |
|
|
9454, /* B2 = 0.288528 */
|
10469 |
|
|
-3981, /* B1 = -0.243027 */
|
10470 |
|
|
9454, /* B0 = 0.288528 */
|
10471 |
|
|
5, /* Internal filter scaling */
|
10472 |
|
|
159, /* Minimum in-band energy threshold */
|
10473 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10474 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10475 |
|
|
},
|
10476 |
|
|
{ /* f1600 */
|
10477 |
|
|
10046, /* A1 = -0.613190 */
|
10478 |
|
|
-32331, /* A2 = 0.986694 */
|
10479 |
|
|
-455, /* B2 = -0.013915 */
|
10480 |
|
|
0, /* B1 = 0.000000 */
|
10481 |
|
|
455, /* B0 = 0.013915 */
|
10482 |
|
|
9694, /* A1 = -0.591705 */
|
10483 |
|
|
-32601, /* A2 = 0.994934 */
|
10484 |
|
|
6023, /* B2 = 0.183815 */
|
10485 |
|
|
-1708, /* B1 = -0.104279 */
|
10486 |
|
|
6023, /* B0 = 0.183815 */
|
10487 |
|
|
10478, /* A1 = -0.639587 */
|
10488 |
|
|
-32603, /* A2 = 0.994965 */
|
10489 |
|
|
22031, /* B2 = 0.672333 */
|
10490 |
|
|
-7342, /* B1 = -0.448151 */
|
10491 |
|
|
22031, /* B0 = 0.672333 */
|
10492 |
|
|
5, /* Internal filter scaling */
|
10493 |
|
|
159, /* Minimum in-band energy threshold */
|
10494 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10495 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10496 |
|
|
},
|
10497 |
|
|
{ /* f1633_1638[] */
|
10498 |
|
|
9181, /* A1 = 0.560394 */
|
10499 |
|
|
-32256, /* A2 = -0.984375 */
|
10500 |
|
|
-556, /* B2 = -0.016975 */
|
10501 |
|
|
0, /* B1 = 0 */
|
10502 |
|
|
556, /* B0 = 0.016975 */
|
10503 |
|
|
8757, /* A1 = 0.534515 */
|
10504 |
|
|
-32574, /* A2 = -0.99408 */
|
10505 |
|
|
8443, /* B2 = 0.25769 */
|
10506 |
|
|
-2135, /* B1 = -0.130341 */
|
10507 |
|
|
8443, /* B0 = 0.25769 */
|
10508 |
|
|
9691, /* A1 = 0.591522 */
|
10509 |
|
|
-32574, /* A2 = -0.99411 */
|
10510 |
|
|
15446, /* B2 = 0.471375 */
|
10511 |
|
|
-4809, /* B1 = -0.293579 */
|
10512 |
|
|
15446, /* B0 = 0.471375 */
|
10513 |
|
|
7, /* Internal filter scaling */
|
10514 |
|
|
159, /* Minimum in-band energy threshold */
|
10515 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10516 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10517 |
|
|
},
|
10518 |
|
|
{ /* f1800 */
|
10519 |
|
|
5076, /* A1 = -0.309875 */
|
10520 |
|
|
-32304, /* A2 = 0.985840 */
|
10521 |
|
|
-508, /* B2 = -0.015503 */
|
10522 |
|
|
0, /* B1 = 0.000000 */
|
10523 |
|
|
508, /* B0 = 0.015503 */
|
10524 |
|
|
4646, /* A1 = -0.283600 */
|
10525 |
|
|
-32605, /* A2 = 0.995026 */
|
10526 |
|
|
6742, /* B2 = 0.205780 */
|
10527 |
|
|
-878, /* B1 = -0.053635 */
|
10528 |
|
|
6742, /* B0 = 0.205780 */
|
10529 |
|
|
5552, /* A1 = -0.338928 */
|
10530 |
|
|
-32605, /* A2 = 0.995056 */
|
10531 |
|
|
23667, /* B2 = 0.722260 */
|
10532 |
|
|
-4297, /* B1 = -0.262329 */
|
10533 |
|
|
23667, /* B0 = 0.722260 */
|
10534 |
|
|
5, /* Internal filter scaling */
|
10535 |
|
|
159, /* Minimum in-band energy threshold */
|
10536 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10537 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10538 |
|
|
},
|
10539 |
|
|
{ /* f1860 */
|
10540 |
|
|
3569, /* A1 = -0.217865 */
|
10541 |
|
|
-32292, /* A2 = 0.985504 */
|
10542 |
|
|
-239, /* B2 = -0.007322 */
|
10543 |
|
|
0, /* B1 = 0.000000 */
|
10544 |
|
|
239, /* B0 = 0.007322 */
|
10545 |
|
|
3117, /* A1 = -0.190277 */
|
10546 |
|
|
-32603, /* A2 = 0.994965 */
|
10547 |
|
|
18658, /* B2 = 0.569427 */
|
10548 |
|
|
-1557, /* B1 = -0.095032 */
|
10549 |
|
|
18658, /* B0 = 0.569427 */
|
10550 |
|
|
4054, /* A1 = -0.247437 */
|
10551 |
|
|
-32603, /* A2 = 0.994965 */
|
10552 |
|
|
18886, /* B2 = 0.576385 */
|
10553 |
|
|
-2566, /* B1 = -0.156647 */
|
10554 |
|
|
18886, /* B0 = 0.576385 */
|
10555 |
|
|
5, /* Internal filter scaling */
|
10556 |
|
|
159, /* Minimum in-band energy threshold */
|
10557 |
|
|
21, /* 21/32 in-band to broad-band ratio */
|
10558 |
|
|
0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
|
10559 |
|
|
},
|
10560 |
|
|
};
|
10561 |
|
|
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
|
10562 |
|
|
{
|
10563 |
|
|
unsigned short cmd;
|
10564 |
|
|
int cnt, max;
|
10565 |
|
|
|
10566 |
|
|
if (jf->filter > 3) {
|
10567 |
|
|
return -1;
|
10568 |
|
|
}
|
10569 |
|
|
if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
|
10570 |
|
|
|
10571 |
|
|
return -1;
|
10572 |
|
|
if (!jf->enable) {
|
10573 |
|
|
if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
|
10574 |
|
|
|
10575 |
|
|
return -1;
|
10576 |
|
|
else
|
10577 |
|
|
return 0;
|
10578 |
|
|
} else {
|
10579 |
|
|
if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
|
10580 |
|
|
|
10581 |
|
|
return -1;
|
10582 |
|
|
/* Select the filter (f0 - f3) to use. */
|
10583 |
|
|
if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
|
10584 |
|
|
return -1;
|
10585 |
|
|
}
|
10586 |
|
|
if (jf->freq < 12 && jf->freq > 3) {
|
10587 |
|
|
/* Select the frequency for the selected filter. */
|
10588 |
|
|
if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
|
10589 |
|
|
return -1;
|
10590 |
|
|
} else if (jf->freq > 11) {
|
10591 |
|
|
/* We need to load a programmable filter set for undefined */
|
10592 |
|
|
/* frequencies. So we will point the filter to a programmable set. */
|
10593 |
|
|
/* Since there are only 4 filters and 4 programmable sets, we will */
|
10594 |
|
|
/* just point the filter to the same number set and program it for the */
|
10595 |
|
|
/* frequency we want. */
|
10596 |
|
|
if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
|
10597 |
|
|
return -1;
|
10598 |
|
|
if (j->ver.low != 0x12) {
|
10599 |
|
|
cmd = 0x515B;
|
10600 |
|
|
max = 19;
|
10601 |
|
|
} else {
|
10602 |
|
|
cmd = 0x515E;
|
10603 |
|
|
max = 15;
|
10604 |
|
|
}
|
10605 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
10606 |
|
|
return -1;
|
10607 |
|
|
for (cnt = 0; cnt < max; cnt++) {
|
10608 |
|
|
if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
|
10609 |
|
|
return -1;
|
10610 |
|
|
}
|
10611 |
|
|
}
|
10612 |
|
|
j->filter_en[jf->filter] = jf->enable;
|
10613 |
|
|
return 0;
|
10614 |
|
|
}
|
10615 |
|
|
|
10616 |
|
|
static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
|
10617 |
|
|
{
|
10618 |
|
|
unsigned short cmd;
|
10619 |
|
|
int cnt, max;
|
10620 |
|
|
if (jfr->filter > 3) {
|
10621 |
|
|
return -1;
|
10622 |
|
|
}
|
10623 |
|
|
if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
|
10624 |
|
|
return -1;
|
10625 |
|
|
|
10626 |
|
|
if (!jfr->enable) {
|
10627 |
|
|
if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
|
10628 |
|
|
return -1;
|
10629 |
|
|
else
|
10630 |
|
|
return 0;
|
10631 |
|
|
} else {
|
10632 |
|
|
if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
|
10633 |
|
|
return -1;
|
10634 |
|
|
/* Select the filter (f0 - f3) to use. */
|
10635 |
|
|
if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
|
10636 |
|
|
return -1;
|
10637 |
|
|
}
|
10638 |
|
|
/* We need to load a programmable filter set for undefined */
|
10639 |
|
|
/* frequencies. So we will point the filter to a programmable set. */
|
10640 |
|
|
/* Since there are only 4 filters and 4 programmable sets, we will */
|
10641 |
|
|
/* just point the filter to the same number set and program it for the */
|
10642 |
|
|
/* frequency we want. */
|
10643 |
|
|
if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
|
10644 |
|
|
return -1;
|
10645 |
|
|
if (j->ver.low != 0x12) {
|
10646 |
|
|
cmd = 0x515B;
|
10647 |
|
|
max = 19;
|
10648 |
|
|
} else {
|
10649 |
|
|
cmd = 0x515E;
|
10650 |
|
|
max = 15;
|
10651 |
|
|
}
|
10652 |
|
|
if (ixj_WriteDSPCommand(cmd, j))
|
10653 |
|
|
return -1;
|
10654 |
|
|
for (cnt = 0; cnt < max; cnt++) {
|
10655 |
|
|
if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
|
10656 |
|
|
return -1;
|
10657 |
|
|
}
|
10658 |
|
|
j->filter_en[jfr->filter] = jfr->enable;
|
10659 |
|
|
return 0;
|
10660 |
|
|
}
|
10661 |
|
|
|
10662 |
|
|
static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
|
10663 |
|
|
{
|
10664 |
|
|
int freq0, freq1;
|
10665 |
|
|
unsigned short data;
|
10666 |
|
|
if (ti->freq0) {
|
10667 |
|
|
freq0 = ti->freq0;
|
10668 |
|
|
} else {
|
10669 |
|
|
freq0 = 0x7FFF;
|
10670 |
|
|
}
|
10671 |
|
|
|
10672 |
|
|
if (ti->freq1) {
|
10673 |
|
|
freq1 = ti->freq1;
|
10674 |
|
|
} else {
|
10675 |
|
|
freq1 = 0x7FFF;
|
10676 |
|
|
}
|
10677 |
|
|
|
10678 |
|
|
if(ti->tone_index > 12 && ti->tone_index < 28)
|
10679 |
|
|
{
|
10680 |
|
|
if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
|
10681 |
|
|
return -1;
|
10682 |
|
|
if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
|
10683 |
|
|
return -1;
|
10684 |
|
|
data = freq0;
|
10685 |
|
|
if (ixj_WriteDSPCommand(data, j))
|
10686 |
|
|
return -1;
|
10687 |
|
|
data = freq1;
|
10688 |
|
|
if (ixj_WriteDSPCommand(data, j))
|
10689 |
|
|
return -1;
|
10690 |
|
|
}
|
10691 |
|
|
return freq0;
|
10692 |
|
|
}
|
10693 |
|
|
|