symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_rtc.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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)