野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 468|回复: 1

[经验\资料] 鲁班猫添加TFT小屏幕

[复制链接]
发表于 2023-11-14 20:05:44 | 显示全部楼层 |阅读模式
鲁班猫添加TFT小屏幕编译内核
  • 更新源 sudo apt update
  • 下载工具 sudo apt install gcc make  git  bc libssl-dev liblz4-tool  device-tree-compiler bison flex u-boot-tools gcc-aarch64-linux-gnu
  • 克隆代码 git clone -b stable-4.19-rk356x --depth=1 https://github.com/LubanCat/kernel.git
  • cd 进入内核目录 cd ./kernel
  • 清除历史编译记录,进行编译
  • 清除之前生成的所有文件和配置
    make mrproper
  • 设置环境变量 export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- 主要通过export设置的环境变量只能在当前设置的终端中使用。
  • 加载lubancat2_defconfig配置文件,rk356x系列均是该配置文件
    make  lubancat2_defconfig
  • 编译内核,指定平台,指定交叉编译工具,使用8线程进行编译,线程可根据电脑性能自行确定
  • make -j8
    这个 -j8是指启用多少个核心进项编译,自己编译的话视自己电脑的cpu定。
    等待一段直接后就编译完成,一般是10-20分钟。
修改设备树
  • 因为tft屏幕我们作为插件使用,所以我们使用修改设备树插件的设备树文件
    ,处在 /arch/arm64/boot/dts/rockchip/overlay/中。
  • 我们新建一个新的设备树文件,就在当前目录中(/arch/arm64/boot/dts/rockchip/overlay/),我就命名为 rk356x-lubancat-spi3-m1-ili9341.dts
  • 将设备树文件添加到当前目录中的makefile中。
    QQ截图20231111162819.png
  • 编写设备树文件/dts-v1/;/plugin/;#include <dt-bindings/gpio/gpio.h>#include <dt-bindings/pinctrl/rockchip.h>/ {        compatible = "rockchip,rk3568";        fragment@0 {                target = <&spi3>;           __overlay__ {                        status = "okay";                        #address-cells = <1>;                        #size-cells = <0>;                        // 40PIN引脚只预留SPI3 CS0引脚,如果有多个CS信号,可以使用gpio模拟cs                         pinctrl-names = "default", "high_speed";                        pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;                        pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;                        spi_dev@0 {                                compatible = "rockchip,spidev";                                reg = <0>; //chip select 0:cs0  1:cs1                                spi-max-frequency = <24000000>; //spi output clock                        };                        display@0{                                compatible = "ilitek,ili9341"; //匹配驱动程序用                                reg = <0>;                                spi-max-frequency = <96000000>;//spi速率                                dc-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;#设置dc引脚                                reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;#设置rst引脚                                rotation = <0>;//设置屏幕旋转角度 ,不过对我的ili9341好像没啥用                                backlight = <&backlight>; //背光                                buswidth = <8>; //数据宽度                                debug = <0>; //debug级别,数越大,调试等级越高                                bgr = <0>;//设置是RGB还是BGR                                fps = <30>;//帧率                                pinctrl-names = "default";                pinctrl-0 = <&spi_lcd_cmd_pin &spi_lcd_reset_pin &spi_lcd_light_pin>;#声明使用的引脚                        };                };        };        fragment@1 {        target = <&pinctrl>;        __overlay__ {            spi_lcd {                //配置指定引脚的 复用/上下拉/驱动能力 等                spi_lcd_cmd_pin: spi_lcd_cmd_pin {                    rockchip,pins = <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;                };                spi_lcd_reset_pin: spi_lcd_reset_pin {                    rockchip,pins = <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;                };                        spi_lcd_light_pin: spi_lcd_light_pin {                    rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;                };            };        };    };    //关闭其它外部输出        fragment@2 {        target = <&route_hdmi>;        __overlay__ {            status = "disabled";        };    };    fragment@3 {        target = <&hdmi_in_vp0>;        __overlay__ {            status = "disabled";        };    };    fragment@4 {        target = <&hdmi_in_vp1>;        __overlay__ {            status = "disabled";        };    };          fragment@5 {        target = <&hdmi>;        __overlay__ {            status = "disabled";        };    };};
  • 至于引脚如何配置,请查阅瑞芯微有关资料。
修改内核,使其支持fbtft
  • make menuconfig 打开配置界面
  • 在 Device Drivers ─> Staging drivers -> Support for small TFT LCD display modules 。
  • 在其中选择对应的驱动,按Y选择,按N取消。
  • 先保存,在推出
  • make -j8 编译
  • make bindeb-pkg  -j24 生成deb增量安装包。
  • 在kernel上一级目录会生成几个deb包。
cjia@DESKTOP-T9MJO61:~/LubanCat$ ls -al ./*.deb-rw-r--r-- 1 cjia cjia  11197288 Nov  9 16:10 ./linux-headers-4.19.232_4.19.232-15_arm64.deb-rw-r--r-- 1 cjia cjia 111315512 Nov  9 16:11 ./linux-image-4.19.232-dbg_4.19.232-15_arm64.deb-rw-r--r-- 1 cjia cjia  17001744 Nov  9 16:10 ./linux-image-4.19.232_4.19.232-15_arm64.deb-rw-r--r-- 1 cjia cjia   1080140 Nov  9 16:10 ./linux-libc-dev_4.19.232-15_arm64.deb
  • 通过你喜欢的方式传到鲁班猫上。
  • sudo opkg -i ./*.deb 安装目录下所有以.deb结尾的deb包。
  • 注意安装deb时会覆盖设备树与配置文件,如果做了更改需要再改一次
加载设备树插件
  • 将内核编译生成的rk356x-lubancat-spi3-m1-overlay.dtbo,通过你喜欢的方式传到鲁班猫的/boot/dtb/overlay中.
  • 并修改/boot/uEnv/uEnvLubancat2-V2.txt 添加dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-ili9341.dtbouname_r=4.19.232size=0x1000000cmdline="earlyprintk console=ttyFIQ0  consoleblank=0 loglevel=7 rootwait rw rootfstype=ext4"enable_uboot_overlays=1#overlay_start#40pindtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-ili9341.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-msata-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-i2c3-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-i2c3-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-i2c5-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm7-ir-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm8-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm9-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm10-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm11-ir-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm12-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm12-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-gpio-cs-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart4-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart7-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart8-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-uart9-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-can1-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-can2-m0-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-canfd1-m1-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-canfd2-m0-overlay.dtbo#mini-pcie 5G modules#dtoverlay=/dtb/overlay/rk356x-lubancat-pcie2x1-disabled-overlay.dtbo#display#dtoverlay=/dtb/overlay/rk3568-lubancat-hdmi-disabled-overlay.dtbo#dsi0-vp1#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-1080p-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-rpi-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-7.0-1024x600-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-10.1-800x1280-overlay.dtbo#dsi1-vp0#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-1080p-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-rpi-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-7.0-1024x600-overlay.dtbo#dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-10.1-800x1280-overlay.dtbo#cam0(mipi-csi0)#dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-sc132gs-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov5647-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov5648-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov8858-overlay.dtbo#cam1(mipi-csi1)#dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-sc132gs-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov5647-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov5648-overlay.dtbo#dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov8858-overlay.dtbo#overlay_end
  • 之后重启,若一切正常则屏幕会先由白变黑,后会显示终端并输出开机日志。
关闭终端在tft屏上显示板
  • sudo systemctl mask getty@tty1.service 关闭tty1服务
  • 修改uEnv.txt 将cmdline="earlyprintk console=ttyFIQ0 console=tty1 consoleblank=0 loglevel=7 rootwait rw rootfstype=ext4"的console=tty1去掉。
  • 重启系统,使用cat /dev/urandom > /dev/fb0进行测试,如果屏幕变为雪花状,则为正常。
使用lvgl在/dev/fb0上。
  • git clone https://github.com/lvgl/lv_port_linux_frame_buffer.git克隆代码。
  • 进入源码目录,更新代码cd lv_port_linux_frame_buffer/git submodule update --init --recursive
  • 我使用cmake进行编译mkdir build cd buildcmake ..make
  • 修改配置文件
    1.修改lv_conf.h
    将#define LV_COLOR_DEPTH 32改为#define LV_COLOR_DEPTH 32,因为我们所使用的是rbg565的驱动方式,所以是16位。
    2.修改main.c,修改尺寸屏幕disp_drv.hor_res    = 320;disp_drv.ver_res    = 240;
  • 之后在build,中进行编译,make -j12./lvgl_fb./lvgl_fb执行程序。
  • 我们会发现出现了报错cat@lubancat:~/lv_port_linux_frame_buffer/build$ ./lvgl_fb ioctl(FBIOBLANK): Invalid argumentunable to open evdev interface:: No such file or directory我们要去修改源码,搜索源码cat@lubancat:~/lv_port_linux_frame_buffer$ grep -r  "FBIOBLANK"Binary file build/lvgl_fb matchesBinary file build/lib/liblv_drivers.a matchesBinary file build/lv_drivers/CMakeFiles/lv_drivers.dir/display/fbdev.c.o matcheslv_drivers/display/fbdev.c:#define FBIOBLANK FBIO_BLANKlv_drivers/display/fbdev.c:    if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {lv_drivers/display/fbdev.c:        perror("ioctl(FBIOBLANK)");发现在fbdev.c,修改代码,将其注释掉// Make sure that the display is on.//if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {//    perror("ioctl(FBIOBLANK)");//    return;//}再次编译,我们会发现,屏幕正常显示了。
通过FFmpeg在/deb/fb0播放视频
  • 下载FFmpegsudo apt update sudo apt install ffmpeg
  • 下载一个你喜欢的视频到鲁班猫上
  • 通过ffmpeg播放视频ffmpeg -re  -i imas320.mp4   -vf "transpose=1"  -vcodec rawvideo   -pix_fmt rgb565  -f fbdev /dev/fb0   -re 循环播放 -i 输入表示 imas320.mp4视频名 -vf "transpose=1"
    ffmpeg滤镜,作用旋转视频 -vcodec rawvideo 转码 -pix_fmt rgb565颜色转换为rgb565 -f fbdev /dev/fb0 指定输出设备
  • 我们还可以播放声音通过-f alsa default 指定输出音频设备。ffmpeg -re -i imas320.mp4 -vf "transpose=1" -vcodec rawvideo  pix_fmt rgb565 -f fbdev /dev/fb0 -f alsa default 这样就可以播放音视频了。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 02:59 , Processed in 0.143903 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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