diff options
author | aiju <aiju@phicode.de> | 2014-12-24 10:21:51 +0100 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2014-12-24 10:21:51 +0100 |
commit | 7a3f0998a0ce7470d70c1a13bc4646abafdcc236 (patch) | |
tree | 9cea39d933719c0b82eb242ec286c25eed0d728c /sys/src/9/zynq/timer.c | |
parent | 6dafa424805d128fcd08c71dca3e3abdc40aa6c6 (diff) |
added zynq kernel
Diffstat (limited to 'sys/src/9/zynq/timer.c')
-rw-r--r-- | sys/src/9/zynq/timer.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/src/9/zynq/timer.c b/sys/src/9/zynq/timer.c new file mode 100644 index 000000000..42211446c --- /dev/null +++ b/sys/src/9/zynq/timer.c @@ -0,0 +1,91 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" + +enum { + TIMERDIV = 1, + LTIMERDIV = 1, + + ARM_PLL_CTRL = 0x100/4, + ARM_CLK_CTRL = 0x120/4, + + GTIMERVALL = 0x200/4, + GTIMERVALH, + GTIMERCTL, + LTIMERVAL = 0x604/4, + LTIMERCTL, + LTIMERISR, +}; + +uvlong timerhz; + +void +delay(int) +{ +} + +void +microdelay(int) +{ +} + +uvlong +fastticks(uvlong *hz) +{ + ulong lo, hi; + + if(hz != nil) + *hz = timerhz; + do{ + hi = mpcore[GTIMERVALH]; + lo = mpcore[GTIMERVALL]; + }while(hi != mpcore[GTIMERVALH]); + return lo | (uvlong)hi << 32; +} + +ulong +µs(void) +{ + NOPE + return 0; +} + +void +timerset(Tval v) +{ + vlong w; + + w = v - fastticks(nil); + if(w < 1) + w = 1; + if(w > 0xffffffffLL) + w = 0xffffffff; + mpcore[LTIMERCTL] &= ~1; + mpcore[LTIMERVAL] = w; + mpcore[LTIMERCTL] |= 1; +} + +void +timerirq(Ureg *u, void *) +{ + if((mpcore[LTIMERISR] & 1) != 0){ + mpcore[LTIMERISR] |= 1; + timerintr(u, 0); + } +} + +void +timerinit(void) +{ + int mhz; + + mhz = PS_CLK * (slcr[ARM_PLL_CTRL] >> 12 & 0x7f) / (slcr[ARM_CLK_CTRL] >> 8 & 0x3f); + timerhz = mhz * 500000; + mpcore[GTIMERCTL] = TIMERDIV - 1 << 8 | 3; + mpcore[LTIMERCTL] = LTIMERDIV - 1 << 8 | 4; + intrenable(TIMERIRQ, timerirq, nil, EDGE, "clock"); + setpmcr(7); +} |