本文共 2988 字,大约阅读时间需要 9 分钟。
console 和 输入没关系,只和输出有关系
串口和 lcd 都能被当做 输出,所以能被当做 console
只是 利用 serial_puts 将 信息打印到 串口上
只是 利用 lcd_puts 将 信息打印到 lcd上
将 serial_puts 和 lcd_puts 注册到 console 机制中调用 console 提供的 console_puts 打印信息至于打印到 串口还是 lcd ,则取决于 console的配置
gd->have_console 为 0串口还初始化此时不能输出(输出一般调用 printf) , 此时 printf 输出的信息在 内存中
gd->have_console 此时 为 1gd->flags & GD_FLG_DEVINIT == 0串口已经初始化了之前输出在内存中的信息已经打印到串口上了此时能输出(输出一般调用printf) , 此时 printf 输出的信息在串口上,调用的是 serial_puts
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
其实就是将 struct stdio_dev 结构体 挂载到 全局变量static struct stdio_dev devs; 的末端
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的更改将立即生效。
// 问题, 此时 找到了 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 设备,不可以这么设置
肯定是做了 iomux_doenv 类似的东西// TODO
转载地址:http://ddigi.baihongyu.com/