46a86e65daafca001023d5755fce57f86d327bcd
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / f28m35x / TransportCirc.xs
1 /*
2  * Copyright (c) 2012-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  */
32 /*
33  *  ======== TransportCirc.xs ========
34  */
36 var TransportCirc = null;
37 var MessageQ     = null;
38 var Notify       = null;
39 var MultiProc    = null;
40 var Swi          = null;
42 /*
43  *  ======== module$use ========
44  */
45 function module$use()
46 {
47     TransportCirc = this;
48     MessageQ     = xdc.useModule("ti.sdo.ipc.MessageQ");
49     Notify       = xdc.useModule("ti.sdo.ipc.Notify");
50     MultiProc    = xdc.useModule("ti.sdo.utils.MultiProc");
51     Swi          = xdc.useModule("ti.sysbios.knl.Swi");
52 }
54 /*
55  * ======== module$static$init ========
56  */
57 function module$static$init(mod, params)
58 {
59     var target = Program.build.target;
60     var bitsPerByte = 8;
61     var bitsPerChar = target.bitsPerChar;
63     /* calculate the msgSize */
64     TransportCirc.msgSize = TransportCirc.maxMsgSizeInBytes *
65                               (bitsPerByte / bitsPerChar);
67     /* calculate the maxIndex */
68     TransportCirc.maxIndex = TransportCirc.numMsgs - 1;
70     /* determine numMsgs is a power of 2 */
71     if (TransportCirc.numMsgs & (TransportCirc.maxIndex)) {
72         TransportCirc.$logFatal("TransportCirc.numMsgs: " +
73                 TransportCirc.numMsgs +
74                 " is not a power of 2", TransportCirc);
75     }
76 }
78 /*
79  *  ======== module$validate ========
80  */
81 function module$validate()
82 {
83     if (Notify.numEvents <= TransportCirc.notifyEventId) {
84         TransportCirc.$logFatal("TransportCirc.notifyEventId (" +
85                 TransportCirc.notifyEventId +
86                 ") is too big: Notify.numEvents = " + Notify.numEvents,
87                 TransportCirc);
88     }
89 }
91 /*
92  *  ======== sharedMemReqMeta ========
93  */
94 function sharedMemReqMeta(params)
95 {
96     var target = Program.build.target;
97     var bitsPerByte = 8;
98     var bitsPerChar = target.bitsPerChar;
100     /* calculate the msgSize */
101     var msgSize = TransportCirc.maxMsgSizeInBytes *
102                   (bitsPerByte / bitsPerChar);
104     /*
105      *  Amount of shared memory:
106      *  1 putBuffer (msgSize * numMsgs) +
107      *  1 putWriteIndex ptr             +
108      *  1 putReadIndex ptr              +
109      */
110     var memReq = (msgSize * TransportCirc.numMsgs) +
111                  (2 *  Program.build.target.stdTypes['t_Int32'].size);
113     return (memReq);
116 /*
117  *************************************************************************
118  *                       ROV View functions
119  *************************************************************************
120  */
122 /*
123  *  ======== viewInitBasic ========
124  */
125 function viewInitBasic(view, obj)
127     var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
128     var MultiProcCfg = Program.getModuleConfig('ti.sdo.utils.MultiProc');
130     /* view.remoteProcName */
131     try {
132         view.remoteProcName = MultiProc.getName$view(obj.remoteProcId -
133                                   MultiProcCfg.baseIdOfCluster);
134     }
135     catch(e) {
136         Program.displayError(view, 'remoteProcName',
137                              "Problem retrieving proc name: " + e);
138     }
141 /*
142  *  ======== getEventData ========
143  *  Helper function for use within viewInitData
144  */
145 function getEventData(view, obj, bufferPtr, putIndex, getIndex)
147     var TransportCirc =
148         xdc.useModule('ti.sdo.ipc.family.f28m35x.TransportCirc');
149     var modCfg =
150         Program.getModuleConfig('ti.sdo.ipc.family.f28m35x.TransportCirc');
151     var ScalarStructs   = xdc.useModule('xdc.rov.support.ScalarStructs');
153     if (bufferPtr == obj.putBuffer) {
154         var bufferName = "put";
155     }
156     else {
157         var bufferName = "get";
158     }
160     try {
161         var putBuffer = Program.fetchArray(ScalarStructs.S_Bits32$fetchDesc,
162                                            bufferPtr,
163                                            modCfg.numMsgs);
164     }
165     catch(e) {
166         throw (new Error("Error fetching putBuffer struct from shared memory"));
167     }
169     var i = getIndex;
171     while (i != putIndex) {
172         /* The event is registered */
173         var elem = Program.newViewStruct(
174                 'ti.sdo.ipc.family.f28m35x.TransportCirc',
175                 'Events');
177         elem.index = i;
178         elem.buffer = bufferName;
179         elem.message = utils.toHex(Number(bufferPtr) + (i * modCfg.msgSize));
181         /* Create a new row in the instance data view */
182         view.elements.$add(elem);
184         i++;
185         if ((i % modCfg.numMsgs) == 0) {
186             i = 0;
187         }
188     }
192 /*
193  *  ======== viewInitData ========
194  *  Instance data view.
195  */
196 function viewInitData(view, obj)
198     var Program         = xdc.useModule('xdc.rov.Program');
199     var ScalarStructs   = xdc.useModule('xdc.rov.support.ScalarStructs');
200     var MultiProc       = xdc.useModule('ti.sdo.utils.MultiProc');
202     /* Display the instance label in the tree */
203     view.label = "remoteProcId = " + obj.remoteProcId;
205     /* Fetch put/get index's */
206     try {
207         var putWriteIndex = Program.fetchStruct(ScalarStructs.S_Bits32$fetchDesc,
208                                                 obj.putWriteIndex);
209     }
210     catch(e) {
211         throw (new Error("Error fetching putWriteIndex struct from shared memory"));
212     }
214     try {
215         var putReadIndex = Program.fetchStruct(ScalarStructs.S_Bits32$fetchDesc,
216                                                obj.putReadIndex);
217     }
218     catch(e) {
219         throw (new Error("Error fetching putReadIndex struct from shared memory"));
220     }
222     try {
223         var getWriteIndex = Program.fetchStruct(ScalarStructs.S_Bits32$fetchDesc,
224                                                 obj.getWriteIndex);
225     }
226     catch(e) {
227         throw (new Error("Error fetching getWriteIndex struct from shared memory"));
228     }
230     try {
231         var getReadIndex = Program.fetchStruct(ScalarStructs.S_Bits32$fetchDesc,
232                                                obj.getReadIndex);
233     }
234     catch(e) {
235         throw (new Error("Error fetching getReadIndex struct from shared memory"));
236     }
238     /* Get event data for the put buffer */
239     getEventData(view, obj, obj.putBuffer, putWriteIndex.elem, putReadIndex.elem);
241     /* Get event data for the get buffer */
242     getEventData(view, obj, obj.getBuffer, getWriteIndex.elem, getReadIndex.elem);