symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py
branchGCC_SURGE
changeset 91 07b904f40417
parent 74 eb3d0111f868
child 129 0a4b67281c48
--- a/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py	Thu Jul 29 11:34:55 2010 +0100
+++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py	Wed Aug 04 10:56:22 2010 +0100
@@ -28,6 +28,8 @@
 import sys
 import os
 import array
+import platform
+import re
 
 class syborg_nvmemorydevice(qemu.devclass):
     # 256 MB default empty drive size if there is no readymade image available
@@ -35,7 +37,7 @@
     DEVICE_SECTOR_SIZE = 0x200
     DRIVE_NAME = "qemudrive.img"
     DRIVE_PATH = "nvmemory"
-    
+    
     # Memory device registers
     R_NVMEM_ID                                = 0x0000
     R_NVMEM_TRANSACTION_OFFSET                = 0x0004
@@ -54,40 +56,50 @@
     # Variables to store the information for current transaction
     shared_memory_base                  = 0
     shared_memory_size                  = 0
-    transaction_offset                  = 0
-    transaction_size                    = 0
-    transaction_direction               = 0
+    transaction_offset                  = 0
+    transaction_size                    = 0
+    transaction_direction               = 0
     # Variables to validate transaction
-    transaction_offset_set              = 0
-    transaction_size_set                = 0
+    transaction_offset_set              = 0
+    transaction_size_set                = 0
     transaction_direction_set           = 0
     nvmemory_sector_count                = 0
     
     drive_size                          = 0
     sector_size                         = 0
-    drive_image_name                    = ""
+    drive_image_name                    = ""
+    host_plat = platform.platform();
 
     def create(self):
         print "syborg_nvmemorydevice: create\n"
         
         # Get properties
-        self.drive_size = self.properties["drive_size"]
-        self.sector_size = self.properties["sector_size"]
+        self.drive_size = self.properties["drive_size"]
+        self.sector_size = self.properties["sector_size"]
         self.drive_image_name = self.properties["drive_image_name"]
         
         print "drive size: ", self.drive_size
         print "sector size: ", self.sector_size
-        print "drive name: ", self.drive_image_name
+        print "drive name: ", self.drive_image_name
 
-        drive_path_and_name = self.DRIVE_PATH + "\\" + self.drive_image_name 
+        drive_path_and_name = os.path.join(self.DRIVE_PATH, self.drive_image_name)  
         # Save working directory
         self.working_dir = os.getcwd()
+        nvmem_lib = ""
+        open_mode = 0
+        if re.match('^linux',self.host_plat,re.I):
+			nvmemlib_name = "libnvmemmory.so"
+			open_mode = os.O_RDWR
+        else:
+			nvmemlib_name = "nvmemmory.dll"
+			open_mode = os.O_RDWR|os.O_BINARY			
         
         # Open the nvmemory library
         try:
-            self.nvmemlib = ctypes.CDLL("nvmemmory.dll")
-        except:
-            sys.exit("syborg_nvmemorydevice: nvmemmory.dll load failed")
+            self.nvmemlib = ctypes.CDLL(nvmemlib_name)
+        except Exception, e:
+            print repr(e)
+            sys.exit("syborg_nvmemorydevice: nvmemmory load failed")
         
         # Create an instance of non volatile memory handler class
         self.obj = self.nvmemlib.nvmem_create( self.sector_size )
@@ -101,7 +113,7 @@
             # Here we could check why we failed - usually because the path already exists \n"
             pass
         try:
-            self.filehandle = os.open( drive_path_and_name, os.O_RDWR|os.O_BINARY )
+            self.filehandle = os.open( drive_path_and_name, open_mode )
             os.close( self.filehandle )
         except:
             print "syborg_nvmemorydevice: drive image not found - create\n"
@@ -119,7 +131,7 @@
                 index = index+1
         
         # Create path and get handle to the raw memory array
-        imagepath = self.working_dir + "\\" + drive_path_and_name
+        imagepath = os.path.join(self.working_dir, drive_path_and_name)
         print "imagepath: ", imagepath
         self.nvmemhandle = self.nvmemlib.nvmem_open( self.obj, imagepath )
         if( self.nvmemhandle < 0 ):
@@ -132,7 +144,7 @@
         print "syborg_nvmemorydevice: created\n"
             
     def updateIrq(self,new_value):
-        self.set_irq_level(0, new_value)
+        self.set_irq_level(0, new_value)
 
     def nvmem_request_callback(self, result):
         #print "graphics_request_callback: " , result
@@ -145,48 +157,48 @@
         self.nvmem_callback = self.CALLBACKFUNC(self.nvmem_request_callback)
         self.nvmemlib.nvmem_set_callback( self.obj, self.nvmem_callback )
 
-    def read_reg(self, offset):
+    def read_reg(self, offset):
         offset >>= 2
-        #print "read register: 0x%x" % (offset) 
-        if offset == self.R_NVMEM_ID:
-            return 0xDEADBEEF
-        elif offset == self.R_NVMEM_TRANSACTION_OFFSET:
-            return self.transaction_offset
-        elif offset == self.R_NVMEM_TRANSACTION_SIZE:
-            return self.transaction_size
-        elif offset == self.R_NVMEM_TRANSACTION_DIRECTION:
-            return self.transaction_direction
+        #print "read register: 0x%x" % (offset) 
+        if offset == self.R_NVMEM_ID:
+            return 0xDEADBEEF
+        elif offset == self.R_NVMEM_TRANSACTION_OFFSET:
+            return self.transaction_offset
+        elif offset == self.R_NVMEM_TRANSACTION_SIZE:
+            return self.transaction_size
+        elif offset == self.R_NVMEM_TRANSACTION_DIRECTION:
+            return self.transaction_direction
         elif offset == self.R_NVMEM_SHARED_MEMORY_BASE:
-            return self.shared_memory_base
+            return self.shared_memory_base
         elif offset == self.R_NVMEM_SHARED_MEMORY_SIZE:
-            return self.shared_memory_size
+            return self.shared_memory_size
         elif offset == self.R_NVMEM_NV_MEMORY_SIZE:
-            return self.nvmemory_sector_count
+            return self.nvmemory_sector_count
         elif offset == self.R_NVMEM_STATUS:
             self.updateIrq(0)
-            return self.status_reg
-        else:
-            reg_read_error = "syborg_nvmemorydevice: Illegal register read at: ", offset 
+            return self.status_reg
+        else:
+            reg_read_error = "syborg_nvmemorydevice: Illegal register read at: ", offset 
             sys.exit( reg_read_error )
-
-    def write_reg(self, offset, value):
-        offset >>= 2
-        #print "write register: 0x%x value: 0x%x" % (offset, value) 
-        if offset == self.R_NVMEM_TRANSACTION_OFFSET:
-            self.transaction_offset = value
-            self.transaction_offset_set = 1
-        elif offset == self.R_NVMEM_TRANSACTION_SIZE:
-            self.transaction_size = value
-            self.transaction_size_set = 1
-        elif offset == self.R_NVMEM_TRANSACTION_DIRECTION:
-            self.transaction_direction = value
-            self.transaction_direction_set = 1
+
+    def write_reg(self, offset, value):
+        offset >>= 2
+        #print "write register: 0x%x value: 0x%x" % (offset, value) 
+        if offset == self.R_NVMEM_TRANSACTION_OFFSET:
+            self.transaction_offset = value
+            self.transaction_offset_set = 1
+        elif offset == self.R_NVMEM_TRANSACTION_SIZE:
+            self.transaction_size = value
+            self.transaction_size_set = 1
+        elif offset == self.R_NVMEM_TRANSACTION_DIRECTION:
+            self.transaction_direction = value
+            self.transaction_direction_set = 1
         elif offset == self.R_NVMEM_TRANSACTION_EXECUTE:
             if( (self.transaction_offset_set == 0) | (self.transaction_size_set == 0) | (self.transaction_direction_set == 0) ):
-                error_msg = "syborg_nvmemorydevice: Illegal transaction! All the required parameters are not set" 
+                error_msg = "syborg_nvmemorydevice: Illegal transaction! All the required parameters are not set" 
                 sys.exit( error_msg )
             elif(self.transaction_size == 0 ):
-                error_msg = "syborg_nvmemorydevice: Zero size transaction issued!" 
+                error_msg = "syborg_nvmemorydevice: Zero size transaction issued!" 
                 sys.exit( error_msg )
             else:
                 if( self.transaction_direction == self.NVMEM_TRANSACTION_READ ):
@@ -194,28 +206,28 @@
                 elif( self.transaction_direction == self.NVMEM_TRANSACTION_WRITE ):
                     self.nvmemlib.nvmem_write(  self.obj, self.nvmemory_sharedmemory_host_address, self.nvmemhandle, self.transaction_offset, self.transaction_size )
                 else:
-                    error_msg = "syborg_nvmemorydevice: Transaction direction not set!" 
+                    error_msg = "syborg_nvmemorydevice: Transaction direction not set!" 
                     sys.exit( error_msg )
-                self.transaction_offset_set = 0
-                self.transaction_size_set = 0
-                self.transaction_direction_set = 0
+                self.transaction_offset_set = 0
+                self.transaction_size_set = 0
+                self.transaction_direction_set = 0
         elif offset == self.R_NVMEM_SHARED_MEMORY_BASE:
             self.shared_memory_base = value
         elif offset == self.R_NVMEM_SHARED_MEMORY_SIZE:
-            self.shared_memory_size = value
+            self.shared_memory_size = value
         elif offset == self.R_NVMEM_ENABLE:
             if( value > 0 ):
                 self.nvmemory_memregion = qemu.memregion( self.shared_memory_base, self.shared_memory_size )
                 self.nvmemory_sharedmemory_host_address = self.nvmemory_memregion.region_host_addr()
                 print"syborg_nvmemorydevice: host addr: 0x%08x" % (self.nvmemory_sharedmemory_host_address)
         else:
-            reg_write_error = "syborg_nvmemorydevice: Illegal register write to: ", offset 
+            reg_write_error = "syborg_nvmemorydevice: Illegal register write to: ", offset 
             sys.exit( reg_write_error )
 
-    # Device class properties
-    regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
-    irqs = 1
-    name = "syborg,nvmemorydevice"
-    properties = {"drive_size":DEFAULT_DRIVE_SIZE, "sector_size":DEVICE_SECTOR_SIZE, "drive_image_name":DRIVE_NAME}
-
-qemu.register_device(syborg_nvmemorydevice)
+    # Device class properties
+    regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
+    irqs = 1
+    name = "syborg,nvmemorydevice"
+    properties = {"drive_size":DEFAULT_DRIVE_SIZE, "sector_size":DEVICE_SECTOR_SIZE, "drive_image_name":DRIVE_NAME}
+
+qemu.register_device(syborg_nvmemorydevice)