def mc_setup_segger_rtt(name): | |
segger = monitor.Machine[name] | |
bus = monitor.Machine.SystemBus | |
cpus = bus.GetCPUs() | |
def store_char(cpu, _): | |
segger.DisplayChar(cpu.GetRegisterUnsafe(1).RawValue) | |
def has_key(cpu, _): | |
cpu.SetRegisterUnsafeUlong(0, 1 if segger.Contains(ord('\r')) else 0) | |
cpu.PC = cpu.LR | |
def read(cpu, _): | |
buffer = cpu.GetRegisterUnsafe(1).RawValue | |
size = cpu.GetRegisterUnsafe(2).RawValue | |
written = segger.WriteBufferToMemory(buffer, size, cpu) | |
cpu.SetRegisterUnsafeUlong(0, written) | |
cpu.PC = cpu.LR | |
def add_hook(symbol, function): | |
for cpu in cpus: | |
try: | |
cpu.AddHook(bus.GetSymbolAddress(symbol), function) | |
except: | |
print "Failed to hook at '{}' for cpu {}".format(symbol, cpu.GetName()) | |
add_hook("_StoreChar", store_char) | |
add_hook("SEGGER_RTT_HasKey", has_key) | |
add_hook("SEGGER_RTT_Read", read) |