source: buchla-emu/emu/tim.c@ 52c8401

Last change on this file since 52c8401 was 52c8401, checked in by Alexander Heinrich <alex.heinrich@…>, 7 years ago

Formatting

  • Property mode set to 100644
File size: 2.6 KB
Line 
1/*
2 * Copyright (C) 2017 The Contributors
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * A copy of the GNU General Public License can be found in the file
15 * "gpl.txt" in the top directory of this repository.
16 */
17
18#include <all.h>
19
20#define ver(...) _ver(tim_verbose, 0, __VA_ARGS__)
21#define ver2(...) _ver(tim_verbose, 1, __VA_ARGS__)
22#define ver3(...) _ver(tim_verbose, 2, __VA_ARGS__)
23
24typedef struct {
25 uint32_t irq;
26 bool run;
27 uint32_t latch;
28 uint32_t count;
29} state_timer;
30
31static state_timer timers[] = {
32 {.irq = 0, .run = false, .latch = 32, .count = 32},
33 {.irq = 0, .run = false, .latch = 3200, .count = 3200},
34 {.irq = 0, .run = false, .latch = 801, .count = 801}
35};
36
37#define REG_CRX 0
38#define REG_CR2 1
39#define REG_T1H 2
40#define REG_T1L 3
41#define REG_T2H 4
42#define REG_T2L 5
43#define REG_T3H 6
44#define REG_T3L 7
45
46int32_t tim_verbose = 0;
47
48void tim_init(void)
49{
50 ver("tim init");
51}
52
53void tim_quit(void)
54{
55 ver("tim quit");
56}
57
58bool tim_exec(void)
59{
60 for (int32_t i = 0; i < ARRAY_COUNT(timers); ++i) {
61 if(timers[i].run == true) {
62 --timers[i].count;
63 if(timers[i].count == 0) {
64 timers[i].count = timers[i].latch;
65 timers[i].irq = 1;
66 }
67 //ver2("tim%d %u", i, timers[i].count);
68 }
69 }
70
71 return timers[0].irq || timers[1].irq || timers[2].irq;
72}
73
74uint32_t tim_read(uint32_t off, int32_t sz)
75{
76 ver2("tim rd %u:%d", off, sz * 8);
77 uint32_t rv;
78 rv = 0;
79 switch(off) {
80 case REG_CRX:
81 break;
82
83 case REG_CR2:
84 rv |= (timers[0].irq << 0);
85 rv |= (timers[1].irq << 1);
86 rv |= (timers[2].irq << 2);
87 ver2("tim plc %u fc %u rtc %u", timers[0].irq, timers[1].irq, timers[2].irq);
88 //ver2("tim rv %u", rv);
89 break;
90
91 case REG_T1H:
92 rv = 0;
93 break;
94
95 case REG_T1L:
96 rv = 31;
97 timers[0].irq = 0;
98 break;
99
100 case REG_T2H:
101 rv = 12;
102 break;
103
104 case REG_T2L:
105 rv = 127;
106 timers[1].irq = 0;
107 break;
108
109 case REG_T3H:
110 rv = 3;
111 break;
112
113 case REG_T3L:
114 rv = 32;
115 timers[2].irq = 0;
116 break;
117
118 default:
119 break;
120 }
121
122 return rv;
123}
124
125void tim_write(uint32_t off, int32_t sz, uint32_t val)
126{
127 ver2("tim wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
128 if( off == 0 && (val & (1 << 7)) ) {
129 timers[0].run = true;
130 timers[1].run = true;
131 timers[2].run = true;
132 }
133}
Note: See TracBrowser for help on using the repository browser.