Merge pull request #1 in PASDK/pasdk_sr from PASDK-318-input-task-code-repetition...
[processor-sdk/performance-audio-sr.git] / pasdk / test_dsp / framework / aspMsg_master.c
2 /*
3 Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/
4 All rights reserved.
6 * Redistribution and use in source and binary forms, with or without 
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
16 * distribution.
17 *
18 * Neither the name of Texas Instruments Incorporated nor the names of
19 * its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 */
36 #include <xdc/std.h>
37 #include <xdc/runtime/Diags.h>
38 #include <xdc/runtime/Error.h>
39 #include <xdc/runtime/IHeap.h>
40 #include <xdc/runtime/Log.h>
41 #include <xdc/runtime/Memory.h>
42 #include <xdc/runtime/System.h>
43 #include <string.h>
44 #include <ti/sysbios/heaps/HeapBuf.h>
46 #include <ti/ipc/MessageQ.h>
47 #include <ti/ipc/MultiProc.h>
48 #include <ti/ipc/SharedRegion.h>
50 #include "aspMsg_common.h"
51 #include "aspMsg_master.h"
52 #include "audioStreamProc_common.h"
53 #include "common.h"
55 #define AspMsg_MasterToSlaveMsgHeapId ( 0 )
57 AspMsgMaster_Module gAspMsgMaster;
58 AspMsgMaster_Handle hAspMsgMaster=&gAspMsgMaster;
60 Uint32 gMessageId;
62 /* Initialize ASP master messaging */
63 Int AspMsgMaster_init(
64     AspMsgMaster_Handle hAspMsgMaster, 
65     UInt16 remoteProcId, 
66     UInt16 numMsgs
67 )
68 {
69     Int             status = ASP_MSG_MASTER_SOK;
70     Int             align;
71     Error_Block     eb;
72     IHeap_Handle    srHeap;
73     HeapBuf_Params  heapParams;
74     MessageQ_Params msgqParams;
75     char            msgqName[32];
76     UInt16          regionId;
79     Log_print0(Diags_ENTRY, "AspMsgMaster_init(): -->");
80     Log_info0("AspMsgMaster_init(): -->");
81     
82     // set default values
83     hAspMsgMaster->masterQue = NULL;
84     hAspMsgMaster->slaveQue = MessageQ_INVALIDMESSAGEQ;
85     hAspMsgMaster->heapId = AspMsg_MasterToSlaveMsgHeapId;
86     hAspMsgMaster->msgSize = 0;
87     hAspMsgMaster->messageId = 0;
88     
89     // set processor Ids
90     hAspMsgMaster->masterProcId = MultiProc_self();
91     hAspMsgMaster->slaveProcId = remoteProcId;
92     
93     regionId = SharedRegion_getIdByName("SR_0"); // get IPC shared region Id
95     // compute message size to fill entire cache lines
96     align = SharedRegion_getCacheLineSize(regionId);
97     hAspMsgMaster->msgSize = ROUNDUP(sizeof(ASP_Msg), align);
98     
99     // compute message pool size
100     hAspMsgMaster->poolSize = hAspMsgMaster->msgSize * numMsgs;
101     
102     // acquire message pool memory
103     srHeap = (IHeap_Handle)SharedRegion_getHeap(regionId);
104     hAspMsgMaster->store = Memory_alloc(srHeap, hAspMsgMaster->poolSize, align, NULL);
106     // create a heap in shared memory for message pool
107     HeapBuf_Params_init(&heapParams);
108     heapParams.blockSize = hAspMsgMaster->msgSize;
109     heapParams.numBlocks = numMsgs;
110     heapParams.bufSize = hAspMsgMaster->poolSize;
111     heapParams.align = align;
112     heapParams.buf = hAspMsgMaster->store;
113     Error_init(&eb);
115     hAspMsgMaster->heap = HeapBuf_create(&heapParams, &eb);
116     if (hAspMsgMaster->heap == NULL) 
117     {
118         Log_error0("AspMsgMaster_init(): failed creating message pool");
119         status = ASP_MSG_MASTER_HEAPBUF_CREATE_FAIL;
120         Log_print1(Diags_INFO, "AspMsgMaster_init(): <-- status=%d", (IArg)status);
121         return status;
122     }
124     // bind message pool to heapId
125     status = MessageQ_registerHeap((Ptr)(hAspMsgMaster->heap), hAspMsgMaster->heapId);
126     if (status != MessageQ_S_SUCCESS)
127     {
128         Log_error0("AspMsgMaster_init(): failed registering heap");
129         status = ASP_MSG_MASTER_MSGQ_REGHEAP_FAIL;
130         Log_print1(Diags_INFO, "AspMsgMaster_init(): <-- status=%d", (IArg)status);
131         return status;        
132     }
134     // create local message queue (inbound messages)
135     MessageQ_Params_init(&msgqParams);
137     hAspMsgMaster->masterQue = MessageQ_create(NULL, &msgqParams);
138     if (hAspMsgMaster->masterQue == NULL) 
139     {
140         Log_error0("AspMsgMaster_init(): failed creating MessageQ");
141         status = ASP_MSG_MASTER_MASTER_MSGQ_CREATE_FAIL;
142         Log_print1(Diags_INFO, "AspMsgMaster_init(): <-- status=%d", (IArg)status);
143         return status;
144     }
146     // open the remote message queue
147     System_sprintf(msgqName, AspMsg_SlaveMsgQueName, MultiProc_getName(remoteProcId));
149     Log_info0("AspMsgMaster_init(): MessageQ_open() start");
150     do {
151         status = MessageQ_open(msgqName, &hAspMsgMaster->slaveQue);
152         Log_info1("MessageQ_open() status=%d", status);
153         //Task_sleep(1);
154     } while (status == MessageQ_E_NOTFOUND);
155     Log_info0("AspMsgMaster_init(): MessageQ_open() finish");
157     if (status < 0) 
158     {
159         Log_error0("AspMsgMaster_init(): failed opening MessageQ");
160         status = ASP_MSG_MASTER_SLAVE_MSGQ_OPEN_FAIL;
161         Log_print1(Diags_INFO, "AspMsgMaster_init(): <-- status=%d", (IArg)status);
162         return status;
163     }
165     Log_print0(Diags_INFO, "AspMsgMaster_init(): ASP Master messaging ready");
166     Log_info0("AspMsgMaster_init(): ASP Master messaging ready");
167     
168     Log_print1(Diags_EXIT, "<-- AspMsgMaster_init(): %d", (IArg)status);    
169     return 0;
172 /************************************************************************************
173  * ASP message sending function. Refer to aspMsg_master.h for detailed description.
174 ************************************************************************************/
175 Int AspMsgSend(UInt32 sndCmd, UInt32 ackCmd, char *sndMsgBuf, char *ackMsgBuf)
177     ASP_Msg* pAspMsg;                   /* Messaging */
178     Int status;
180     // allocate message
181     pAspMsg = (ASP_Msg *)MessageQ_alloc(hAspMsgMaster->heapId, hAspMsgMaster->msgSize);
182     if (pAspMsg == NULL) {
183         TRACE_TERSE0("MessageQ_alloc() failure.");
184         return (ASP_MSG_ERR_QUEUE_ALLOC);
185     }
187     // set the return address in the message header and fill in message payload
188     MessageQ_setReplyQueue(hAspMsgMaster->masterQue, (MessageQ_Msg)pAspMsg);
189     pAspMsg->cmd = sndCmd;
190     pAspMsg->procId = hAspMsgMaster->masterProcId;
191     pAspMsg->messageId = hAspMsgMaster->messageId & ~(1<<31);
192     pAspMsg->expectResp = TRUE;
194     // copy the message provided by caller
195     if(sndMsgBuf != NULL) {
196         memcpy(pAspMsg->buf, sndMsgBuf, ASP_MSG_BUF_LEN*sizeof(char));
197     }
199     // send the message
200     TRACE_TERSE3("ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
201     status = MessageQ_put(hAspMsgMaster->slaveQue, (MessageQ_Msg)pAspMsg);
202     if (status != MessageQ_S_SUCCESS) {
203         TRACE_TERSE0("MessageQ_put() failure.");
204         MessageQ_free((MessageQ_Msg)pAspMsg);
205         return (ASP_MSG_ERR_QUEUE_PUT);
206     }
208     // wait for complete message from slave
209     status = MessageQ_get(hAspMsgMaster->masterQue, (MessageQ_Msg *)&pAspMsg, MessageQ_FOREVER);
210     if (status != MessageQ_S_SUCCESS) {
211         TRACE_TERSE0("MessageQ_get() failure.");
212         MessageQ_free((MessageQ_Msg)pAspMsg);
213         return (ASP_MSG_ERR_QUEUE_GET);
214     }
216     // check if returned message is valid
217     if ((pAspMsg->procId != hAspMsgMaster->slaveProcId) ||
218         (pAspMsg->cmd != ackCmd) ||
219         (pAspMsg->messageId != (hAspMsgMaster->messageId | ((UInt32)1<<31)))) {
220         TRACE_TERSE3("ERROR: ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
221         MessageQ_free((MessageQ_Msg)pAspMsg);
222         return(ASP_MSG_ERR_ACKNOWLEDGE);
223     }
225     hAspMsgMaster->messageId = (hAspMsgMaster->messageId + 1) & ~(1<<31);
226     TRACE_TERSE3("ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
228     // get the returned message
229     if(ackMsgBuf != NULL) {
230         memcpy(ackMsgBuf, pAspMsg->buf, ASP_MSG_BUF_LEN*sizeof(char));
231     }
233     // free the message 
234     status = MessageQ_free((MessageQ_Msg)pAspMsg);
235     if (status != MessageQ_S_SUCCESS) {
236         TRACE_TERSE0("MessageQ_free() failure.");
237         return (ASP_MSG_ERR_QUEUE_FREE);
238     }
240     // No error in messaging operation, even though there
241     // may be error in returned (acknowledgement) message.
242     return (ASP_MSG_NO_ERR);
243 } /* AspMsgSend */