source: rtems/c/src/lib/libbsp/arm/tms570/hwinit/init_system.c @ b2ed712

5
Last change on this file since b2ed712 was 29430a3, checked in by Pavel Pisa <pisa@…>, on 09/22/16 at 07:50:59

arm/tms570: include hardware initialization and selftest based on Ti HalCoGen? generated files.

The configuration is specific for TMS570LS3137 based HDK.
Pins configuration can be easily changed in

rtems/c/src/lib/libbsp/arm/tms570/hwinit/init_pinmux.c

file.

The list tms570_selftest_par_list in the file

rtems/c/src/lib/libbsp/arm/tms570/hwinit/bspstarthooks-hwinit.c

specifies peripherals which health status is examined
by parity self-test at BSP start-up. It can be easily
modified for other TMS570 family members variants same
as the selection of other tests in bspstarthooks-hwinit.c.

  • Property mode set to 100644
File size: 14.5 KB
Line 
1/** @file init_system.c
2
3   based on Ti HalCoGen generated file
4 */
5
6/*
7 * Copyright (C) 2009-2015 Texas Instruments Incorporated - www.ti.com
8 *
9 *
10 *  Redistribution and use in source and binary forms, with or without
11 *  modification, are permitted provided that the following conditions
12 *  are met:
13 *
14 *    Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 *
17 *    Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in the
19 *    documentation and/or other materials provided with the
20 *    distribution.
21 *
22 *    Neither the name of Texas Instruments Incorporated nor the names of
23 *    its contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 *
38 */
39
40#include <stdint.h>
41#include <stdbool.h>
42#include <bsp/tms570.h>
43#include <bsp/tms570-pinmux.h>
44#include "tms570_selftest.h"
45#include "tms570_hwinit.h"
46
47/**
48 * @brief Setup all system PLLs (HCG:setupPLL)
49 *
50 */
51void tms570_pll_init( void )
52{
53  uint32_t pll12_dis = 0x42;
54
55  /* Disable PLL1 and PLL2 */
56  TMS570_SYS1.CSDISSET = pll12_dis;
57
58  /*SAFETYMCUSW 28 D MR:NA <APPROVED> "Hardware status bit read check" */
59  while ( ( TMS570_SYS1.CSDIS & pll12_dis ) != pll12_dis ) {
60    /* Wait */
61  }
62
63  /* Clear Global Status Register */
64  TMS570_SYS1.GLBSTAT = TMS570_SYS1_GLBSTAT_FBSLIP |
65                        TMS570_SYS1_GLBSTAT_RFSLIP |
66                        TMS570_SYS1_GLBSTAT_OSCFAIL;
67  /** - Configure PLL control registers */
68  /** @b Initialize @b Pll1: */
69
70  /* Setup pll control register 1 */
71  TMS570_SYS1.PLLCTL1 = TMS570_SYS1_PLLCTL1_ROS * 0 |
72                        TMS570_SYS1_PLLCTL1_MASK_SLIP( 1 ) |
73                        TMS570_SYS1_PLLCTL1_PLLDIV( 0x1f ) | /* max value */
74                        TMS570_SYS1_PLLCTL1_ROF * 0 |
75                        TMS570_SYS1_PLLCTL1_REFCLKDIV( 6 - 1 ) |
76                        TMS570_SYS1_PLLCTL1_PLLMUL( ( 120 - 1 ) << 8 );
77
78  /* Setup pll control register 2 */
79  TMS570_SYS1.PLLCTL2 = TMS570_SYS1_PLLCTL2_FMENA * 0 |
80                        TMS570_SYS1_PLLCTL2_SPREADINGRATE( 255 ) |
81                        TMS570_SYS1_PLLCTL2_MULMOD( 7 ) |
82                        TMS570_SYS1_PLLCTL2_ODPLL( 2 - 1 ) |
83                        TMS570_SYS1_PLLCTL2_SPR_AMOUNT( 61 );
84
85  /** @b Initialize @b Pll2: */
86
87  /* Setup pll2 control register */
88  TMS570_SYS2.PLLCTL3 = TMS570_SYS2_PLLCTL3_ODPLL2( 2 - 1 ) |
89                        TMS570_SYS2_PLLCTL3_PLLDIV2( 0x1F ) | /* max value */
90                        TMS570_SYS2_PLLCTL3_REFCLKDIV2( 6 - 1 ) |
91                        TMS570_SYS2_PLLCTL3_PLLMUL2( ( 120 - 1 ) << 8 );
92
93  /** - Enable PLL(s) to start up or Lock */
94  TMS570_SYS1.CSDIS = 0x00000000 | /* CLKSR0 on */
95                      0x00000000 | /* CLKSR1 on */
96                      0x00000008 | /* CLKSR3 off */
97                      0x00000000 | /* CLKSR4 on */
98                      0x00000000 | /* CLKSR5 on */
99                      0x00000000 | /* CLKSR6 on */
100                      0x00000080;  /* CLKSR7 off */
101}
102
103/**
104 * @brief Adjust Low-Frequency (LPO) oscilator (HCG:trimLPO)
105 *
106 */
107/* SourceId : SYSTEM_SourceId_002 */
108/* DesignId : SYSTEM_DesignId_002 */
109/* Requirements : HL_SR468 */
110void tms570_trim_lpo_init( void )
111{
112  /** @b Initialize Lpo: */
113  /** Load TRIM values from OTP if present else load user defined values */
114  /*SAFETYMCUSW 139 S MR:13.7 <APPROVED> "Hardware status bit read check" */
115  TMS570_SYS1.LPOMONCTL = TMS570_SYS1_LPOMONCTL_BIAS_ENABLE |
116                          TMS570_SYS1_LPOMONCTL_OSCFRQCONFIGCNT * 0 |
117                          TMS570_SYS1_LPOMONCTL_HFTRIM( 16 ) |
118                          16; /* LFTRIM  */
119}
120
121/* FIXME */
122enum tms570_flash_power_modes {
123  TMS570_FLASH_SYS_SLEEP = 0U,     /**< Alias for flash bank power mode sleep   */
124  TMS570_FLASH_SYS_STANDBY = 1U,   /**< Alias for flash bank power mode standby */
125  TMS570_FLASH_SYS_ACTIVE = 3U     /**< Alias for flash bank power mode active  */
126};
127
128enum tms570_system_clock_source {
129  TMS570_SYS_CLK_SRC_OSC = 0U,          /**< Alias for oscillator clock Source                */
130  TMS570_SYS_CLK_SRC_PLL1 = 1U,         /**< Alias for Pll1 clock Source                      */
131  TMS570_SYS_CLK_SRC_EXTERNAL1 = 3U,    /**< Alias for external clock Source                  */
132  TMS570_SYS_CLK_SRC_LPO_LOW = 4U,      /**< Alias for low power oscillator low clock Source  */
133  TMS570_SYS_CLK_SRC_LPO_HIGH = 5U,     /**< Alias for low power oscillator high clock Source */
134  TMS570_SYS_CLK_SRC_PLL2 = 6U,         /**< Alias for Pll2 clock Source                      */
135  TMS570_SYS_CLK_SRC_EXTERNAL2 = 7U,    /**< Alias for external 2 clock Source                */
136  TMS570_SYS_CLK_SRC_VCLK = 9U          /**< Alias for synchronous VCLK1 clock Source         */
137};
138
139/**
140 * @brief Setup Flash memory parameters and timing (HCG:setupFlash)
141 *
142 */
143/* SourceId : SYSTEM_SourceId_003 */
144/* DesignId : SYSTEM_DesignId_003 */
145/* Requirements : HL_SR457 */
146void tms570_flash_init( void )
147{
148  /** - Setup flash read mode, address wait states and data wait states */
149  TMS570_FLASH.FRDCNTL = TMS570_FLASH_FRDCNTL_RWAIT( 3 ) |
150                         TMS570_FLASH_FRDCNTL_ASWSTEN |
151                         TMS570_FLASH_FRDCNTL_ENPIPE;
152
153  /** - Setup flash access wait states for bank 7 */
154  TMS570_FLASH.FSMWRENA = TMS570_FLASH_FSMWRENA_WR_ENA( 0x5 );
155  TMS570_FLASH.EEPROMCONFIG = TMS570_FLASH_EEPROMCONFIG_EWAIT( 3 ) |
156                              TMS570_FLASH_EEPROMCONFIG_AUTOSUSP_EN * 0 |
157                              TMS570_FLASH_EEPROMCONFIG_AUTOSTART_GRACE( 2 );
158
159  /** - Disable write access to flash state machine registers */
160  TMS570_FLASH.FSMWRENA = TMS570_FLASH_FSMWRENA_WR_ENA( 0xA );
161
162  /** - Setup flash bank power modes */
163  TMS570_FLASH.FBFALLBACK = TMS570_FLASH_FBFALLBACK_BANKPWR7(
164    TMS570_FLASH_SYS_ACTIVE ) |
165                            TMS570_FLASH_FBFALLBACK_BANKPWR1(
166    TMS570_FLASH_SYS_ACTIVE ) |
167                            TMS570_FLASH_FBFALLBACK_BANKPWR0(
168    TMS570_FLASH_SYS_ACTIVE );
169}
170
171/**
172 * @brief Power-up all peripherals and enable their clocks (HCG:periphInit)
173 *
174 */
175/* SourceId : SYSTEM_SourceId_004 */
176/* DesignId : SYSTEM_DesignId_004 */
177/* Requirements : HL_SR470 */
178void tms570_periph_init( void )
179{
180  /** - Disable Peripherals before peripheral powerup*/
181  TMS570_SYS1.CLKCNTL &= ~TMS570_SYS1_CLKCNTL_PENA;
182
183  /** - Release peripherals from reset and enable clocks to all peripherals */
184  /** - Power-up all peripherals */
185  TMS570_PCR.PSPWRDWNCLR0 = 0xFFFFFFFFU;
186  TMS570_PCR.PSPWRDWNCLR1 = 0xFFFFFFFFU;
187  TMS570_PCR.PSPWRDWNCLR2 = 0xFFFFFFFFU;
188  TMS570_PCR.PSPWRDWNCLR3 = 0xFFFFFFFFU;
189
190  /** - Enable Peripherals */
191  TMS570_SYS1.CLKCNTL |= TMS570_SYS1_CLKCNTL_PENA;
192}
193
194/**
195 * @brief Setup chip clocks including to wait for PLLs locks (HCG:mapClocks)
196 *
197 */
198/* SourceId : SYSTEM_SourceId_005 */
199/* DesignId : SYSTEM_DesignId_005 */
200/* Requirements : HL_SR469 */
201void tms570_map_clock_init( void )
202{
203  uint32_t sys_csvstat, sys_csdis;
204
205  /** @b Initialize @b Clock @b Tree: */
206  /** - Disable / Enable clock domain */
207  TMS570_SYS1.CDDIS = ( 0U << 4U ) |  /* AVCLK 1 OFF */
208                      ( 0U << 5U ) |  /* AVCLK 2 OFF */
209                      ( 0U << 8U ) |  /* VCLK3 OFF */
210                      ( 0U << 9U ) |  /* VCLK4 OFF */
211                      ( 1U << 10U ) | /* AVCLK 3 OFF */
212                      ( 0U << 11U );  /* AVCLK 4 OFF */
213
214  /* Work Around for Errata SYS#46:
215   *
216   * Errata Description:
217   *            Clock Source Switching Not Qualified with Clock Source Enable And Clock Source Valid
218   * Workaround:
219   *            Always check the CSDIS register to make sure the clock source is turned on and check
220   * the CSVSTAT register to make sure the clock source is valid. Then write to GHVSRC to switch the clock.
221   */
222  /** - Wait for until clocks are locked */
223  sys_csvstat = TMS570_SYS1.CSVSTAT;
224  sys_csdis = TMS570_SYS1.CSDIS;
225
226  while ( ( sys_csvstat & ( ( sys_csdis ^ 0xFFU ) & 0xFFU ) ) !=
227          ( ( sys_csdis ^ 0xFFU ) & 0xFFU ) ) {
228    sys_csvstat = TMS570_SYS1.CSVSTAT;
229    sys_csdis = TMS570_SYS1.CSDIS;
230  } /* Wait */
231
232  /* Now the PLLs are locked and the PLL outputs can be sped up */
233  /* The R-divider was programmed to be 0xF. Now this divider is changed to programmed value */
234  TMS570_SYS1.PLLCTL1 =
235    ( TMS570_SYS1.PLLCTL1 & ~TMS570_SYS1_PLLCTL1_PLLDIV( 0x1F ) ) |
236    TMS570_SYS1_PLLCTL1_PLLDIV( 1 - 1 );
237  /*SAFETYMCUSW 134 S MR:12.2 <APPROVED> "LDRA Tool issue" */
238  TMS570_SYS2.PLLCTL3 =
239    ( TMS570_SYS2.PLLCTL3 & ~TMS570_SYS2_PLLCTL3_PLLDIV2( 0x1F ) ) |
240    TMS570_SYS2_PLLCTL3_PLLDIV2( 1 - 1 );
241
242  /* Enable/Disable Frequency modulation */
243  TMS570_SYS1.PLLCTL2 &= ~TMS570_SYS1_PLLCTL2_FMENA;
244
245  /** - Map device clock domains to desired sources and configure top-level dividers */
246  /** - All clock domains are working off the default clock sources until now */
247  /** - The below assignments can be easily modified using the HALCoGen GUI */
248
249  /** - Setup GCLK, HCLK and VCLK clock source for normal operation, power down mode and after wakeup */
250  TMS570_SYS1.GHVSRC = TMS570_SYS1_GHVSRC_GHVWAKE( TMS570_SYS_CLK_SRC_OSC ) |
251                       TMS570_SYS1_GHVSRC_HVLPM( TMS570_SYS_CLK_SRC_OSC ) |
252                       TMS570_SYS1_GHVSRC_GHVSRC( TMS570_SYS_CLK_SRC_PLL1 );
253
254  /** - Setup synchronous peripheral clock dividers for VCLK1, VCLK2, VCLK3 */
255  TMS570_SYS1.CLKCNTL =
256    ( TMS570_SYS1.CLKCNTL & ~TMS570_SYS1_CLKCNTL_VCLK2R( 0xF ) ) |
257    TMS570_SYS1_CLKCNTL_VCLK2R( 1 );
258
259  TMS570_SYS1.CLKCNTL =
260    ( TMS570_SYS1.CLKCNTL & ~TMS570_SYS1_CLKCNTL_VCLKR( 0xF ) ) |
261    TMS570_SYS1_CLKCNTL_VCLKR( 1 );
262
263  TMS570_SYS2.CLK2CNTRL =
264    ( TMS570_SYS2.CLK2CNTRL & ~TMS570_SYS2_CLK2CNTRL_VCLK3R( 0xF ) ) |
265    TMS570_SYS2_CLK2CNTRL_VCLK3R( 1 );
266
267  TMS570_SYS2.CLK2CNTRL = ( TMS570_SYS2.CLK2CNTRL & 0xFFFFF0FFU ) |
268                          ( 1U << 8U ); /* FIXME: unknown in manual*/
269
270  /** - Setup RTICLK1 and RTICLK2 clocks */
271  TMS570_SYS1.RCLKSRC = ( 1U << 24U ) |
272                        ( TMS570_SYS_CLK_SRC_VCLK << 16U ) | /* FIXME: not in manual */
273                        TMS570_SYS1_RCLKSRC_RTI1DIV( 1 ) |
274                        TMS570_SYS1_RCLKSRC_RTI1SRC( TMS570_SYS_CLK_SRC_VCLK );
275
276  /** - Setup asynchronous peripheral clock sources for AVCLK1 and AVCLK2 */
277  TMS570_SYS1.VCLKASRC =
278    TMS570_SYS1_VCLKASRC_VCLKA2S( TMS570_SYS_CLK_SRC_VCLK ) |
279    TMS570_SYS1_VCLKASRC_VCLKA1S( TMS570_SYS_CLK_SRC_VCLK );
280
281  TMS570_SYS2.VCLKACON1 = TMS570_SYS2_VCLKACON1_VCLKA4R( 1 - 1 ) |
282                          TMS570_SYS2_VCLKACON1_VCLKA4_DIV_CDDIS * 0 |
283                          TMS570_SYS2_VCLKACON1_VCLKA4S(
284    TMS570_SYS_CLK_SRC_VCLK ) |
285                          TMS570_SYS2_VCLKACON1_VCLKA3R( 1 - 1 ) |
286                          TMS570_SYS2_VCLKACON1_VCLKA3_DIV_CDDIS * 0 |
287                          TMS570_SYS2_VCLKACON1_VCLKA3S(
288    TMS570_SYS_CLK_SRC_VCLK );
289}
290
291/**
292 * @brief TMS570 system hardware initialization (HCG:systemInit)
293 *
294 */
295/* SourceId : SYSTEM_SourceId_006 */
296/* DesignId : SYSTEM_DesignId_006 */
297/* Requirements : HL_SR471 */
298void tms570_system_hw_init( void )
299{
300  uint32_t efc_check_status;
301
302  /* Configure PLL control registers and enable PLLs.
303   * The PLL takes (127 + 1024 * NR) oscillator cycles to acquire lock.
304   * This initialization sequence performs all the tasks that are not
305   * required to be done at full application speed while the PLL locks.
306   */
307  tms570_pll_init();
308
309  /* Run eFuse controller start-up checks and start eFuse controller ECC self-test.
310   * This includes a check for the eFuse controller error outputs to be stuck-at-zero.
311   */
312  efc_check_status = tms570_efc_check();
313
314  /* Enable clocks to peripherals and release peripheral reset */
315  tms570_periph_init();
316
317  /* Configure device-level multiplexing and I/O multiplexing */
318  tms570_pinmux_init();
319
320  /* Enable external memory interface */
321  TMS570_SYS1.GPREG1 |= TMS570_SYS1_GPREG1_EMIF_FUNC;
322
323  if ( efc_check_status == 0U ) {
324    /* Wait for eFuse controller self-test to complete and check results */
325    if ( tms570_efc_check_self_test() == false ) { /* eFuse controller ECC logic self-test failed */
326      bsp_selftest_fail_notification( EFCCHECK_FAIL1 );           /* device operation is not reliable */
327    }
328  } else if ( efc_check_status == 2U ) {
329    /* Wait for eFuse controller self-test to complete and check results */
330    if ( tms570_efc_check_self_test() == false ) { /* eFuse controller ECC logic self-test failed */
331      bsp_selftest_fail_notification( EFCCHECK_FAIL1 );           /* device operation is not reliable */
332    } else {
333      bsp_selftest_fail_notification( EFCCHECK_FAIL2 );
334    }
335  } else {
336    /* Empty */
337  }
338
339  /** - Set up flash address and data wait states based on the target CPU clock frequency
340   * The number of address and data wait states for the target CPU clock frequency are specified
341   * in the specific part's datasheet.
342   */
343  tms570_flash_init();
344
345  /** - Configure the LPO such that HF LPO is as close to 10MHz as possible */
346  tms570_trim_lpo_init();
347
348  /** - Wait for PLLs to start up and map clock domains to desired clock sources */
349  tms570_map_clock_init();
350
351  /** - set ECLK pins functional mode */
352  TMS570_SYS1.SYSPC1 = 0U;
353
354  /** - set ECLK pins default output value */
355  TMS570_SYS1.SYSPC4 = 0U;
356
357  /** - set ECLK pins output direction */
358  TMS570_SYS1.SYSPC2 = 1U;
359
360  /** - set ECLK pins open drain enable */
361  TMS570_SYS1.SYSPC7 = 0U;
362
363  /** - set ECLK pins pullup/pulldown enable */
364  TMS570_SYS1.SYSPC8 = 0U;
365
366  /** - set ECLK pins pullup/pulldown select */
367  TMS570_SYS1.SYSPC9 = 1U;
368
369  /** - Setup ECLK */
370  TMS570_SYS1.ECPCNTL = TMS570_SYS1_ECPCNTL_ECPSSEL * 0 |
371                        TMS570_SYS1_ECPCNTL_ECPCOS * 0 |
372                        TMS570_SYS1_ECPCNTL_ECPDIV( 8 - 1 );
373}
374
375#if 0
376errata_PBIST_4
377vimInit
378#endif
Note: See TracBrowser for help on using the repository browser.