i8254: switch time API to support PIT frequency natively
[qemupp.git] / include / i8254.hpp
blob67b3d5e02bf175efc80025a730c5f0ab8de0b10e
1 #ifndef I8254_HPP
2 #define I8254_HPP
4 #include "device.hpp"
5 #include "io.hpp"
6 #include "marshal.hpp"
7 #include "timer.hpp"
9 #define PIT_FREQ 1193182
11 class PITChannel : public Device
13 public:
14 PITChannel(void);
16 void write_back_command(uint8_t val);
17 void write_access(uint8_t val);
18 void write_state_val(uint8_t val);
19 uint8_t read(void);
21 void marshal(Marshaller *m, const char *name);
22 void reset(int gate);
24 OutputPin irq;
26 private:
27 int64_t get_next_transition_time(uint64_t current_time);
28 void irq_timer_update(uint64_t current_time);
29 void on_irq_timer(void);
30 int get_out1(int64_t current_time);
31 void load_count(int val);
32 void latch_count(void);
33 uint16_t get_count(void);
34 void update_irq(uint64_t current_time);
36 uint32_t count; /* can be 65536 */
37 uint16_t latched_count;
38 uint8_t count_latched;
39 uint8_t status_latched;
40 uint8_t status;
41 uint8_t read_state;
42 uint8_t write_state;
43 uint8_t write_latch;
44 uint8_t rw_mode;
45 uint8_t mode;
46 uint8_t bcd; /* not supported */
47 uint8_t gate; /* timer start */
48 int64_t count_load_time;
49 /* irq handling */
50 int64_t next_transition_time;
51 Timer irq_timer;
54 class PIT : public Device
56 public:
57 void marshal(Marshaller *m, const char *name);
59 void write(uint8_t addr, uint8_t val);
60 uint8_t read(uint8_t addr);
62 OutputPin &get_irq(void);
64 void reset(void);
66 private:
67 PITChannel channels[3];
70 #endif