u-boot 阶段
lowlevel_init 调用了以下函数 实现了 putc ,但不支持 printf
spl_config_uart_baudrate
uart_asm_init
asm_putc
board_init_f 调用了以下函数,完成后,支持printf
initf_dm
init_baud_rate // 查找 环境变量 baudrate
gd->baudrate = env_get_ulong("baudrate", 10, 115200);
serial_init // 重新设置了一下波特率
serial_find_console_or_panic
gd->flags |= GD_FLG_SERIAL_READY;
serial_setbrg
console_init_f // 该函数执行完后printf 可用了
gd->have_console = 1;
console_update_silent
print_pre_console_buffer
board_init_r 调用了以下函数,增加了什么支持?
initr_dm
stdio_init_tables
INIT_LIST_HEAD(&devs.list);
serial_initialize
serial_init
serial_find_console_or_panic
gd->flags |= GD_FLG_SERIAL_READY;
serial_setbrg
stdio_add_devices
drv_system_init
struct stdio_dev dev;
memset (&dev, 0, sizeof (dev));
strcpy (dev.name, "serial");
dev.flags = 0x00000002 | 0x00000001;
dev.putc = stdio_serial_putc;
dev.puts = stdio_serial_puts;
dev.getc = stdio_serial_getc;
dev.tstc = stdio_serial_tstc;
stdio_register (&dev);
serial_stdio_init
// null
console_init_r
struct stdio_dev *inputdev = 0;
struct stdio_dev *outputdev = 0;
struct list_head *list = stdio_get_list();
struct list_head *pos;
struct stdio_dev *dev;
int flushpoint;
if (console_update_silent())
flushpoint = 0;
else
flushpoint = 1;
for (pos = (list)->next; prefetch(pos->next), pos != (list); pos = pos->next) {
dev = ({
const typeof( ((struct stdio_dev *)0)->list ) *__mptr = (pos); (struct stdio_dev *)( (char *)__mptr - __builtin_offsetof (struct stdio_dev, list) );});
if ((dev->flags & 0x00000001) && (inputdev == 0)
inputdev = dev;
if ((dev->flags & 0x00000002) && (outputdev ==0)
outputdev = dev;
}
console_setfile(1, outputdev);
console_setfile(2, outputdev);
console_setfile(0, inputdev);
stdio_print_current_devices
for (i = 0; i < 3; i++) {
env_set(stdio_names[i], stdio_devices[i]->name);
}
gd->flags |= GD_FLG_DEVINIT;
print_pre_console_buffer(flushpoint);
OK6410A 开发板 (三) 17 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 串口
猜你喜欢
转载自blog.csdn.net/u011011827/article/details/115265124
今日推荐
周排行