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