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