博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (三) 27 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 console
阅读量:4284 次
发布时间:2019-05-27

本文共 2988 字,大约阅读时间需要 9 分钟。

console 和 输入没关系,只和输出有关系

模型

串口和 lcd 都能被当做 输出,所以能被当做 console
  • 无console机制的输出 : 串口
只是 利用 serial_puts 将 信息打印到 串口上
  • 无console机制的输出:lcd
只是 利用 lcd_puts 将 信息打印到 lcd上
  • console
将 serial_puts  和 lcd_puts 注册到 console 机制中调用 console 提供的 console_puts 打印信息至于打印到 串口还是 lcd ,则取决于 console的配置

U-boot 是怎么处理的

  • board_init_f->console_init_f 之前
gd->have_console  为 0串口还初始化此时不能输出(输出一般调用 printf) , 此时 printf 输出的信息在 内存中
  • board_init_f->console_init_f 之后,board_init_r->console_init_r 之前
gd->have_console  此时 为 1gd->flags & GD_FLG_DEVINIT == 0串口已经初始化了之前输出在内存中的信息已经打印到串口上了此时能输出(输出一般调用printf) , 此时 printf 输出的信息在串口上,调用的是 serial_puts
  • board_init_r->console_init_r 后
gd->have_console  此时 为 1gd->flags & GD_FLG_DEVINIT == 1串口已经初始化,且注册(init_sequence_r->stdio_add_devices->drv_system_init->stdio_register)到 console系统 中lcd已经初始化,且注册(init_sequence_r->stdio_add_devices->drv_lcd_init->stdio_register)到 console系统 中此时能输出(输出一般调用printf)此时printf 输出的信息 根据设置 可能会输出到 lcd上或者 串口上,调用的是 console_putsconsole_puts 再调用 serial_puts 或者 lcd_puts

细节阶段

  • stdio_register
其实就是将 struct stdio_dev 结构体 挂载到 全局变量static struct stdio_dev devs; 的末端
  • console_init_r
console_init_r 根据 SYS_CONSOLE_IS_IN_ENV  是否定义 有两个实现SYS_CONSOLE_IS_IN_ENV   // CONSOLE_MUX 为Y则为Y这允许在引导时设置多个输入/输出设备。例如,如果stdout设置为“serial,video”,那么在引导时输出将同时发送到serial和video设备。引导后可以更新环境变量以更改输入/输出设备。CONSOLE_MUX 	// VIDEO/DM_VIDEO/LCD 为Y 则 为 Y这允许对每个控制台“文件”使用多个设备。例如,stdout可以设置为转到串行和视频。类似地,stdin可以设置为来自串行和键盘。可以从任一来源提供输入。控制台多路复用为U-Boot增加了少量的大小。对环境变量stdout、stdin和stderr的更改将立即生效。
  • console_init_r SYS_CONSOLE_IS_IN_ENV 定义时
// 问题, 此时 找到了 outputdev ,但是 printf 的时候怎么用的 outputdevconsole_init_r	stdinname  = env_get("stdin");		stdoutname = env_get("stdout");	// stdoutname 可以是 lcd,serial0@7F005000	// 可以是 lcd	// 可以是 serial0@7F005000	// 如果其中有 逗号(,)  表示有两个stdout设备		stderrname = env_get("stderr");		iomux_err = iomux_doenv(stdin, stdinname);	iomux_err += iomux_doenv(stdout, stdoutname); 		for_each_consoledevice			console_devices[console] = (struct stdio_dev **)realloc(console_devices[console], cs_idx * sizeof(struct stdio_dev *));			memcpy(console_devices[console], cons_set, cs_idx * sizeof(struct stdio_dev *));			cd_count[console] = cs_idx;			iomux_err += iomux_doenv(stderr, stderrname);		stdio_print_current_devices	gd->flags |= GD_FLG_DEVINIT;	print_pre_console_buffer(flushpoint);

消费者

console_puts	for (i = 0; i < cd_count[file]; i++)		dev = console_devices[file][i];		dev->puts(dev, s);

控制台的设置

  • 正确设置
在 u-boot 环境下设置 环境变量,才可在 lcd 输出只有lcd输出 // 当设置如此的时候,串口也有输出,是因为程序作了改动 8c24d5adfbc43826246716e41f964f0467c1cfd6// 此时 BUG : 串口上会有一些 杂数据(promot 数据) 出来env set stdout lcdsa只有串口输出// 此时无任何问题env set stdout serial0@7F005000sa两者都输出 // 当设置如此的时候,串口打印两次,是因为程序作了改动 8c24d5adfbc43826246716e41f964f0467c1cfd6// 此时时序不满足(因为从串口getc之后马上要写入lcd,此时无法从串口getc下一个字符)env set stdout "lcd,serial0@7F005000" // 每次printf/puts的时候,先从lcd输出env set stdout "serial0@7F005000,lcd" // 每次printf/puts的时候,先从serial输出sa
  • 错误设置
env set stdout bbb## Error inserting "stdout" variable, errno=22bbb 不是一个 stdout 设备,不可以这么设置
  • env set stdout 解析
肯定是做了 iomux_doenv 类似的东西// TODO

转载地址:http://ddigi.baihongyu.com/

你可能感兴趣的文章
OK6410A 开发板 (八) 19 linux-5.11 OK6410A start_kernel 功能角度 第三阶段之init进程
查看>>
OK6410A 开发板 (八) 20 linux-5.11 OK6410A start_kernel 功能角度 第三阶段之kthreadd进程
查看>>
OK6410A 开发板 (八) 21 linux-5.11 OK6410A schedule 的 __switch_to 部分
查看>>
OK6410A 开发板 (八) 22 linux-5.11 OK6410A start_kernel 功能角度 第一阶段
查看>>
OK6410A 开发板 (八) 23 linux-5.11 OK6410A start_kernel 功能角度 第二阶段
查看>>
OK6410A 开发板 (八) 24 linux-5.11 OK6410A start_kernel 功能角度 第三阶段
查看>>
OK6410A 开发板 (八) 25 linux-5.11 OK6410A 进程角度 裸机和进程的区别
查看>>
getopt 解析
查看>>
文章标题
查看>>
linux前后台切换
查看>>
nmap
查看>>
uboot执行顺序main_loop
查看>>
uboot编译内容详解
查看>>
uboot Makefile 分析
查看>>
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>