source: rtems/bsps/arm/csb337/start/pmc.c

Last change on this file was 9964895, checked in by Sebastian Huber <sebastian.huber@…>, on 04/20/18 at 08:35:35

bsps: Move startup files to bsps

Adjust build support files to new directory layout.

This patch is a part of the BSP source reorganization.

Update #3285.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*
2 * Atmel AT91RM9200 PMC functions
3 *
4 * Copyright (c) 2004 by Jay Monkman <jtm@lopingdog.com>
5 *
6 *  The license and distribution terms for this file may be
7 *  found in the file LICENSE in this distribution or at
8 *  http://www.rtems.org/license/LICENSE.
9 */
10
11#include <rtems.h>
12#include <bsp.h>
13#include <at91rm9200.h>
14#include <at91rm9200_pmc.h>
15
16int at91rm9200_get_mainclk(void)
17{
18    return BSP_MAIN_FREQ;
19}
20
21int at91rm9200_get_slck(void)
22{
23    return BSP_SLCK_FREQ;
24}
25
26int at91rm9200_get_mck(void)
27{
28    uint32_t mck_reg;
29    uint32_t mck_freq = 0;  /* to avoid warnings */
30    uint32_t pll_reg;
31    int prescaler = 0;  /* to avoid warnings */
32
33    mck_reg = PMC_REG(PMC_MCKR);
34
35    switch(mck_reg & PMC_MCKR_PRES_MASK) {
36    case PMC_MCKR_PRES_1:
37        prescaler = 1;
38        break;
39    case PMC_MCKR_PRES_2:
40        prescaler = 2;
41        break;
42    case PMC_MCKR_PRES_4:
43        prescaler = 4;
44        break;
45    case PMC_MCKR_PRES_8:
46        prescaler = 8;
47        break;
48    case PMC_MCKR_PRES_16:
49        prescaler = 16;
50        break;
51    case PMC_MCKR_PRES_32:
52        prescaler = 32;
53        break;
54    case PMC_MCKR_PRES_64:
55        prescaler = 64;
56        break;
57    }
58
59    /* Let's find out what MCK's source is */
60    switch (mck_reg & PMC_MCKR_CSS_MASK) {
61    case PMC_MCKR_CSS_SLOW:
62        /* I'm assuming the slow clock is 32.768 MHz */
63        mck_freq = at91rm9200_get_slck() / prescaler;
64        break;
65
66    case PMC_MCKR_CSS_MAIN:
67        mck_freq = at91rm9200_get_mainclk() / prescaler;
68        break;
69
70    case PMC_MCKR_CSS_PLLA:
71        pll_reg = PMC_REG(PMC_PLLAR);
72        mck_freq = at91rm9200_get_mainclk() / prescaler;
73        mck_freq = mck_freq / (pll_reg & PMC_PLLAR_DIV_MASK);
74        mck_freq = mck_freq * (((pll_reg & PMC_PLLAR_MUL_MASK) >> 16) + 1);
75        break;
76
77    case PMC_MCKR_CSS_PLLB:
78        pll_reg = PMC_REG(PMC_PLLBR);
79        mck_freq = at91rm9200_get_mainclk() / prescaler;
80        mck_freq = mck_freq / (pll_reg & PMC_PLLBR_DIV_MASK);
81        mck_freq = mck_freq * (((pll_reg & PMC_PLLBR_MUL_MASK) >> 16) + 1);
82        break;
83    }
84
85    if ((mck_reg & PMC_MCKR_MDIV_MASK) == PMC_MCKR_MDIV_2) {
86        mck_freq = mck_freq / 2;
87    } else if ((mck_reg & PMC_MCKR_MDIV_MASK) == PMC_MCKR_MDIV_3) {
88        mck_freq = mck_freq / 3;
89    } else if ((mck_reg & PMC_MCKR_MDIV_MASK) == PMC_MCKR_MDIV_4) {
90        mck_freq = mck_freq / 4;
91    }
92
93
94    return mck_freq;
95}
96
Note: See TracBrowser for help on using the repository browser.