67 lines
1.6 KiB
C
67 lines
1.6 KiB
C
|
#ifndef TIMER_H
|
||
|
#define TIMER_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
namespace Timer {
|
||
|
/* Timer peripheral (with common registers) */
|
||
|
uint32_t* const TMR_PERIPHERAL_BASE = (uint32_t*)(0x01c20c00);
|
||
|
struct Peripheral {
|
||
|
uint32_t TMR_IRQ_EN_REG;
|
||
|
uint32_t TMR_IRQ_STA_REG;
|
||
|
};
|
||
|
|
||
|
/* Timer modules array */
|
||
|
uint32_t* const TMR_MODULE_BASE = (uint32_t*)(0x01c20c10);
|
||
|
struct TimerModule {
|
||
|
uint32_t TMR_CTLR_REG;
|
||
|
uint32_t TMR_INTV_VALUE_REG;
|
||
|
uint32_t TMR_CUR_VALUE_REG;
|
||
|
};
|
||
|
enum Mode {
|
||
|
CONTINUOUS = 0,
|
||
|
SINGLE = 1
|
||
|
};
|
||
|
enum Prescaler { /* maybe PRESCALERx = log2(x) */
|
||
|
PRESCALER_1 = 0,
|
||
|
PRESCALER_2 = 1,
|
||
|
PRESCALER_4 = 2,
|
||
|
PRESCALER_8 = 3,
|
||
|
PRESCALER_16 = 4,
|
||
|
PRESCALER_32 = 5,
|
||
|
PRESCALER_64 = 6,
|
||
|
PRESCALER_128 = 7
|
||
|
|
||
|
};
|
||
|
enum ClockSource {
|
||
|
LS_OSC = 0, /* Low speed OSC */
|
||
|
OSC24M = 1, /* OSC24M */
|
||
|
PLL66 = 2 /* PLL6/6 */
|
||
|
};
|
||
|
|
||
|
Peripheral* const peripheral = (Peripheral* const)(TMR_PERIPHERAL_BASE);
|
||
|
|
||
|
class Timer {
|
||
|
private:
|
||
|
uint8_t n;
|
||
|
TimerModule* module;
|
||
|
public:
|
||
|
/* Initialize class instance as timer n
|
||
|
* where n is found on Allwinner datasheet */
|
||
|
Timer(uint8_t n);
|
||
|
/* Prepare timer */
|
||
|
void set(uint32_t interval, Mode mode, Prescaler prescaler, ClockSource source);
|
||
|
/* Reload and start timer */
|
||
|
void start(void);
|
||
|
/* Stop timer */
|
||
|
void stop(void);
|
||
|
};
|
||
|
|
||
|
/* Vector of system's timers */
|
||
|
extern Timer timer[];
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|