Source code for ducky.devices

import enum
import importlib

from ..interfaces import IMachineWorker
from ..mm import UINT16_FMT
from ..errors import InvalidResourceError

VIRTUAL_INTERRUPTS = {}

[docs]class IRQList(enum.IntEnum): """ List of known IRQ sources. """ # HW devices TIMER = 0 KEYBOARD = 1 BIO = 2 # SW interrupts and exceptions HALT = 16 BLOCKIO = 17 VMDEBUG = 18 IRQ_COUNT = 32
[docs]class IOPorts(enum.IntEnum): PORT_COUNT = 65536
[docs]class Device(IMachineWorker): def __init__(self, machine, klass, name): super(Device, self).__init__() self.machine = machine self.klass = klass self.name = name self.logger = machine.LOGGER self.master = None @staticmethod
[docs] def create_from_config(machine, config, section): raise NotImplementedError()
[docs] def boot(self): self.logger.debug('%s.boot', self.__class__.__name__) pass
[docs] def halt(self): self.logger.debug('%s.halt', self.__class__.__name__) pass
[docs] def is_slave(self): return self.master is not None
[docs] def get_master(self): return self.master
[docs]class DeviceFrontend(Device):
[docs] def set_backend(self, device): self.backend = device
[docs]class DeviceBackend(Device):
[docs] def set_frontend(self, device): self.frontend = device
[docs]class IRQProvider(object): pass
[docs]class IOProvider(object):
[docs] def is_port_protected(self, port, read = True): return False
[docs] def read_u8(self, port): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs] def read_u16(self, port): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs] def read_u32(self, port): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs] def write_u8(self, port, value): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs] def write_u16(self, port, value): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs] def write_u32(self, port, value): raise InvalidResourceError('Unhandled port: port={}'.format(UINT16_FMT(port)))
[docs]def get_driver_creator(driver_class): driver = driver_class.split('.') driver_module = importlib.import_module('.'.join(driver[0:-1])) driver_class = getattr(driver_module, driver[-1]) return driver_class.create_from_config