Initial code package commit.
[apps/c55x-digital-mic-decimation.git] / src / pll_control.c
1 /* ============================================================================
2  * Copyright (c) 2016 Texas Instruments Incorporated.
3  *
4  *  Redistribution and use in source and binary forms, with or without
5  *  modification, are permitted provided that the following conditions
6  *  are met:
7  *
8  *    Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  *    Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the
14  *    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
21  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32   ===============================================================================*/
33 #include "csl_pll.h"
34 #include "csl_general.h"
35 #include "csl_pllAux.h"
36 #include "pll_control.h"
38 PLL_Obj pllObj;
39 PLL_Config pllCfg1;
41 PLL_Handle hPll;
43 const PLL_Config pllCfg_16p384MHz   = {0x83E4, 0x8000, 0x0806, 0x0201};
44 const PLL_Config pllCfg_32p768MHz   = {0x87CC, 0x8000, 0x0806, 0x0201};
45 const PLL_Config pllCfg_40MHz       = {0x8988, 0x8000, 0x0806, 0x0201};
46 const PLL_Config pllCfg_50MHz       = {0x8BE8, 0x8000, 0x0806, 0x0201};
47 const PLL_Config pllCfg_60MHz       = {0x8724, 0x8000, 0x0806, 0x0000};
48 const PLL_Config pllCfg_75MHz       = {0x88ED, 0x8000, 0x0806, 0x0000};
49 const PLL_Config pllCfg_100MHz      = {0x8BE8, 0x8000, 0x0806, 0x0000};
50 const PLL_Config pllCfg_120MHz      = {0x8E4A, 0x8000, 0x0806, 0x0000};
52 PLL_Config *pConfigInfo;
54 /* Sets PLL to desired output frequency = 
55 {32.768, 40, 50, 60, 75, 100, 120} MHZ.
56 Default is 60 MHz.
57 Assumes CPU core voltage is set appropriately for requested output frequency. */
58 CSL_Status pll_sample(
59     EPllFreq pllFreq
60 )
61 {
62     CSL_Status status;
63     volatile int i;
65     status = PLL_init(&pllObj, CSL_PLL_INST_0);
66     if (status != CSL_SOK)
67     {
68         return status;
69     }
71     hPll = (PLL_Handle)(&pllObj);
73     PLL_reset(hPll);
75     status = PLL_bypass(hPll);
76     if (status != CSL_SOK)
77     {
78         return status;
79     }
81     /* Configure the PLL */
82     switch (pllFreq)
83     {
84     case PLL_FREQ_16P384MHZ:
85         pConfigInfo = (PLL_Config *)&pllCfg_16p384MHz;
86         break;
88     case PLL_FREQ_32P768MHZ:
89         pConfigInfo = (PLL_Config *)&pllCfg_32p768MHz;
90         break;
92     case PLL_FREQ_40MHZ:
93         pConfigInfo = (PLL_Config *)&pllCfg_40MHz;
94         break;
95         
96     case PLL_FREQ_50MHZ:
97         pConfigInfo = (PLL_Config *)&pllCfg_50MHz;
98         break;
100     case PLL_FREQ_60MHZ:
101         pConfigInfo = (PLL_Config *)&pllCfg_60MHz;
102         break;
104     case PLL_FREQ_75MHZ:
105         pConfigInfo = (PLL_Config *)&pllCfg_75MHz;
106         break;
108     case PLL_FREQ_100MHZ:
109         pConfigInfo = (PLL_Config *)&pllCfg_100MHz;
110         break;
112     case PLL_FREQ_120MHZ:
113         pConfigInfo = (PLL_Config *)&pllCfg_120MHz;
114         break;
115     
116     default:
117         pConfigInfo = (PLL_Config *)&pllCfg_60MHz;
118     }
119     
120     // set the PLL using CSL function
121     status = PLL_config (hPll, pConfigInfo);
122     if (status != CSL_SOK)
123     {
124         return(status);
125     }
127     // read the PLL configure back
128     status = PLL_getConfig(hPll, &pllCfg1);
129     if (status != CSL_SOK)
130     {
131         return status;
132     }
134     /* Wait for PLL to stabilize */
135     for (i=0; i<100; i++);
137     // enable the PLL
138     status = PLL_enable(hPll);
139     if (status != CSL_SOK)
140     {
141         return status;
142     }
144     return CSL_SOK;