Files
beaglefw/drv_omap35x_gpt.cc

92 lines
2.8 KiB
C++

#include <cstdint>
#include <cstring>
#include <cassert>
#include <functional>
#include "omap35x_intc.hh"
#include "util.hh"
#include "mmio.hh"
#include "drv_omap35x_gpt.hh"
#define TIOCP_CFG 4
#define TISR 6
#define TIER 7
#define TWER 8
#define TCLR 9
#define TCRR 10
#define TLDR 11
#define TPIR 18
#define TNIR 19
class OMAP35x_GPT_impl {
public:
OMAP35x_GPT_impl(uintptr_t base, int irq) : base_{base}, irq_{irq} {
}
~OMAP35x_GPT_impl() {
OMAP35x_intc::get().disable_int(irq_);
}
void ticktimer(int_handler_t handler) {
r_tiocp_cfg() = 0x215; // Clockactiviy = 2, emufree = 0, idlemode = 2 (smartidle), wakeup = ena, autoidle = 1
r_tldr() = -327;
r_tcrr() = -327;
r_tpir() = 320000;
r_tnir() = -680000;
handler_ = handler;
OMAP35x_intc::get().register_handler(irq_, std::bind(&OMAP35x_GPT_impl::irqhandler, this), 0);
r_tclr() = 0x3; // autoreload = 1, start = 1
r_tier() = 0x2; // Overflow int = enable
r_twer() = 0x2; // Overflow wakeup = enable
OMAP35x_intc::get().enable_int(irq_);
}
private:
void irqhandler() {
if(handler_)
handler_();
r_tisr() = 0x2;
}
uint32_t volatile& r_tidr() {return _reg32(base_.get_virt(), 0x0); }
uint32_t volatile& r_tiocp_cfg() {return _reg32(base_.get_virt(), 0x10); }
uint32_t volatile& r_tistat() {return _reg32(base_.get_virt(), 0x14); }
uint32_t volatile& r_tisr() {return _reg32(base_.get_virt(), 0x18); }
uint32_t volatile& r_tier() {return _reg32(base_.get_virt(), 0x1c); }
uint32_t volatile& r_twer() {return _reg32(base_.get_virt(), 0x20); }
uint32_t volatile& r_tclr() {return _reg32(base_.get_virt(), 0x24); }
uint32_t volatile& r_tcrr() {return _reg32(base_.get_virt(), 0x28); }
uint32_t volatile& r_tldr() {return _reg32(base_.get_virt(), 0x2c); }
uint32_t volatile& r_ttgr() {return _reg32(base_.get_virt(), 0x30); }
uint32_t volatile& r_twps() {return _reg32(base_.get_virt(), 0x34); }
uint32_t volatile& r_tmar() {return _reg32(base_.get_virt(), 0x38); }
uint32_t volatile& r_tcar1() {return _reg32(base_.get_virt(), 0x3c); }
uint32_t volatile& r_tsicr() {return _reg32(base_.get_virt(), 0x40); }
uint32_t volatile& r_tcar2() {return _reg32(base_.get_virt(), 0x44); }
uint32_t volatile& r_tpir() {return _reg32(base_.get_virt(), 0x48); }
uint32_t volatile& r_tnir() {return _reg32(base_.get_virt(), 0x4c); }
uint32_t volatile& r_tcvr() {return _reg32(base_.get_virt(), 0x50); }
uint32_t volatile& r_tocr() {return _reg32(base_.get_virt(), 0x54); }
uint32_t volatile& r_towr() {return _reg32(base_.get_virt(), 0x58); }
MMIO_alloc base_;
int irq_;
int_handler_t handler_;
};
OMAP35x_GPT::OMAP35x_GPT(uintptr_t base, int irq) : impl_{new OMAP35x_GPT_impl{base, irq}} {
}
OMAP35x_GPT::~OMAP35x_GPT() {
}
void OMAP35x_GPT::ticktimer(int_handler_t handler) {
impl_->ticktimer(handler);
}