49 for (
int i = 0; i < 3; ++i) {
50 memset(&m_timer[i], 0,
sizeof(TimerInfo));
52 m_timer[i].RLMode = 3;
53 m_timer[i].latch = -1;
54 m_timer[i].LSBToggle =
true;
56 m_lastTickTime = esp_timer_get_time();
60void PIT8253::write(
int reg, uint8_t value)
70 timerIndex = (value >> 6) & 0x03;
72 int RLMode = (value >> 4) & 0x03;
76 m_timer[timerIndex].latch = m_timer[timerIndex].count;
77 m_timer[timerIndex].LSBToggle =
true;
78 m_timer[timerIndex].ctrlSet =
false;
82 m_timer[timerIndex].mode = (value >> 1) & 0x07;
83 m_timer[timerIndex].BCD = (value & 1) == 1;
84 m_timer[timerIndex].RLMode = RLMode;
85 m_timer[timerIndex].ctrlSet =
true;
87 m_timer[timerIndex].LSBToggle =
true;
92 printf(
"8253, read back. Required 8254?\n");
98 bool writeLSB =
false;
100 switch (m_timer[timerIndex].RLMode) {
105 writeLSB = m_timer[timerIndex].LSBToggle;
106 m_timer[timerIndex].LSBToggle = !m_timer[timerIndex].LSBToggle;
113 m_timer[timerIndex].resetHolding = (m_timer[timerIndex].resetHolding & 0xFF00) | value;
117 m_timer[timerIndex].resetHolding = (m_timer[timerIndex].resetHolding & 0x00FF) | (((
int)value) << 8);
118 m_timer[timerIndex].resetCount = m_timer[timerIndex].resetHolding;
119 if (m_timer[timerIndex].ctrlSet) {
120 m_timer[timerIndex].count = (uint16_t)(m_timer[timerIndex].resetCount - 1);
121 m_timer[timerIndex].ctrlSet =
false;
126 changeOut(timerIndex, m_timer[timerIndex].mode != 0);
133uint8_t PIT8253::read(
int reg)
142 int timerIndex = reg;
144 int readValue = m_timer[timerIndex].latch != -1 ? m_timer[timerIndex].latch : m_timer[timerIndex].count;
146 bool readLSB =
false;
147 if (m_timer[timerIndex].RLMode == 1) {
149 }
else if (m_timer[timerIndex].RLMode == 3) {
150 readLSB = m_timer[timerIndex].LSBToggle;
151 m_timer[timerIndex].LSBToggle = !m_timer[timerIndex].LSBToggle;
155 value = readValue & 0xFF;
157 value = (readValue >> 8) & 0xFF;
158 m_timer[timerIndex].latch = -1;
167void PIT8253::setGate(
int timerIndex,
bool value)
172 switch (m_timer[timerIndex].mode) {
177 m_timer[timerIndex].running = value;
182 if (m_timer[timerIndex].gate ==
false && value ==
true)
183 m_timer[timerIndex].running =
true;
186 switch (m_timer[timerIndex].mode) {
190 changeOut(timerIndex,
true);
193 if (!m_timer[timerIndex].gate && value)
194 m_timer[timerIndex].count = m_timer[timerIndex].resetCount;
195 m_timer[timerIndex].gate = value;
200void PIT8253::changeOut(
int timer,
bool value)
202 if (value != m_timer[timer].out) {
204 m_timer[timer].out = value;
205 m_changeOut(m_context, timer);
212 uint64_t now = esp_timer_get_time();
213 int ticks = (int) ((now - m_lastTickTime) * 1000 / (1000000000 / PIT_TICK_FREQ));
217 m_lastTickTime = now;
220 printf(
"Too much ticks! (%d)\n", ticks);
222 for (
int timerIndex = 0; timerIndex < 3; ++timerIndex) {
224 if (m_timer[timerIndex].running) {
227 if (m_timer[timerIndex].mode >= 4 && m_timer[timerIndex].out ==
false) {
229 changeOut(timerIndex,
true);
230 m_timer[timerIndex].running =
false;
231 m_timer[timerIndex].count = 65535;
235 m_timer[timerIndex].count -= ticks;
238 if (m_timer[timerIndex].mode == 3)
239 m_timer[timerIndex].count -= ticks;
241 if (m_timer[timerIndex].count <= 0) {
243 if (m_timer[timerIndex].resetCount == 0) {
244 m_timer[timerIndex].count += 65536;
246 m_timer[timerIndex].count += m_timer[timerIndex].resetCount;
248 switch (m_timer[timerIndex].mode) {
251 changeOut(timerIndex,
true);
255 changeOut(timerIndex,
true);
258 changeOut(timerIndex,
false);
261 changeOut(timerIndex, !m_timer[timerIndex].out);
266 switch (m_timer[timerIndex].mode) {
269 changeOut(timerIndex,
false);
272 changeOut(timerIndex,
true);
277 changeOut(timerIndex,
false);