野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 364|回复: 1

[经验\资料] 野火[鲁班猫]卡片电脑创意氛围赛(第二期)鲁班猫添加TFT...

[复制链接]
发表于 2023-11-21 12:31:49 | 显示全部楼层 |阅读模式
本帖最后由 cjiax 于 2023-11-27 20:40 编辑

鲁班猫添加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
  • 编写设备树文件
    1. /dts-v1/;
    2. /plugin/;

    3. #include <dt-bindings/gpio/gpio.h>
    4. #include <dt-bindings/pinctrl/rockchip.h>

    5. / {
    6.         compatible = "rockchip,rk3568";
    7.         fragment@0 {
    8.                 target = <&spi3>;

    9.            __overlay__ {
    10.                         status = "okay";
    11.                         #address-cells = <1>;
    12.                         #size-cells = <0>;

    13.                         // 40PIN引脚只预留SPI3 CS0引脚,如果有多个CS信号,可以使用gpio模拟cs
    14.                         pinctrl-names = "default", "high_speed";
    15.                         pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;
    16.                         pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;

    17.                         spi_dev@0 {
    18.                                 compatible = "rockchip,spidev";
    19.                                 reg = <0>; //chip select 0:cs0  1:cs1
    20.                                 spi-max-frequency = <24000000>; //spi output clock
    21.                         };

    22.                         display@0{
    23.                                 compatible = "ilitek,ili9341"; //匹配驱动程序用
    24.                                 reg = <0>;
    25.                                 spi-max-frequency = <96000000>;//spi速率
    26.                                 dc-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;#设置dc引脚
    27.                                 reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;#设置rst引脚
    28.                                 rotation = <0>;//设置屏幕旋转角度 ,不过对我的ili9341好像没啥用
    29.                                 backlight = <&backlight>; //背光
    30.                                 buswidth = <8>; //数据宽度
    31.                                 debug = <0>; //debug级别,数越大,调试等级越高
    32.                                 bgr = <0>;//设置是RGB还是BGR
    33.                                 fps = <30>;//帧率
    34.                                 pinctrl-names = "default";
    35.                 pinctrl-0 = <&spi_lcd_cmd_pin &spi_lcd_reset_pin &spi_lcd_light_pin>;#声明使用的引脚
    36.                         };
    37.                 };
    38.         };

    39.         fragment@1 {
    40.         target = <&pinctrl>;

    41.         __overlay__ {
    42.             spi_lcd {
    43.                 //配置指定引脚的 复用/上下拉/驱动能力 等
    44.                 spi_lcd_cmd_pin: spi_lcd_cmd_pin {
    45.                     rockchip,pins = <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
    46.                 };
    47.                 spi_lcd_reset_pin: spi_lcd_reset_pin {
    48.                     rockchip,pins = <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
    49.                 };        
    50.                 spi_lcd_light_pin: spi_lcd_light_pin {
    51.                     rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up_drv_level_1>;
    52.                 };
    53.             };

    54.         };

    55.     };
    56.     //关闭其它外部输出
    57.         fragment@2 {
    58.         target = <&route_hdmi>;

    59.         __overlay__ {
    60.             status = "disabled";
    61.         };
    62.     };


    63.     fragment@3 {
    64.         target = <&hdmi_in_vp0>;

    65.         __overlay__ {
    66.             status = "disabled";
    67.         };
    68.     };

    69.     fragment@4 {
    70.         target = <&hdmi_in_vp1>;

    71.         __overlay__ {
    72.             status = "disabled";
    73.         };
    74.     };      

    75.     fragment@5 {
    76.         target = <&hdmi>;

    77.         __overlay__ {
    78.             status = "disabled";
    79.         };
    80.     };
    81. };
    复制代码

  • 至于引脚如何配置,请查阅瑞芯微有关资料。
修改内核,使其支持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包。
    1. cjia@DESKTOP-T9MJO61:~/LubanCat$ ls -al ./*.deb
    2. -rw-r--r-- 1 cjia cjia  11197288 Nov  9 16:10 ./linux-headers-4.19.232_4.19.232-15_arm64.deb
    3. -rw-r--r-- 1 cjia cjia 111315512 Nov  9 16:11 ./linux-image-4.19.232-dbg_4.19.232-15_arm64.deb
    4. -rw-r--r-- 1 cjia cjia  17001744 Nov  9 16:10 ./linux-image-4.19.232_4.19.232-15_arm64.deb
    5. -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包。
加载设备树插件
  • 将内核编译生成的rk356x-lubancat-spi3-m1-overlay.dtbo,通过你喜欢的方式传到鲁班猫的/boot/dtb/overlay中.
  • 并修改/boot/uEnv/uEnvLubancat2-V2.txt 添加dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-ili9341.dtbo
    1. uname_r=4.19.232
    2. size=0x1000000
    3. cmdline="earlyprintk console=ttyFIQ0  consoleblank=0 loglevel=7 rootwait rw rootfstype=ext4"

    4. enable_uboot_overlays=1
    5. #overlay_start

    6. #40pin
    7. dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-ili9341.dtbo
    8. #dtoverlay=/dtb/overlay/rk3568-lubancat-msata-overlay.dtbo
    9. #dtoverlay=/dtb/overlay/rk356x-lubancat-i2c3-m0-overlay.dtbo
    10. #dtoverlay=/dtb/overlay/rk356x-lubancat-i2c3-m1-overlay.dtbo
    11. #dtoverlay=/dtb/overlay/rk356x-lubancat-i2c5-m0-overlay.dtbo
    12. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm7-ir-overlay.dtbo
    13. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm8-m0-overlay.dtbo
    14. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm9-m0-overlay.dtbo
    15. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm10-m0-overlay.dtbo
    16. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm11-ir-m0-overlay.dtbo
    17. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm12-m0-overlay.dtbo
    18. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm12-m1-overlay.dtbo
    19. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m0-overlay.dtbo
    20. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm13-m1-overlay.dtbo
    21. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m0-overlay.dtbo
    22. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm14-m1-overlay.dtbo
    23. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m0-overlay.dtbo
    24. #dtoverlay=/dtb/overlay/rk356x-lubancat-pwm15-ir-m1-overlay.dtbo
    25. #dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-gpio-cs-overlay.dtbo
    26. #dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-overlay.dtbo
    27. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m0-overlay.dtbo
    28. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart3-m1-overlay.dtbo
    29. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart4-m1-overlay.dtbo
    30. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart7-m1-overlay.dtbo
    31. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart8-m1-overlay.dtbo
    32. #dtoverlay=/dtb/overlay/rk356x-lubancat-uart9-m1-overlay.dtbo
    33. #dtoverlay=/dtb/overlay/rk3568-lubancat-can1-m1-overlay.dtbo
    34. #dtoverlay=/dtb/overlay/rk3568-lubancat-can2-m0-overlay.dtbo
    35. #dtoverlay=/dtb/overlay/rk3568-lubancat-canfd1-m1-overlay.dtbo
    36. #dtoverlay=/dtb/overlay/rk3568-lubancat-canfd2-m0-overlay.dtbo
    37. #mini-pcie 5G modules
    38. #dtoverlay=/dtb/overlay/rk356x-lubancat-pcie2x1-disabled-overlay.dtbo
    39. #display
    40. #dtoverlay=/dtb/overlay/rk3568-lubancat-hdmi-disabled-overlay.dtbo
    41. #dsi0-vp1
    42. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-1080p-overlay.dtbo
    43. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-rpi-overlay.dtbo
    44. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-7.0-1024x600-overlay.dtbo
    45. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi0-in-vp1-10.1-800x1280-overlay.dtbo
    46. #dsi1-vp0
    47. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-1080p-overlay.dtbo
    48. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-rpi-overlay.dtbo
    49. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-7.0-1024x600-overlay.dtbo
    50. #dtoverlay=/dtb/overlay/rk3568-lubancat-2-dsi1-in-vp0-10.1-800x1280-overlay.dtbo
    51. #cam0(mipi-csi0)
    52. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-sc132gs-overlay.dtbo
    53. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov5647-overlay.dtbo
    54. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov5648-overlay.dtbo
    55. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi0-ov8858-overlay.dtbo
    56. #cam1(mipi-csi1)
    57. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-sc132gs-overlay.dtbo
    58. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov5647-overlay.dtbo
    59. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov5648-overlay.dtbo
    60. #dtoverlay=/dtb/overlay/rk356x-lubancat-csi1-ov8858-overlay.dtbo
    61. #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克隆代码。
  • 进入源码目录,更新代码
    1. cd lv_port_linux_frame_buffer/
    2. git submodule update --init --recursive
    复制代码

  • 我使用cmake进行编译
    1. mkdir build cd buildcmake ..make
    复制代码

  • 修改配置文件
    1.修改lv_conf.h
    将#define LV_COLOR_DEPTH 32改为#define LV_COLOR_DEPTH 32,因为我们所使用的是rbg565的驱动方式,所以是16位。
    2.修改main.c,修改尺寸屏幕
    1. disp_drv.hor_res = 320;
    2. disp_drv.ver_res = 240;
    复制代码

  • 之后在build,中进行编译,make -j12./lvgl_fb./lvgl_fb执行程序。
  • 我们会发现出现了报错
    1. cat@lubancat:~/lv_port_linux_frame_buffer/build$ ./lvgl_fb
    2. ioctl(FBIOBLANK): Invalid argument
    3. unable to open evdev interface:: No such file or directory
    复制代码
    我们要去修改源码,搜索源码
    1. cat@lubancat:~/lv_port_linux_frame_buffer$ grep -r  "FBIOBLANK"
    2. Binary file build/lvgl_fb matches
    3. Binary file build/lib/liblv_drivers.a matches
    4. Binary file build/lv_drivers/CMakeFiles/lv_drivers.dir/display/fbdev.c.o matches
    5. lv_drivers/display/fbdev.c:#define FBIOBLANK FBIO_BLANK
    6. lv_drivers/display/fbdev.c:    if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {
    7. lv_drivers/display/fbdev.c:        perror("ioctl(FBIOBLANK)");
    复制代码
    发现在fbdev.c,修改代码,将其注释掉
    1. // Make sure that the display is on.
    2. //if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {
    3. //    perror("ioctl(FBIOBLANK)");
    4. //    return;
    5. //}
    复制代码
    再次编译,我们会发现,屏幕正常显示了。
通过FFmpeg在/deb/fb0播放视频
  • 下载FFmpeg
    1. sudo apt update sudo apt install ffmpeg
    复制代码

  • 下载一个你喜欢的视频到鲁班猫上
  • 通过ffmpeg播放视频
    1. ffmpeg -re  -i imas320.mp4   -vf "transpose=1"  -vcodec rawvideo   -pix_fmt rgb565  -f fbdev /dev/fb0<span style="background-color: initial;">   </span>
    复制代码
    -re 循环播放 -i 输入表示 imas320.mp4视频名 -vf "transpose=1" ffmpeg滤镜,作用旋转视频 -vcodec rawvideo 转码 -pix_fmt rgb565颜色转换为rgb565 -f fbdev /dev/fb0 指定输出设备
  • 我们还可以播放声音通过-f alsa default 指定输出音频设备。
    1. ffmpeg -re -i imas320.mp4 -vf "transpose=1" -vcodec rawvideo  pix_fmt rgb565 -f fbdev /dev/fb0 -f alsa default
    复制代码
    这样就可以播放音视频了。
回复

使用道具 举报

发表于 2023-11-23 08:38:00 | 显示全部楼层
真不错  
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 10:28 , Processed in 0.133496 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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