symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_pointer.py
changeset 1 2fb8b9db1c86
child 62 99ca724f9829
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 import qemu
       
     2 
       
     3 class syborg_pointer(qemu.devclass):
       
     4   REG_ID           = 0
       
     5   REG_LATCH        = 1
       
     6   REG_FIFO_COUNT   = 2
       
     7   REG_X            = 3
       
     8   REG_Y            = 4
       
     9   REG_Z            = 5
       
    10   REG_BUTTONS      = 6
       
    11   REG_INT_ENABLE   = 7
       
    12   REG_FIFO_SIZE    = 8
       
    13 
       
    14   class fifo_entry:
       
    15     def __init__(self, x, y, z, buttons):
       
    16       self.x = x
       
    17       self.y = y
       
    18       self.z = z
       
    19       self.buttons = buttons
       
    20 
       
    21   def update_irq(self):
       
    22     self.set_irq_level(0, (len(self.fifo) > 0) and self.int_enabled)
       
    23 
       
    24   def event(self, x, y, z, buttons):
       
    25     if len(self.fifo) < self.fifo_size:
       
    26       self.fifo.append(self.fifo_entry(x, y, z, buttons))
       
    27     self.update_irq()
       
    28 
       
    29   def create(self):
       
    30     self.absolute = self.properties["absolute"]
       
    31     self.fifo_size = self.properties["fifo-size"]
       
    32     self.fifo=[]
       
    33     self.current = self.fifo_entry(0, 0, 0, 0)
       
    34     self.int_enabled = False
       
    35     qemu.register_mouse(self.event, self.absolute)
       
    36 
       
    37   def read_reg(self, offset):
       
    38     offset >>= 2
       
    39     if offset == self.REG_ID:
       
    40       return 0xc51d0006 if self.absolute else 0xc51d0005
       
    41     elif offset == self.REG_FIFO_COUNT:
       
    42       return len(self.fifo)
       
    43     elif offset == self.REG_X:
       
    44       return self.current.x
       
    45     elif offset == self.REG_Y:
       
    46       return self.current.y
       
    47     elif offset == self.REG_Z:
       
    48       return self.current.z
       
    49     elif offset == self.REG_BUTTONS:
       
    50       return self.current.buttons
       
    51     elif offset == self.REG_INT_ENABLE:
       
    52       return self.int_enabled
       
    53     elif offset == self.REG_FIFO_SIZE:
       
    54       return self.fifo_size
       
    55     return 0
       
    56 
       
    57   def write_reg(self, offset, value):
       
    58     offset >>= 2
       
    59     if offset == self.REG_LATCH:
       
    60       if len(self.fifo) == 0:
       
    61         return
       
    62       self.current = self.fifo.pop(0)
       
    63       self.update_irq()
       
    64     elif offset == self.REG_INT_ENABLE:
       
    65       self.int_enabled = ((value & 1) != 0)
       
    66       self.update_irq()
       
    67 
       
    68   def save(self, f):
       
    69     f.put_u32(self.fifo_size)
       
    70     f.put_u32(self.int_enabled)
       
    71     f.put_u32(len(self.fifo) + 1)
       
    72     for d in [self.current] + self.fifo:
       
    73       f.put_u32(d.x)
       
    74       f.put_u32(d.y)
       
    75       f.put_u32(d.z)
       
    76       f.put_u32(d.buttons)
       
    77 
       
    78   def load(self, f):
       
    79     if self.fifo_size != f.get_u32():
       
    80       raise ValueError, "fifo size mismatch"
       
    81     self.int_enabled = f.get_u32()
       
    82     n = f.get_u32()
       
    83     self.fifo = []
       
    84     while n > 0:
       
    85       x = f.get_u32()
       
    86       y = f.get_u32()
       
    87       z = f.get_u32()
       
    88       buttons = f.get_u32()
       
    89       self.fifo.append(self.fifo_entry(x, y, z, buttons))
       
    90       n -= 1;
       
    91     self.current = self.fifo.pop(0);
       
    92 
       
    93   # Device class properties
       
    94   regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
       
    95   irqs = 1
       
    96   name = "syborg,pointer"
       
    97   properties = {"fifo-size":16, "absolute":1}
       
    98 
       
    99 qemu.register_device(syborg_pointer)