linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植

目录

  • 一、 LCD st7789移植
    • 1.设备树更改
    • 2. 修改linux自带的fbtft驱动
    • 5.测试
    • 6 将启动信息同时打印到lcd 和串口
    • 8.设置LCD屏幕为终端控制台
  • 二、linux vscode lvgl模拟器

一、 LCD st7789移植

1.设备树更改

linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第1张图片

&spi0 {
	pinctrl-names = "default";
	pinctrl-0 = <&spi0_pins_a>;
	status = "okay";

	flash@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "winbond,w25q128", "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <40000000>;
	};

};
&spi1 {
	pinctrl-names = "default";
	pinctrl-0 = <&spi1_pins_a>;
	status = "okay";

	st7789v@0 {
		status = "okay";
		compatible = "sitronix,st7789v";
			reg = <0>;
			spi-max-frequency = <32000000>;
			rotate = <90>;
			spi-cpol;
			spi-cpha;
			rgb;
			fps = <30>;
			buswidth = <8>;
			reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
			dc-gpios = <&pio 4 5 GPIO_ACTIVE_LOW>;
			debug = <0>;
	};
};


linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第2张图片

2. 修改linux自带的fbtft驱动

只需要更改下面的三个地方即可,因为新下载的内核已经做了升级

static int init_display(struct fbtft_par *par)
{
	par->fbtftops.reset(par);
	mdelay(50);
	write_reg(par,0x11);//Sleep exit
	mdelay(12);
	write_reg(par,0x11);
	mdelay(10);
	write_reg(par,0x3A,0x05); //65k mode
	write_reg(par,0xc5,0x1a);
	write_reg(par,0x36,0x70); // 屏幕显示方向设置
	//-------------ST7789V Frame rate setting-----------//
	write_reg(par,0xb2,0x05,0x05,0x00,0x33,0x33);
	write_reg(par,0xb7,0x35);
	//--------------ST7789V Power setting---------------//
	write_reg(par,0xbb,0x3f);
	write_reg(par,0xc0,0x2c);
	write_reg(par,0xc2,0x01);
	write_reg(par,0xc3,0x0f);
	write_reg(par,0xc4,0x20);
	write_reg(par,0xc6,0x11);
	write_reg(par,0xd0,0xa4,0xa1);
	write_reg(par,0xe8,0x03);
	write_reg(par,0xe9,0x09,0x09,0x08);
	write_reg(par,0xe0,0xd0,0x05,0x09,0x09,0x08,0x14,0x28,0x33,0x3f,0x07,0x13,0x14,0x28,0x30);
	write_reg(par,0xe1,0xd0,0x05,0x09,0x09,0x08,0x03,0x24,0x32,0x32,0x3b,0x14,0x13,0x28,0x2f);
	write_reg(par,0x21);
	write_reg(par,0x11);
	mdelay(120);      //Delay 120ms
	write_reg(par,0x29);
	mdelay(200);
	return 0;
}
static struct fbtft_display display = {
	.regwidth = 8,
	.width = 135,
	.height = 240,
	.gamma_num = 2,
	.gamma_len = 14,
	.gamma = DEFAULT_GAMMA,
	.fbtftops = {
		.init_display = init_display,
		.set_var = set_var,
		.set_gamma = set_gamma,
		.blank = blank,
	},
};

对于1.14寸液晶屏而言,其屏幕有偏移,这里需要修改fbtft-core.c文件中的fbtft_set_addr_win函数

static void fbtft_set_addr_win(struct fbtft_par *par, int xs, int ys, int xe,
                   int ye)
{
    write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,(xs+40) >> 8, xs+40, ((xe+40) >> 8) & 0xFF, (xe+40) & 0xFF);

    write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,((ys+52) >> 8) & 0xFF, (ys+52) & 0xFF, ((ye+52) >> 8) & 0xFF, (ye+52) & 0xFF);

    write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
}

现在所有的修改都完成了,剩下的就是编译内核了,在内核根目录下执行
make menuconfig
2.5 内核配置
由于FC1000S的SPI中有一个BUG,因此我们在开启SPI驱动的时候必须选择A31(Device Drivers -> SPI support)
如图所示
linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第3张图片
现在选择ST7789V驱动并编译进内核中,如下:
Device Drivers —>  
    [] Staging drivers —>  
        <
> Support for small TFT LCD display modules —>
              <*> FB driver for the ST7789V LCD Controller

linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第4张图片
保存退出,然后执行make命令编译内核,然后将镜像拷贝到tf卡第一分区中,此时可以看到屏幕已经可以驱动起来了,并且/dev目录下有fb0设备。

编译 make -j2
将设备树和zimage复制到tf卡中 重启可以看到光标闪烁
说明移植成功

5.测试

linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第5张图片

此时可以看到屏幕刷新了,然后编程了黑色背景,同时出现了光标,从终端的 log 可以看到,当
fb 挂载成功后,控制台驱动检测到 fb 设备后会自动将 fb0 映射到 tty0 上,这样 tty0 实际上就是 fb0 ttys0则是串口
设备。现在我们向屏幕输入一个 hello frame buffer,如下:
#echo hello frame buffer > /dev/tty0

可以看到此时液晶屏上显示了该文字,我们也可以将当前目录输出到液晶屏上:
ls / > /dev/tty0

6 将启动信息同时打印到lcd 和串口

实际上很就简单
在uboot启动 倒计时内按任意键进入uboot命令行,设置bootargs 添加console=tty0最前面即可
注意不要输入错误 一定要确保是在英文输入法下面输入的,有时不小心按到shift 进入中文输入字符就会不对,我就是这样 导致我格式化了多次tf卡
在这里插入图片描述

8.设置LCD屏幕为终端控制台

上面的步骤只能使Linux的启动信息显示到LCD上面,
要将LCD作为终端控制台还需要一下步骤

修改/etc/inittab文件,添加一行:

vi /etc/inittab
tty0::askfirst:-/bin/sh

linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第6张图片

修改完成以后保存/etc/inittab 并退出,然后重启开发板,重启以后开发板 LCD 屏幕最后一行会显示下面一行语句

Please press Enter to activate this console.

按下回车键,即可进入终端,使用USB外接键盘,正常交互。

下面这个方法是另一个博客里提到的方法,待测试
将原有的console注释掉,改为ttyS0和tty0,ttyS0是USB键盘输入,tty0就是正常输出输入

#console::respawn:-/bin/sh
ttyS0::respawn:-/bin/sh
tty0::respawn:-/bin/sh

二、linux vscode lvgl模拟器

大部分操作参考https://blog.csdn.net/weixin_45652444/article/details/119756079
实际操作有几率无法编译过
一般卡在c99编译上
解决办法 在顶层Makefile CFLAGS 后增加 -std=c99选项
搞了很久才解决
CFLAGS := -O0 -g $(WARNINGS) -std=c99
linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植_第7张图片
最简单的模拟器使用方法是安装Vs Studio 2019,打开模拟器工程;编译即可。

你可能感兴趣的:(#,Linux,linux,ui,嵌入式硬件)