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


    一、 LCD st7789移植

    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>;
    	};
    };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
    dc-gpios = <&pio 4 5 GPIO_ACTIVE_LOW>;
    
    • 1
    • 2

    st7789V中指定了rst与dc引脚,pio 4 3 对应PE3,pio 4 5对应PE5;
    详细配置方式见链接:全志 :gpio使用
    需要根据自身硬件配置。

    Tips:更改 spi-max-frequency = <32000000> -> spi-max-frequency = <100000000>; 和 fps = <30>; 改为 fps = <60>; 感谢楼下老哥提示。
    rotate = <90>;根据屏幕方向更改。

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    对于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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    现在所有的修改都完成了,剩下的就是编译内核了,在内核根目录下执行
    make menuconfig
    2.5 内核配置
    由于FC1000S的SPI中有一个BUG,因此我们在开启SPI驱动的时候必须选择A31(Device Drivers -> SPI support)
    如图所示
    在这里插入图片描述
    现在选择ST7789V驱动并编译进内核中,如下:
    Device Drivers —>  
        [] Staging drivers —>  
            <
    > Support for small TFT LCD display modules —>
                  <*> FB driver for the ST7789V LCD Controller

    在这里插入图片描述
    保存退出,然后执行make命令编译内核,然后将镜像拷贝到tf卡第一分区中,此时可以看到屏幕已经可以驱动起来了,并且/dev目录下有fb0设备。

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

    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
    
    • 1
    tty0::askfirst:-/bin/sh
    
    • 1

    在这里插入图片描述

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

    Please press Enter to activate this console.
    
    • 1

    在这里插入图片描述

    按下回车键,即可进入终端,使用USB外接键盘,正常交互(按下回车键,前题是已经完成好F1C100S的USB驱动增加)。

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

    #console::respawn:-/bin/sh
    ttyS0::respawn:-/bin/sh
    tty0::respawn:-/bin/sh
    
    • 1
    • 2
    • 3

    二、linux vscode lvgl模拟器

    大部分操作参考https://blog.csdn.net/weixin_45652444/article/details/119756079
    实际操作有几率无法编译过
    一般卡在c99编译上
    解决办法 在顶层Makefile CFLAGS 后增加 -std=c99选项
    搞了很久才解决
    CFLAGS := -O0 -g $(WARNINGS) -std=c99
    在这里插入图片描述
    最简单的模拟器使用方法是安装Vs Studio 2019,打开模拟器工程;编译即可。

  • 相关阅读:
    矿物质电缆的优点与应用场所
    基于Tensorrtx 实现 darknet Yolov4-tiny 模型
    睿趣科技:抖音开店前期需要准备什么
    总结SQL中add constraint的用法
    微服务-微服务Nacos配置中心
    JUC-ReentrantLock锁基础篇
    day04_java基础
    Android 11源码——安全策略SELinux关闭
    干货复盘 | 银行数智化转型十大趋势
    内网服务器无法访问外网下载时,制作本地清华镜像源,搭建中转服务器(rinted)
  • 原文地址:https://blog.csdn.net/qq_33552551/article/details/133740350