| /* |
| * Copyright (c) 2019 LuoZhongYao |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <kernel.h> |
| #include <device.h> |
| #include <init.h> |
| #include <sys/printk.h> |
| |
| extern void __printk_hook_install(int (*fn)(int)); |
| extern void __stdout_hook_install(int (*fn)(int)); |
| |
| static int semihost_console_out(int ch) |
| { |
| static unsigned char c; |
| |
| c = ch; |
| __asm__ __volatile__ ( |
| "movs r1, %0\n" |
| "movs r0, #3\n" |
| "bkpt 0xab\n" |
| : |
| : "r" (&c) |
| : "r0", "r1"); |
| return ch; |
| } |
| |
| static int semihost_console_init(const struct device *dev) |
| { |
| ARG_UNUSED(dev); |
| |
| __printk_hook_install(semihost_console_out); |
| __stdout_hook_install(semihost_console_out); |
| |
| return 0; |
| } |
| |
| SYS_INIT(semihost_console_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); |