gbasys

annotate src/timer.c @ 12:a6ddf338a111

line clipping
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 01 Feb 2016 04:41:27 +0200
parents 875ef6085efc
children
rev   line source
nuclear@0 1 /*
nuclear@7 2 gbasys - a gameboy advance hardware abstraction library
nuclear@7 3 Copyright (C) 2004-2014 John Tsiombikas <nuclear@member.fsf.org>
nuclear@0 4
nuclear@7 5 This program is free software: you can redistribute it and/or modify
nuclear@0 6 it under the terms of the GNU General Public License as published by
nuclear@7 7 the Free Software Foundation, either version 3 of the License, or
nuclear@0 8 (at your option) any later version.
nuclear@0 9
nuclear@0 10 This program is distributed in the hope that it will be useful,
nuclear@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@0 13 GNU General Public License for more details.
nuclear@0 14
nuclear@0 15 You should have received a copy of the GNU General Public License
nuclear@7 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@0 17 */
nuclear@0 18 #include <limits.h>
nuclear@0 19 #include "intr.h"
nuclear@0 20 #include "signal.h"
nuclear@0 21
nuclear@0 22 /* prescalar selection based on the system clock (16.78MHz) */
nuclear@0 23 #define TIMER_CNTL_CLK 0
nuclear@0 24 #define TIMER_CNTL_CLK64 1
nuclear@0 25 #define TIMER_CNTL_CLK256 2
nuclear@0 26 #define TIMER_CNTL_CLK1024 3
nuclear@0 27
nuclear@0 28 /* control bits */
nuclear@0 29 #define TIMER_CNTL_COUNTUP 4
nuclear@0 30 #define TIMER_CNTL_INTR 0x40
nuclear@0 31 #define TIMER_CNTL_ENABLE 0x80
nuclear@0 32
nuclear@0 33 static void timer_intr_handler(void);
nuclear@0 34
nuclear@0 35 volatile static unsigned short *reg_timer[] = {(void*)0x4000100, (void*)0x4000104, (void*)0x4000108, (void*)0x400010c};
nuclear@0 36 static unsigned short *reg_timer_cntl[] = {(void*)0x4000102, (void*)0x4000106, (void*)0x400010a, (void*)0x400010e};
nuclear@0 37
nuclear@0 38 static unsigned long milli_sec;
nuclear@0 39 static unsigned long alarm_val;
nuclear@0 40
nuclear@0 41 void enable_timer(int timer) {
nuclear@0 42 *reg_timer_cntl[timer] |= TIMER_CNTL_ENABLE;
nuclear@0 43 }
nuclear@0 44
nuclear@0 45 void disable_timer(int timer) {
nuclear@0 46 *reg_timer_cntl[timer] &= ~TIMER_CNTL_ENABLE;
nuclear@0 47 }
nuclear@0 48
nuclear@0 49 void reset_msec_timer(void) {
nuclear@0 50 *reg_timer_cntl[0] &= ~TIMER_CNTL_ENABLE;
nuclear@0 51 interrupt(INTR_TIMER0, timer_intr_handler);
nuclear@0 52 milli_sec = 0;
nuclear@0 53 *reg_timer[0] = USHRT_MAX - 16779;
nuclear@0 54 *reg_timer_cntl[0] = TIMER_CNTL_INTR | TIMER_CNTL_ENABLE;
nuclear@0 55 unmask(INTR_TIMER0);
nuclear@0 56 }
nuclear@0 57
nuclear@0 58
nuclear@0 59 unsigned long get_millisec(void) {
nuclear@0 60 return milli_sec;
nuclear@0 61 }
nuclear@0 62
nuclear@0 63 unsigned int alarm(unsigned int seconds) {
nuclear@0 64 unsigned int prev = alarm_val;
nuclear@0 65 alarm_val = seconds * 1000;
nuclear@0 66 }
nuclear@0 67
nuclear@0 68 static void timer_intr_handler(void) {
nuclear@0 69 milli_sec++;
nuclear@0 70
nuclear@0 71 if(alarm_val > 0) {
nuclear@0 72 if(!--alarm_val) raise(SIGALRM);
nuclear@0 73 }
nuclear@0 74 }