blob: c30ee2c274d8b35f1d307a71ef025f36639e9587 [file] [log] [blame]
developere0cea0f2021-12-16 16:08:26 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Author(s):
4 * laj
5 *
6 * Distributed by:
7 * Silicon Laboratories, Inc
8 *
9 * This file contains proprietary information.
10 * No dissemination allowed without prior written permission from
11 * Silicon Laboratories, Inc.
12 *
13 * File Description:
14 * This file contains common (ProSIC + DAA) functions.
15 *
16 */
17
18#include "../config_inc/si_voice_datatypes.h"
19#include "../inc/si_voice.h"
20#include "../config_inc/proslic_api_config.h"
21
22#ifdef ENABLE_DEBUG
23#define LOGPRINT_PREFIX "SiVoice: "
24#endif
25
26#ifdef SI3217X
27#include "si3217x.h"
28#include "si3217x_intf.h"
29#endif
30
31#ifdef SI3218X
32#include "../inc/si3218x.h"
33#include "../inc/si3218x_intf.h"
34#endif
35
36#ifdef SI3219X
37#include "si3219x.h"
38#include "si3219x_intf.h"
39#endif
40
41#ifdef SI3226X
42#include "si3226x.h"
43#include "si3226x_intf.h"
44#endif
45
46#ifdef SI3228X
47#include "si3228x.h"
48#include "si3228x_intf.h"
49#endif
50
51#define pCtrl(X) (X)->deviceId->ctrlInterface
52#define pProHW(X) pCtrl((X))->hCtrl
53#define ReadReg(PCHAN, CHANNEL, REGADDR) (PCHAN)->deviceId->ctrlInterface->ReadRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR))
54#define WriteReg(PCHAN, CHANNEL, REGADDR, REGDATA) (PCHAN)->deviceId->ctrlInterface->WriteRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR), (REGDATA))
55
56/*
57** Control object constructor/destructor
58*/
59int SiVoice_createControlInterfaces (SiVoiceControlInterfaceType **pCtrlIntf,
60 uInt32 interface_count)
61{
62 TRACEPRINT_NOCHAN("count = %lu\n", (unsigned long)interface_count);
63#ifndef DISABLE_MALLOC
64 *pCtrlIntf = SIVOICE_CALLOC(sizeof(SiVoiceControlInterfaceType),
65 interface_count);
66 if(*pCtrlIntf == NULL)
67 {
68#ifdef ENABLE_DEBUG
69 LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
70#endif
71 return RC_NO_MEM;
72 }
73
74 return RC_NONE;
75#else
76 SILABS_UNREFERENCED_PARAMETER(pCtrlIntf);
77 SILABS_UNREFERENCED_PARAMETER(interface_count);
78 return RC_UNSUPPORTED_FEATURE;
79#endif
80}
81
82int SiVoice_destroyControlInterfaces ( SiVoiceControlInterfaceType **pCtrlIntf )
83{
84
85 TRACEPRINT_NOCHAN("\n",NULL);
86#ifndef DISABLE_MALLOC
87 if( pCtrlIntf && *pCtrlIntf)
88 {
89 SIVOICE_FREE ((SiVoiceControlInterfaceType *)*pCtrlIntf);
90 *pCtrlIntf = NULL;
91 }
92 return RC_NONE;
93#else
94 SILABS_UNREFERENCED_PARAMETER(pCtrlIntf);
95 return RC_UNSUPPORTED_FEATURE;
96#endif
97}
98
99/*
100** Device object constructor/destructor
101*/
102int SiVoice_createDevices (SiVoiceDeviceType **pDevice, uInt32 device_count)
103{
104
105 TRACEPRINT_NOCHAN("\n",NULL);
106#ifndef DISABLE_MALLOC
107 *pDevice = SIVOICE_CALLOC (sizeof(SiVoiceDeviceType), device_count);
108
109 if(*pDevice == NULL)
110 {
111#ifdef ENABLE_DEBUG
112 LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
113#endif
114 return RC_NO_MEM;
115 }
116 return RC_NONE;
117#else
118 SILABS_UNREFERENCED_PARAMETER(pDevice);
119 SILABS_UNREFERENCED_PARAMETER(device_count);
120 return RC_UNSUPPORTED_FEATURE;
121#endif
122}
123
124int SiVoice_destroyDevices (SiVoiceDeviceType **pDevice)
125{
126
127 TRACEPRINT_NOCHAN("\n", NULL);
128#ifndef DISABLE_MALLOC
129 if(pDevice && *pDevice)
130 {
131 SIVOICE_FREE ((SiVoiceDeviceType *)*pDevice);
132 *pDevice = NULL;
133 }
134 return RC_NONE;
135#else
136 SILABS_UNREFERENCED_PARAMETER(pDevice);
137 return RC_UNSUPPORTED_FEATURE;
138#endif
139}
140
141/*
142** Channel object constructor/destructor
143*/
144int SiVoice_createChannels (SiVoiceChanType_ptr *pChan, uInt32 channel_count)
145{
146
147 TRACEPRINT_NOCHAN("count = %lu\n", (unsigned long) channel_count);
148#ifndef DISABLE_MALLOC
149 *pChan = SIVOICE_CALLOC(sizeof(SiVoiceChanType),channel_count);
150 if(*pChan == NULL)
151 {
152#ifdef ENABLE_DEBUG
153 LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
154#endif
155 return RC_NO_MEM;
156 }
157 return RC_NONE;
158#else
159 SILABS_UNREFERENCED_PARAMETER(pChan);
160 SILABS_UNREFERENCED_PARAMETER(channel_count);
161 return RC_UNSUPPORTED_FEATURE;
162#endif
163}
164
165int SiVoice_destroyChannels (SiVoiceChanType_ptr *hProslic)
166{
167
168 TRACEPRINT_NOCHAN("\n",NULL);
169#ifndef DISABLE_MALLOC
170 if(hProslic && *hProslic)
171 {
172 SIVOICE_FREE ((SiVoiceChanType_ptr)*hProslic);
173 *hProslic = NULL;
174 }
175 return RC_NONE;
176#else
177 SILABS_UNREFERENCED_PARAMETER(hProslic);
178 return RC_UNSUPPORTED_FEATURE;
179#endif
180}
181
182/*
183** Host control linkage
184*/
185int SiVoice_setControlInterfaceCtrlObj (SiVoiceControlInterfaceType *pCtrlIntf,
186 void *hCtrl)
187{
188 TRACEPRINT_NOCHAN("\n",NULL);
189 pCtrlIntf->hCtrl = hCtrl;
190 return RC_NONE;
191}
192
193/*
194** Host reset linkage
195*/
196int SiVoice_setControlInterfaceReset (SiVoiceControlInterfaceType *pCtrlIntf,
197 ctrl_Reset_fptr Reset_fptr)
198{
199 TRACEPRINT_NOCHAN("\n",NULL);
200 pCtrlIntf->Reset_fptr = Reset_fptr;
201 return RC_NONE;
202}
203
204/*
205** Host register/RAM read/write linkage
206*/
207int SiVoice_setControlInterfaceWriteRegister (SiVoiceControlInterfaceType
208 *pCtrlIntf, ctrl_WriteRegister_fptr WriteRegister_fptr)
209{
210 TRACEPRINT_NOCHAN("\n",NULL);
211 pCtrlIntf->WriteRegister_fptr = WriteRegister_fptr;
212 return RC_NONE;
213}
214
215int SiVoice_setControlInterfaceReadRegister (SiVoiceControlInterfaceType
216 *pCtrlIntf, ctrl_ReadRegister_fptr ReadRegister_fptr)
217{
218 TRACEPRINT_NOCHAN("\n",NULL);
219 pCtrlIntf->ReadRegister_fptr = ReadRegister_fptr;
220 return RC_NONE;
221}
222
223int SiVoice_setControlInterfaceWriteRAM (SiVoiceControlInterfaceType *pCtrlIntf,
224 ctrl_WriteRAM_fptr WriteRAM_fptr)
225{
226 TRACEPRINT_NOCHAN("\n",NULL);
227 pCtrlIntf->WriteRAM_fptr = WriteRAM_fptr;
228 return RC_NONE;
229}
230
231int SiVoice_setControlInterfaceReadRAM (SiVoiceControlInterfaceType *pCtrlIntf,
232 ctrl_ReadRAM_fptr ReadRAM_fptr)
233{
234 TRACEPRINT_NOCHAN("\n",NULL);
235 pCtrlIntf->ReadRAM_fptr = ReadRAM_fptr;
236 return RC_NONE;
237}
238
239/*
240** Host timer linkage
241*/
242int SiVoice_setControlInterfaceTimerObj (SiVoiceControlInterfaceType *pCtrlIntf,
243 void *hTimer)
244{
245 TRACEPRINT_NOCHAN("\n",NULL);
246 pCtrlIntf->hTimer = hTimer;
247 return RC_NONE;
248}
249
250int SiVoice_setControlInterfaceDelay (SiVoiceControlInterfaceType *pCtrlIntf,
251 system_delay_fptr Delay_fptr)
252{
253 TRACEPRINT_NOCHAN("\n",NULL);
254 pCtrlIntf->Delay_fptr = Delay_fptr;
255 return RC_NONE;
256}
257
258int SiVoice_setControlInterfaceSemaphore (SiVoiceControlInterfaceType
259 *pCtrlIntf, ctrl_Semaphore_fptr semaphore_fptr)
260{
261 TRACEPRINT_NOCHAN("\n",NULL);
262 pCtrlIntf->Semaphore_fptr = semaphore_fptr;
263 return RC_NONE;
264}
265
266int SiVoice_setControlInterfaceTimeElapsed (SiVoiceControlInterfaceType
267 *pCtrlIntf, system_timeElapsed_fptr timeElapsed_fptr)
268{
269 TRACEPRINT_NOCHAN("\n",NULL);
270 pCtrlIntf->timeElapsed_fptr = timeElapsed_fptr;
271 return RC_NONE;
272}
273
274int SiVoice_setControlInterfaceGetTime (SiVoiceControlInterfaceType *pCtrlIntf,
275 system_getTime_fptr getTime_fptr)
276{
277 TRACEPRINT_NOCHAN("\n",NULL);
278 pCtrlIntf->getTime_fptr = getTime_fptr;
279 return RC_NONE;
280}
281
282/*
283** Channel object initialization
284*/
285int SiVoice_SWInitChan (SiVoiceChanType_ptr pChan,int channel,int chipType,
286 SiVoiceDeviceType *pDeviceObj, SiVoiceControlInterfaceType *pCtrlIntf)
287{
288 TRACEPRINT_NOCHAN( "channel = %d chipType = %d\n", channel, chipType);
289 pChan->channel = (uInt8)channel;
290 pChan->deviceId = pDeviceObj;
291 pChan->deviceId->ctrlInterface = pCtrlIntf;
292 pChan->channelEnable=1;
293 pChan->error = RC_NONE;
294 pChan->debugMode = 0;
295 pChan->dcdc_polarity_invert = 0;
296#ifdef PROSLIC_BOM_DEFAULT
297 pChan->bomOption = PROSLIC_BOM_DEFAULT;
298#else
299 pChan->bomOption = 0;
300#endif
301
302 switch (chipType)
303 {
304 case SI3217X_TYPE:
305 pChan->deviceId->chipType = SI32171;
306 break;
307
308 case SI3218X_TYPE:
309 pChan->deviceId->chipType = SI32180;
310 break;
311
312 case SI3219X_TYPE:
313 pChan->deviceId->chipType = SI32190;
314 break;
315
316 case SI3226X_TYPE:
317 pChan->deviceId->chipType = SI32260;
318 break;
319
320 case SI3228X_TYPE:
321 pChan->deviceId->chipType = SI32280;
322 break;
323
324 case SI3050_TYPE:
325 pChan->deviceId->chipType = SI3050;
326 break;
327
328 default:
329 return RC_UNSUPPORTED_FEATURE;
330 }
331 return RC_NONE;
332}
333
334/*
335** Reset control
336*/
337int SiVoice_Reset (SiVoiceChanType_ptr pChan)
338{
339 TRACEPRINT_NOCHAN( "\n", NULL);
340 /*
341 ** assert reset, wait 250ms, release reset, wait 250ms
342 */
343 pChan->deviceId->ctrlInterface->Reset_fptr(
344 pChan->deviceId->ctrlInterface->hCtrl,1);
345
346 pChan->deviceId->ctrlInterface->Delay_fptr(
347 pChan->deviceId->ctrlInterface->hTimer,250);
348
349 pChan->deviceId->ctrlInterface->Reset_fptr(
350 pChan->deviceId->ctrlInterface->hCtrl,0);
351
352 pChan->deviceId->ctrlInterface->Delay_fptr(
353 pChan->deviceId->ctrlInterface->hTimer,250);
354
355 return RC_NONE;
356}
357
358/*
359** Debug Mode Control
360*/
361int SiVoice_setSWDebugMode (SiVoiceChanType_ptr pChan, int debugEn)
362{
363#ifdef ENABLE_DEBUG
364 TRACEPRINT_NOCHAN( "debugEn %d\n", debugEn);
365 pChan->debugMode = (0xFE & pChan->debugMode) | (debugEn != 0);
366#else
367 SILABS_UNREFERENCED_PARAMETER(pChan);
368 SILABS_UNREFERENCED_PARAMETER(debugEn);
369#endif
370 return RC_NONE;
371}
372
373/*
374** Trace Mode Control
375*/
376int SiVoice_setTraceMode (SiVoiceChanType_ptr pChan, int traceEn)
377{
378#ifdef ENABLE_TRACES
379 TRACEPRINT_NOCHAN( "debugEn %d\n", traceEn);
380 pChan->debugMode = (0xFD & pChan->debugMode) | ((traceEn != 0)<<1);
381#else
382 SILABS_UNREFERENCED_PARAMETER(pChan);
383 SILABS_UNREFERENCED_PARAMETER(traceEn);
384#endif
385 return RC_NONE;
386}
387
388/*
389** Error status
390*/
391int SiVoice_getErrorFlag (SiVoiceChanType_ptr pChan, int *error)
392{
393 TRACEPRINT( pChan, "\n", NULL);
394 *error = pChan->error;
395 return RC_NONE;
396}
397
398int SiVoice_clearErrorFlag (SiVoiceChanType_ptr pChan)
399{
400 TRACEPRINT( pChan, "\n", NULL);
401 pChan->error = RC_NONE;
402 return RC_NONE;
403}
404
405/*
406** Channel status
407*/
408int SiVoice_setChannelEnable (SiVoiceChanType_ptr pChan, int chanEn)
409{
410 TRACEPRINT( pChan, "enable = %d\n", chanEn);
411 pChan->channelEnable = chanEn;
412 return RC_NONE;
413}
414
415int SiVoice_getChannelEnable (SiVoiceChanType_ptr pChan, int *chanEn)
416{
417 TRACEPRINT( pChan, "\n", NULL);
418 *chanEn = pChan->channelEnable;
419 return RC_NONE;
420}
421
422uInt8 SiVoice_ReadReg(SiVoiceChanType_ptr hProslic,uInt8 addr)
423{
424 TRACEPRINT( hProslic, "addr = %u\n", (unsigned int)addr);
425 return ReadReg(hProslic, hProslic->channel, addr);
426}
427
428int SiVoice_WriteReg(SiVoiceChanType_ptr hProslic,uInt8 addr,uInt8 data)
429{
430 TRACEPRINT( hProslic, "addr = %u data = 0x%02X\n", (unsigned int)addr,
431 (unsigned int) data);
432 return WriteReg(hProslic, hProslic->channel, addr, data);
433}
434
435/*****************************************************************************************************/
436#if defined(SI3217X) || defined(SI3218X) || defined(SI3219X) || defined(SI3226X) || defined(SI3228X)
437#include "../inc/proslic.h"
438
439/* Iterate through the number of channels to determine if it's a SLIC, DAA, or unknown. Rev ID and chiptype is
440 * also filled in.
441 */
442int SiVoice_IdentifyChannels(SiVoiceChanType_ptr *pProslic, int size,
443 int *slicCount, int *daaCount)
444{
445 int i;
446 int rc = RC_NONE;
447 SiVoiceChanType_ptr currentChannel;
448
449 TRACEPRINT( *pProslic, "size = %d\n", size);
450
451 if(slicCount)
452 {
453 *slicCount = 0;
454 }
455 if(daaCount)
456 {
457 *daaCount = 0;
458 }
459
460 for(i = 0; i < size; i++)
461 {
462 currentChannel = pProslic[i];
463 /* SiVoice_SWInitChan() fills in the chipType initially with something the user provided, fill it
464 * in with the correct info.. The GetChipInfo may probe registers to compare them with their
465 * initial values, so this function MUST only be called after a chipset reset.
466 */
467#ifdef SI3217X
468 if (currentChannel->deviceId->chipType >= SI32171
469 && currentChannel->deviceId->chipType <= SI32179)
470 {
471 rc = Si3217x_GetChipInfo(currentChannel);
472 }
473#endif
474
475#ifdef SI3218X
476 if (currentChannel->deviceId->chipType >= SI32180
477 && currentChannel->deviceId->chipType <= SI32189)
478 {
479 rc = Si3218x_GetChipInfo(currentChannel);
480 }
481#endif
482
483#ifdef SI3219X
484 if ( IS_SI3219X(currentChannel->deviceId) )
485 {
486 rc = Si3219x_GetChipInfo(currentChannel);
487 }
488#endif
489
490#ifdef SI3226X
491 if (currentChannel->deviceId->chipType >= SI32260
492 && currentChannel->deviceId->chipType <= SI32269)
493 {
494 rc = Si3226x_GetChipInfo(currentChannel);
495 }
496#endif
497
498#ifdef SI3228X
499 if (currentChannel->deviceId->chipType >= SI32280
500 && currentChannel->deviceId->chipType <= SI32289)
501 {
502 rc = Si3228x_GetChipInfo(currentChannel);
503 }
504#endif
505
506 if(rc != RC_NONE)
507 {
508 return rc;
509 }
510
511 currentChannel->channelType = ProSLIC_identifyChannelType(currentChannel);
512 if(currentChannel->channelType == PROSLIC)
513 {
514 if(slicCount)
515 {
516 (*slicCount)++;
517 }
518 }
519 else if(currentChannel->channelType == DAA)
520 {
521 if(daaCount)
522 {
523 (*daaCount)++;
524 }
525 }
526#ifdef ENABLE_DEBUG
527 {
528 const char *dev_type = "UNKNOWN";
529 if(currentChannel->channelType == PROSLIC)
530 {
531 dev_type = "PROSLIC";
532 }
533 else if(currentChannel->channelType == DAA)
534 {
535 dev_type = "DAA";
536 }
537 LOGPRINT("%sChannel %d: Type = %s Rev = %d\n",
538 LOGPRINT_PREFIX, currentChannel->channel, dev_type,
539 currentChannel->deviceId->chipRev);
540
541 }
542#endif /* ENABLE_DEBUG */
543 }
544 return RC_NONE;
545}
546#endif
547
548/*
549** Function: ProSLIC_Version
550**
551** Description:
552** Return API version
553**
554** Returns:
555** string of the API release.
556*/
557
558extern const char *SiVoiceAPIVersion;
559char *SiVoice_Version()
560{
561 return (char *)SiVoiceAPIVersion;
562}
563