Home | History | Annotate | Download | only in dspexec
      1 /*
      2  *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
      3  *
      4  *  Licensed under the Apache License, Version 2.0 (the "License");
      5  *  you may not use this file except in compliance with the License.
      6  *  You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  *  Unless required by applicable law or agreed to in writing, software
     11  *  distributed under the License is distributed on an "AS IS" BASIS,
     12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  *  See the License for the specific language governing permissions and
     14  *  limitations under the License.
     15  */
     16 
     17 /*
     18  *  ======== cexec.c ========
     19  *  "cexec" is a Linux console-based utility that allows developers to load
     20  *  and start a new DSP/BIOS Bridge based DSP program. If "cexec" encounters
     21  *  an error, it will display a DSP/BIOS Bridge GPP API error code.
     22  *
     23  *  Usage:
     24  *      cexec [optional args] <dsp_program>
     25  *
     26  *  Options:
     27  *      -?: displays "cexec" usage. If this option is set, cexec does not
     28  *          load the DSP program.
     29  *      -w: waits for the user to hit the enter key on the keyboard, which
     30  *          stops DSP program execution by placing the DSP into reset. This
     31  *          will also display on the WinCE console window the contents of
     32  *          DSP/BIOS Bridge trace buffer, which is used internally by the
     33  *          DSP/BIOS Bridge runtime. If this option is not specified, "cexec"
     34  *          loads and starts the DSP program, then returns immeidately,
     35  *          leaving the DSP program running.
     36  *      -v: verbose mode.
     37  *      -p [processor]: defines the DSP processor on which to execute code,
     38  *          where processor is the processor number provided by cexec to
     39  *          the DSPProcessor_Attach() function. If this option is not
     40  *          specified, the default processor is 0.
     41  *      -T: Set scriptable mode. If set, cexec will run to completion after
     42  *          loading and running a DSP target. User will not be able to stop
     43  *          the loaded DSP target.
     44  *
     45  *  Example:
     46  *      1.  Load and execute a DSP/BIOS Bridge base image, waiting for user to
     47  *          hit enter key to halt the DSP.
     48  *
     49  *          cexec -w chnltest_tiomap1510.x55l
     50  *
     51  *      2.  Start a program running on the second processor (zero-indexed).
     52  *          This will halt the currently running DSP program, if any.
     53  *
     54  *          cexec -w -p l chnltest_tiomap1510.x55l
     55  *
     56  *      3.  Load and start a program running on the DSP. Cexec will run to
     57  *          completion and leave the DSP loaded and running.
     58  *
     59  *          cexec -T chnltest_tiomap1510.x55l
     60  *
     61  *! Revision History:
     62  *! ================
     63  *! 20-Oct-2002 map: 	Instrumented to measure performance on PROC_Load
     64  *! 31-Jul-2002 kc:     Added scriptable mode to enable batch testing.
     65  *! 05-Apr-2001 kc:     Adapted from existing cexec. Updated cexec program
     66  *!                     options. Added command line argument handling.
     67  *!                     Based on DSP/BIOS Bridge API version 0.??.
     68  *! 13-Feb-2001 kc:     DSP/BIOS Bridge name update.
     69  *! 15-Nov-2000 jeh     Converted to use DSPProcessor.
     70  */
     71 
     72 #include <stdio.h>
     73 #include <stdlib.h>
     74 #include <unistd.h>
     75 #include <dbdefs.h>
     76 /* #include <varargs.h> */
     77 #include <stdarg.h>
     78 
     79 #include <dbapi.h>
     80 #include <DSPManager.h>
     81 #include <DSPProcessor.h>
     82 #include <DSPProcessor_OEM.h>
     83 
     84 /* global constants. */
     85 #define MAXTRACESIZE 256   /* size of trace buffer. */
     86 
     87 /* function prototype. */
     88 VOID DisplayUsage();
     89 VOID PrintVerbose(PSTR pstrFmt,...);
     90 
     91 /* global variables. */
     92 bool g_fVerbose = false;
     93 
     94 /*
     95  *  ======== main ========
     96  */
     97 INT main(INT argc, CHAR * argv[])
     98 {
     99 	INT opt;
    100 	bool fWaitForTerminate = false;
    101 	UINT uProcId = 0;	/* default proc ID is 0. */
    102 	bool fError = false;
    103 	DSP_HPROCESSOR hProc;
    104 	DSP_STATUS status = DSP_SOK;
    105 	INT cArgc = 0;		/* local argc count. */
    106 	bool fScriptable = false;
    107 	extern char *optarg;
    108 	struct DSP_PROCESSORINFO dspInfo;
    109 	UINT numProcs;
    110 	UINT index = 0;
    111 	while ((opt = getopt(argc, argv, "+T+v+w+?p:")) != EOF) {
    112 		switch (opt) {
    113 		case 'v':
    114 			/* verbose mode */
    115 			fprintf(stdout, "Verbose mode: ON\n");
    116 			g_fVerbose = true;
    117 			cArgc++;
    118 			break;
    119 		case 'w':
    120 			/* wait for user input to terminate */
    121 			fprintf(stdout, "Not supported \n");
    122 			fWaitForTerminate = true;
    123 			cArgc++;
    124 			break;
    125 		case 'T':
    126 			fScriptable = true;
    127 			cArgc++;
    128 			break;
    129 		case 'p':
    130 			/* user specified DSP processor ID (based on zero-index) */
    131 			uProcId = atoi(optarg);
    132 			cArgc++;
    133 			break;
    134 		case '?':
    135 		default:
    136 			fError = true;
    137 			break;
    138 		}
    139 	}
    140 	argv += cArgc + 1;
    141 	argc -= cArgc + 1;
    142 	if (fError) {
    143 		DisplayUsage();
    144 	} else {
    145 		status = (DBAPI)DspManager_Open(0, NULL);
    146 		if (DSP_FAILED(status)) {
    147 			PrintVerbose("DSPManager_Open failed \n");
    148 			return -1;
    149 		}
    150 		while (DSP_SUCCEEDED(DSPManager_EnumProcessorInfo(index,&dspInfo,
    151 						(UINT)sizeof(struct DSP_PROCESSORINFO),&numProcs))) {
    152 			if ((dspInfo.uProcessorType == DSPTYPE_55) ||
    153 									(dspInfo.uProcessorType == DSPTYPE_64)) {
    154 				printf("DSP device detected !! \n");
    155 				uProcId = index;
    156 				status = DSP_SOK;
    157 				break;
    158 			}
    159 			index++;
    160 		}
    161 		status = DSPProcessor_Attach(uProcId, NULL, &hProc);
    162 		if (DSP_SUCCEEDED(status)) {
    163 			PrintVerbose("DSPProcessor_Attach succeeded.\n");
    164 			status = DSPProcessor_Stop(hProc);
    165 			if (DSP_SUCCEEDED(status)) {
    166 				PrintVerbose("DSPProcessor_Stop succeeded.\n");
    167 				status = DSPProcessor_Load(hProc,argc,(CONST CHAR **)argv,NULL);
    168 				if (DSP_SUCCEEDED(status)) {
    169 					PrintVerbose("DSPProcessor_Load succeeded.\n");
    170 					status = DSPProcessor_Start(hProc);
    171 					if (DSP_SUCCEEDED(status)) {
    172 						fprintf(stdout,"DSPProcessor_Start succeeded.\n");
    173 #if 0
    174 						/* It seems Linux bridge does n't yet support
    175 						 * * DSPProcessor_GetTrace */
    176 						if (fWaitForTerminate) {
    177 							/* wait for user */
    178 							fprintf(stdout,"Hit \"return\" to stop DSP and"
    179 													"dump trace buffer:\n");
    180 							(void)getchar();
    181 							status = DSPProcessor_GetTrace(hProc,
    182 												(BYTE *)&traceBuf,MAXTRACESIZE);
    183 							fprintf(stdout,"%s\n",traceBuf);
    184 						} else {
    185 							PrintVerbose("in run free mode...\n");
    186 						}
    187 #endif	/* 0 */
    188 					} else {
    189 						PrintVerbose("DSPProcessor_Start failed: 0x%x.\n",
    190 																		status);
    191 					}
    192 				} else {
    193 					PrintVerbose("DSPProcessor_Load failed: 0x%x.\n",status);
    194 				}
    195 				DSPProcessor_Detach(hProc);
    196 			}
    197 		} else {
    198 			PrintVerbose("DSPProcessor_Attach failed: 0x%x.\n",status);
    199 		}
    200 	}
    201 	if (!fScriptable) {
    202 		/* Wait for user to hit any key before exiting. */
    203 		fprintf(stdout, "Hit any key to terminate cexec.\n");
    204 		(void)getchar();
    205 	}
    206 	status = DspManager_Close(0, NULL);
    207 	if (DSP_FAILED(status)) {
    208 		printf("\nERROR: DSPManager Close FAILED\n");
    209 	}
    210 	return (DSP_SUCCEEDED(status) ? 0 : -1);
    211 }
    212 
    213 VOID DisplayUsage()
    214 {
    215 	fprintf(stdout, "Usage: cexec [options] <dsp program>\n");
    216 	fprintf(stdout, "\t[optional arguments]:\n");
    217 	fprintf(stdout, "\t-?: Display cexec usage\n");
    218 	fprintf(stdout, "\t-v: Verbose mode\n");
    219 	fprintf(stdout, "\t-w: Waits for user to hit enter key before\n");
    220 	fprintf(stdout, "\t    terminating. Displays trace buffer\n");
    221 	fprintf(stdout, "\t-p [processor]: User-specified processor #\n");
    222 	fprintf(stdout, "\n\t[required arguments]:\n");
    223 	fprintf(stdout, "\t<dsp program>\n");
    224 	fprintf(stdout, "\n\tExample: cexec -w -p 1 prog.x55l\n\n");
    225 }
    226 
    227 
    228 /*
    229  * ======== PrintVerbose ========
    230  */
    231 VOID PrintVerbose(PSTR pstrFmt,...)
    232 {
    233 	va_list args;
    234 	if (g_fVerbose) {
    235 		va_start(args, pstrFmt);
    236 		vfprintf(stdout, pstrFmt, args);
    237 		va_end(args);
    238 		fflush(stdout);
    239 	}
    240 }
    241 
    242 
    243