一、开启u-boot显示功能
1、首先要说明的是,博主的LCD屏是裸屏,不需要对屏幕进行初始化,即可直接使用。所以下面的步骤是省略了显示屏初始化部分。
2、类比kernel开启显示功能,推测实现u-boot开启显示功能大概也是三个方面,第一配置设备树,第二是在菜单中打开驱动,第三是应用层调用。
2、事实也确是如此,但也并不完全如此。可能是因为博主的u-boot是LicheePi nano的版本,芯片有关于panel外设的部分(应该包括寄存器部分)已经在源码中固定写好了,亦或者panel本身是通用的外设接口,不需要再配置设备树,所以对于第一步的设备树不再需要配置。
3、接下来就是在菜单中打开驱动了。进入/usr/local/f1c200s/u-boot/u-boot路径下,执行make menuconfig,然后使能如下选项以开启u-boot的LCD panel驱动。
ARM architecture > Enable graphical uboot console on HDMI, LCD or VGA
4、当然,LCD panel虽然是通用接口,但是并不能自动检测屏幕大小,以及屏幕前后门廊等一些参数的。所以我们还需要配置LCD panel timing details选项,下面是博主的屏幕参数。
x:800,y:480,depth:18,pclk_khz:33000,le:16,ri:209,up:22,lo:22,hs:30,vs:1,sync:0,vmode:0
x y:这个自然就是屏幕的像素啦。
depth:屏幕的颜色深度,比如RGB888就是32,RGB666是18,具体是看屏幕硬件的接法。
pclk_khz:数据传输的时钟频率,要根据屏幕参数确定,不是越快越好,不然显示会失真或者有雪花的。
le:显示屏前廊,从行同步信号到图像左边沿的像素时钟数。
ri:显示屏后廊,从行同步到图像右边沿的像素时钟数,(可以结合上一条,理解为行同步信号是插入到两组行数据中间)。
up:从场同步到图像上边沿的行数,场信号可以理解为一张图片的起始信号。
lo:从场同步到图像下边沿的行数。
hs:行同步时间长度(像素时钟数)。
vs:场同步时间长度(行数)。
sync、vmode:这两个参数的配置,可以从文件include/uapi/linux/fb.h的211~229行找到一些蛛丝马迹,大概是控制视频刷新的一些参数。
5、要配置lcd,自然不能少了背光,接下来修改配置“() LCD panel backlight enable pin”的值为PE6,用以使能背光引脚。
6、这个时候,背光引脚尚没有配置完成。因为要配置设备树。gpio默认开始dm模式(driver model),gpio驱动需要寻找对应的设备,才能执行对应的驱动。具体可以参考https://www.freesion.com/article/368464004/
于是乎,在文件/usr/local/f1c200s/kernel/linux-5.7.1/arch/arm/boot/dts/suniv-f1c100s.dtsi内的根节点下,添加gpio的设备节点。
pinctrl: pinctrl@1c20800 {
compatible = "allwinner,sun4i-a10-pinctrl";
reg = <0x01c20800 0x2c4>;
#address-cells = <1>;
#size-cells = <1>;
pa: pa {
gpio-controller;
#gpio-cells = <2>;
};
pb: pb {
gpio-controller;
#gpio-cells = <2>;
};
pc: pc {
gpio-controller;
#gpio-cells = <2>;
};
pd: pd {
gpio-controller;
#gpio-cells = <2>;
};
pe: pe {
gpio-controller;
#gpio-cells = <2>;
};
pf: pf {
gpio-controller;
#gpio-cells = <2>;
};
};
7、修改完上述,再将bin文件烧录到tf内,上电,就能看到开机的logo啦。什么,第三步应用层调用还没有配置,那是因为u-boot默认就开启了logo显示的功能。
二、修改开机logo
1、默认的开机logo,怎么能显示出我们设配的特色呢,立刻马上就更换。既然原本有开机logo,那是不是只要把它换成我们自己的图片就可以了,那当然是的。
2、首先呢,需要准备一张bmp图片,颜色深度为8位,切记不能太大了,不然就会超出u-boot的尺寸。博主默默拿出了珍藏的病娇。
如果凑巧电脑没有安装ps,可以使用Ubuntu上的方法
//首先安装对应的工具
sudo apt-get install netpbm
//然后将jpg转换为bmp图片,$1是源文件名,$2是输出文件名
jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2
3、将制作好的BMP图片,放置到/usr/local/f1c200s/u-boot/u-boot/tools/logos路径下面。然后还不够,还需要修改相关文件使之和源码相关联。
打开文件/usr/local/f1c200s/u-boot/u-boot/tools/Makefile,修改223行的LOGO_BMP,使其指向自己的bmp图片。
4、这样,开机logo就修改成我们自己的图片了,但是目前还不能正常使用。因为它只是图片,还需要转化成数组,编译进我们的可执行bin文件内,才能被执行。
好在这一步已经被u-boot做掉了,我们只需要在 uboot/include/configs/suniv.h 中加入两个宏定义即可。
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
5、当然不要忘了先执行make clean,然后执行make,最后烧录。可以看到u-boot开机logo已经变成了我们自定义的图片,只不过8位图片显示失真严重。
6、图片居然不是居中的,而且还打印了一些版本信息。对于强迫症来说,心里面痒痒的。打开文件drivers/video/cfb_console.c
嗯~,舒服多了。
三、u-boot过度到kernel时的花屏问题
1、首先要感谢这位博主的分享https://whycan.com/t_3792.html
2、从u-boot过度到kernel的时候,会出现一秒钟的花屏。是因为u-boot驱动屏幕显示的那片内存,在过度到kernel的时候,被初始化掉了,才导致显示的异常。又因为这片内存区域是在最后面,所以我们可以通过限制kernel的内存大小,避免这片区域被初始化,从而解决这个问题。
3、操作方式就是,执行make menuconfig,在uboot菜单中的bootargs项目(Boot arguments),添加mem=62M,记得加空格。
四、关闭autoboot倒计时
1、关闭u-boot跳转autoboot倒计时是比较简单的,只需要在配置菜单内,将(0) delay in seconds before automatically booting设置为零即可。
2、但是需要注意的是,运行过u-boot的tf卡,会保存环境变量,所以修改上述配置后,还需要在u-boot重置一下环境变量。具体操作是,在倒计时过程中按任意键进入命令行。
//重置环境变量
env default -a
//查看环境变量,对应bootdelay=0
print
//保存变更
saveenv
改变autoboot为零后,若想进入命令模式,只需要在开机的时候狂按任意按键,就可以进入命令行。
五、删除kernel的logo和光标
1、在启动kernel的时候,我们会看到屏幕又跳出了内核的开机logo。不过此时,我们只需要在内核菜单的Device Drivers > Graphics support > Bootup logo位置,就可以轻易关闭它了。
2、现在我们的设备,从开机logo到运行lvgl的demo程序,跳转终于正常了,但是在运行demo的时候,输入光标一直在哪里一闪一闪的,影响界面的显示效果。要想关闭他们,可以打开文件drivers/video/fbdev/core/fbcon.c,将如下这两个函数的内容屏蔽掉,就不会有光标跳出来影响观感了。
388:static void fb_flashcursor(struct work_struct *work)
1384:static void fbcon_cursor(struct vc_data *vc, int mode)
催更USB网络|´・ω・)ノ
安排୧(๑•̀⌄•́๑)૭
我调试通了,成功挂载了nfs,可以和ubuntu传文件了ヾ(≧∇≦*)ゝ
厉害了^o^
催更崔更