野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2758|回复: 6

[经验\资料] 给Lubancat装一个spi小屏幕

[复制链接]
发表于 2023-5-12 17:07:16 | 显示全部楼层 |阅读模式
本帖最后由 charlieee 于 2023-5-12 18:12 编辑

软/硬件信息:lubancat1 + ubuntu22.04.1通用镜像 + st7789v驱动的172x320 IPS LCD。

通过fbtft来驱动lcd,fbtft在内核里有,但是没编译进去。

步骤如下:



一、把spi屏幕连接上

楼主用的spi3,具体接线如图2。



二、魔改一下驱动和设备树插件

第一步、下载和解压内核源码kernel-stable-4.19-rk356x

第二步、在/kernel-stable-4.19-rk356x/drivers/staging/fbtft目录下有很多lcd控制器的驱动名字叫 fb_****.c ,找到你的屏幕对应的那一个,没有也无所谓,随便进一个,我这里是fb_st7789v.c:

  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * FB driver for the ST7789V LCD Controller
  4. *
  5. * Copyright (C) 2015 Dennis Menschel
  6. */

  7. #include <linux/bitops.h>
  8. #include <linux/delay.h>
  9. #include <linux/init.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <video/mipi_display.h>

  13. #include "fbtft.h"

  14. #define DRVNAME "fb_st7789v" //驱动名字不要管



  15. //参考卖屏幕的给的初始化代码
  16. static int init_display(struct fbtft_par *par)
  17. {
  18.     par->fbtftops.reset(par); //reset
  19.     mdelay(50);
  20.     write_reg(par,0x11);//Sleep exit
  21.         write_reg(par,0x36,0x70); // 屏幕显示方向设置 横屏
  22.     write_reg(par,0x3A,0x05); //65k mode
  23. //-------------ST7789V Frame rate setting-----------//
  24.     write_reg(par,0xb2,0x0C,0x0C,0x00,0x33,0x33);
  25.     write_reg(par,0xb7,0x35);
  26. //--------------ST7789V Power setting---------------//
  27.     write_reg(par,0xbb,0x35);
  28.     write_reg(par,0xc0,0x2c);
  29.     write_reg(par,0xc2,0x01);
  30.     write_reg(par,0xc3,0x13);
  31.     write_reg(par,0xc4,0x20);
  32.     write_reg(par,0xc6,0x0F);
  33.     write_reg(par,0xd0,0xa4,0xa1);
  34.     write_reg(par,0xD6,0xA1);
  35.     //write_reg(par,0xe9,0x09,0x09,0x08);
  36.     write_reg(par,0xe0,0xF0,0x00,0x04,0x04,0x04,0x05,0x29,0x33,0x3E,0x38,0x12,0x12,0x28,0x30);
  37.     write_reg(par,0xe1,0xF0,0x07,0x0A,0x0D,0x0B,0x07,0x28,0x33,0x3E,0x36,0x14,0x14,0x29,0x32);
  38.     write_reg(par,0x21); //反色显示 有的ips屏幕要设置反色才能正常显示
  39.     write_reg(par,0x11);
  40.     mdelay(120);      //Delay 120ms
  41.     write_reg(par,0x29);
  42.     mdelay(200);
  43.     return 0;
  44. };


  45. //本来就有 没动过
  46. static int blank(struct fbtft_par *par, bool on)
  47. {
  48.         if (on)
  49.                 write_reg(par, MIPI_DCS_SET_DISPLAY_OFF);
  50.         else
  51.                 write_reg(par, MIPI_DCS_SET_DISPLAY_ON);
  52.         return 0;
  53. }

  54. //在init里设置过了
  55. static int set_var(struct fbtft_par *par)
  56. {
  57.         return 0;
  58. }

  59. //在init里设置过了
  60. static int set_gamma(struct fbtft_par *par, u32 *curves)
  61. {
  62.         return 0;
  63. }

  64. //设置屏幕显示位置
  65. static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe,
  66.                                int ye)
  67. {
  68.         //硬件的偏移,参考卖屏幕的给的代码
  69.         ys = ys + 34;
  70.         ye = ye + 34;
  71.         write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,
  72.                   (xs >> 8) & 0xFF, xs & 0xFF, (xe >> 8) & 0xFF, xe & 0xFF);

  73.         write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,
  74.                   (ys >> 8) & 0xFF, ys & 0xFF, (ye >> 8) & 0xFF, ye & 0xFF);

  75.         write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
  76. }


  77. static struct fbtft_display display = {
  78.         .regwidth = 8,
  79.         .width = 320,  //自己配置
  80.         .height = 172, //自己配置
  81.         .fbtftops = {
  82.                 .init_display = init_display,
  83.                 .set_var = set_var,
  84.                 .set_gamma = set_gamma,
  85.                 .blank = blank,
  86.                 .set_addr_win = set_addr_win
  87.         },
  88. };


  89. FBTFT_REGISTER_DRIVER(DRVNAME, "my,spi_lcd", &display); //这里的名字要和设备树里节点里的compatible属性值一样!

  90. MODULE_ALIAS("spi:" DRVNAME);
  91. MODULE_ALIAS("platform:" DRVNAME);
  92. MODULE_ALIAS("spi:st7789v");
  93. MODULE_ALIAS("platform:st7789v");

  94. MODULE_DESCRIPTION("FB driver for the ST7789V LCD Controller");
  95. MODULE_AUTHOR("Dennis Menschel");
  96. MODULE_LICENSE("GPL");
复制代码


第三步、在目录kernel-stable-4.19-rk356x/arch/arm64/boot/dts/rockchip/overlay/下创建一个新的设备树源码文件:my_lcd_fbtft.dts:代码如下:

  1. /dts-v1/;
  2. /plugin/;

  3. #include <dt-bindings/gpio/gpio.h>
  4. #include <dt-bindings/pinctrl/rockchip.h>
  5. #include <dt-bindings/clock/rk3568-cru.h>
  6. #include <dt-bindings/interrupt-controller/irq.h>


  7. / {
  8.         compatible = "rockchip,rk3568";

  9.         fragment@0 {
  10.                 target = <&spi3>;

  11.                 __overlay__ {
  12.                         status = "okay";
  13.             cs-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
  14.                         #address-cells = <1>;
  15.                         #size-cells = <0>;

  16.             //assigned-clock-rates = <100000000>; //100M
  17.                         // 40PIN引脚只预留SPI3 CS0引脚,如果有多个CS信号,可以使用gpio模拟cs
  18.                         pinctrl-names = "default", "high_speed";  //引脚状态名字
  19.                         pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>; //default状态下的引脚配置
  20.                         pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>; //配置了“high_speed”,驱动会用这个,而不是default

  21.             spi_lcd@0 {
  22.                 compatible = "my,spi_lcd";
  23.                 reg = <0>; //chip select 0:cs0  1:cs1
  24.                 spi-max-frequency = <50000000>; //spi output clock 50M
  25.                 buswidth = <8>; //fbtft用的 带宽
  26.                 fps = <50>; //fbtft用的 fps
  27.                 //指定引用引脚,以及有效电平
  28.                 dc-gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>; //GPIO_A7 data/command 103
  29.                 reset-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>; //GPIO3_A6 reset 102
  30.                 led-gpios = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>; //GPIO3_A5 back light 101
  31.                 pinctrl-names = "default";
  32.                 pinctrl-0 = <&spi_lcd_cmd_pin &spi_lcd_reset_pin &spi_lcd_light_pin>;
  33.             };
  34.         };
  35.     };

  36.     fragment@1 {
  37.         target = <&pinctrl>;

  38.         __overlay__ {
  39.             spi_lcd {
  40.                 //配置指定引脚的 复用/上下拉/驱动能力 等
  41.                 spi_lcd_cmd_pin: spi_lcd_cmd_pin {
  42.                     rockchip,pins = <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
  43.                 };
  44.                 spi_lcd_reset_pin: spi_lcd_reset_pin {
  45.                     rockchip,pins = <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
  46.                 };        
  47.                 spi_lcd_light_pin: spi_lcd_light_pin {
  48.                     rockchip,pins = <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
  49.                 };
  50.             };

  51.         };

  52.     };

  53.     //下面的是关hdmi,不然小屏幕显示不了?
  54.     fragment@2 {
  55.         target = <&route_hdmi>;

  56.         __overlay__ {
  57.             status = "disabled";
  58.         };
  59.     };


  60.     fragment@3 {
  61.         target = <&hdmi_in_vp0>;

  62.         __overlay__ {
  63.             status = "disabled";
  64.         };
  65.     };

  66.     fragment@4 {
  67.         target = <&hdmi_in_vp1>;

  68.         __overlay__ {
  69.             status = "disabled";
  70.         };
  71.     };      

  72.     fragment@5 {
  73.         target = <&hdmi>;

  74.         __overlay__ {
  75.             status = "disabled";
  76.         };
  77.     };

  78.    
  79. };
复制代码

然后在同目录下的makefile里面加上my_lcd_fbtft.dtbo,如图3



三、编译内核和设备树插件

在/kernel-stable-4.19-rk356x/目录下,终端输入: make menuconfig KCONFIG_CONFIG=arch/arm64/configs/ lubancat2_defconfig ARCH=arm64

进入图形化配置界面,然后依次选择:Device Drivers ---> Staging drivers ---> Support for small TFT LCD display modules  --->

把光标移到刚刚魔改的驱动上,然后按Y,就选上了:<*> FB driver for the ST7789V LCD Controller

然后选择save、选择ok、然后一直exit

最后,/kernel-stable-4.19-rk356x/目录下,终端输入:make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- bindeb-pkg -j8

等编译完

四、安装内核和配置lubancat

编译完后,kernel-stable-4.19-rk356x/的上级目录下生成了几个文件,把名字为linux-headers***.deb和linux-image***.deb的文件拷贝到lubancat上任意目录,用sudo dpkg -i ***.deb命令把这两装上

然后把lubancat上的/boot/uEnv/uEnvLubancat1.txt改成这样:

  1. uname_r=4.19.232
  2. size=0x1000000
  3. bootargs=console=ttyFIQ0 console=tty1
  4. #dtb=rk3566-lubancat1.dtb

  5. enable_uboot_overlays=1
  6. #overlay_start

  7. #40pin
  8. #dtoverlay=/dtb/overlay/rk356x-lubancat-i2c3-m0-overlay.dtbo
  9. #dtoverlay=/dtb/overlay/rk356x-lubancat-i2c5-m0-overlay.dtbo
  10. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm8-m0-overlay.dtbo
  11. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm9-m0-overlay.dtbo
  12. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm10-m0-overlay.dtbo
  13. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm11-ir-m0-overlay.dtbo
  14. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm12-m0-overlay.dtbo
  15. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m0-overlay.dtbo
  16. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m1-overlay.dtbo
  17. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m0-overlay.dtbo
  18. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m1-overlay.dtbo
  19. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m0-overlay.dtbo
  20. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m1-overlay.dtbo
  21. #dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-gpio-cs-overlay.dtbo
  22. #dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-overlay.dtbo
  23. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m0-overlay.dtbo
  24. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m1-overlay.dtbo
  25. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart4-m1-overlay.dtbo
  26. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart5-m1-overlay.dtbo
  27. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart7-m1-overlay.dtbo
  28. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart9-m1-overlay.dtbo
  29. #mini-pcie 5G modules
  30. #dtoverlay=/dtb/overlay/rk356x-lubancat-pcie2x1-disabled-overlay.dtbo
  31. #display
  32. #dtoverlay=/dtb/overlay/rk3566-lubancat-dsi0-720p-overlay.dtbo
  33. #dtoverlay=/dtb/overlay/rk3566-lubancat-dsi0-1080p-overlay.dtbo
  34. #dtoverlay=/dtb/overlay/rk3566-lubancat-dsi0-rpi-overlay.dtbo

  35. #新加的:
  36. dtoverlay=/dtb/overlay/my_lcd_fbtft.dtbo

  37. #overlay_end
复制代码

ps:如果/boot/dtb/overlay/下没有my_lcd_fbtft.dtbo的话,自己去编译机器的kernel-stable-4.19-rk356x/arch/arm64/boot/dts/rockchip/overlay/里拷贝一份


然后在lubancat上 sudo reboot

这时候屏幕应该有启动信息了

然后按ctrl+alt+F2就可以显示登录界面了




图1

图1

图3

图3

图2

图2

评分

参与人数 1火花 +10 收起 理由
雨-p3755A + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2023-9-30 01:47:58 | 显示全部楼层
您好,之前说的问题已经解决了,目前又遇到了一个新问题
野火论坛202309300147534215..png
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-12 18:40:21 | 显示全部楼层
这么小都可以显示终端,太厉害了
回复 支持 反对

使用道具 举报

发表于 2023-9-30 01:25:06 | 显示全部楼层
您好,按照您的步骤,我在第三步出现了一点问题,如图1,由于我使用的是lbc1所以只把2改为了1 ,其他没有做改变

问题

问题
回复 支持 反对

使用道具 举报

发表于 2023-9-30 01:28:32 | 显示全部楼层
你好,我是使用的lbc1,按照您的步骤做到了第三处,出现了一些问题 野火论坛202309300127408059..png ,由于和您型号不同,只将2改为了1 ,其他未作出改动
回复 支持 反对

使用道具 举报

发表于 2023-10-7 09:51:39 | 显示全部楼层
雨-p3755A 发表于 2023-9-30 01:28
你好,我是使用的lbc1,按照您的步骤做到了第三处,出现了一些问题,由于和您型号不同,只将2改为了1 ,其 ...

鲁班猫356x都是lubancat2_defconfig,没有1或者0的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-23 19:36 , Processed in 0.096105 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表