OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [Common/] [drivers/] [Atmel/] [at91lib/] [peripherals/] [tc/] [tc.c] - Blame information for rev 609

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 608 jeremybenn
/* ----------------------------------------------------------------------------
2
 *         ATMEL Microcontroller Software Support
3
 * ----------------------------------------------------------------------------
4
 * Copyright (c) 2008, Atmel Corporation
5
 *
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions are met:
10
 *
11
 * - Redistributions of source code must retain the above copyright notice,
12
 * this list of conditions and the disclaimer below.
13
 *
14
 * Atmel's name may not be used to endorse or promote products derived from
15
 * this software without specific prior written permission.
16
 *
17
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 * ----------------------------------------------------------------------------
28
 */
29
 
30
//------------------------------------------------------------------------------
31
//         Headers
32
//------------------------------------------------------------------------------
33
 
34
#include "tc.h"
35
 
36
//------------------------------------------------------------------------------
37
//         Global functions
38
//------------------------------------------------------------------------------
39
 
40
//------------------------------------------------------------------------------
41
/// Configures a Timer Counter to operate in the given mode. Timer is stopped
42
/// after configuration and must be restarted with TC_Start().
43
/// to obtain the target frequency.
44
/// \param pTc  Pointer to an AT91S_TC instance.
45
/// \param mode  Operating mode.
46
//------------------------------------------------------------------------------
47
void TC_Configure(AT91S_TC *pTc, unsigned int mode)
48
{
49
    // Disable TC clock
50
    pTc->TC_CCR = AT91C_TC_CLKDIS;
51
 
52
    // Disable interrupts
53
    pTc->TC_IDR = 0xFFFFFFFF;
54
 
55
    // Clear status register
56
    pTc->TC_SR;
57
 
58
    // Set mode
59
    pTc->TC_CMR = mode;
60
}
61
 
62
//------------------------------------------------------------------------------
63
/// Starts the timer clock.
64
/// \param pTc  Pointer to an AT91S_TC instance.
65
//------------------------------------------------------------------------------
66
void TC_Start(AT91S_TC *pTc)
67
{
68
    pTc->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
69
}
70
 
71
//------------------------------------------------------------------------------
72
/// Stops the timer clock.
73
/// \param pTc  Pointer to an AT91S_TC instance.
74
//------------------------------------------------------------------------------
75
void TC_Stop(AT91S_TC *pTc)
76
{
77
    pTc->TC_CCR = AT91C_TC_CLKDIS;
78
}
79
 
80
//------------------------------------------------------------------------------
81
/// Finds the best MCK divisor given the timer frequency and MCK. The result
82
/// is guaranteed to satisfy the following equation:
83
///   (MCK / (DIV * 65536)) <= freq <= (MCK / DIV)
84
/// with DIV being the highest possible value.
85
/// Returns 1 if a divisor could be found; otherwise returns 0.
86
/// \param freq  Desired timer frequency.
87
/// \param mck  Master clock frequency.
88
/// \param div  Divisor value.
89
/// \param tcclks  TCCLKS field value for divisor.
90
//------------------------------------------------------------------------------
91
unsigned char TC_FindMckDivisor(
92
    unsigned int freq,
93
    unsigned int mck,
94
    unsigned int *div,
95
    unsigned int *tcclks)
96
{
97
    const unsigned int divisors[5] = {2, 8, 32, 128,
98
#if defined(at91sam9260) || defined(at91sam9261) || defined(at91sam9263) \
99
    || defined(at91sam9xe) || defined(at91sam9rl64) || defined(at91cap9)
100
        BOARD_MCK / 32768};
101
#else
102
        1024};
103
#endif
104
    unsigned int index = 0;
105
 
106
    // Satisfy lower bound
107
    while (freq < ((mck / divisors[index]) / 65536)) {
108
 
109
        index++;
110
 
111
        // If no divisor can be found, return 0
112
        if (index == 5) {
113
 
114
            return 0;
115
        }
116
    }
117
 
118
    // Try to maximise DIV while satisfying upper bound
119
    while (index < 4) {
120
 
121
        if (freq > (mck / divisors[index + 1])) {
122
 
123
            break;
124
        }
125
        index++;
126
    }
127
 
128
    // Store results
129
    if (div) {
130
 
131
        *div = divisors[index];
132
    }
133
    if (tcclks) {
134
 
135
        *tcclks = index;
136
    }
137
 
138
    return 1;
139
}
140
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.