File: [local] / funnyos / arch / sam7s64 / dev / sartt.c (download)
Revision 1.2, Sun Dec 16 23:23:16 2007 UTC (16 years, 5 months ago) by nbrk
Branch: MAIN
CVS Tags: HEAD Changes since 1.1: +4 -9 lines
do not ugly enable our interrupt; saaic will do all the magic after my last commit.
implement sarrt_readsec() to just read RTT value register.
|
/*
* $Id: sartt.c,v 1.2 2007/12/16 23:23:16 nbrk Exp $
*/
#include <sys/types.h>
#include <sys/device.h>
#include <sys/bus.h>
#include <sys/kern_time.h>
#include <arch/sam7s64/dev/sarttvar.h>
#include <arch/sam7s64/dev/at91sam7.h>
#include <libkern/printf.h>
/*
* Real Time Timer.
*/
int sartt_attach(struct device *, uint32_t loc, uint8_t flags);
void sartt_interrupt(struct device *);
void sartt_sethz(uint8_t hz);
uint32_t sartt_getsec(void);
uint32_t sartt_getusec(void);
/* default sartt device to use; will bind to first sartt instance */
struct sartt_dd *sarttdd = NULL;
extern struct rtcops sysrtcops;
struct driver sartt_dr = {
sizeof(struct sartt_dd),
sartt_attach,
NULL,
sartt_interrupt
};
int
sartt_attach(struct device *self, uint32_t loc, uint8_t flags)
{
struct sartt_dd *ddp = self->dv_devdata;
uint32_t value;
/* acquire bus_handle from parent */
ddp->sr_bhp = self->dv_parent->dv_aux;
/* read counter value */
value = bus_read_4(ddp->sr_bhp, (uint32_t)AT91C_RTTC_RTVR);
printf("SAM7 Real Time Timer (value=%d)\n", value);
/* set default sartt */
sarttdd = ddp;
/* fill-in rtcops to be used by kern_time */
sysrtcops.ro_sethz = sartt_sethz;
sysrtcops.ro_getsec = sartt_getsec;
sysrtcops.ro_getusec = sartt_getusec;
return(0);
}
void
sartt_sethz(uint8_t hz)
{
/*
* Set timer frequency.
* RTT is clocked from 32768Hz SCK (Slow Clock) oscillator.
* Default prescaler value is 2^16 (32768) means that after reset HZ is 1 (1 second).
*/
if (sarttdd == NULL)
panic("sartt_sethz: can't calibrate timer: default device not configured\n");
/* program prescaler (which is 2^16/HZ) and enable timer interrupts */
//bus_write_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTMR, AT91C_RTTC_RTTINCIEN | (32768 / hz));
bus_write_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTMR, AT91C_RTTC_RTTRST | 32768);
}
uint32_t
sartt_getsec(void)
{
/*
* Get seconds.
*/
if (sarttdd == NULL)
panic("sartt_getsec: can't get seconds from rtc: default device not configured\n");
return(bus_read_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTVR));
}
uint32_t
sartt_getusec(void)
{
/*
* Get microseconds.
*/
if (sarttdd == NULL)
panic("sartt_getusec: can't get microseconds from rtc: default device not configured\n");
/* TODO */
return(0);
}
void
sartt_interrupt(struct device *self)
{
/* process system tick */
sysclock();
}