Esempio n. 1
0
def intrusive_cortex_m_probe_and_setup(options, adapter, openocd_rpc):
    '-> (dap_info, mcu_info, openocd_rpc)'
    o = openocd_rpc

    mdetect = OpenOcdCortexMDetect(options, adapter, o)

    # Try SWD first (read IDCODE), if that fails falllback to JTAG
    # Use adapter_info and querying the adapters (e.g. cmsis-dap INFO_ID_CAPS command)
    # to know whether the adapter supports SWD/JTAG
    openocd_transport = 'swd'
    try:
        adapter = mdetect.openocd_init_for_detection(openocd_transport)
    except (OpenOcdOpenFailedDuringInit,) as e:
        raise CortexMProbeFatalError("can't open adapter: %r" % (e.args[0],))
    except (AdapterDoesntSupportTransport, OpenOcdDoesntSupportTransportForAdapter):
        try_jtag = True
    except (ConnectionError):
        # protocol or connection error
        assert(o.pid is not None)
        kill_ignore_echild(o.pid, signal.SIGTERM)
        subprocess.call(['tmux', 'kill-session', '-t', tmux_session_name_for_adapter(adapter)])
        time.sleep(0.01)
        (o, openocd_newly_started_or_not) = openocd_rpc_for_adapter(adapter)
        mdetect = OpenOcdCortexMDetect(options, adapter, o)
        adapter = mdetect.openocd_init_for_detection(openocd_transport)

    # OpenOCD limits 'flash bank' to config stage
    # So declare_flash_bank is called afer openocd_init_for_detection() and before openocd_init_for_cortex_m()

    try:
        o.reset_halt()
    except OpenOcdResetError as e:
        raise CortexMProbeFatalError("Can't reset target CPU. Check your debug connection wiring, "
                                     "target power and hardware reset signal wiring.")

    dap_info = None
    try:
        dap_info = mdetect.detect_dap()
    except OpenOcdCortexMDetectError as e:
        try:
            voltage = o.target_voltage()
        except OpenOcdCommandNotSupportedError:
            if voltage <= 1.5:
                raise CortexMProbeFatalError('target voltage %f is too low. Check your debug connection wiring' %
                                             (voltage,))
        try_jtag = True
    else:
        try_jtag = False

    if try_jtag:
        openocd_transport = 'jtag'
        try:
            adapter = mdetect.openocd_init_for_detection(openocd_transport)
        except (AdapterDoesntSupportTransport, OpenOcdDoesntSupportTransportForAdapter):
            dap_info = None
        else:
            # protocol or connection error
            assert(o.pid is not None)
            kill_ignore_echild(o.pid, signal.SIGTERM)
            subprocess.call(['tmux', 'kill-session', '-t', tmux_session_name_for_adapter(adapter)])
            adapter = mdetect.openocd_init_for_detection(openocd_transport)
            o.reset_init()
            try:
                dap_info = mdetect.detect_dap()
            except OpenOcdCortexMDetectError:
                dap_info = None

    if dap_info is None:
        raise CortexMProbeFatalError('failed to detect ARM Debug Access Port')

    logging.info('dap_info: %r' % (HexDict(dap_info),))

    # mcu_info: silicon vendor, MCU family, make, revision etc
    try:
        mcu_info = mdetect.detect_mcu(dap_info)
    except OpenOcdCortexMDetectError:
        o.openocd_shutdown()
        waitpid_ignore_echild(o.pid)
        raise

    logging.info('mcu_info: %r' % (HexDict(mcu_info),))

    # Don't attempt to 'init' OpenOCD twice, shutdown then re-launch instead
    o.openocd_shutdown()
    waitpid_ignore_echild(o.pid)

    (o, openocd_newly_started_or_not) = openocd_rpc_for_adapter(adapter)
    mdetect = OpenOcdCortexMDetect(options, adapter, o)
    mdetect.openocd_init_for_cortex_m(openocd_transport, dap_info, mcu_info)
    # OpenOCD gdbserver is up after 'init'
    return (dap_info, mcu_info, o)
Esempio n. 2
0
def intrusive_cortex_m_probe_and_setup(options, adapter, openocd_rpc):
    '-> (dap_info, mcu_info, openocd_rpc)'
    o = openocd_rpc

    mdetect = OpenOcdCortexMDetect(options, adapter, o)

    # Try SWD first (read IDCODE), if that fails falllback to JTAG
    # Use adapter_info and querying the adapters (e.g. cmsis-dap INFO_ID_CAPS command)
    # to know whether the adapter supports SWD/JTAG
    openocd_transport = 'swd'
    try:
        adapter = mdetect.openocd_init_for_detection(openocd_transport)
    except (OpenOcdOpenFailedDuringInit, ) as e:
        raise CortexMProbeFatalError("can't open adapter: %r" % (e.args[0], ))
    except (AdapterDoesntSupportTransport,
            OpenOcdDoesntSupportTransportForAdapter):
        try_jtag = True
    except (ConnectionError):
        # protocol or connection error
        assert (o.pid is not None)
        kill_ignore_echild(o.pid, signal.SIGTERM)
        subprocess.call([
            'tmux', 'kill-session', '-t',
            tmux_session_name_for_adapter(adapter)
        ])
        time.sleep(0.01)
        (o, openocd_newly_started_or_not) = openocd_rpc_for_adapter(adapter)
        mdetect = OpenOcdCortexMDetect(options, adapter, o)
        adapter = mdetect.openocd_init_for_detection(openocd_transport)

    # OpenOCD limits 'flash bank' to config stage
    # So declare_flash_bank is called afer openocd_init_for_detection() and before openocd_init_for_cortex_m()

    try:
        o.reset_halt()
    except OpenOcdResetError as e:
        raise CortexMProbeFatalError(
            "Can't reset target CPU. Check your debug connection wiring, "
            "target power and hardware reset signal wiring.")

    dap_info = None
    try:
        dap_info = mdetect.detect_dap()
    except OpenOcdCortexMDetectError as e:
        try:
            voltage = o.target_voltage()
        except OpenOcdCommandNotSupportedError:
            if voltage <= 1.5:
                raise CortexMProbeFatalError(
                    'target voltage %f is too low. Check your debug connection wiring'
                    % (voltage, ))
        try_jtag = True
    else:
        try_jtag = False

    if try_jtag:
        openocd_transport = 'jtag'
        try:
            adapter = mdetect.openocd_init_for_detection(openocd_transport)
        except (AdapterDoesntSupportTransport,
                OpenOcdDoesntSupportTransportForAdapter):
            dap_info = None
        else:
            # protocol or connection error
            assert (o.pid is not None)
            kill_ignore_echild(o.pid, signal.SIGTERM)
            subprocess.call([
                'tmux', 'kill-session', '-t',
                tmux_session_name_for_adapter(adapter)
            ])
            adapter = mdetect.openocd_init_for_detection(openocd_transport)
            o.reset_init()
            try:
                dap_info = mdetect.detect_dap()
            except OpenOcdCortexMDetectError:
                dap_info = None

    if dap_info is None:
        raise CortexMProbeFatalError('failed to detect ARM Debug Access Port')

    logging.info('dap_info: %r' % (HexDict(dap_info), ))

    # mcu_info: silicon vendor, MCU family, make, revision etc
    try:
        mcu_info = mdetect.detect_mcu(dap_info)
    except OpenOcdCortexMDetectError:
        o.openocd_shutdown()
        waitpid_ignore_echild(o.pid)
        raise

    logging.info('mcu_info: %r' % (HexDict(mcu_info), ))

    # Don't attempt to 'init' OpenOCD twice, shutdown then re-launch instead
    o.openocd_shutdown()
    waitpid_ignore_echild(o.pid)

    (o, openocd_newly_started_or_not) = openocd_rpc_for_adapter(adapter)
    mdetect = OpenOcdCortexMDetect(options, adapter, o)
    mdetect.openocd_init_for_cortex_m(openocd_transport, dap_info, mcu_info)
    # OpenOCD gdbserver is up after 'init'
    return (dap_info, mcu_info, o)