Esempio n. 1
0
class NodeArduinoZero(object):
    """ Open node Arduino Zero implementation """

    TYPE = 'arduino_zero'
    ELF_TARGET = ('ELFCLASS32', 'EM_ARM')
    TTY = '/dev/iotlab/ttyON_ARDUINO_ZERO'
    BAUDRATE = 115200
    OPENOCD_CFG_FILE = static_path('iot-lab-arduino-zero.cfg')
    FW_IDLE = static_path('arduino_zero_idle.elf')
    FW_AUTOTEST = static_path('arduino_zero_autotest.elf')

    AUTOTEST_AVAILABLE = [
        'echo',
        'get_time',  # mandatory
        'leds_on',
        'leds_off'
    ]

    ALIM = '5V'

    def __init__(self):
        self.serial_redirection = SerialRedirection(self.TTY, self.BAUDRATE)
        self.openocd = OpenOCD.from_node(self)
        self.edbg = Edbg()
        self._current_fw = None
        self._in_debug = False

    @logger_call("Node Arduino Zero : Setup of arduino zero node")
    def setup(self, firmware_path):
        """ Flash open node, create serial redirection """
        self._in_debug = False

        ret_val = 0

        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        ret_val += self.flash(firmware_path)
        ret_val += self.serial_redirection.start()
        return ret_val

    @logger_call("Node Arduino Zero : teardown of arduino zero node")
    def teardown(self):
        """ Stop serial redirection and flash idle firmware """
        self._in_debug = False

        ret_val = 0
        # ON may have been stopped at the end of the experiment.
        # And then restarted again in cn teardown.
        # This leads to problem where the TTY disappears and reappears during
        # the first 2 seconds. So let some time if it wants to disappear first.
        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        # cleanup debugger before flashing
        ret_val += self.debug_stop()
        ret_val += self.serial_redirection.stop()
        ret_val += self.flash(None)
        return ret_val

    @logger_call("Node Arduino Zero : flash of arduino zero node")
    def flash(self, firmware_path=None):
        """ Flash the given firmware on Arduino Zero node

        :param firmware_path: Path to the firmware to be flashed on `node`.
                              If None, flash 'idle' firmware.
        """
        firmware_path = firmware_path or self.FW_IDLE
        LOGGER.info('Flash firmware on Arduino Zero: %s', firmware_path)
        self._current_fw = firmware_path

        if self._in_debug:
            return self.openocd.flash(firmware_path)

        return self.edbg.flash(firmware_path)

    @logger_call("Node Arduino Zero : reset of arduino zero node")
    def reset(self):
        """ Reset the Arduino Zero node using jtag """
        LOGGER.info('Reset Arduino Zero node')
        return self.openocd.reset()

    def debug_start(self):
        """ Start Arduino Zero node debugger """
        LOGGER.info('Arduino Zero Node debugger start')
        self._in_debug = True
        if self._current_fw is not None:
            # Reflash current firmware using openocd to avoid misbehavior of
            # previously flashed firmware (with edbg)
            self.flash(firmware_path=self._current_fw)
        return self.openocd.debug_start()

    def debug_stop(self):
        """ Stop Arduino Zero node debugger """
        LOGGER.info('Arduino Zero Node debugger stop')
        self._in_debug = False
        return self.openocd.debug_stop()

    @staticmethod
    def status():
        """ Check Arduino Zero node status """
        # Status is called when open node is not powered
        # So can't check for FTDI
        return 0
Esempio n. 2
0
class NodeEdbgBase(OpenNodeBase):
    # pylint:disable=no-member
    """ Open node EDBG implementation """

    ELF_TARGET = ('ELFCLASS32', 'EM_ARM')
    TTY = '/dev/iotlab/ttyON_CMSIS_DAP'
    BAUDRATE = 115200

    AUTOTEST_AVAILABLE = [
        'echo', 'get_time',  # mandatory
        'get_uid',
        'leds_on', 'leds_off', 'leds_blink'
    ]

    ALIM = '5V'

    def __init__(self):
        self.serial_redirection = SerialRedirection(self.TTY, self.BAUDRATE)
        self.openocd = OpenOCD.from_node(self)
        self.edbg = Edbg()
        self._current_fw = None
        self._in_debug = False

    @property
    def programmer(self):
        """Returns the openocd instance of the open node."""
        return self.edbg

    @logger_call("Node EDBG: Setup of EDBG node")
    def setup(self, firmware_path):
        """ Flash open node, create serial redirection """
        self._in_debug = False
        ret_val = 0

        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        ret_val += self.flash(firmware_path)
        ret_val += self.serial_redirection.start()
        return ret_val

    @logger_call("Node EDBG: teardown of EDBG node")
    def teardown(self):
        """ Stop serial redirection and flash idle firmware """
        self._in_debug = False
        ret_val = 0
        # ON may have been stopped at the end of the experiment.
        # And then restarted again in cn teardown.
        # This leads to problem where the TTY disappears and reappears during
        # the first 2 seconds. So let some time if it wants to disappear first.
        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        # cleanup debugger before flashing
        ret_val += self.debug_stop()
        ret_val += self.serial_redirection.stop()
        ret_val += self.flash(None)
        return ret_val

    @logger_call("Node EDBG: flash of edbg node")
    def flash(self, firmware_path=None, binary=False, offset=0):
        """ Flash the given firmware on EDBG node

        :param firmware_path: Path to the firmware to be flashed on `node`.
                              If None, flash 'idle' firmware.
        """
        firmware_path = firmware_path or self.FW_IDLE
        LOGGER.info('Flash firmware on %s: %s',
                    self.TYPE.upper(), firmware_path)
        self._current_fw = firmware_path

        if self._in_debug:
            return self.openocd.flash(firmware_path, binary, offset)

        return self.edbg.flash(firmware_path, binary, offset)

    @logger_call("Node EDBG: reset of EDBG node")
    def reset(self):
        """ Reset the EDBG node using jtag """
        LOGGER.info('Reset %s node', self.TYPE.upper())
        return self.openocd.reset()

    def debug_start(self):
        """ Start EDBG node debugger """
        LOGGER.info('%s Node debugger start', self.TYPE.upper())
        self._in_debug = True
        if self._current_fw is not None:
            # Reflash current firmware using openocd to avoid misbehavior of
            # previously flashed firmware (with edbg)
            self.flash(firmware_path=self._current_fw)
        return self.openocd.debug_start()

    def debug_stop(self):
        """ Stop EDBG node debugger """
        LOGGER.info('%s Node debugger stop', self.TYPE.upper())
        self._in_debug = False
        return self.openocd.debug_stop()

    @staticmethod
    def status():
        """ Check EDBG node status """
        # Status is called when open node is not powered
        # So can't check for FTDI
        return 0
Esempio n. 3
0
class NodeSamr21(object):
    """ Open node SAMR21 implemention """

    TYPE = 'samr21'
    ELF_TARGET = ('ELFCLASS32', 'EM_ARM')
    TTY = '/dev/iotlab/ttyON_SAMR21'
    BAUDRATE = 115200
    OPENOCD_CFG_FILE = static_path('iot-lab-samr21.cfg')
    FW_IDLE = static_path('samr21_idle.elf')
    FW_AUTOTEST = static_path('samr21_autotest.elf')

    AUTOTEST_AVAILABLE = [
        'echo',
        'get_time',  # mandatory
        'leds_on',
        'leds_off'
    ]

    ALIM = '5V'

    def __init__(self):
        self.serial_redirection = SerialRedirection(self.TTY, self.BAUDRATE)
        self.openocd = OpenOCD.from_node(self)
        self.edbg = Edbg()

    @logger_call("Node SAMR21 : Setup of samr21 node")
    def setup(self, firmware_path):
        """ Flash open node, create serial redirection """
        ret_val = 0

        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        ret_val += self.flash(firmware_path)
        ret_val += self.serial_redirection.start()
        return ret_val

    @logger_call("Node SAMR21 : teardown of samr21 node")
    def teardown(self):
        """ Stop serial redirection and flash idle firmware """
        ret_val = 0
        # ON may have been stopped at the end of the experiment.
        # And then restarted again in cn teardown.
        # This leads to problem where the TTY disappears and reappears during
        # the first 2 seconds. So let some time if it wants to disappear first.
        common.wait_no_tty(self.TTY)
        ret_val += common.wait_tty(self.TTY, LOGGER)
        # cleanup debugger before flashing
        ret_val += self.debug_stop()
        ret_val += self.serial_redirection.stop()
        ret_val += self.flash(None)
        return ret_val

    @logger_call("Node SAMR21 : flash of sam21 node")
    def flash(self, firmware_path=None):
        """ Flash the given firmware on SAMR21 node

        :param firmware_path: Path to the firmware to be flashed on `node`.
                              If None, flash 'idle' firmware.
        """
        firmware_path = firmware_path or self.FW_IDLE
        LOGGER.info('Flash firmware on SAMR21: %s', firmware_path)
        return self.edbg.flash(firmware_path)

    @logger_call("Node SAMR21 : reset of samr21 node")
    def reset(self):
        """ Reset the SAMR21 node using jtag """
        LOGGER.info('Reset SAMR21 node')
        return self.openocd.reset()

    def debug_start(self):
        """ Start SAMR21 node debugger """
        LOGGER.info('SAMR21 Node debugger start')
        return self.openocd.debug_start()

    def debug_stop(self):
        """ Stop SAMR21 node debugger """
        LOGGER.info('SAMR21 Node debugger stop')
        return self.openocd.debug_stop()

    @staticmethod
    def status():
        """ Check SAMR21 node status """
        # Status is called when open node is not powered
        # So can't check for FTDI
        return 0