New bitmap method SetRGBConversionFunction which can be used to
[tangerine.git] / rom / timer / timer_init.c
blobd7ae876336a502b74d303542610b168884840bfc
1 /*
2 Copyright © 1995-2006, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Timer startup and device commands
6 */
8 /****************************************************************************************/
10 #include <exec/types.h>
11 #include <exec/io.h>
12 #include <exec/errors.h>
13 #include <exec/devices.h>
14 #include <exec/alerts.h>
15 #include <exec/initializers.h>
16 #include <devices/timer.h>
17 #include <hidd/timer.h>
18 #include <hardware/intbits.h>
20 #include <proto/exec.h>
21 #include <proto/timer.h>
23 #include <aros/symbolsets.h>
25 #include <aros/debug.h>
26 #undef kprintf
27 #include <proto/arossupport.h>
29 //#include "timer_intern.h"
30 #include LC_LIBDEFS_FILE
32 AROS_UFP4(ULONG, VBlankInt,
33 AROS_UFPA(ULONG, dummy, A0),
34 AROS_UFPA(struct TimerBase *, TimerBase, A1),
35 AROS_UFPA(ULONG, dummy2, A5),
36 AROS_UFPA(struct ExecBase *, SysBase, A6)
39 /****************************************************************************************/
41 static int GM_UNIQUENAME(Init)(LIBBASETYPEPTR LIBBASE)
43 /* Setup the timer.device data */
44 LIBBASE->tb_CurrentTime.tv_secs = 0;
45 LIBBASE->tb_CurrentTime.tv_micro = 0;
46 LIBBASE->tb_VBlankTime.tv_secs = 0;
47 LIBBASE->tb_VBlankTime.tv_micro = 1000000 / (SysBase->VBlankFrequency * SysBase->PowerSupplyFrequency);
48 LIBBASE->tb_Elapsed.tv_secs = 0;
49 LIBBASE->tb_Elapsed.tv_micro = 0;
51 D(kprintf("Timer period: %ld secs, %ld micros\n",
52 LIBBASE->tb_VBlankTime.tv_secs, LIBBASE->tb_VBlankTime.tv_micro));
54 LIBBASE->tb_MiscFlags = TF_GO;
56 /* Initialise the lists */
57 NEWLIST( &LIBBASE->tb_Lists[0] );
58 NEWLIST( &LIBBASE->tb_Lists[1] );
59 NEWLIST( &LIBBASE->tb_Lists[2] );
60 NEWLIST( &LIBBASE->tb_Lists[3] );
61 NEWLIST( &LIBBASE->tb_Lists[4] );
63 /* Start up the interrupt server. This is shared between us and the
64 HIDD that deals with the vblank */
65 LIBBASE->tb_VBlankInt.is_Node.ln_Pri = 0;
66 LIBBASE->tb_VBlankInt.is_Node.ln_Type = NT_INTERRUPT;
67 LIBBASE->tb_VBlankInt.is_Node.ln_Name = (STRPTR)MOD_NAME_STRING;
68 LIBBASE->tb_VBlankInt.is_Code = (APTR)&VBlankInt;
69 LIBBASE->tb_VBlankInt.is_Data = LIBBASE;
71 AddIntServer(INTB_TIMERTICK, &LIBBASE->tb_VBlankInt);
73 return TRUE;
76 /****************************************************************************************/
78 static int GM_UNIQUENAME(Open)
80 LIBBASETYPEPTR LIBBASE,
81 struct timerequest *tr,
82 ULONG unitNum,
83 ULONG flags
87 Normally, we should check the length of the message and other
88 such things, however the RKM documents an example where the
89 length of the timerrequest isn't set, so we must not check
90 this.
92 This fixes bug SF# 741580
95 switch(unitNum)
97 case UNIT_VBLANK:
98 case UNIT_WAITUNTIL:
99 tr->tr_node.io_Error = 0;
100 tr->tr_node.io_Unit = (struct Unit *)unitNum;
101 tr->tr_node.io_Device = (struct Device *)LIBBASE;
102 break;
104 case UNIT_MICROHZ:
105 case UNIT_ECLOCK:
106 case UNIT_WAITECLOCK:
107 default:
108 tr->tr_node.io_Error = IOERR_OPENFAIL;
111 return TRUE;
114 /****************************************************************************************/
116 static int GM_UNIQUENAME(Expunge)(LIBBASETYPEPTR LIBBASE)
118 RemIntServer(INTB_VERTB, &LIBBASE->tb_VBlankInt);
119 return TRUE;
122 /****************************************************************************************/
124 ADD2INITLIB(GM_UNIQUENAME(Init), 0)
125 ADD2OPENDEV(GM_UNIQUENAME(Open), 0)
126 ADD2EXPUNGELIB(GM_UNIQUENAME(Expunge), 0)