source: rtems/c/src/lib/libbsp/arm/lm3s69xx/startup/bspstart.c @ bcc6c70

4.115
Last change on this file since bcc6c70 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright © 2013 Eugeniy Meshcheryakov <eugen@debian.org>
3 *
4 * The license and distribution terms for this file may be
5 * found in the file LICENSE in this distribution or at
6 * http://www.rtems.org/license/LICENSE.
7 */
8
9#include <bsp.h>
10#include <bspopts.h>
11#include <bsp/irq-generic.h>
12#include <bsp/lm3s69xx.h>
13#include <bsp/io.h>
14#include <bsp/syscon.h>
15#include <assert.h>
16
17static void init_main_osc(void)
18{
19  volatile lm3s69xx_syscon *syscon = LM3S69XX_SYSCON;
20
21  uint32_t sysdiv_val = LM3S69XX_PLL_FREQUENCY / LM3S69XX_SYSTEM_CLOCK;
22#if defined(LM3S69XX_MCU_LM3S6965) || defined(LM3S69XX_MCU_LM3S3749)
23  assert(sysdiv_val * LM3S69XX_SYSTEM_CLOCK == LM3S69XX_PLL_FREQUENCY);
24#endif
25  assert((sysdiv_val >= 4) && (sysdiv_val <= 16));
26
27  uint32_t rcc = syscon->rcc;
28  uint32_t rcc2 = syscon->rcc2;
29
30  rcc = (rcc & ~SYSCONRCC_USESYSDIV) | SYSCONRCC_BYPASS;
31  rcc2 |= SYSCONRCC2_BYPASS2;
32
33  syscon->rcc = rcc;
34  syscon->rcc2 = rcc2;
35
36  /*
37   As per a note in Stellaris® LM4F120H5QR Microcontroller Data
38   Sheet on page 219: "When transitioning the system clock
39   configuration to use the MOSC as the fundamental clock source, the
40   MOSCDIS bit must be set prior to reselecting the MOSC or an
41   undefined system clock configuration can sporadically occur."
42  */
43
44  rcc |= SYSCONRCC_MOSCDIS;
45  syscon->rcc = rcc;
46
47  rcc = (rcc & ~(SYSCONRCC_XTAL_MSK))
48      | SYSCONRCC_XTAL(LM3S69XX_XTAL_CONFIG);
49  rcc2 = (rcc2 & ~(SYSCONRCC2_PWRDN2 | SYSCONRCC2_OSCSRC2_MSK))
50      | SYSCONRCC2_USERCC2 | SYSCONRCC2_OSCSRC2(0x0);
51
52  /* clear PLL lock interrupt */
53  syscon->misc &= (SYSCONMISC_PLLLMIS);
54
55  syscon->rcc = rcc;
56  syscon->rcc2 = rcc2;
57  lm3s69xx_syscon_delay_3x_clocks(16);
58
59  /* since now, we'll use only RCC2 as SYSCONRCC2_USERCC2 and XTAL
60     (only available in RCC) are already set */
61
62  if (sysdiv_val % 2 == 0) {
63      rcc2 = (rcc2 & ~SYSCONRCC2_SYSDIV2_MSK) | SYSCONRCC2_SYSDIV2(sysdiv_val / 2 - 1);
64
65      rcc2 &= ~(SYSCONRCC2_DIV400);
66  }
67  else {
68      /* need to use DIV400 */
69      rcc2 = (rcc2 & ~SYSCONRCC2_SYSDIV2EXT_MSK) | SYSCONRCC2_SYSDIV2EXT(sysdiv_val - 1)
70          | SYSCONRCC2_DIV400;
71  }
72  syscon->rcc2 = rcc2;
73
74  while ((syscon->ris & SYSCONRIS_PLLLRIS) == 0)
75      /* Wait for PLL lock */;
76
77  rcc2 &= ~(SYSCONRCC2_BYPASS2);
78
79  syscon->rcc2 = rcc2;
80  lm3s69xx_syscon_delay_3x_clocks(16);
81}
82
83static const lm3s69xx_gpio_config start_config_gpio[] = {
84#ifdef LM3S69XX_ENABLE_UART_0
85#if defined(LM3S69XX_MCU_LM3S3749) || defined(LM3S69XX_MCU_LM3S6965) || defined(LM3S69XX_MCU_LM4F120)
86  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_A, 0),
87  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_A, 1),
88#else
89#error No GPIO pin configuration for UART 0
90#endif
91#endif /* LM3S69XX_ENABLE_UART_0 */
92
93#ifdef LM3S69XX_ENABLE_UART_1
94#if defined(LM3S69XX_MCU_LM3S3749)
95  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_B, 0),
96  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_B, 1),
97#elif defined(LM3S69XX_MCU_LM3S6965)
98  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_D, 2),
99  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_D, 3),
100#elif defined(LM3S69XX_MCU_LM4F120)
101  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_B, 0),
102  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_B, 1),
103  LM3S69XX_PIN_UART_RTS(LM3S69XX_PORT_C, 4),
104  LM3S69XX_PIN_UART_CTS(LM3S69XX_PORT_C, 5),
105#else
106#error No GPIO pin configuration for UART 1
107#endif
108#endif /* LM3S69XX_ENABLE_UART_1 */
109
110#ifdef LM3S69XX_ENABLE_UART_2
111#if defined(LM3S69XX_MCU_LM3S3749)
112  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_D, 0),
113  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_D, 1),
114#elif defined(LM3S69XX_MCU_LM3S6965)
115  LM3S69XX_PIN_UART_RX(LM3S69XX_PORT_G, 0),
116  LM3S69XX_PIN_UART_TX(LM3S69XX_PORT_G, 1),
117#else
118#error No GPIO pin configuration for UART 2
119#endif
120#endif /* LM3S69XX_ENABLE_UART_2 */
121};
122
123static void init_gpio(void)
124{
125#if LM3S69XX_USE_AHB_FOR_GPIO
126  volatile lm3s69xx_syscon *syscon = LM3S69XX_SYSCON;
127
128  syscon->gpiohbctl |= SYSCONGPIOHBCTL_PORTA | SYSCONGPIOHBCTL_PORTB
129      | SYSCONGPIOHBCTL_PORTC | SYSCONGPIOHBCTL_PORTD
130      | SYSCONGPIOHBCTL_PORTE | SYSCONGPIOHBCTL_PORTF
131#if LM3S69XX_NUM_GPIO_BLOCKS > 6
132      | SYSCONGPIOHBCTL_PORTG
133#if LM3S69XX_NUM_GPIO_BLOCKS > 7
134      | SYSCONGPIOHBCTL_PORTH
135#endif
136#endif
137      ;
138
139#endif /* LM3S69XX_USE_AHB_FOR_GPIO */
140
141  lm3s69xx_gpio_set_config_array(start_config_gpio,
142      sizeof(start_config_gpio) / sizeof(start_config_gpio[0]));
143}
144
145void bsp_start(void)
146{
147  init_main_osc();
148  init_gpio();
149  bsp_interrupt_initialize();
150}
Note: See TracBrowser for help on using the repository browser.