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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTEX_AT91SAM3U256_IAR/] [AT91Lib/] [peripherals/] [tc/] [tc.c] - Blame information for rev 580

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 580 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(). All the
43
/// interrupts of the timer are also disabled.
44
/// \param pTc  Pointer to an AT91S_TC instance.
45
/// \param mode  Operating mode (TC_CMR value).
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
/// Enables the timer clock and performs a software reset to start the counting.
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
/// Disables the timer clock, stopping the counting.
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
/// \pre
84
///   (MCK / (DIV * 65536)) <= freq <= (MCK / DIV)
85
/// \endpre
86
/// with DIV being the highest possible value.
87
/// \param freq  Desired timer frequency.
88
/// \param mck  Master clock frequency.
89
/// \param div  Divisor value.
90
/// \param tcclks  TCCLKS field value for divisor.
91
/// \return 1 if a proper divisor has been found; otherwise 0.
92
//------------------------------------------------------------------------------
93
unsigned char TC_FindMckDivisor(
94
    unsigned int freq,
95
    unsigned int mck,
96
    unsigned int *div,
97
    unsigned int *tcclks)
98
{
99
    const unsigned int divisors[5] = {2, 8, 32, 128,
100
#if defined(at91sam9260) || defined(at91sam9261) || defined(at91sam9263) \
101
    || defined(at91sam9xe) || defined(at91sam9rl64) || defined(at91cap9) \
102
    || defined(at91sam9m10) || defined(at91sam9m11)
103
        BOARD_MCK / 32768};
104
#else
105
        1024};
106
#endif
107
    unsigned int index = 0;
108
 
109
    // Satisfy lower bound
110
    while (freq < ((mck / divisors[index]) / 65536)) {
111
 
112
        index++;
113
 
114
        // If no divisor can be found, return 0
115
        if (index == 5) {
116
 
117
            return 0;
118
        }
119
    }
120
 
121
    // Try to maximise DIV while satisfying upper bound
122
    while (index < 4) {
123
 
124
        if (freq > (mck / divisors[index + 1])) {
125
 
126
            break;
127
        }
128
        index++;
129
    }
130
 
131
    // Store results
132
    if (div) {
133
 
134
        *div = divisors[index];
135
    }
136
    if (tcclks) {
137
 
138
        *tcclks = index;
139
    }
140
 
141
    return 1;
142
}
143
 

powered by: WebSVN 2.1.0

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