[BACK]Return to sartt.c CVS log [TXT][DIR] Up to [local] / funnyos / arch / sam7s64 / dev

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();
}