|
1 # |
|
2 # Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
3 # All rights reserved. |
|
4 # This component and the accompanying materials are made available |
|
5 # under the terms of "Eclipse Public License v1.0" |
|
6 # which accompanies this distribution, and is available |
|
7 # at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 # |
|
9 # Initial Contributors: |
|
10 # Nokia Corporation - initial contribution. |
|
11 # |
|
12 # Contributors: |
|
13 # |
|
14 # Description: syborg_graphicsdevice.py |
|
15 # |
|
16 # Represents a graphics device register interface for quest OS in QEMU Syborg environment. |
|
17 # |
|
18 # |
|
19 |
1 import ctypes |
20 import ctypes |
2 import qemu |
21 import qemu |
3 import sys |
22 import sys |
4 #import SyborgModule |
23 import platform |
5 |
24 |
6 class syborg_graphicsdevice(qemu.devclass): |
25 class syborg_graphicsdevice(qemu.devclass): |
7 # Graphics device registers derived from VirtualVideoInterfaceConstants.h |
26 # Graphics device registers derived from VirtualVideoInterfaceConstants.h |
8 VVI_R_ID = 0x0000 |
27 VVI_R_ID = 0x0000 |
9 VVI_R_IRQ_ENABLE = 0x0004 |
28 VVI_R_IRQ_ENABLE = 0x0004 |
24 VVI_EXECUTE = 0 |
43 VVI_EXECUTE = 0 |
25 shared_cmd_memory_base = 0 |
44 shared_cmd_memory_base = 0 |
26 shared_framebuffer_memory_base = 0 |
45 shared_framebuffer_memory_base = 0 |
27 m_request_id_reg = 0 |
46 m_request_id_reg = 0 |
28 |
47 |
29 # Memory base id's from SyborgModule.h |
48 host_os = platform.system() |
30 # SYBORG_CMDMEMBASE = 0 |
49 # List of operating systems for this device |
31 # SYBORG_FRAMEBUFFERMEMBASE = 1 |
50 OS_WINDOWS = "Windows" |
32 |
51 OS_LINUX = "Linux" |
33 class DllLoadExeption( Exception ): |
|
34 def __init__(self,value): |
|
35 self.value = value |
|
36 |
|
37 def __str__(self): |
|
38 return repr(self.value) |
|
39 |
|
40 class SyborgGraphicsWrapper(): |
|
41 def __init__(self): |
|
42 try: |
|
43 self.library = ctypes.CDLL("syborg-graphicswrapper.dll") |
|
44 except: |
|
45 raise syborg_graphicsdevice.DllLoadExeption(1) |
|
46 self.obj = self.library.create_SyborgGraphicsWrapper() |
|
47 |
|
48 def initialize_graphics_utils(self): |
|
49 self.library.initialize_SyborgGraphicsWrapper( self.obj ) |
|
50 |
52 |
51 def create(self): |
53 def create(self): |
|
54 print "syborg_graphicsdevice: running on ", self.host_os |
|
55 |
|
56 # Add the supported and validated operating systems to the condition below |
|
57 if( (self.host_os != self.OS_WINDOWS) ): |
|
58 error_msg = "syborg_graphicsdevice: os support not validated: ", self.host_os |
|
59 sys.exit( error_msg ) |
|
60 |
|
61 # Try open the syborg graphicswrapper library |
52 try: |
62 try: |
53 self.graphicsutils = self.SyborgGraphicsWrapper() |
63 if( self.host_os == self.OS_WINDOWS ): |
54 except syborg_graphicsdevice.DllLoadExeption: |
64 libname = "syborg-graphicswrapper.dll" |
55 #print "syborg_graphicsdevice: Graphics dll load failed" |
65 elif( self.host_os == self.OS_LINUX ): |
56 sys.exit("syborg_graphicsdevice: Graphics dll load failed") |
66 libname = "syborg-graphicswrapper.so" |
|
67 else: |
|
68 # We should never end up here since the operating system check is done above |
|
69 sys.exit( "syborg_graphicsdevice: library loading failed. Os not supported!" ) |
|
70 self.library = ctypes.CDLL(libname) |
|
71 except Exception, e: |
|
72 print repr(e) |
|
73 error_msg = "syborg_graphicsdevice: " + libname + " load failed"; |
|
74 sys.exit( error_msg ) |
|
75 |
|
76 # Create an instance of syborg graphics wrapper |
|
77 self.obj = self.library.create_SyborgGraphicsWrapper() |
57 |
78 |
58 |
79 self.library.initialize_SyborgGraphicsWrapper( self.obj ) |
59 self.graphicsutils.initialize_graphics_utils() |
|
60 self.initialize_graphics_callback() |
80 self.initialize_graphics_callback() |
61 # deliver the graphics ram region |
|
62 # self.gmembase = self.graphicsutils.library.get_membase() |
|
63 |
81 |
64 self.irqenable = 0 |
82 self.irqenable = 0 |
65 self.irqstatus = 0 |
83 self.irqstatus = 0 |
66 self.command = 0 |
84 self.command = 0 |
67 self.parameterload = 0 |
85 self.parameterload = 0 |
94 return self.parameterload |
112 return self.parameterload |
95 elif offset == self.VVI_R_ERROR: |
113 elif offset == self.VVI_R_ERROR: |
96 self.lasterror = 0 |
114 self.lasterror = 0 |
97 return self.lasterror |
115 return self.lasterror |
98 elif offset == self.VVI_R_INPUT_BUFFER_TAIL: |
116 elif offset == self.VVI_R_INPUT_BUFFER_TAIL: |
99 return self.graphicsutils.library.get_InputBufferTail( self.graphicsutils.obj ) |
117 return self.library.get_InputBufferTail( self.obj ) |
100 elif offset == self.VVI_R_INPUT_BUFFER_HEAD: |
118 elif offset == self.VVI_R_INPUT_BUFFER_HEAD: |
101 return self.graphicsutils.library.get_InputBufferHead( self.graphicsutils.obj ) |
119 return self.library.get_InputBufferHead( self.obj ) |
102 elif offset == self.VVI_R_INPUT_BUFFER_READ_COUNT: |
120 elif offset == self.VVI_R_INPUT_BUFFER_READ_COUNT: |
103 return self.graphicsutils.library.get_InputBufferReadCount( self.graphicsutils.obj ) |
121 return self.library.get_InputBufferReadCount( self.obj ) |
104 elif offset == self.VVI_R_INPUT_BUFFER_WRITE_COUNT: |
122 elif offset == self.VVI_R_INPUT_BUFFER_WRITE_COUNT: |
105 return self.graphicsutils.library.get_InputBufferWriteCount( self.graphicsutils.obj ) |
123 return self.library.get_InputBufferWriteCount( self.obj ) |
106 elif offset == self.VVI_R_INPUT_BUFFER_MAX_TAIL: |
124 elif offset == self.VVI_R_INPUT_BUFFER_MAX_TAIL: |
107 return self.graphicsutils.library.get_InputMaxTailIndex( self.graphicsutils.obj ) |
125 return self.library.get_InputMaxTailIndex( self.obj ) |
108 elif offset == self.VVI_R_REQUEST_ID: |
126 elif offset == self.VVI_R_REQUEST_ID: |
109 return self.m_request_id_reg |
127 return self.m_request_id_reg |
110 elif offset == self.VVI_R_SHARED_CMD_MEMORY_BASE: |
128 elif offset == self.VVI_R_SHARED_CMD_MEMORY_BASE: |
111 return self.shared_cmd_memory_base |
129 return self.shared_cmd_memory_base |
112 elif offset == self.VVI_R_SHARED_FRAMEBUFFER_MEMORY_BASE: |
130 elif offset == self.VVI_R_SHARED_FRAMEBUFFER_MEMORY_BASE: |
117 |
135 |
118 def write_reg(self, offset, value): |
136 def write_reg(self, offset, value): |
119 offset >>= 2 |
137 offset >>= 2 |
120 if offset == self.VVI_R_IRQ_STATUS: |
138 if offset == self.VVI_R_IRQ_STATUS: |
121 self.updateIrq(0); |
139 self.updateIrq(0); |
122 self.graphicsutils.library.signal_outputbuffer_semafore( self.graphicsutils.obj ) |
140 self.library.signal_outputbuffer_semafore( self.obj ) |
123 self.graphicsutils.library.execute_command( self.graphicsutils.obj ); |
141 self.library.execute_command( self.obj ); |
124 elif offset == self.VVI_R_COMMAND: |
142 elif offset == self.VVI_R_COMMAND: |
125 if value == self.VVI_EXECUTE: |
143 if value == self.VVI_EXECUTE: |
126 self.graphicsutils.library.execute_command( self.graphicsutils.obj ); |
144 self.library.execute_command( self.obj ); |
127 else: |
145 else: |
128 sys.exit("syborg_graphicsdevice: Unknown command issued!") |
146 sys.exit("syborg_graphicsdevice: Unknown command issued!") |
129 elif offset == self.VVI_R_INPUT_BUFFER_TAIL: |
147 elif offset == self.VVI_R_INPUT_BUFFER_TAIL: |
130 self.graphicsutils.library.set_InputBufferTail( self.graphicsutils.obj, value ); |
148 self.library.set_InputBufferTail( self.obj, value ); |
131 elif offset == self.VVI_R_INPUT_BUFFER_HEAD: |
149 elif offset == self.VVI_R_INPUT_BUFFER_HEAD: |
132 self.graphicsutils.library.set_InputBufferHead( self.graphicsutils.obj, value ); |
150 self.library.set_InputBufferHead( self.obj, value ); |
133 elif offset == self.VVI_R_INPUT_BUFFER_READ_COUNT: |
151 elif offset == self.VVI_R_INPUT_BUFFER_READ_COUNT: |
134 self.graphicsutils.library.set_InputBufferReadCount( self.graphicsutils.obj, value ); |
152 self.library.set_InputBufferReadCount( self.obj, value ); |
135 elif offset == self.VVI_R_INPUT_BUFFER_WRITE_COUNT: |
153 elif offset == self.VVI_R_INPUT_BUFFER_WRITE_COUNT: |
136 self.graphicsutils.library.set_InputBufferWriteCount( self.graphicsutils.obj, value ); |
154 self.library.set_InputBufferWriteCount( self.obj, value ); |
137 elif offset == self.VVI_R_INPUT_BUFFER_MAX_TAIL: |
155 elif offset == self.VVI_R_INPUT_BUFFER_MAX_TAIL: |
138 self.graphicsutils.library.set_InputMaxTailIndex( self.graphicsutils.obj, value ); |
156 self.library.set_InputMaxTailIndex( self.obj, value ); |
139 elif offset == self.VVI_R_SHARED_CMD_MEMORY_BASE: |
157 elif offset == self.VVI_R_SHARED_CMD_MEMORY_BASE: |
140 gmemsize = self.graphicsutils.library.get_cmd_memsize() |
158 gmemsize = self.library.get_cmd_memsize() |
141 self.cmd_memregion = qemu.memregion( value, gmemsize ) |
159 self.cmd_memregion = qemu.memregion( value, gmemsize ) |
142 self.memregion_cmd_base = self.cmd_memregion.region_host_addr() |
160 self.memregion_cmd_base = self.cmd_memregion.region_host_addr() |
143 #SyborgModule.post_address( self.memregion_cmd_base, self.SYBORG_CMDMEMBASE ) |
|
144 elif offset == self.VVI_R_SHARED_FRAMEBUFFER_MEMORY_BASE: |
161 elif offset == self.VVI_R_SHARED_FRAMEBUFFER_MEMORY_BASE: |
145 gmemsize = self.graphicsutils.library.get_framebuffer_memsize() |
162 gmemsize = self.library.get_framebuffer_memsize() |
146 self.framebuffer_memregion = qemu.memregion( value, gmemsize ) |
163 self.framebuffer_memregion = qemu.memregion( value, gmemsize ) |
147 self.memregion_framebuffer_base = self.framebuffer_memregion.region_host_addr() |
164 self.memregion_framebuffer_base = self.framebuffer_memregion.region_host_addr() |
148 #SyborgModule.post_address( self.memregion_framebuffer_base, self.SYBORG_FRAMEBUFFERMEMBASE ) |
|
149 # Ready to finalise graphics initialization |
165 # Ready to finalise graphics initialization |
150 if( self.graphicsutils.library.reset_SyborgGraphicsWrapper( self.graphicsutils.obj, self.memregion_framebuffer_base, self.memregion_cmd_base ) != 0 ): |
166 if( self.library.reset_SyborgGraphicsWrapper( self.obj, self.memregion_framebuffer_base, self.memregion_cmd_base ) != 0 ): |
151 sys.exit("syborg_graphicsdevice: Syborg graphicsutils library not initialized correctly!") |
167 sys.exit("syborg_graphicsdevice: Syborg graphicsutils library not initialized correctly!") |
152 else: |
168 else: |
153 reg_write_error = "syborg_graphicsdevice: Illegal register write to: ", offset |
169 reg_write_error = "syborg_graphicsdevice: Illegal register write to: ", offset |
154 sys.exit( reg_write_error ) |
170 sys.exit( reg_write_error ) |
155 |
171 |