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

Annotation of funnyos/arch/sam7s64/dev/sartt.c, Revision 1.2

1.1       nbrk        1: /*
1.2     ! nbrk        2:  * $Id: sartt.c,v 1.1 2007/11/24 20:51:30 nbrk Exp $
1.1       nbrk        3:  */
                      4: #include <sys/types.h>
                      5: #include <sys/device.h>
                      6: #include <sys/bus.h>
                      7:
                      8: #include <sys/kern_time.h>
                      9: #include <arch/sam7s64/dev/sarttvar.h>
                     10: #include <arch/sam7s64/dev/at91sam7.h>
                     11:
                     12: #include <libkern/printf.h>
                     13:
                     14: /*
                     15:  * Real Time Timer.
                     16:  */
                     17: int    sartt_attach(struct device *, uint32_t loc, uint8_t flags);
                     18: void   sartt_interrupt(struct device *);
                     19: void   sartt_sethz(uint8_t hz);
                     20: uint32_t sartt_getsec(void);
                     21: uint32_t sartt_getusec(void);
                     22:
                     23:
                     24: /* default sartt device to use; will bind to first sartt instance */
                     25: struct sartt_dd *sarttdd = NULL;
                     26: extern struct rtcops sysrtcops;
                     27:
                     28: struct driver sartt_dr = {
                     29:        sizeof(struct sartt_dd),
                     30:        sartt_attach,
                     31:        NULL,
                     32:        sartt_interrupt
                     33: };
                     34:
                     35:
                     36: int
                     37: sartt_attach(struct device *self, uint32_t loc, uint8_t flags)
                     38: {
                     39:        struct sartt_dd *ddp = self->dv_devdata;
                     40:        uint32_t value;
                     41:
                     42:        /* acquire bus_handle from parent */
                     43:        ddp->sr_bhp = self->dv_parent->dv_aux;
                     44:
                     45:        /* read counter value */
                     46:        value = bus_read_4(ddp->sr_bhp, (uint32_t)AT91C_RTTC_RTVR);
                     47:
                     48:        printf("SAM7 Real Time Timer (value=%d)\n", value);
                     49:
                     50:        /* set default sartt */
                     51:        sarttdd = ddp;
                     52:
                     53:        /* fill-in rtcops to be used by kern_time */
                     54:        sysrtcops.ro_sethz = sartt_sethz;
                     55:        sysrtcops.ro_getsec = sartt_getsec;
                     56:        sysrtcops.ro_getusec = sartt_getusec;
                     57:
                     58:        return(0);
                     59:
                     60: }
                     61:
                     62:
                     63: void
                     64: sartt_sethz(uint8_t hz)
                     65: {
                     66:        /*
                     67:         * Set timer frequency.
                     68:         * RTT is clocked from 32768Hz SCK (Slow Clock) oscillator.
                     69:         * Default prescaler value is 2^16 (32768) means that after reset HZ is 1 (1 second).
                     70:         */
                     71:        if (sarttdd == NULL)
                     72:                panic("sartt_sethz: can't calibrate timer: default device not configured\n");
                     73:
                     74:        /* program prescaler (which is 2^16/HZ) and enable timer interrupts */
1.2     ! nbrk       75:        //bus_write_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTMR, AT91C_RTTC_RTTINCIEN | (32768 / hz));
        !            76:        bus_write_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTMR, AT91C_RTTC_RTTRST | 32768);
1.1       nbrk       77: }
                     78:
                     79:
                     80: uint32_t
                     81: sartt_getsec(void)
                     82: {
                     83:        /*
                     84:         * Get seconds.
                     85:         */
                     86:        if (sarttdd == NULL)
                     87:                panic("sartt_getsec: can't get seconds from rtc: default device not configured\n");
                     88:
1.2     ! nbrk       89:        return(bus_read_4(sarttdd->sr_bhp, (uint32_t)AT91C_RTTC_RTVR));
1.1       nbrk       90: }
                     91:
                     92:
                     93: uint32_t
                     94: sartt_getusec(void)
                     95: {
                     96:        /*
                     97:         * Get microseconds.
                     98:         */
                     99:        if (sarttdd == NULL)
                    100:                panic("sartt_getusec: can't get microseconds from rtc: default device not configured\n");
                    101:
                    102:        /* TODO */
                    103:        return(0);
                    104: }
                    105:
                    106:
                    107: void
                    108: sartt_interrupt(struct device *self)
                    109: {
                    110:        /* process system tick */
                    111:        sysclock();
                    112: }
                    113:

CVSweb