[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.1, Sat Nov 24 20:51:30 2007 UTC (16 years, 6 months ago) by nbrk
Branch: MAIN

driver for Real Time Timer.
this is a simple device provides periodic interrupts or alarms;
not functional yet

/*
 * $Id: sartt.c,v 1.1 2007/11/24 20:51:30 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 <arch/sam7s64/dev/saaicvar.h> /* XXX */
#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));

	/* enable coresponding interrupt source in AIC */
	saaic_unmask_intr(1);
	/* XXX should not be here */
}


uint32_t
sartt_getsec(void)
{
	/*
	 * Get seconds.
	 */
	if (sarttdd == NULL)
		panic("sartt_getsec: can't get seconds from rtc: default device not configured\n");

	/* TODO */
	return(0);
}


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