事情从某多买了一个rk3506开始,参考链接https://whycan.com/t_12088.html
修改设备树驱动屏幕参考上面链接修改就行了,关于上面的报错信息,不需要修改Build options–>Mirrors and Download locations改一下路由器的DNS或者重启一下就好了
关于wifi,修改/etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1
network={
ssid="wifi名字"
psk="密码"
key_mgmt=WPA-PSK
}
重启网络/etc/init.d/S40network restart
这时候可以ssh登录
然后你想传输一下文件或者放个qt.你会发现打包失败,就是超过了尺寸
这时候需要修改分区表删除一些分区,修改设备树的启动参数
分区表rk3506_linux6.1_sdk/device/rockchip/.chips/rk3506/parameter-128M.txt
FIRMWARE_VER:8.1
MACHINE_MODEL:RK3506
MACHINE_ID:007
MANUFACTURER: RK3506
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3506
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE:mtdparts=:0x00002000@0x00002000(uboot),0x00005000@0x00004000(boot),-@0x00009000(rootfs:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
只保留了必须的分区
还能顺便看一下rk3506_linux6.1_sdk/device/rockchip/.chips/rk3506/rockchip_rk3506_g_mini_defconfig默认配置
RK_ROOTFS_UBI=y
RK_ROOTFS_INSTALL_MODULES=y
RK_WIFIBT_CHIP="AIC8800"
# RK_ROOTFS_LOG_GUARDIAN is not set
RK_UBOOT_CFG_FRAGMENTS="rk3506_tb"
RK_UBOOT_SPL=y
RK_KERNEL_CFG="rk3506_defconfig"
RK_KERNEL_CFG_FRAGMENTS="rk3506-display.config"
RK_KERNEL_DTS_NAME="rk3506g-mini-v10"
RK_BOOT_COMPRESSED=y
RK_BOOT_FIT_ITS_NAME="thunderboot.its"
RK_RECOVERY_FIT_ITS_NAME="thunderboot4recovery.its"
RK_FLASH_SIZE=2048
RK_EXTRA_PARTITION_NUM=0
# RK_EXTRA_PARTITION_1_FSTYPE="ubi"
# RK_EXTRA_PARTITION_1_SRC="rk3506_oem"
# RK_EXTRA_PARTITION_2_FSTYPE="ubi"
RK_PARAMETER="parameter-128M.txt"
RK_USE_FIT_IMG=y
修改设备树rk3506_linux6.1_sdk/kernel-6.1/arch/arm/boot/dts/rk3506g-mini-v10.dtsi
chosen {
//bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=tty1 console=ttyFIQ0 root=ubi0:rootfs ubi.mtd=2 rootfstype=ubifs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=2 root=ubi0:rootfs rw rootfstype=ubifs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
//bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=5 ubi.block=0,rootfs root=/dev/ubiblock0_0 rootfstype=squashfs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
//bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=5 root=ubi0:rootfs rw rootfstype=ubifs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
};
那啥顺手修改一下屏幕
修改rk3506g-mini-v10-rgb.dtsi,display-timings {
native-mode = <&rgb_timing>;
rgb_timing: timing0 {
clock-frequency = <51200000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
vback-porch = <23>;
vfront-porch = <12>;
hsync-len = <20>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
修改触摸
gt911: gt911@5d {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <>911_int_pin
>911_rst_pin>;
compatible = "goodix,gt911";
reg = <0x5d>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PA6 0>;
irq-gpios = <&gpio0 RK_PA6 0>;
reset-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
max-x = <1024>;
max-y = <600>;
};
这时候编译完烧录会挂载文件系统失败,这时候需要修改buildroot里面文件系统的配置
/rk3506_linux6.1_sdk/buildroot/configs/rockchip_rk3506_defconfig
#include "base/base.config"
#include "chips/rk3506_arm.config"
#include "fs/vfat.config"
#include "wifibt/bt.config"
#include "wifibt/wireless.config"
#include "wifibt/bt.config"
#include "wifibt/wireless.config"
#include "bus/can.config"
#include "lvgl/lvgl_rkadk.config"
#include "lvgl/rk_demo.config"
BR2_LV_CALENDAR_WEEK_STARTS_MONDAY=y
BR2_LV_DEMO_MUSIC_AUTO_PLAY=y
BR2_LV_DEMO_MUSIC_LANDSCAPE=y
BR2_LV_DEMO_MUSIC_LARGE=y
BR2_LV_DEMO_MUSIC_ROUND=y
BR2_LV_DEMO_MUSIC_SQUARE=y
BR2_LV_DEMO_WIDGETS_SLIDESHOW=y
BR2_LV_DISP_DEF_REFR_PERIOD=5
BR2_LV_INDEV_DEF_READ_PERIOD=10
BR2_LV_THEME_DEFAULT_DARK=y
BR2_LV_USE_DEMO_BENCHMARK=y
BR2_LV_USE_DEMO_KEYPAD_AND_ENCODER=y
BR2_LV_USE_DEMO_MUSIC=y
BR2_LV_USE_DEMO_WIDGETS=y
BR2_LV_USE_GRIDNAV=y
BR2_LV_USE_IME_PINYIN=y
BR2_LV_USE_PERF_MONITOR=y
BR2_LV_USE_QRCODE=y
# BR2_PACKAGE_CHRONY is reset to default
BR2_PACKAGE_COREUTILS=y
# BR2_PACKAGE_DNSMASQ is reset to default
# BR2_PACKAGE_DROPBEAR is reset to default
BR2_PACKAGE_EVTEST=y
BR2_PACKAGE_GDB=y
BR2_PACKAGE_GDB_DEBUGGER=y
BR2_PACKAGE_GDB_SERVER=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
BR2_PACKAGE_LIBCAP=y
BR2_PACKAGE_LIBGPIOD=y
BR2_PACKAGE_LIBGPIOD_TOOLS=y
BR2_PACKAGE_LIBRSYNC=y
BR2_PACKAGE_MHZ=y
BR2_PACKAGE_MTD=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_OPENSSH_GEN_KEYS=y
BR2_PACKAGE_RECOVERY=y
BR2_PACKAGE_RECOVERY_NO_UI=y
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y
BR2_PACKAGE_RIPGREP=y
BR2_PACKAGE_RKADK_EXAMPLES=y
BR2_PACKAGE_ROCKCHIP_RGA=y
BR2_PACKAGE_ROCKCHIP_TEST=y
BR2_PACKAGE_RSYNC=y
BR2_PACKAGE_START_STOP_DAEMON=y
BR2_PACKAGE_TSLIB=y
BR2_ROOTFS_OVERLAY+="board/rockchip/rk3506/fast-display-overlay/"
BR2_ROOTFS_POST_BUILD_SCRIPT+="board/rockchip/rk3506/post-build-fast-display.sh"
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_TARGET_ROOTFS_SQUASHFS4_ZSTD=y
BR2_TARGET_ROOTFS_TAR_ZSTD=y
BR2_TARGET_ROOTFS_UBI=y
BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000
BR2_TARGET_ROOTFS_UBIFS_MAX_SIZE=1024
BR2_TARGET_ROOTFS_UBIFS_OPTS="-F -v"
BR2_TARGET_ROOTFS_UBI_OPTS="-v"
BR2_TARGET_ROOTFS_UBI_SUBSIZE=2048
BR2_TIME_BITS_64=y
或者./build.sh buildroot-config进入配置
一定注意UBIFS_LEBSIZE=0x1f000默认是UBIFS_LEBSIZE=0x1f800需要修改,不然也会挂载失败,顺便加一下其它软件比如tslib,gdbserver等等
这样内核文件系统修改完毕下面是qt和lvgl
离线
关于Qt修改qt-everywhere-src-5.15.17/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -mfpu=neon -mfloat-abi=hard
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a -mfpu=neon -mfloat-abi=hard
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
QMAKE_LFLAGS += -Wl,-rpath-link,/home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib
# modifications to g++.conf
QMAKE_CC = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-gcc
QMAKE_CXX = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-g++
QMAKE_LINK = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-objcopy
QMAKE_NM = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-nm -P
QMAKE_STRIP = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-strip
load(qt_config)
使用如下配置
../qt-everywhere-src-5.15.17/configure \
-prefix /opt/qt5.15.17arm \
-extprefix /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/opt/qt5.15.17arm \
-hostprefix /home/work/work/rk3506g/qt/hostqt5.15.17arm \
-sysroot /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot \
-I /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/libdrm \
-L /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib \
-confirm-license -opensource \
-release -shared \
-xplatform linux-arm-gnueabi-g++ \
-qpa linuxfb \
-make libs \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-qt-freetype \
-qt-harfbuzz \
-qt-pcre \
-qt-sqlite \
-alsa \
-gui \
-widgets \
-kms \
-dbus-runtime \
-accessibility \
-nomake examples -nomake tests \
-no-sse2 \
-no-cups \
-no-separate-debug-info \
-no-iconv \
-no-opengl \
-no-glib \
-no-pkg-config \
-no-compile-examples \
-no-xcb \
-no-eglfs \
-skip qtwayland \
-skip qtdoc \
-skip qttools \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-v \
这时候就可以make -j5 ,make install -j5
完成之后复制rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/opt/qt5.15.17arm到/home/work/work/rk3506g/qt/hostqt5.15.17arm
顺便写个qt.conf
[Paths]
Prefix=../qt5.15.17arm
HostPrefix = ..
Sysroot =/home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot
# 关键平台插件设置
[Platforms]
LinuxFB = drm
EGLFS = disable
QPA = linuxfb:drm
# DRM专用参数(RK3506优化)
[Drm]
Device = /dev/dri/card0
Atomic = 1
SwapBuffersWait = 1
ForceMultiPlane = 1
顺便删了/home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/opt/qt5.15.17arm文件夹下的doc,include的文件
顺便写个arm下环境变量设置的shell文件rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/opt/qt5.15.17arm/
qtsetdrmenv.sh使用drm
#! /bin/bash
# 导出qtdemo的安装目录
export APP_DIR=/opt/qt5.15.17arm
# 指定qt库路径
export LD_LIBRARY_PATH=/opt/qt5.15.17arm/lib:$LD_LIBRARY_PATH
# 指定qt插件路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt5.15.17arm/plugins
# 指定显示平台插件,通过QT_QPA_PLATFORM 或者-platform命令行选项指定其他设置
export QT_QPA_PLATFORM=LINUXFB
export QT_QPA_FB_DRM=1
# 鼠标设备
#export QT_QPA_FB_HIDECURSOR=1
# 键盘设备
#export QT_QPA_EVDEV_KEYBOARD_PARAMETERS
# 触摸配置
#export QT_QPA_FB_TSLIB=1
#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx
# 字体库
#指定字体库
export QT_QPA_FONTDIR=/opt/fonts
# 屏幕旋转
#rotation=0
#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:rotation=$rotation
#export QT_QPA_FB_FORCE_FULLSCREEN=0
qtsetfbenv.sh使用FB
#! /bin/bash
# 导出qtdemo的安装目录
export APP_DIR=/opt/qt5.15.17arm
# 指定qt库路径
export LD_LIBRARY_PATH=/opt/qt5.15.17arm/lib:$LD_LIBRARY_PATH
# 指定qt插件路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt5.15.17arm/plugins
# 指定显示平台插件,通过QT_QPA_PLATFORM 或者-platform命令行选项指定其他设置
export QT_QPA_PLATFORM=LINUXFB
export QT_QPA_FB_DRM=0
# 鼠标设备
#export QT_QPA_FB_HIDECURSOR=1
# 键盘设备
#export QT_QPA_EVDEV_KEYBOARD_PARAMETERS
# 触摸配置
#export QT_QPA_FB_TSLIB=1
#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx
# 字体库
#指定字体库
export QT_QPA_FONTDIR=/opt/fonts
# 屏幕旋转
#rotation=0
#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:rotation=$rotation
#export QT_QPA_FB_FORCE_FULLSCREEN=0
再去修改rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/etc/profile
添加
if [ "$USER" = "root" ]; then
echo "Running as root"
source /opt/qt5.15.17arm/qtsetdrmenv.sh
fi
去掉默认的rk_demo程序rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/target/etc/init.d/pre_init/S10lv_demo
#! /bin/sh
start() {
set -a
export LV_DRIVERS_SET_PLANE=CURSOR
ulimit -n 1024
set +a
# rk_demo &
sleep 1 # All processer help rk_demo output first UI.
}
case "$1" in
start)
start
;;
*)
echo "Usage: $0 {start}"
exit 1
esac
exit $?
关于qt如何显示fps
主窗口中添加
void paintEvent(QPaintEvent *event) override {
frameCount++;
QGraphicsView::paintEvent(event);
}
开个定时器进行计算
void timerOutFPSUI()
{
if (etimer.elapsed() >= 500) { // 每秒更新
fps = (frameCount*1000)/etimer.elapsed();
frameCount = 0;
etimer.restart();
}
if(oldfps!=fps)
{
mlable->setText(QString(" fps:[%1] ")
.arg(fps));
mlable->adjustSize();
oldfps=fps;
update();
}
}
这样基本其它就完成了,既能fb,也能drm,DRM的cpu使用率竟然比FB下低帧率也就是20到30左右
离线
关于lvgl 有fb,drm ,rkadk显示接口
官网https://github.com/lvgl/lv_port_linux
读readme
支持的接口
Graphics drivers
Definition Description
LV_USE_LINUX_FBDEV Legacy frame buffer (/dev/fb*)
LV_USE_LINUX_DRM DRM/KMS (/dev/dri/*)
LV_USE_SDL SDL
LV_USE_WAYLAND WAYLAND
LV_USE_X11 X11
LV_USE_OPENGLES GLFW3
Device drivers
Definition Description
LV_USE_EVDEV libevdev input devices
clone文件
git clone https://github.com/lvgl/lv_port_linux.git
cd lv_port_linux/
git submodule update --init --recursive
复制lv_port_linux为lv_port_linuxfb
修改lv_port_linuxfb下 makefile
#
# Makefile
#
CC = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-gcc
CXX = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-g++
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= .
WARNINGS := -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith \
-fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits \
-Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security \
-Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body \
-Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -std=gnu99
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ $(WARNINGS)
LDFLAGS ?= -lm
BIN = lvgl9fbtest
BUILD_DIR = ./build
BUILD_OBJ_DIR = $(BUILD_DIR)/obj
BUILD_BIN_DIR = $(BUILD_DIR)/bin
prefix ?= /usr
bindir ?= $(prefix)/bin
# Collect source files recursively
CSRCS := $(shell find src -type f -name '*.c')
CXXSRCS := $(shell find src -type f -name '*.cpp')
# Include LVGL sources
include $(LVGL_DIR)/lvgl/lvgl.mk
OBJEXT ?= .o
COBJS = $(CSRCS:.c=$(OBJEXT))
CXXOBJS = $(CXXSRCS:.cpp=$(OBJEXT))
AOBJS = $(ASRCS:.S=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS)
OBJS = $(AOBJS) $(COBJS) $(CXXOBJS)
TARGET = $(addprefix $(BUILD_OBJ_DIR)/, $(patsubst ./%, %, $(OBJS)))
all: default
$(BUILD_OBJ_DIR)/%.o: %.c lv_conf.h
@mkdir -p $(dir $@)
@$(CC) $(CFLAGS) -c $< -o $@
@echo "CC $<"
$(BUILD_OBJ_DIR)/%.o: %.cpp lv_conf.h
@mkdir -p $(dir $@)
@$(CXX) $(CFLAGS) -c $< -o $@
@echo "CXX $<"
$(BUILD_OBJ_DIR)/%.o: %.S lv_conf.h
@mkdir -p $(dir $@)
@$(CC) $(CFLAGS) -c $< -o $@
@echo "AS $<"
default: $(TARGET)
@mkdir -p $(dir $(BUILD_BIN_DIR)/)
$(CXX) -o $(BUILD_BIN_DIR)/$(BIN) $(TARGET) $(LDFLAGS)
clean:
rm -rf $(BUILD_DIR)
install:
install -d $(DESTDIR)$(bindir)
install $(BUILD_BIN_DIR)/$(BIN) $(DESTDIR)$(bindir)
uninstall:
$(RM) -r $(addprefix $(DESTDIR)$(bindir)/,$(BIN))
修改lv_conf.h
/** Driver for /dev/fb */
#define LV_USE_LINUX_FBDEV 1
#if LV_USE_LINUX_FBDEV
#define LV_LINUX_FBDEV_BSD 0
#define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL
#define LV_LINUX_FBDEV_BUFFER_COUNT 2
#define LV_LINUX_FBDEV_BUFFER_SIZE 1080
#define LV_LINUX_FBDEV_MMAP 1
#endif
其它驱动去掉,其它选项根据需要选择
make -j5 就可以了
widget demo下profile帧率700多,analytics帧率只有28
复制lv_port_linux为lv_port_linuxdrm
修改lv_port_linuxdrm下 makefile
#
# Makefile
#
CC = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-gcc
CXX = /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/bin/arm-buildroot-linux-gnueabihf-g++
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= .
HEADER_PATH = -I /home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/libdrm
LIB_PATH = -L/home/work/work/rk3506g/hdrk3506mini/rk3506_linux6.1_sdk/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib
LIBS = -ldrm
WARNINGS := -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith \
-fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits \
-Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security \
-Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body \
-Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -std=gnu99
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ $(WARNINGS)
LDFLAGS ?= -lm
BIN = lvgl9drmtest
BUILD_DIR = ./build
BUILD_OBJ_DIR = $(BUILD_DIR)/obj
BUILD_BIN_DIR = $(BUILD_DIR)/bin
prefix ?= /usr
bindir ?= $(prefix)/bin
# Collect source files recursively
CSRCS := $(shell find src -type f -name '*.c')
CXXSRCS := $(shell find src -type f -name '*.cpp')
# Include LVGL sources
include $(LVGL_DIR)/lvgl/lvgl.mk
OBJEXT ?= .o
COBJS = $(CSRCS:.c=$(OBJEXT))
CXXOBJS = $(CXXSRCS:.cpp=$(OBJEXT))
AOBJS = $(ASRCS:.S=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS)
OBJS = $(AOBJS) $(COBJS) $(CXXOBJS)
TARGET = $(addprefix $(BUILD_OBJ_DIR)/, $(patsubst ./%, %, $(OBJS)))
all: default
$(BUILD_OBJ_DIR)/%.o: %.c lv_conf.h
@mkdir -p $(dir $@)
@$(CC) $(CFLAGS) -c $< -o $@ $(HEADER_PATH)
@echo "CC $<"
$(BUILD_OBJ_DIR)/%.o: %.cpp lv_conf.h
@mkdir -p $(dir $@)
@$(CXX) $(CFLAGS) -c $< -o $@ $(HEADER_PATH)
@echo "CXX $<"
$(BUILD_OBJ_DIR)/%.o: %.S lv_conf.h
@mkdir -p $(dir $@)
@$(CC) $(CFLAGS) -c $< -o $@ $(HEADER_PATH)
@echo "AS $<"
default: $(TARGET)
@mkdir -p $(dir $(BUILD_BIN_DIR)/)
$(CXX) -o $(BUILD_BIN_DIR)/$(BIN) $(TARGET) $(LDFLAGS) $(LIB_PATH) $(LIBS)
clean:
rm -rf $(BUILD_DIR)
install:
install -d $(DESTDIR)$(bindir)
install $(BUILD_BIN_DIR)/$(BIN) $(DESTDIR)$(bindir)
uninstall:
$(RM) -r $(addprefix $(DESTDIR)$(bindir)/,$(BIN))
修过lv_conf.h
/** Driver for /dev/dri/card */
#define LV_USE_LINUX_DRM 1
#if LV_USE_LINUX_DRM
/* Use the MESA GBM library to allocate DMA buffers that can be
* shared across sub-systems and libraries using the Linux DMA-BUF API.
* The GBM library aims to provide a platform independent memory management system
* it supports the major GPU vendors - This option requires linking with libgbm */
#define LV_USE_LINUX_DRM_GBM_BUFFERS 0
#endif
其它按需修改
make -j5就可以了
关于rkadk参考官方例子吧,自带例子就是rkadk
其它内容以后补充吧
离线
关于/devfb0参考https://whycan.com/t_12106.html
去内核里面启用fb,启用
<*> DRM Support for Rockchip,
<*> Support for frame buffer devices --->
*Enable legacy fbdev support for your modesetting driver
重新编译内核就会出现fb0
离线
离线
内存貌似有点小
free -h
total used free shared buff/cache available
Mem: 104.5M 64.1M 13.1M 292.0K 27.3M 35.0M
Swap: 0 0 0
存储空间还行
df -h
Filesystem Size Used Avail Use% Mounted on
ubi0:rootfs 206M 122M 85M 59% /
devtmpfs 53M 0 53M 0% /dev
tmpfs 53M 124K 53M 1% /var/log
tmpfs 53M 12K 53M 1% /tmp
tmpfs 53M 156K 53M 1% /run
tmpfs 53M 0 53M 0% /dev/shm
离线
我在等着rt-thread团队的rt3506开发板
这要是跑rt-thread,某些方面不是吊打stm32h7,
还有这板子厂家不提供原厂的开发文档,没有文档,只有一个datasheet和sdk,下载工具,原理图,
厂家的资料网址https://vanxoak.yuque.com/wb353n/hd-rk3506-mini/svttp0hymv51efyd#om5ff里面说的各种文档是没有的
所以里面的mo核心如何使用还不知道,等大佬来个例程了
离线
CPU占用高,应该是G2D没有搞起来;Qt那个示图跑的QML吧,没有GPU跑QML神仙CPU也吃力,所以帧率低。
我去源码里面搜了一圈,没有g2d选项,去配置文件下看了一下,lvgl只有三种显示驱动的配置1:lvgl_drm.config,2:lvgl_rkadk.config,3:lvgl_sdl.config,上面视频是使用的2:lvgl_rkadk.config,启动log如下
drm encode type is LCD
rk_disp: 1024x600 (0mm X 0mm)
[RKADK_P] {RKADK_VERSION_Dump :021} ---------------------------------------------------------
[RKADK_P] {RKADK_VERSION_Dump :022} rkadk version: git-6cdc879 Fri Nov 22 11:39:55 2024 +0800
[RKADK_P] {RKADK_VERSION_Dump :023} rkadk building: unknown rkadk build info
[RKADK_P] {RKADK_VERSION_Dump :024} ---------------------------------------------------------
rockit_load start
v4l2_tx probe successv4l2_rx_probe success
[04675.640] vrgn_thread_fn(102): vrgn_thread_fn [102] dev(vrgn-15) register okrockit_load end
rockit log path (null), log_size = 0, can use export rt_log_path=, export rt_log_size= change
log_file = (nil)
(null) 12:37:55-642 {log_level_init :190}
please use echo name=level > /tmp/rt_log_level set log level
name: all cmpi mb sys vdec venc rgn vpss vgs tde avs wbc vo vi ai ao aenc adec
log_level: 0 1 2 3 4 5 6
(null) 12:37:55-643 {log_level_init :196} Failed to open /dev/mpi/vlog,please check insmod success or fail
rockit default level 4, can use export rt_log_level=x, x=0,1,2,3,4,5,6 change
(null) 12:37:55-643 {read_log_level :077} text is all=4
(null) 12:37:55-643 {read_log_level :079} module is all, log_level is 4
(null) 12:37:55-644 {dump_version :055} ---------------------------------------------------------
(null) 12:37:55-644 {dump_version :056} rockit version: git-ef354cbc9 Mon Dec 2 16:29:53 2024 +0800
(null) 12:37:55-644 {dump_version :057} rockit building: built-Chu 2024-12-03 21:05:52
(null) 12:37:55-644 {dump_version :058} ---------------------------------------------------------
vsys dev open 4
(null) 12:37:55-644 {monitor_log_level :131} #Start monitor_log_level thread, arg:(nil)
cmpi 12:37:55-644 {sys_runtime_librar:178} Failed to open /dev/mpi/venc,please check insmod success or fail
cmpi 12:37:55-644 {sys_runtime_librar:178} Failed to open /dev/mpi/avs,please check insmod success or fail
cmpi 12:37:55-645 {sys_runtime_librar:178} Failed to open /dev/mpi/venc,please check insmod success or fail
get a hdl = 0x4ca850
get a hdl = 0x4cb718
rk_disp: ui created successfullyl.
mb 12:37:55-653 {mb_create_buffer :484} allocated buffer(this=0xa6eef8e8, data=0x9e0cb000, size=2457600, phy=(nil), id = 27)
rk_disp: ui bufs[0] application is successful.
mb 12:37:55-656 {mb_create_buffer :484} allocated buffer(this=0xa6eef948, data=0x9dc1b000, size=2457600, phy=(nil), id = 28)
evdev_get_tp_event: /sys/class/input/input0/name = Goodix Capacitive TouchScreen
/dev/input/event0
EV_ABS ABS_MT_POSITION_X
Min 0
Max 1023
EV_ABS ABS_MT_POSITION_Y
Min 0
Max 599
calibrate [0,1023]x[0,599] to 1024x600
evdev_calibrate = 1
rga_api version 1.10.1_[0]
load library(librga.so) in releative path
猜测librga.so可能是g2d相关,不知道是否对?
1:谁有官方文档可以分享一下?
2:请教一下如何启用g2d
3:ai回复的内容如下,是否靠谱?
Rockchip官方SDK中缺少G2D驱动的解决方案
如果Rockchip官方SDK中没有提供G2D驱动文件,您可以尝试以下方法解决:
1. 检查SDK版本和分支
建议确认您使用的是最新版本的RK3506 SDK,并检查是否有专门针对G2D的分支或补丁。Rockchip有时会将特定功能放在不同的SDK分支中。您可以联系Rockchip技术支持获取最新的G2D驱动支持情况。16
2. 从其他Rockchip平台移植G2D驱动
RK3506的G2D驱动可能与其他Rockchip平台(如RK3568)兼容。您可以尝试从RK3568 Linux SDK中移植相关驱动文件:
drivers/gpu/drm/rockchip/rockchip_drm_g2d.c
include/uapi/drm/rockchip_drm.h
相应的Kconfig和Makefile修改
需要特别注意寄存器地址和时钟配置的差异。12
3. 使用开源社区解决方案
一些开源社区如ArmSoM和Firefly可能已经为RK3506适配了G2D功能:
检查ArmSoM提供的RK3506内核源码
查找Firefly-RK3506的开源项目
参考Rockchip Linux开源社区的补丁
这些资源可能包含您需要的G2D驱动实现。15
4. 替代方案评估
如果确实无法获得G2D硬件加速支持,可以考虑以下替代方案:
使用Mesa 3D的软件渲染
采用CPU优化的图形库如Cairo
评估是否可以使用VPU进行图像处理
考虑使用OpenCL进行通用计算加速
这些方案虽然性能可能不如专用G2D硬件,但可以提供基本功能
离线
CPU占用高,应该是G2D没有搞起来;Qt那个示图跑的QML吧,没有GPU跑QML神仙CPU也吃力,所以帧率低。
搜索了一下,rk的G2D的加速为DRM+RGA ,其中RGA 为2D加速,启用之后拖动视频那个界面CPU使用率90以上,FPS90多,复杂界面还是掉到FPS4到10
好像这个G2D加速很弱
离线
根据log看lcd的帧率是60,lvgl设置很高是否有意义?
LV_DRIVERS_SET_PLANE not be set, use DRM_PLANE_TYPE_PRIMARY
Best plane: 57
disp_init res1:[1024 x 600@60fps] bit depth 32
[ 379.586739] rockchip-vop ff600000.vop: [drm:vop_crtc_atomic_enable] Update mode to 1024x600p60, type: 17
DRM subsystem and buffer mapped successfully lcd_fps:60
evdev_get_tp_event: /sys/class/input/input0/name = Goodix Capacitive TouchScreen
/dev/input/event0
EV_ABS ABS_MT_POSITION_X
Min 0
Max 1023
EV_ABS ABS_MT_POSITION_Y
Min 0
Max 599
calibrate [0,1023]x[0,599] to 1024x600
evdev_calibrate = 1
rga_api version 1.10.1_[0]
离线
qt那俩不是QML 是QtWidgets,官方的例程
离线
关于QT的帧率,你不操作界面,直接降到0,你操作一下才会马上升高,应该和lvgl的处理方式不一样,这个moveblocks方块的动画可以50多帧,另外一个animatedtiles,qt图标的界面,是0到20多帧,不操作界面就是0帧。
离线
从原子那找到文档了,位置08、RK官方文档\cn\Linux\Graphics,文件名Rockchip_Developer_Guide_Linux_Graphics_CN.pdf,内容如下
1. Rockchip Linux Graphics介绍
1.1 概述
Rockchip Linux平台的图形处理模块,基于DRM和DMA-BUF技术,提供了符合ARM Linux标准的⾼效图
形处理环境。其主要优势在于通⽤架构,简化了定制化开发流程,并且允许⼴泛利⽤现有组件,成为众
多开源项⽬在ARM端的⾸选适配平台。 尽管如此,由于技术和架构复杂性,理解和应⽤这⼀平台可能需
要⼀定的学习过程。开发者可通过查阅 docs/cn/Common/DISPLAY/ 、 docs/cn/Linux/Graphics/ ⽂
档和Rockchip wiki来获取深⼊的信息和指南,这些资料是掌握平台核⼼技术的重要资源。
1.2 芯⽚硬件模块介绍
1.2.1 VOP (Video Output Processor)
VOP是从存储器帧缓冲区到显⽰设备的显⽰接口,是显⽰单元⽤来显⽰图像 (⽐如输⼊NV12,RGB的
Buffer,显⽰到屏幕)。
各个平台VOP的基础特性不尽相同,⽐如各个显⽰接口⽀持的最⼤分辨率,⽀不⽀持4K分辨率,AFBC
压缩格式等等,具体细节可参考
docs/cn/Common/DISPLAY/Rockchip_Developer_Guide_DRM_Display_Driver_CN.pdf 。
1.2.2 GPU (Graphics Process Unit)
GPU是⼀个基于开放标准的图形加速平台。它⽀持 2D 图形、3D 图形以及 GPU 上的通⽤计算
(GPGPU)。
基本上Rockchip Linux的GPU有提供OpenGLES,EGL,OpenCl的 API,不⽀持OPENGL。⽀持类型如下
(各个芯⽚平台⽀持的类型不尽相同,具体可以参考对应的芯⽚⼿册):
OpenGL ES 3.0
OpenGL ES 2.0
OpenGL ES 1.1
OpenCL 1.2
OpenCL 1.1
OpenCL 1.0
1.2.3 RGA (Raster Graphic Acceleration)
Rockchip RGA是⼀个独⽴的⼆维光栅图形加速单元。它加速了⼆维图形操作,例如点/线绘制、图像缩
放、旋转、位图、图像合成等。不同芯⽚平台⽀持的图像格式不尽相同,具体可以参考对应的芯⽚⼿
册。代码位于“SDK/external/linux-rga”⽬录, 更多信息可以参考
docs/cn/Common/RGA/Rockchip_Developer_Guide_RGA_CN.pdf 。
测试DRM+RGA和lvgl_rkadk都使用了RGA的2D加速,但是DRM+RGA帧率更高,RGA文档在docs/cn/Common/RGA/Rockchip_Developer_Guide_RGA_CN.pdf 。
参考文档可以进行测试,
还有这颗芯片的RGA的2D加速感觉有点弱。不知道是不是因为分辨率高的原因,1024X600是不是换成800X480会不会好很多
离线
这颗芯片的亮点是不是RK3506G2、RK3506B工作温度-20到80,RK3506J工作温度-40到85,然后双网口,canfd,多串口,轻量GUI
厂家介绍
内存差异:
RK3506G2集成DDR3L 128MB内存,仅需4层板即可完成整板设计,极大简化了设计并节省成本。RK3506B和RK3506J支持外部内存,最高可达1GB。
工作温度差异:
RK3506G2和RK3506B的工作温度范围为-20~80℃,而RK3506J为工业级宽温型号,工作温度范围为-40~85℃。
封装、尺寸差异:
RK3506G2、RK3506B和RK3506J的接口功能一致,但在封装和尺寸上有所不同,详见上一章配置表。
不同的应用场景
RK3506适用场景简介
工业控制:RK3506适用于工业控制、工业通信、人机交互等应用场景。其多核异构架构(3xCortex-A7+Cortex-M0)和外设接口丰富,支持Buildroot、Yocto系统,适合轻量级HMI应用。
工业通信:RK3506均支持双路百兆网口、2路CAN FD、6路UART等接口,满足工业领域的控制及通信要求。
PLC控制:RK3506支持AMP多核异构架构,可实现高实时性能,适用于PLC控制及各类闸道应用。
总结:结合RK3506性能参数与功能特性来看,RK3506主要应用于工控,或者一些AIoT应用,如家电显控,手持POS,楼宇对讲等,工控应用
复杂GUI还是很吃力
离线