diff -r ffa851df0825 -r 2fb8b9db1c86 symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_rtc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_rtc.py Fri Jul 31 15:01:17 2009 +0100 @@ -0,0 +1,53 @@ +import qemu + +class syborg_timer(qemu.devclass): + REG_ID = 0 + REG_LATCH = 1 + REG_DATA_LOW = 2 + REG_DATA_HIGH = 3 + + def create(self): + self.data = 0 + self.offset = qemu.start_time() * 1000000 - qemu.get_clock() + + def read_reg(self, offset): + offset >>= 2 + if offset == self.REG_ID: + return 0xc51d0004 + elif offset == self.REG_DATA_LOW: + return self.data & 0xffffffff + elif offset == self.REG_DATA_HIGH: + return (self.data >> 32) & 0xffffffff + return 0 + + def write_reg(self, offset, value): + offset >>= 2 + if offset == self.REG_LATCH: + now = qemu.get_clock() + if value >= 4: + self.offset = self.data - now + else: + self.data = now + self.offset + while value: + self.data /= 1000 + value -= 1; + elif offset == self.REG_DATA_LOW: + self.data = (self.data & ~0xffffffff) | value + elif offset == self.REG_DATA_HIGH: + self.data = (self.data & 0xffffffff) | (value << 32) + + def save(self, f): + f.put_s64(self.offset) + f.put_u64(self.data) + + def load(self, f): + self.offset = f.get_s64() + self.data = f.get_u64() + + # Device class properties + regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)] + irqs = 0 + name = "syborg,rtc" + properties = {} + +qemu.register_device(syborg_timer)