6fb7f183a476ec298b7161819538ff029e3f4b4c
[ipc/ipcdev.git] / packages / ti / ipc / tests / mmrpc_test.c
1 /*
2  * Copyright (c) 2013, Texas Instruments Incorporated
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  *  ======== mmrpc_test.c ========
35  */
36 #include <stdio.h>
38 #if defined(SYSLINK_BUILDOS_QNX)
39 #include <ti/shmemallocator/SharedMemoryAllocatorUsr.h>
40 #endif
42 #include "Mx.h"
44 /*
45  *  ======== main ========
46  */
47 int main(int argc, char **argv)
48 {
49     int status;
50     int i;
51     int32_t ret;
52     uint32_t val;
53     Mx_Compute *compute;
54 #if defined(SYSLINK_BUILDOS_QNX)
55     shm_buf shmCompute, shmInBuf, shmOutBuf;
56 #endif
58     printf("mmrpc_test: --> main\n");
60     /* initialize Mx module (setup rpc connection) */
61     status = Mx_initialize();
63     if (status < 0) {
64         goto leave;
65     }
67     /* invoke Mx functions */
68     ret = Mx_triple(11);
69     printf("mmrpc_test: Mx_triple(11), ret=%d\n", ret);
71     if (ret < 0) {
72         status = -1;
73         goto leave;
74     }
76     ret = Mx_triple(111);
77     printf("mmrpc_test: Mx_triple(111), ret=%d\n", ret);
79     if (ret < 0) {
80         status = -1;
81         goto leave;
82     }
84     ret = Mx_add(44, 66);
85     printf("mmrpc_test: Mx_add(44, 66), ret=%d\n", ret);
87     if (ret < 0) {
88         status = -1;
89         goto leave;
90     }
92     /* allocate a compute structure in shared memory */
93 #if defined(SYSLINK_BUILDOS_QNX)
94     SHM_alloc(sizeof(Mx_Compute), &shmCompute);
95     compute = (Mx_Compute *)(shmCompute.vir_addr);
96 #else
97     compute = NULL;
98 #endif
100     if (compute == NULL) {
101         /* temporary: memory alloc not implemented on Linux */
102         goto leave;
103     }
105     /* initialize compute structure */
106     compute->coef = 0x80400000;
107     compute->key = 0xABA0;
108     compute->size = 0x1000;
109     compute->inBuf = NULL;
110     compute->outBuf = NULL;
112     /* allocate an input buffer in shared memory */
113 #if defined(SYSLINK_BUILDOS_QNX)
114     SHM_alloc(compute->size * sizeof(uint32_t), &shmInBuf);
115     compute->inBuf = (uint32_t *)(shmInBuf.vir_addr);
116 #else
117 //  compute->inBuf = ...;
118 #endif
120     if (compute->inBuf == NULL) {
121         printf("mmrpc_test: Error: inBuf == NULL\n");
122         status = -1;
123         goto leave;
124     }
126     /* fill input buffer with seed value */
127     for (i = 0; i < compute->size; i++) {
128         compute->inBuf[i] = 0x2010;
129     }
131     /* allocate an output buffer in shared memory */
132 #if defined(SYSLINK_BUILDOS_QNX)
133     SHM_alloc(compute->size * sizeof(uint32_t), &shmOutBuf);
134     compute->outBuf = (uint32_t *)(shmOutBuf.vir_addr);
135 #else
136 //  compute->outBuf = ...;
137 #endif
139     if (compute->outBuf == NULL) {
140         printf("mmrpc_test: Error: outBuf == NULL\n");
141         status = -1;
142         goto leave;
143     }
145     /* clear output buffer */
146     for (i = 0; i < compute->size; i++) {
147         compute->outBuf[i] = 0;
148     }
150     /* print some debug info */
151     printf("mmrpc_test: calling Mx_compute(0x%x)\n", (unsigned int)compute);
152     printf("mmrpc_test: compute->coef=0x%x\n", compute->coef);
153     printf("mmrpc_test: compute->key=0x%x\n", compute->key);
154     printf("mmrpc_test: compute->size=0x%x\n", compute->size);
155     printf("mmrpc_test: compute->inBuf=0x%x\n", (unsigned int)compute->inBuf);
156     printf("mmrpc_test: compute->outBuf=0x%x\n", (unsigned int)compute->outBuf);
158     /* process the buffer */
159     ret = Mx_compute(compute);
161     if (ret < 0) {
162         status = -1;
163         printf("mmrpc_test: Error: Mx_Compute() failed\n");
164         goto leave;
165     }
167     printf("mmrpc_test: after Mx_compute(0x%x)\n", (unsigned int)compute);
168     printf("mmrpc_test: compute->coef=0x%x\n", compute->coef);
169     printf("mmrpc_test: compute->key=0x%x\n", compute->key);
170     printf("mmrpc_test: compute->size=0x%x\n", compute->size);
171     printf("mmrpc_test: compute->inBuf=0x%x\n", (unsigned int)compute->inBuf);
172     printf("mmrpc_test: compute->outBuf=0x%x\n", (unsigned int)compute->outBuf);
173     printf("mmrpc_test: compute->inBuf[0]=0x%x\n",
174             (unsigned int)compute->inBuf[0]);
175     printf("mmrpc_test: compute->outBuf[0]=0x%x\n",
176             (unsigned int)compute->outBuf[0]);
178     /* check the output buffer */
179     for (i = 0; i < compute->size; i++) {
180         val = compute->outBuf[i] | compute->coef;
181         if (compute->outBuf[i] != val) {
182             status = -1;
183             printf("mmrpc_test: Error: incorrect outBuf\n");
184             break;
185         }
186     }
188     /* free resources */
189 #if defined(SYSLINK_BUILDOS_QNX)
190     SHM_release(&shmOutBuf);
191     SHM_release(&shmInBuf);
192     SHM_release(&shmCompute);
193 #else
194 //  ...
195 #endif
197 leave:
198     /* finalize Mx module (destroy rpc connection) */
199     Mx_finalize();
201     if (status < 0) {
202         printf("mmrpc_test: FAILED\n");
203     }
204     else {
205         printf("mmrpc_test: PASSED\n");
206     }
207     return(0);