天天看点

LCD 屏幕显示内核打印信息

参考:

The Linux Kernel documentation(可能会失效)

要想在 LCD 屏幕上显示内核的打印信息,需要确保以下三点

1:设备树或者 u-boot 中要去指定 bootargs 的 console 参数。在官网文档描述中,console 是可以多次指定的。

eg:
bootargs = "console=tty1 console=ttyS0......"
上述 tty1 是 LCD 屏幕在 /dev 下的节点名,需要根据实际情况来
上述 ttyS0 是串口的节点,需要根据实际情况来
中间是空格,不要用逗号!
           

上述需要注意的是:

        默认情况下,哪一个 console 写在最后面,那么就只能使用其作为交互的终端。比如上述例子,内核启动的信息会同时加载到串口和 LCD 上。但默认情况下只能串口作为交互的终端。就是LCD 屏幕不能通过外接键盘的方式去交互。若 tty1 写在后面。那么会发现在串口打印 starting kernel 后就没有输出了,但是 LCD 屏幕可以当做交互的终端设备。

        可以通过修改来达到 LCD 和 串口都作为终端的方式,详见下方

2:在内核编译时允许开启以下两项

        CONFIG_FRAMEBUFFER_CONSOLE=y

        CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y

可在 menuconfig 中配置。在如下目录下:

Device Drivers

        Graphics support

                Console display driver support

选中 Framebuffer Console support 和其子项 Map the console to the primary display device.

这两项就对应于上述的两个 CONFIG。其余的根据需要。

在 .config 文件中确定上述两个 CONFIG 都开启后就可以开始编译了。编译的对象在  drivers/video/fbdev/core 下的 fbcon.o bitblit.o 和 softcursor.o 文件。根据需要可能还有带有其他文件的编译。若在当前目录下没有找到这3个文件的话,可以去 drivers/video/console 目录下找找看。

3:确保当前 SOC 的 LCD 驱动正确。

        这一点如果出现问题其实不好发现。若实际中使用的是内核中自带的(drivers/video/fbdev 下的)LCD 控制器驱动。那么只要保证你在设备树中对实际使用的 LCD 屏幕参数描述正确后,基本上没有什么问题。有问题也不会是驱动的问题。因为这部分 LCD 控制器驱动都是厂商做好了的。

        若你使用的 LCD 控制器驱动是自己写的,那么就可能会有一些细枝末节需要注意了。

        在我实际使用中,使用的 SOC 在内核中并没有写好的 LCD 控制器驱动。使用的是公司同事编写的 LCD 控制器驱动。这个驱动在不开启  Framebuffer Console support 时并没有什么问题。在用户态可以正常使用。但是一旦开启 Framebuffer Console support 后,就会导致内核启动时 “卡住”。在 starting kernel 后就没有了任何反应。经过与正常的 LCD 控制器驱动对比后发现如下两处会导致内核起不来的现象:

 1:在驱动中对 fb_ops 结构体构建时,应该加上 .fb_imageblit 成员函数的赋值操作。使其等于 cfb_imagebit 函数。cfb_imagebit  函数是内核自带的。

2:在 *_probe 函数中,在调用 register_framebuffer 前应该调用 platform_set_drvdata 函数来存储用户在 probe 函数中主动申请的内存区域指针以防丢失。

4:使用 LCD 屏幕作为终端

打开 rootfs 中的 /etc/inittab,加入如下代码

tty1::askfirst:-/bin/sh
           

tty1是 LCD 在 /dev 下的节点名

然后重启系统,在接上键盘的情况下,按下回车,就可以使用 LCD 作为交互的终端了,但是在运行一些全屏的程序时,按下 ctrl+c。屏幕上运行的程序是停止了,但是屏幕上的显示不会刷新回终端的形式,比如QT程序,所以使用起来还是串口作为终端比较方便。

        若是使用 buildroot 生成的 rootfs 。那么使用LCD 屏幕作为终端会导致在 LCD 屏幕上终端是不需要输入用户名和密码的。这点可以在 buildroot 的 menuconfig 配置更改。在如下路径:

System configuration

        Run a getty

                TTY port 中输入控制台设备节点名,注意只输入节点名就好。如 tty1

        然后再编译并修改 rootfs 中的 /etc/inittab。然后就可以在 LCD屏幕上正常输入用户名和密码

继续阅读