Merge branch 'master' of git://git.ti.com/tas2557sw-android/tas2557-ftc
[tas2557sw-android/tas2557-ftc.git] / factorytest.c
1 /*
2 ** =============================================================================
3 ** Copyright (c) 2016  Texas Instruments Inc.
4 **
5 ** File:
6 **     factorytest.c
7 **
8 ** Description:
9 **     main program for TAS2555 factory test 
10 **
11 ** =============================================================================
12 */
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <stdbool.h>
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 #include <string.h>
20 #include <fcntl.h>
22 #include "tas2557_ftc.h"
24 // ================================================================ Definitions
25 // Obtained from Speaker Manufacturer
26 #define SPK_T_MAX            100    // Speaker Maximum Temperature (C)
27 #define SPK_RE_TOL_PER       10     // Re +/- tolerance (%)
28 #define SPK_RE_ALPHA         0.0039 // Temperature coefficient alpha (1/K)
30 // Obtained from PurePath Console 3 (PPC3)
31 #define PPC3_RE0             7.41   // Re0 (ohm)
32 #define PPC3_FWARP           891
33 #define PPC3_BL              0.814
34 #define PPC3_MMS             0.0666
35 #define PPC3_RTV             46.5   // Rtv (K/W)
36 #define PPC3_RTM             78.2   // Rtm (K/W)
37 #define PPC3_RTVA            2460   // Rtva (K/W)
38 #define PPC3_SYSGAIN         9.35   // System Gain (V/FS)
39 #define PPC3_DEV_NONLIN_PER  1.5    // Device Non-linearity (%)
40 #define PPC3_PIG                        1
42 void ExitWithHint(char *pHint)
43 {
44         printf("factorytest: invalid command line: %s\n\r\n\r", pHint);
46         printf("usage: factorytest [-t temperature] [-c configuration file] [-l load calibration] [-v verbose]\n\r");
47         exit(-1);
48 }
50 void InitFTCC(struct TFTCConfiguration *pFTCC)
51 {
52         pFTCC->nCalibrationTime = 2000;
53         pFTCC->nPPC3_FS = 48000;
55         pFTCC->bVerbose = false;
56         pFTCC->bLoadCalibration = false;
58         pFTCC->nTSpkCharDevA.nSpkTMax = SPK_T_MAX;
59         pFTCC->nTSpkCharDevA.nSpkReTolPer = SPK_RE_TOL_PER;
60         pFTCC->nTSpkCharDevA.nSpkReAlpha = SPK_RE_ALPHA;
61         pFTCC->nTSpkCharDevA.nReHi = PPC3_RE0*1.15;
62         pFTCC->nTSpkCharDevA.nReLo = PPC3_RE0*0.85;
63         pFTCC->nTSpkCharDevA.nPPC3_Re0 = PPC3_RE0;
64         pFTCC->nTSpkCharDevA.nPPC3_FWarp = PPC3_FWARP;
65         pFTCC->nTSpkCharDevA.nPPC3_Bl = PPC3_BL;
66         pFTCC->nTSpkCharDevA.nPPC3_Mms = PPC3_MMS;
67         pFTCC->nTSpkCharDevA.nPPC3_RTV = PPC3_RTV;
68         pFTCC->nTSpkCharDevA.nPPC3_RTM = PPC3_RTM;
69         pFTCC->nTSpkCharDevA.nPPC3_RTVA = PPC3_RTVA;
70         pFTCC->nTSpkCharDevA.nPPC3_SysGain = PPC3_SYSGAIN;
71         pFTCC->nTSpkCharDevA.nPPC3_DevNonlinPer = PPC3_DEV_NONLIN_PER;
72         pFTCC->nTSpkCharDevA.nPPC3_PIG = PPC3_PIG;
73 }
75 unsigned int SkipCharacter(char *pData, char cCharacter, unsigned int nSize)
76 {
77         unsigned int nRIndex;
78         unsigned int nWIndex = 0;
80         for (nRIndex = 0; nRIndex < nSize; nRIndex++)
81                 if (pData[nRIndex] != cCharacter) pData[nWIndex++] = pData[nRIndex];
83         return nWIndex;
84 }
86 unsigned int RemoveComments(char *pData, char cCharacter, unsigned int nSize)
87 {
88         unsigned int nRIndex;
89         unsigned int nWIndex = 0;
91         for (nRIndex = 0; nRIndex < nSize; nRIndex++)
92         {
93                 if (pData[nRIndex] == cCharacter)
94                         while ((nRIndex < nSize) && (pData[nRIndex] != '\r')) nRIndex++;
95                 pData[nWIndex++] = pData[nRIndex];
96         }
98         return nWIndex;
99 }
101 void ReadValue(struct TFTCConfiguration *pFTCC, struct TSPKCharData *pSpk, char *pLine, char *pValue)
103         if (!strcmp(pLine, "CALIBRATION_TIME")) {pFTCC->nCalibrationTime = atoi(pValue); return;};
104         if (!strcmp(pLine, "FS_RATE")) {pFTCC->nPPC3_FS = atof(pValue); return;};
105         if (!strcmp(pLine, "SPK_T_MAX")) {pSpk->nSpkTMax = atof(pValue); return;};
106         if (!strcmp(pLine, "SPK_RE_TOL_PER")) {pSpk->nSpkReTolPer = atof(pValue); return;};
107         if (!strcmp(pLine, "PPC3_RE_ALPHA")) {pSpk->nSpkReAlpha = atof(pValue); return;};
108         if (!strcmp(pLine, "PPC3_RE0")) {pSpk->nPPC3_Re0 = atof(pValue); return;};
109         if (!strcmp(pLine, "PPC3_FWARP")) {pSpk->nPPC3_FWarp = atof(pValue); return;};
110         if (!strcmp(pLine, "PPC3_BL")) {pSpk->nPPC3_Bl = atof(pValue); return;};
111         if (!strcmp(pLine, "PPC3_MMS")) {pSpk->nPPC3_Mms = atof(pValue); return;};
112         if (!strcmp(pLine, "PPC3_RTV")) {pSpk->nPPC3_RTV = atof(pValue); return;};
113         if (!strcmp(pLine, "PPC3_RTM")) {pSpk->nPPC3_RTM = atof(pValue); return;};
114         if (!strcmp(pLine, "PPC3_RTVA")) {pSpk->nPPC3_RTVA = atof(pValue); return;};
115         if (!strcmp(pLine, "PPC3_SYSGAIN")) {pSpk->nPPC3_SysGain = atof(pValue); return;};
116         if (!strcmp(pLine, "PPC3_DEV_NONLIN_PER")) {pSpk->nPPC3_DevNonlinPer = atof(pValue); return;};
117         if (!strcmp(pLine, "PPC3_PIG")) {pSpk->nPPC3_PIG = atof(pValue); return;};
118         if (!strcmp(pLine, "RE_HI")) {pSpk->nReHi = atof(pValue); return;};
119         if (!strcmp(pLine, "RE_LO")) {pSpk->nReLo = atof(pValue); return;};
122 void ftcc_print(struct TFTCConfiguration *pFTCC)
124         printf("factorytest configuration: \n\r");
126         printf("  CALIBRATION_TIME   = %d\n\r", pFTCC->nCalibrationTime);
127         printf("Speaker A characterization data: \n\r");
129         printf(" SPKA SPK_T_MAX      = %2.2f\n\r", pFTCC->nTSpkCharDevA.nSpkTMax);
130         printf(" SPKA SPK_RE_TOL_PER = %2.2f\n\r", pFTCC->nTSpkCharDevA.nSpkReTolPer);
131         printf(" SPKA SPK_RE_ALPHA   = %2.4f\n\r\n\r", pFTCC->nTSpkCharDevA.nSpkReAlpha);
133         printf(" SPKA PPC3_RE0            = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_Re0);
134         printf(" SPKA PPC3_FWARP          = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_FWarp);
135         printf(" SPKA PPC3_BL             = %2.6f\n\r", pFTCC->nTSpkCharDevA.nPPC3_Bl);
136         printf(" SPKA PPC3_MMS            = %2.6f\n\r", pFTCC->nTSpkCharDevA.nPPC3_Mms);
137         printf(" SPKA PPC3_RTV            = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_RTV);
138         printf(" SPKA PPC3_RTM            = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_RTM);
139         printf(" SPKA PPC3_RTVA           = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_RTVA);
140         printf(" SPKA PPC3_SYSGAIN        = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_SysGain);
141         printf(" SPKA PPC3_DEV_NONLIN_PER = %2.2f\n\r", pFTCC->nTSpkCharDevA.nPPC3_DevNonlinPer);
142         printf(" SPKA PPC3_PIG            = %f\n\r", pFTCC->nTSpkCharDevA.nPPC3_PIG);
145 int ftcc_parse(struct TFTCConfiguration *pFTCC, struct TSPKCharData *pSpk, char *pData, unsigned int nSize)
147         unsigned int nRIndex = 0;
148         char *pLine;
149         char *pEqual;
150         double nTest;
152         nSize = SkipCharacter(pData, ' ', nSize);
153         nSize = RemoveComments(pData, ';', nSize);
155         pData[nSize] = 0;
157         pLine = strtok(pData, "\n\r");
159 //      printf("ftcc_parse: pData = %s\n\r", pData);
161 //      printf("ftcc_parse: size = %d, pLine = 0x%08x\n\r", nSize, pLine);
162         while (pLine) {
163 //              printf("ftcc_parse: pLine = 0x%08x\n\r", pLine);
164                 if (pLine[0]) {
165                         printf("Line = %s\n\r", pLine);
166                         pEqual = strstr(pLine, "=");
167                         if ((pEqual) && (strlen(pEqual) > 1)) {
168                                 pEqual[0] = 0;
169                                 ReadValue(pFTCC, pSpk, pLine, pEqual + 1);
170                                 pEqual[0] = '=';
171                         }
172                 }
173                 pLine = strtok(NULL, "\n\r");
174         }
176         return 0;
179 void LoadFTCC(char *pFileName, struct TFTCConfiguration *pFTCC, struct TSPKCharData *pSpk)
181         struct stat st;
182         char *pData;
183         int nFile;
184         
185 //      printf("LoadFTCC: %s\n\r", pFileName);
187         if (stat(pFileName, &st) < 0) ExitWithHint("configuration file doesn't exist");
189         pData = malloc(st.st_size);
190         if (!pData) ExitWithHint("cannot allocate memory for configuation file");
192     nFile = open(pFileName, O_RDONLY);
193         if (nFile < 0) ExitWithHint("cannot open configuration file"); 
195         read(nFile, pData, st.st_size);
196         close(nFile);
198         ftcc_parse(pFTCC, pSpk, pData, st.st_size); 
200         free(pData);
203 int main(int argc, char *argv[])
205         double nTemp = 20.0;
206         int nArg = 1;
207         bool bValidArg;
208         bool bSpkChk = false;
209         char pHint[256];
210         struct TFTCConfiguration sFTCC;
212         printf("\nTI TAS2557 factory test calibration sequence V1.0\n");
214         InitFTCC(&sFTCC);
215 //      printf("argc = %d\n\r", argc);
216         while (nArg < argc)
217         {
218 //              printf("argv[%d] = %s: ", nArg, argv[nArg]);
219                 bValidArg = false;
220                 if (!strcmp(argv[nArg], "-t")) {
221                         printf("nArg = %d, argc = %d\n\r", nArg, argc);
222                         if (argc <= (nArg + 1))
223                                 ExitWithHint("temperature parameter is missing");
224                         nTemp = atof(argv[nArg + 1]);
225                         nArg++;
226                         bValidArg = true;
227                 }
229                 if (!strcmp(argv[nArg], "-c")) {
230 //                      printf("found configuration file argument\n\r");
231                         if (argc <= (nArg + 1))
232                                 ExitWithHint("configuration file name is missing");
233                         LoadFTCC(argv[nArg + 1], &sFTCC, &(sFTCC.nTSpkCharDevA));
234                         nArg++;
235                         bValidArg = true;
236                 }
238                 if (!strcmp(argv[nArg], "-v")) {
239                         sFTCC.bVerbose = true;
240                         bValidArg = true;
241                 }
243                 if (!strcmp(argv[nArg], "-u")) {
244                         sFTCC.bLoadCalibration = true;
245                         bValidArg = true;
246                 }
248                 if (!strcmp(argv[nArg], "-m")) {
249                         bSpkChk = true;
250                         bValidArg = true;
251                 }
253                 if (!bValidArg) {
254                         sprintf(pHint, "don't know argument %s", argv[nArg]);
255                         ExitWithHint(pHint);
256                 }
258                 nArg++;
259         }
261         if (sFTCC.bVerbose) {
262                 printf("\n\rambient temperature = %2.1f\n\r", nTemp);
263                 ftcc_print(&sFTCC);
264         }
266         if (bSpkChk)
267                 tas2557_chk(nTemp, &sFTCC);
268         else
269                 tas2557_ftc(nTemp, &sFTCC);
270         return 0;