equal
deleted
inserted
replaced
|
1 import qemu |
|
2 |
|
3 class syborg_timer(qemu.devclass): |
|
4 REG_ID = 0 |
|
5 REG_LATCH = 1 |
|
6 REG_DATA_LOW = 2 |
|
7 REG_DATA_HIGH = 3 |
|
8 |
|
9 def create(self): |
|
10 self.data = 0 |
|
11 self.offset = qemu.start_time() * 1000000 - qemu.get_clock() |
|
12 |
|
13 def read_reg(self, offset): |
|
14 offset >>= 2 |
|
15 if offset == self.REG_ID: |
|
16 return 0xc51d0004 |
|
17 elif offset == self.REG_DATA_LOW: |
|
18 return self.data & 0xffffffff |
|
19 elif offset == self.REG_DATA_HIGH: |
|
20 return (self.data >> 32) & 0xffffffff |
|
21 return 0 |
|
22 |
|
23 def write_reg(self, offset, value): |
|
24 offset >>= 2 |
|
25 if offset == self.REG_LATCH: |
|
26 now = qemu.get_clock() |
|
27 if value >= 4: |
|
28 self.offset = self.data - now |
|
29 else: |
|
30 self.data = now + self.offset |
|
31 while value: |
|
32 self.data /= 1000 |
|
33 value -= 1; |
|
34 elif offset == self.REG_DATA_LOW: |
|
35 self.data = (self.data & ~0xffffffff) | value |
|
36 elif offset == self.REG_DATA_HIGH: |
|
37 self.data = (self.data & 0xffffffff) | (value << 32) |
|
38 |
|
39 def save(self, f): |
|
40 f.put_s64(self.offset) |
|
41 f.put_u64(self.data) |
|
42 |
|
43 def load(self, f): |
|
44 self.offset = f.get_s64() |
|
45 self.data = f.get_u64() |
|
46 |
|
47 # Device class properties |
|
48 regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)] |
|
49 irqs = 0 |
|
50 name = "syborg,rtc" |
|
51 properties = {} |
|
52 |
|
53 qemu.register_device(syborg_timer) |