initial release
[apps/tidep0074.git] / host / main_host.c
1 /*
2  * Copyright (c) 2013-2015 Texas Instruments Incorporated - http://www.ti.com
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34  *  ======== main_host.c ========
35  *
36  */
38 /* cstdlib header files */
39 #include <stdio.h>
40 #include <stdlib.h>
42 /* package header files */
43 #include <ti/ipc/Std.h>
44 #include <ti/ipc/Ipc.h>
45 #include <ti/ipc/transports/TransportRpmsg.h>
47 #include <ti/ipc/MultiProc.h>
49 /* local header files */
50 #include "App.h"
52 /* private functions */
53 static Int Main_main(Void);
54 static Int Main_parseArgs(Int argc, Char *argv[]);
57 #define Main_USAGE "\
58 Usage:\n\
59     app_host [options] procName\n\
60 \n\
61 Arguments:\n\
62     procName      : the name of the remote processor\n\
63 \n\
64 Options:\n\
65     h   : print this help message\n\
66     l   : list the available remote names\n\
67 \n\
68 Examples:\n\
69     app_host IPU1\n\
70     app_host -l\n\
71     app_host -h\n\
72 \n"
74 /* private data */
75 static String   Main_remoteProcName = NULL;
78 /*
79  *  ======== main ========
80  */
81 Int main(Int argc, Char* argv[])
82 {
83     Int status;
85     printf("--> main:\n");
87     /* parse command line */
88     status = Main_parseArgs(argc, argv);
90     if (status < 0) {
91         goto leave;
92     }
93     /* configure the transport factory */
94     Ipc_transportConfig(&TransportRpmsg_Factory);
96     /* Ipc initialization */
97     status = Ipc_start();
99     if (status >= 0) {
100         /* application create, exec, delete */
101         status = Main_main();
103         /* Ipc finalization */
104         Ipc_stop();
105     }
106     else {
107         printf("Ipc_start failed: status = %d\n", status);
108         goto leave;
109     }
111 leave:
112     printf("<-- main:\n");
113     status = (status >= 0 ? 0 : status);
115     return (status);
119 /*
120  *  ======== Main_main ========
121  */
122 Int Main_main(Void)
124     UInt16      remoteProcId;
125     Int         status = 0;
127     printf("--> Main_main:\n");
129     remoteProcId = MultiProc_getId(Main_remoteProcName);
131     /* application create phase */
132     status = App_create(remoteProcId);
134     if (status < 0) {
135         goto leave;
136     }
138     /* application execute phase */
139     status = App_exec();
141     if (status < 0) {
142         goto leave;
143     }
145     /* application delete phase */
146     status = App_delete();
148     if (status < 0) {
149         goto leave;
150     }
152 leave:
153     printf("<-- Main_main:\n");
155     status = (status >= 0 ? 0 : status);
156     return (status);
160 /*
161  *  ======== Main_parseArgs ========
162  */
163 Int Main_parseArgs(Int argc, Char *argv[])
165     Int             x, cp, opt, argNum;
166     UInt16          i, numProcs;
167     String          name;
168     Int             status = 0;
171     /* parse the command line options */
172     for (opt = 1; (opt < argc) && (argv[opt][0] == '-'); opt++) {
173         for (x = 0, cp = 1; argv[opt][cp] != '\0'; cp++) {
174             x = (x << 8) | (int)argv[opt][cp];
175         }
177         switch (x) {
178             case 'h': /* -h */
179                 printf("%s", Main_USAGE);
180                 exit(0);
181                 break;
183             case 'l': /* -l */
184                 printf("Processor List\n");
185                 status = Ipc_start();
186                 if (status >= 0) {
187                     numProcs = MultiProc_getNumProcessors();
188                     for (i = 0; i < numProcs; i++) {
189                         name = MultiProc_getName(i);
190                         printf("    procId=%d, procName=%s\n", i, name);
191                     }
192                     Ipc_stop();
193                 }
194                 else {
195                     printf(
196                         "Error: %s, line %d: Ipc_start failed\n",
197                         __FILE__, __LINE__);
198                     goto leave;
199                 }
200                 exit(0);
201                 break;
203             default:
204                 printf(
205                     "Error: %s, line %d: invalid option, %c\n",
206                     __FILE__, __LINE__, (Char)x);
207                 printf("%s", Main_USAGE);
208                 status = -1;
209                 goto leave;
210         }
211     }
213     /* parse the command line arguments */
214     for (argNum = 1; opt < argc; argNum++, opt++) {
216         switch (argNum) {
217             case 1: /* name of proc #1 */
218                 Main_remoteProcName = argv[opt];
219                 break;
221             default:
222                 printf(
223                     "Error: %s, line %d: too many arguments\n",
224                     __FILE__, __LINE__);
225                 printf("%s", Main_USAGE);
226                 status = -1;
227                 goto leave;
228         }
229     }
231     /* validate command line arguments */
232     if (Main_remoteProcName == NULL) {
233         printf("Error: missing procName argument\n");
234         printf("%s", Main_USAGE);
235         status = -1;
236         goto leave;
237     }
239 leave:
240     return(status);