/* * $Id: sartt.c,v 1.1 2007/11/24 20:51:30 nbrk Exp $ */ #include #include #include #include #include #include #include /* XXX */ #include /* * 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(); }