1    /* 
     2     * Copyright (c) 2012, 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     *  ======== TimestampProvider.xdc ========
    34     *
    35     *
    36     */
    37    
    38    package ti.sysbios.family.arm.a8;
    39    
    40    /*!
    41     *  ======== TimestampProvider ========
    42     *  A8 TimestampProvider.
    43     *
    44     *  The source of the timestamps for the A8 TimestampProvider is
    45     *  the A8's internal PMC counter which counts CPU cycles.
    46     *
    47     *  As this counter is only 32 bits in length, provision is made
    48     *  in the get64() API to test if an overflow has occurred since 
    49     *  the last invocation of get64() and compensate the return value
    50     *  accordingly.
    51     *
    52     *  As it is possible for the 32 bit counter to roll over more 
    53     *  than once between successive get64() calls, it is up to the user
    54     *  to call the get64() API often enough to guarantee coherency in
    55     *  successive timestamps. A simple mechanism to do this would be 
    56     *  to add a Clock function that simply invokes get64():
    57     *
    58     *  @p(code)
    59     *  var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    60     *  var TimestampProvider = xdc.useModule('ti.sysbios.family.arm.a8.TimestampProvider');
    61     *  var clockParams = new Clock.Params();
    62     *  clockParams.period = 1;     // call every Clock tick
    63     *  Clock.create($externModFxn(TimestampProvider.get64), 1, clockParams);
    64     *  @p
    65     *
    66     *  @p(html)
    67     *  <h3> Calling Context </h3>
    68     *  <table border="1" cellpadding="3">
    69     *    <colgroup span="1"></colgroup> <colgroup span="5" align="center">
    70     *    </colgroup>
    71     *
    72     *    <tr><th> Function                 </th><th>  Hwi   </th><th>  Swi   </th>
    73     *    <th>  Task  </th><th>  Main  </th><th>  Startup  </th></tr>
    74     *    <!--                                                              -->
    75     *    <tr><td> {@link #get32}           </td><td>   Y    </td><td>   Y    </td>
    76     *    <td>   Y    </td><td>   Y    </td><td>   N    </td></tr>
    77     *    <tr><td> {@link #get64}           </td><td>   Y    </td><td>   Y    </td>
    78     *    <td>   Y    </td><td>   Y    </td><td>   N    </td></tr>
    79     *    <tr><td> {@link #getFreq}         </td><td>   Y    </td><td>   Y    </td>
    80     *    <td>   Y    </td><td>   Y    </td><td>   N    </td></tr>
    81     *    <tr><td colspan="6"> Definitions: <br />
    82     *       <ul>
    83     *         <li> <b>Hwi</b>: API is callable from a Hwi thread. </li>
    84     *         <li> <b>Swi</b>: API is callable from a Swi thread. </li>
    85     *         <li> <b>Task</b>: API is callable from a Task thread. </li>
    86     *         <li> <b>Main</b>: API is callable during any of these phases: </li>
    87     *           <ul>
    88     *             <li> In your module startup after this module is started 
    89     *    (e.g. TimestampProvider_Module_startupDone() returns TRUE). </li>
    90     *             <li> During xdc.runtime.Startup.lastFxns. </li>
    91     *             <li> During main().</li>
    92     *             <li> During BIOS.startupFxns.</li>
    93     *           </ul>
    94     *         <li> <b>Startup</b>: API is callable during any of these phases:</li>
    95     *           <ul>
    96     *             <li> During xdc.runtime.Startup.firstFxns.</li>
    97     *             <li> In your module startup before this module is started 
    98     *    (e.g. TimestampProvider_Module_startupDone() returns FALSE).</li>
    99     *           </ul>
   100     *       </ul>
   101     *    </td></tr>
   102     *
   103     *  </table>
   104     *  @p
   105     */
   106    
   107    @ModuleStartup          /* To get Clock Timer Handle */
   108    
   109    module TimestampProvider inherits ti.sysbios.interfaces.ITimestamp
   110    {
   111        /*! @_nodoc */
   112        @XmlDtd
   113        metaonly struct Module_View {
   114        };
   115    
   116    internal:   /* not for client use */
   117    
   118        UInt32 getCCNT32();
   119        UInt32 getOverflowCCNT();
   120        Void initCCNT();
   121        
   122        struct Module_State {
   123            UInt32          upper32Bits;    /* upper 32 bits of counter */
   124        }
   125    }
   126    /*
   127     *  @(#) ti.sysbios.family.arm.a8; 2, 0, 0, 0,151; 2-24-2012 11:39:10; /db/vtree/library/trees/avala/avala-q28x/src/ xlibrary
   128    
   129     */
   130