62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
|
|
#
|
||
|
|
# Copyright (c) 2010-2025 Antmicro
|
||
|
|
#
|
||
|
|
# This file is licensed under the MIT License.
|
||
|
|
# Full license text is available in 'licenses/MIT.txt'.
|
||
|
|
#
|
||
|
|
|
||
|
|
def mc_setup_segger_rtt(console, with_has_key = True, with_read = True, with_write = True, with_has_data = False, with_putchar = False):
|
||
|
|
# `mc_` is omitted as it isn't needed in the Monitor.
|
||
|
|
setup_arg_spec = 'setup_segger_rtt(console, with_has_key = True, with_read = True, with_write = True, with_has_data = False, with_putchar = False)'
|
||
|
|
bus = monitor.Machine.SystemBus
|
||
|
|
|
||
|
|
def has_data(cpu, _):
|
||
|
|
cpu.SetRegisterUlong(0, 1 if console.Contains(ord('\r')) else 0)
|
||
|
|
cpu.PC = cpu.LR
|
||
|
|
|
||
|
|
def read(cpu, _):
|
||
|
|
buffer = cpu.GetRegister(1).RawValue
|
||
|
|
size = cpu.GetRegister(2).RawValue
|
||
|
|
written = console.WriteBufferToMemory(buffer, size, cpu)
|
||
|
|
cpu.SetRegisterUlong(0, written)
|
||
|
|
cpu.PC = cpu.LR
|
||
|
|
|
||
|
|
def write(cpu, _):
|
||
|
|
pointer = cpu.GetRegister(1).RawValue
|
||
|
|
length = cpu.GetRegister(2).RawValue
|
||
|
|
for i in range(length):
|
||
|
|
console.DisplayChar(bus.ReadByte(pointer + i))
|
||
|
|
|
||
|
|
cpu.SetRegisterUlong(0, length)
|
||
|
|
cpu.PC = cpu.LR
|
||
|
|
|
||
|
|
def write_char(cpu, _):
|
||
|
|
char = cpu.GetRegister(1).RawValue
|
||
|
|
console.DisplayChar(char)
|
||
|
|
cpu.PC = cpu.LR
|
||
|
|
|
||
|
|
def add_hook(symbol, function, argument_name = None):
|
||
|
|
for cpu in bus.GetCPUs():
|
||
|
|
found, addresses = bus.TryGetAllSymbolAddresses(symbol, context=cpu)
|
||
|
|
|
||
|
|
if not found:
|
||
|
|
cpu.WarningLog("Symbol '{}' not found. Make sure the binary is loaded before calling setup_segger_rtt"
|
||
|
|
.format(symbol))
|
||
|
|
if argument_name is not None:
|
||
|
|
cpu.WarningLog("Adding this hook can be omitted by passing False to the optional '{}' argument:\n{}"
|
||
|
|
.format(argument_name, setup_arg_spec))
|
||
|
|
|
||
|
|
for address in addresses:
|
||
|
|
cpu.AddHook(address, function)
|
||
|
|
|
||
|
|
if with_has_key:
|
||
|
|
add_hook("SEGGER_RTT_HasKey", has_data, "with_has_key")
|
||
|
|
if with_has_data:
|
||
|
|
add_hook("SEGGER_RTT_HasData", has_data, "with_has_data")
|
||
|
|
if with_read:
|
||
|
|
add_hook("SEGGER_RTT_ReadNoLock", read, "with_read")
|
||
|
|
if with_write:
|
||
|
|
add_hook("SEGGER_RTT_WriteNoLock", write, "with_write")
|
||
|
|
if with_putchar:
|
||
|
|
add_hook("SEGGER_RTT_PutChar", write_char, "with_putchar")
|