embox
71 строка · 1.9 Кб
1/**
2* @file
3* @brief Timer Counter interface realization
4*
5* @date
6* @author Anton Kozlov
7*/
8
9#include <stdint.h>
10#include <stdbool.h>
11#include <stddef.h>
12#include <assert.h>
13
14#include <drivers/at91sam7s256.h>
15#include <drivers/timer_counter/at91_timer_counter.h>
16
17#include <hal/reg.h>
18
19
20void tc_init(uint8_t channel) {
21assert(channel < 3);
22REG_STORE(AT91C_PMC_PCER, (1L << (AT91C_ID_TC0 + channel)));
23}
24
25void tc_config_input(uint8_t channel, uint32_t clock_mode) {
26assert(channel < 3);
27REG_ORIN(((uint8_t *) AT91C_TC0_CMR) + channel * sizeof(AT91S_TCB),
28clock_mode);
29}
30
31void tc_reset(uint8_t channel) {
32//assert(channel < 3);
33REG_STORE(((uint8_t *) AT91C_TC0_CCR) + channel * sizeof(AT91S_TCB),
34AT91C_TC_CLKEN | AT91C_TC_SWTRG);
35}
36
37uint32_t tc_counter_value(uint8_t channel) {
38//assert(channel < 3);
39return REG_LOAD(((uint8_t *) AT91C_TC0_CV) + channel * sizeof(AT91S_TCB));
40}
41
42void tc_set_limit(uint8_t channel, uint32_t limit) {
43REG_STORE(AT91C_TC0_RC + channel * sizeof(AT91S_TCB), limit);
44REG_ORIN(((uint8_t *) AT91C_TC0_CMR) + channel * sizeof(AT91S_TCB),
45AT91C_TC_CPCTRG);
46}
47
48void tc_limit_int_enable(uint8_t channel, irq_handler_t handler) {
49// TODO check return code.
50irq_attach(AT91C_ID_TC0 + channel, handler, 0, NULL, "Timer limit handler");
51REG_STORE(((uint8_t *) AT91C_TC0_IER) + channel * sizeof(AT91S_TCB), AT91C_TC_CPCS);
52}
53
54void tc_limit_int_disable(uint8_t channel) {
55REG_STORE(((uint8_t *) AT91C_TC0_IDR) + channel * sizeof(AT91S_TCB), AT91C_TC_CPCS);
56// TODO check return code.
57irq_detach(AT91C_ID_TC0 + channel, NULL);
58}
59
60bool tc_was_overflowed(uint8_t channel) {
61//assert(channel < 3);
62return REG_LOAD(((uint8_t *) AT91C_TC0_SR) + channel * sizeof(AT91S_TCB)) &
63AT91C_TC_COVFS;
64}
65
66void tc_stop(uint8_t channel) {
67//assert(channel < 3);
68REG_STORE(((uint8_t *) AT91C_TC0_CCR) + channel * sizeof(AT91S_TCB),
69AT91C_TC_CLKDIS);
70//REG_STORE(AT91C_PMC_PCDR, (1L << (AT91C_ID_TC0 + channel)));
71}
72