--- 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)