初中生
最后登录1970-1-1
在线时间 小时
注册时间2023-11-6
|
本帖最后由 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中。
- 编写设备树文件
- /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包。
加载设备树插件- 将内核编译生成的rk356x-lubancat-spi3-m1-overlay.dtbo,通过你喜欢的方式传到鲁班猫的/boot/dtb/overlay中.
- 并修改/boot/uEnv/uEnvLubancat2-V2.txt 添加dtoverlay=/dtb/overlay/rk356x-lubancat-spi3-m1-ili9341.dtbo
- uname_r=4.19.232
- size=0x1000000
- cmdline="earlyprintk console=ttyFIQ0 consoleblank=0 loglevel=7 rootwait rw rootfstype=ext4"
- enable_uboot_overlays=1
- #overlay_start
- #40pin
- dtoverlay=/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 argument
- unable to open evdev interface:: No such file or directory
复制代码 我们要去修改源码,搜索源码
- cat@lubancat:~/lv_port_linux_frame_buffer$ grep -r "FBIOBLANK"
- Binary file build/lvgl_fb matches
- Binary file build/lib/liblv_drivers.a matches
- Binary file build/lv_drivers/CMakeFiles/lv_drivers.dir/display/fbdev.c.o matches
- lv_drivers/display/fbdev.c:#define FBIOBLANK FBIO_BLANK
- lv_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播放视频- 下载FFmpeg
- sudo apt update sudo apt install ffmpeg
复制代码
- 下载一个你喜欢的视频到鲁班猫上
- 通过ffmpeg播放视频
- 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 指定输出音频设备。
- ffmpeg -re -i imas320.mp4 -vf "transpose=1" -vcodec rawvideo pix_fmt rgb565 -f fbdev /dev/fb0 -f alsa default
复制代码 这样就可以播放音视频了。
|
|