source: rtems/c/src/lib/libcpu/arm/at91rm9200/pmc/pmc.c @ 359e537

4.104.115
Last change on this file since 359e537 was 359e537, checked in by Ralf Corsepius <ralf.corsepius@…>, on 11/30/09 at 05:09:41

Whitespace removal.

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