mirror of
https://github.com/sinseman44/PyCNC.git
synced 2026-07-17 08:46:55 +00:00
use ctype binding for memmap
This commit is contained in:
@@ -112,6 +112,8 @@ def CM_DIV_VALUE(x):
|
|||||||
|
|
||||||
|
|
||||||
class PhysicalMemory(object):
|
class PhysicalMemory(object):
|
||||||
|
lc = ctypes.cdll.LoadLibrary('libc.so.6')
|
||||||
|
|
||||||
def __init__(self, phys_address, size=PAGE_SIZE):
|
def __init__(self, phys_address, size=PAGE_SIZE):
|
||||||
""" Create object which maps physical memory to Python's mmap object.
|
""" Create object which maps physical memory to Python's mmap object.
|
||||||
:param phys_address: based address of physical memory
|
:param phys_address: based address of physical memory
|
||||||
@@ -119,13 +121,18 @@ class PhysicalMemory(object):
|
|||||||
self._size = size
|
self._size = size
|
||||||
phys_address -= phys_address % PAGE_SIZE
|
phys_address -= phys_address % PAGE_SIZE
|
||||||
fd = self._open_dev("/dev/mem")
|
fd = self._open_dev("/dev/mem")
|
||||||
self._rmap = mmap.mmap(fd, size, flags=mmap.MAP_SHARED,
|
# Pypy doesn't work correctly with Python's mmap, use native calls
|
||||||
prot=mmap.PROT_READ | mmap.PROT_WRITE,
|
# self._rmap = mmap.mmap(fd, size, flags=mmap.MAP_SHARED,
|
||||||
offset=phys_address)
|
# prot=mmap.PROT_READ | mmap.PROT_WRITE,
|
||||||
|
# offset=phys_address)
|
||||||
|
self._rmap = self.lc.mmap(None, size, mmap.PROT_READ | mmap.PROT_WRITE,
|
||||||
|
mmap.MAP_SHARED, fd, phys_address)
|
||||||
|
os.close(fd)
|
||||||
atexit.register(self.cleanup)
|
atexit.register(self.cleanup)
|
||||||
|
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
self._rmap.close()
|
# self._rmap.close()
|
||||||
|
self.lc.munmap(self._rmap, self._size)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _open_dev(name):
|
def _open_dev(name):
|
||||||
@@ -139,19 +146,22 @@ class PhysicalMemory(object):
|
|||||||
os.close(fd)
|
os.close(fd)
|
||||||
|
|
||||||
def write_int(self, address, int_value):
|
def write_int(self, address, int_value):
|
||||||
self._rmap[address:address + 4] = struct.pack("I", int_value)
|
# self._rmap[address:address + 4] = struct.pack("I", int_value)
|
||||||
|
ctypes.c_uint32.from_address(self._rmap + address).value = int_value
|
||||||
|
|
||||||
def write(self, address, data):
|
def write(self, address, data):
|
||||||
self._rmap.seek(address)
|
# self._rmap.seek(address)
|
||||||
self._rmap.write(struct.pack(str(len(data)) + "I", *data))
|
# self._rmap.write(struct.pack(str(len(data)) + "I", *data))
|
||||||
|
for i in range(0, len(data)):
|
||||||
|
self.write_int(address + i * 4, data[i])
|
||||||
|
|
||||||
def read_int(self, address):
|
def read_int(self, address):
|
||||||
return struct.unpack("I", self._rmap[address:address + 4])[0]
|
# return struct.unpack("I", self._rmap[address:address + 4])[0]
|
||||||
|
return ctypes.c_uint32.from_address(self._rmap + address).value
|
||||||
|
|
||||||
def get_size(self):
|
def get_size(self):
|
||||||
return self._size
|
return self._size
|
||||||
|
|
||||||
|
|
||||||
class CMAPhysicalMemory(PhysicalMemory):
|
class CMAPhysicalMemory(PhysicalMemory):
|
||||||
IOCTL_MBOX_PROPERTY = ctypes.c_long(0xc0046400).value
|
IOCTL_MBOX_PROPERTY = ctypes.c_long(0xc0046400).value
|
||||||
def __init__(self, size):
|
def __init__(self, size):
|
||||||
|
|||||||
Reference in New Issue
Block a user