STM32MP157移植Qt5.12.10
2025-02-28 来源:cnblogs
一 说明
不带GPU功能,只能使用linuxFB方式运行QT程序
STM32MP15-Ecosystem-v2.1.0 release
tf-a-stm32mp-2.2.r2-r0
u-boot-stm32mp-2020.01.r2-r0
linux-stm32mp-5.4.56-r0
Buildroot: buildroot-2021.02.10
tslib: tslib-1.22
qt-everywhere-src-5.12.10
qt-opensource-linux-x64-5.12.10.run
Arm GNU Toolchain: gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
二 屏幕驱动
屏幕是800x480的RGB-LCD,与开发板的硬件接口与ST官方开发板STM32MP157-EVAL的RGB-LTDC接口引脚一致。
首先修改设备树文件arch/arm/boot/dts/stm32mp157d-custom.dts:
根节点添加panel_backlight和panel_rgb节点
/ {
......
panel_backlight: panel-backlight {
compatible = 'pwm-backlight';
pwms = <&pwm4 1 5000000>;
brightness-levels = <0 32 64 96 128 160 192 224 255>;
power-supply = <&v3v3>;
default-brightness-level = <7>;
status = 'okay';
};
panel_rgb: panel-rgb {
compatible = 'custom,rgb-lcd5';
backlight = <&panel_backlight>;
status = 'okay';
port {
rgb_panel_in: endpoint {
remote-endpoint = <<dc_ep0_out>;
};
};
};
......
};
<dc节点追加内容如下:
<dc {
pinctrl-names = 'default', 'sleep';
pinctrl-0 = <<dc_pins_b>;
pinctrl-1 = <<dc_pins_sleep_b>;
status = 'okay';
port {
#address-cells = <1>;
#size-cells = <0>;
ltdc_ep0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&rgb_panel_in>;
};
};
};
接着修改设备树文件arch/arm/boot/dts/stm32mp157d-custom.dtsi:
&timers4节点追加用于控制屏幕背光的内容如下
&timers4 {
status = 'okay';
/* spare dmas for other usage */
/delete-property/dmas;
/delete-property/dma-names;
pwm4: pwm {
pinctrl-0 = <&pwm4_pins_b>;
pinctrl-1 = <&pwm4_sleep_pins_b>;
pinctrl-names = 'default', 'sleep';
#pwm-cells = <2>;
status = 'okay';
};
};
接着修改屏幕驱动文件drivers/gpu/drm/panel/panel-simple.c:
platform_of_match数组中添加自己屏幕的匹配数据
static const struct of_device_id platform_of_match[] = {
......
{
.compatible = 'custom,rgb-lcd5',
.data = &custom_rgb_lcd5_desc,
},{
/* sentinel */
}
};
添加自己屏幕的时序参数及相关描述信息
static const struct drm_display_mode custom_rgb_lcd5_mode = {
.clock = 33300, /* LCD像素时钟,单位:KHz */
.hdisplay = 800, /* LCD X轴像素个数 */
.hsync_start = 800 + 88, /* LCD X轴 + hbp 像素个数 */
.hsync_end = 800 + 88 + 48, /* LCD X轴 + hbp + hspw 像素个数*/
.htotal = 800 + 88 + 48 + 40, /* LCD X轴 + hbp + hspw + hfp */
.vdisplay = 480, /* LCD Y轴像素个数 */
.vsync_start = 480 + 32, /* LCD Y轴 + vbp 像素个数 */
.vsync_end = 480 + 32 + 3, /* LCD Y轴 + vbp + vspw 像素个数 */
.vtotal = 480 + 32 + 3 + 13, /* LCD Y轴 + vbp + vspw + vfp */
.vrefresh = 60, /* LCD刷新率,单位:HZ */
.flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
};
static const struct panel_desc custom_rgb_lcd5_desc = {
.modes = &custom_rgb_lcd5_mode,
.num_modes = 1,
.bpc = 8,
.size = {
.width = 117,
.height = 67,
},
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
};
三 触摸驱动
我手上开发板配套的RGB-LCD使用的触摸芯片型号为GT9147,通信接口使用的是开发板的i2c2,除此之外还有RST复位引脚和IRQ中断引脚。为了使Linux内核匹配该设备驱动,需要修改arch/arm/boot/dts/stm32mp157d-custom.dts设备树文件。在&i2c2节点下追加如下内容:
&i2c2 {
pinctrl-names = 'default', 'sleep';
pinctrl-0 = <&i2c2_pins_a>;
pinctrl-1 = <&i2c2_pins_sleep_a>;
i2c-scl-rising-time-ns = <185>;
i2c-scl-falling-time-ns = <20>;
clock-frequency = <400000>;
status = 'okay';
/* spare dmas for other usage */
/delete-property/dmas;
/delete-property/dma-names;
goodix_ts: gt9147@14 {
compatible = 'goodix,gt9147';
reg = <0x14>;
interrupt-parent = <&gpioe>;
interrupts = <1 IRQ_TYPE_EDGE_RISING>;
irq-gpios = <&gpioe 1 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpioa 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
status = 'okay';
};
};
Linux源码中已有gt9147的驱动文件drivers/input/touchscreen/goodix.c,只需要配置内核使能该驱动即可。该驱动文件匹配列表如下:
static const struct of_device_id goodix_of_match[] = {
{ .compatible = 'goodix,gt1151' },
{ .compatible = 'goodix,gt5663' },
{ .compatible = 'goodix,gt5688' },
{ .compatible = 'goodix,gt911' },
{ .compatible = 'goodix,gt9110' },
{ .compatible = 'goodix,gt912' },
{ .compatible = 'goodix,gt927' },
{ .compatible = 'goodix,gt9271' },
{ .compatible = 'goodix,gt928' },
{ .compatible = 'goodix,gt967' },
{ .compatible = 'goodix,gt9147',},
{ }
};
四 测试显示和触摸
4.1 配置Linux
1、使能DRM(Direct Rendering Module)驱动(st源码默认配置已使能配置)
Device Drivers --->
Graphics support --->
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
<*> DRM Support for STMicroelectronics SoC Series
Display Panels --->
<*> support for simple panels
Backlight & LCD device support --->
<*> Generic PWM based Backlight Driver
开启DRM驱动的传统FB(FrameBuffer)框架:
Device Drivers --->
Graphics support --->
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
[*] Enable legacy fbdev support for your modesetting driver
2、使能Goodix I2C触摸芯片驱动(st源码默认配置已使能配置)
Device Drivers --->
Input device support --->
[*] Touchscreens --->
<*> Goodix I2C touchscreen
4.2 配置Buildroot
1、使能libdrm库用来调用DRM驱动测试屏幕
Target packages --->
Libraries --->
Graphics --->
[*] libdrm --->
[*] Install test programs
2、使能evtest用来测试触摸
Target packages --->
Hardware handling --->
[*] evtest
3、使能字库(后面配置Qt环境变量会用到,否则后面在开发板运行软件会无法正常显示字符)
Target packages --->
Fonts, cursors, icons, sounds and themes --->
[*] DejaVu fonts
[*] mono fonts (NEW)
[*] sans fonts (NEW)
[*] serif fonts (NEW)
[*] sans condensed fonts (NEW)
[*] serif condensed fonts (NEW)
配置完成后重新make然后接下来使用新编译的文件系统启动开发板进行测试。
4.3 测试
4.3.1 屏幕测试
使用modetest测试屏幕显示。查看该命令使用帮助如下:
# modetest --help
usage: modetest [-acDdefMPpsCvrw]
Query options:
-c list connectors
-e list encoders
-f list framebuffers
-p list CRTCs and planes (pipes)
Test options:
-P -s -C test hw cursor -v test vsynced page flipping -r set the preferred mode for all connectors -w -a use atomic API -F pattern1,pattern2 specify fill patterns Generic options: -d drop master after mode set -M module use the given driver -D device use the given device Default is to dump all info. 直接执行modetest命令会自动扫描并尝试打开显示设备,如下: # modetest ...... trying to open device 'amdgpu'...failed trying to open device 'imx-drm'...failed trying to open device 'virtio_gpu'...failed ...... trying to open device 'stm'...done Encoders: id crtc type possible crtcs possible clones 31 35 DPI 0x00000001 0x00000000 Connectors: id encoder status name size (mm) modes encoders 32 31 connected DPI-1 117x67 1 31 modes: index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot #0 800x480 64.62 800 888 936 976 480 512 515 528 33300 flags: phsync, pvsync; type: preferred, driver props: 1 EDID: flags: immutable blob blobs: value: 2 DPMS: flags: enum enums: On=0 Standby=1 Suspend=2 Off=3 value: 0 5 link-status: flags: enum enums: Good=0 Bad=1 value: 0 6 non-desktop: flags: immutable range values: 0 1 value: 0 4 TILE: flags: immutable blob blobs: value: CRTCs: id fb pos size 35 38 (0,0) (800x480) #0 800x480 64.62 800 888 936 976 480 512 515 528 33300 flags: phsync, pvsync; type: preferred, driver props: 24 VRR_ENABLED: flags: range values: 0 1 value: 0 28 GAMMA_LUT: flags: blob blobs: value: 29 GAMMA_LUT_SIZE: flags: immutable range values: 0 4294967295 value: 256 Planes: id crtc fb CRTC x,y x,y gamma size possible crtcs 33 35 38 0,0 0,0 0 0x00000001 formats: AR24 XR24 RG24 RG16 AR15 XR15 AR12 XR12 C8 props: 8 type: flags: immutable enum enums: Overlay=0 Primary=1 Cursor=2 value: 1 30 IN_FORMATS: flags: immutable blob blobs: value: 01000000000000000900000018000000 01000000400000004152323458523234 52473234524731364152313558523135 41523132585231324338202000000000 ff010000000000000000000000000000 0000000000000000 in_formats blob decoded: AR24: LINEAR XR24: LINEAR RG24: LINEAR RG16: LINEAR AR15: LINEAR XR15: LINEAR AR12: LINEAR XR12: LINEAR C8 : LINEAR 36 0 0 0,0 0,0 0 0x00000001 formats: AR24 RG24 RG16 AR15 AR12 C8 props: 8 type: flags: immutable enum enums: Overlay=0 Primary=1 Cursor=2 value: 0 30 IN_FORMATS: flags: immutable blob blobs: value: 01000000000000000600000018000000 01000000300000004152323452473234 52473136415231354152313243382020 3f000000000000000000000000000000 0000000000000000 in_formats blob decoded: AR24: LINEAR RG24: LINEAR RG16: LINEAR AR15: LINEAR AR12: LINEAR C8 : LINEAR Frame buffers: id size pitch 可见开发板当前可用显示设备是stm,接下来指定该设备进行测试: # modetest -M stm -s 32@35:800x480 setting mode 800x480-64.62Hz on connectors 32, crtc 35 4.3.2 触摸测试 重新启动开发板进入文件系统后查看当前系统下的输入设备: # ls -l /sys/class/input/ event0 -> ../../devices/platform/soc/40013000.i2c/i2c-0/0-0014/input/input0/event0 event1 -> ../../devices/platform/soc/5c002000.i2c/i2c-1/1-0033/5c002000.i2c:stpmic@33:onkey/input/input1/event1 input0 -> ../../devices/platform/soc/40013000.i2c/i2c-0/0-0014/input/input0 input1 -> ../../devices/platform/soc/5c002000.i2c/i2c-1/1-0033/5c002000.i2c:stpmic@33:onkey/input/input1 可以看到input0是屏幕触摸芯片(i2c地址0x14),event0是它的evdev用户空间接口。此evdev接口可通过/dev/input/event0设备文件访问: # ls -l /dev/input/event0 crw-r----- 1 root root 13, 64 Jan 1 1970 /dev/input/event0 接下来执行evtest命令,无其余参数。该命令会显示可用的输入设备列表及名称,并允许选择要测试的设备: # evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: Goodix Capacitive TouchScreen /dev/input/event1: pmic_onkey Select the device event number [0-1]: 0 输入0指定触摸设备,然后按回车键显示如下: Input driver version is 1.0.1 Input device ID: bus 0x18 vendor 0x416 product 0x38f version 0x1060 Input device name: 'Goodix Capacitive TouchScreen' Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 125 (KEY_LEFTMETA) Event code 330 (BTN_TOUCH) Event type 3 (EV_ABS) Event code 0 (ABS_X) Value 0 Min 0 Max 799 Event code 1 (ABS_Y) Value 0 Min 0 Max 479 Event code 47 (ABS_MT_SLOT) Value 0 Min 0 Max 9 Event code 48 (ABS_MT_TOUCH_MAJOR) Value 0 Min 0 Max 255 Event code 50 (ABS_MT_WIDTH_MAJOR) Value 0 Min 0 Max 255 Event code 53 (ABS_MT_POSITION_X) Value 0 Min 0 Max 799 Event code 54 (ABS_MT_POSITION_Y) Value 0 Min 0 Max 479 Event code 57 (ABS_MT_TRACKING_ID) Value 0 Min 0 Max 65535 Properties: Property type 1 (INPUT_PROP_DIRECT) Testing ... (interrupt to exit) evtest运行后,按下触摸面板,将看到如下格式报告的触摸信息: Event: time 946686619.368650, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 0 Event: time 946686619.368650, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 31 Event: time 946686619.368650, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 27 Event: time 946686619.368650, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 35 Event: time 946686619.368650, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 35 Event: time 946686619.368650, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1 Event: time 946686619.368650, type 3 (EV_ABS), code 0 (ABS_X), value 31 Event: time 946686619.368650, type 3 (EV_ABS), code 1 (ABS_Y), value 27 Event: time 946686619.368650, -------------- SYN_REPORT ------------ Event: time 946686619.511455, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1 Event: time 946686619.511455, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0 Event: time 946686619.511455, -------------- SYN_REPORT ------------ 按Ctrl+Z结束测试。 五 编译tslib源码 # 解压源码 $ tar xvfJ tslib-1.22.tar.xz # 进入源码目录 $ cd tslib-1.22 # 配置 $ ./configure --prefix=/home/admin/qt/build-tslib-1.22 --host=arm-none-linux-gnueabihf CC=/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc # 编译&安装 $ make && make install --prefix=编译后安装输出路径 --host=平台 CC=gcc交叉编译器所在路径 查看配置选项帮助说明: $ ./configure -help 编译安装完成后在安装输出目录下有如下内容: $ ls /home/admin/qt/build-tslib-1.22/ bin etc include lib share 六 编译Qt源码 # 解压源码 $ tar xfJ qt-everywhere-src-5.12.10.tar.xz # 进入源码目录 $ cd qt-everywhere-src-5.12.10 为了不破坏源码本身内容,复制一份自己修改使用的文件: $ cp ./qtbase/mkspecs/linux-arm-gnueabi-g++ -a ./qtbase/mkspecs/arm-none-linux-gnueabihf-g++/ 编辑文件: $ vim ./qtbase/mkspecs/arm-none-linux-gnueabihf-g++/qmake.conf 修改后内容如下: # # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc QMAKE_CXX = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ QMAKE_LINK = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ # modifications to linux.conf QMAKE_AR = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-objcopy QMAKE_NM = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-nm -P QMAKE_STRIP = /opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-strip load(qt_config) QMAKE_INCDIR=/home/admin/qt/build-tslib-1.22/include QMAKE_LIBDIR=/home/admin/qt/build-tslib-1.22/lib 主要改动:1-修改自己使用的编译器,2-添加上一节编译好的tslib相关路径。 接下来配置选项,由于内容较多故创建一个配置脚本config-qt.sh,内容如下: export CC=/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc export CXX=/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ ./configure -prefix /home/admin/qt/build-qt-everywhere-src-5.12.10 -xplatform arm-none-linux-gnueabihf-g++ -release -opensource -confirm-license -no-openssl -no-opengl -no-xcb -no-eglfs -no-compile-examples -no-pkg-config -skip qtsensors -skip qtdoc -skip qtwayland -skip qt3d -skip qtcanvas3d -skip qtpurchasing -skip qtdeclarative -no-iconv -no-glib -tslib -I/home/admin/qt/build-tslib-1.22/include -L/home/admin/qt/build-tslib-1.22/lib export CC=gcc交叉编译器路径 export CXX=g++交叉编译器路径 -prefix 编译后安装输出路径 -xplatform 平台(自己修改使用的) -tslib -I 编译好的tslib安装路径/include -L 编译好的tslib安装路径/lib 赋予脚本执行权限: $ chmod +x config-qt.sh 执行配置脚本: $ ./config-qt.sh 配置过程如下: + cd qtbase + /home/admin/qt/qt-everywhere-src-5.12.10/qtbase/configure -top-level -prefix /home/admin/qt/build-qt-everywhere-src-5.12.10 -xplatform arm-none-linux-gnueabihf-g++ -release -opensource -confirm-license -no-openssl -no-opengl -no-xcb -no-eglfs -no-compile-examples -no-pkg-config -skip qtsensors -skip qtdoc -skip qtwayland -skip qt3d -skip qtcanvas3d -skip qtpurchasing -skip qtdeclarative -no-iconv -no-glib -tslib -I/home/admin/qt/build-tslib-1.22/include -L/home/admin/qt/build-tslib-1.22/lib Creating qmake... ............................................................................................Done. Info: creating super cache file /home/admin/qt/qt-everywhere-src-5.12.10/.qmake.super Info: creating cache file /home/admin/qt/qt-everywhere-src-5.12.10/.qmake.cache Info: creating stash file /home/admin/qt/qt-everywhere-src-5.12.10/.qmake.stash This is the Qt Open Source Edition. You have already accepted the terms of the Open Source license. Running configuration tests... Checking for gold linker... yes Checking for machine tuple... yes Checking for valid makespec... yes Checking for target architecture... arm Checking for host architecture... x86_64 Checking for alloca() in alloca.h... yes Checking for C++14 support... yes Checking for C++1z support... yes Checking for C99 support... yes Checking for C11 support... yes Checking for D-Bus >= 1.2... no Checking for new dtags support... yes Checking for D-Bus >= 1.2 (host)... yes Checking for udev... no Checking for POSIX fallocate()... yes Checking for precompiled header support... yes Checking for RDRAND instruction... no Checking for symbol visibility support... yes Checking for -Bsymbolic-functions support... no Checking for STL compatibility... yes Checking for zlib... no Checking for clock_gettime()... yes Checking for POSIX monotonic clock... yes Checking for C++11 Checking for dlopen()... yes Checking for eventfd... yes Checking for futimens()... yes Checking for getauxval()... yes Checking for getentropy()... yes Checking for GNU libc... yes Checking for ICU... no Checking for inotify... yes Checking for SysV IPC... yes Checking for linkat()... yes Checking for ppoll()... yes Checking for renameat2()... yes Checking for slog2... no Checking for statx() in libc... yes Checking for 64 bit atomics... yes Checking for DoubleConversion... no Checking for PCRE2... no Checking for O_CLOEXEC... yes Checking for C++11 Checking for working std::atomic for function pointers... yes Checking for getifaddrs()... yes Checking for IPv6 ifname... yes Checking for Linux AF_NETLINK sockets... yes Checking for KMS... no Checking for OpenVG... no Checking for evdev... yes Checking for FreeType... no Checking for GBM... no Checking for LinuxFB... yes Checking for mtdev... no Checking for default QPA platform... xcb Checking for HarfBuzz... no Checking for libjpeg... no Checking for tslib... yes Checking for Vulkan... no Checking for XLib... no Checking for xkbcommon >= 0.5.0... no Checking for CUPS... no Checking for DB2 (IBM)... no Checking for InterBase... no Checking for MySQL... no Checking for OCI (Oracle)... no Checking for ODBC... no Checking for PostgreSQL... no Checking for SQLite (version 2)... no Checking for TDS (Sybase)... no Checking for Socket CAN... yes Checking for Socket CAN FD... yes Checking for jasper... no Checking for mng... no Checking for tiff... no Checking for webp... no Checking for SDL2... no Checking for BlueZ... no Checking for Gypsy... no Checking for WinRT Geolocation API... no Checking for ALSA... no Checking for GStreamer 1.0... no Checking for GStreamer 0.10... no Checking for Video for Linux... yes Checking for OpenAL... no Checking for PulseAudio >= 0.9.10... no Checking for libresourceqt5... no Checking for libclang... no Done running configuration tests. Configure summary: Building on: linux-g++ (x86_64, CPU features: mmx sse sse2) Building for: arm-none-linux-gnueabihf-g++ (arm, CPU features: neon) Target compiler: gcc 9.2.1 Configuration: cross_compile use_gold_linker enable_new_dtags largefile neon precompile_header shared rpath release c++11 c++14 c++1z concurrent dbus no-pkg-config reduce_exports stl Build options: Mode ................................... release Optimize release build for size ........ no Building shared libraries .............. yes Using C standard ....................... C11 Using C++ standard ..................... C++1z Using ccache ........................... no Using gold linker ...................... yes Using new DTAGS ........................ yes Using precompiled headers .............. yes Using LTCG ............................. no Target compiler supports: NEON ................................. yes Build parts ............................ libs examples Qt modules and options: Qt Concurrent .......................... yes Qt D-Bus ............................... yes Qt D-Bus directly linked to libdbus .... no Qt Gui ................................. yes Qt Network ............................. yes Qt Sql ................................. yes Qt Testlib ............................. yes Qt Widgets ............................. yes Qt Xml ................................. yes Support enabled for: Using pkg-config ....................... no udev ................................... no Using system zlib ...................... no Qt Core: DoubleConversion ....................... yes Using system DoubleConversion ........ no GLib ................................... no iconv .................................. no ICU .................................... no Tracing backend ........................ Logging backends: journald ............................. no syslog ............................... no slog2 ................................ no Using system PCRE2 ..................... no Qt Network: getifaddrs() ........................... yes IPv6 ifname ............................ yes libproxy ............................... no Linux AF_NETLINK ....................... yes OpenSSL ................................ no Qt directly linked to OpenSSL ........ no OpenSSL 1.1 ............................ no DTLS ................................... no SCTP ................................... no Use system proxies ..................... yes Qt Gui: Accessibility .......................... yes FreeType ............................... yes Using system FreeType ................ no HarfBuzz ............................... yes Using system HarfBuzz ................ no Fontconfig ............................. no Image formats: GIF .................................. yes ICO .................................. yes JPEG ................................. yes Using system libjpeg ............... no PNG .................................. yes Using system libpng ................ no EGL .................................... no OpenVG ................................. no OpenGL: Desktop OpenGL ....................... no OpenGL ES 2.0 ........................ no OpenGL ES 3.0 ........................ no OpenGL ES 3.1 ........................ no OpenGL ES 3.2 ........................ no Vulkan ................................. no Session Management ..................... yes Features used by QPA backends: evdev .................................. yes libinput ............................... no INTEGRITY HID .......................... no mtdev .................................. no tslib .................................. yes xkbcommon .............................. no X11 specific: XLib ................................. no XCB Xlib ............................. no EGL on X11 ........................... no QPA backends: DirectFB ............................... no EGLFS .................................. no LinuxFB ................................ yes VNC .................................... yes Mir client ............................. no Qt Sql: SQL item models ........................ yes Qt Widgets: GTK+ ................................... no Styles ................................. Fusion Windows Qt PrintSupport: CUPS ................................... no Qt Sql Drivers: DB2 (IBM) .............................. no InterBase .............................. no MySql .................................. no OCI (Oracle) ........................... no ODBC ................................... no PostgreSQL ............................. no SQLite2 ................................ no SQLite ................................. yes Using system provided SQLite ......... no TDS (Sybase) ........................... no Qt Testlib: Tester for item models ................. yes Qt SerialBus: Socket CAN ............................. yes Socket CAN FD .......................... yes Further Image Formats: JasPer ................................. no MNG .................................... no TIFF ................................... yes Using system libtiff ................. no WEBP ................................... yes Using system libwebp ................. no Qt Gamepad: SDL2 ................................... no Qt Bluetooth: BlueZ .................................. no BlueZ Low Energy ....................... no Linux Crypto API ....................... no WinRT Bluetooth API (desktop & UWP) .... no Qt Positioning: Gypsy GPS Daemon ....................... no WinRT Geolocation API .................. no Qt Location: Qt.labs.location experimental QML plugin . yes Geoservice plugins: OpenStreetMap ........................ yes HERE ................................. yes Esri ................................. yes Mapbox ............................... yes MapboxGL ............................. no Itemsoverlay ......................... yes QtXmlPatterns: XML schema support ..................... yes Qt Multimedia: ALSA ................................... no GStreamer 1.0 .......................... no GStreamer 0.10 ......................... no Video for Linux ........................ yes OpenAL ................................. no PulseAudio ............................. no Resource Policy (libresourceqt5) ....... no Windows Audio Services ................. no DirectShow ............................. no Windows Media Foundation ............... no Qt Tools: QDoc ................................... no Note: Also available for Linux: linux-clang linux-icc WARNING: QDoc will not be compiled, probably because libclang could not be located. This means that you cannot build the Qt documentation. Either ensure that llvm-config is in your PATH environment variable, or set LLVM_INSTALL_DIR to the location of your llvm installation. On Linux systems, you may be able to install libclang by installing the libclang-dev or libclang-devel package, depending on your distribution. On macOS, you can use Homebrew's llvm package. On Windows, you must set LLVM_INSTALL_DIR to the installation path. Qt is now configured for building. Just run 'make'. Once everything is built, you must run 'make install'. Qt will be installed into '/home/admin/qt/build-qt-everywhere-src-5.12.10'. Prior to reconfiguration, make sure you remove any leftovers from the previous build. 然后执行编译(加time是为了查看编译耗时): $ time (make -j 8) 编译完成后执行安装命令: $ make install 此时在安装输出目录下有如下内容: $ ls /home/admin/qt/build-qt-everywhere-src-5.12.10/ bin doc examples include lib mkspecs plugins translations 最后,将安装输出目录拷贝到/opt目录下: sudo cp /home/admin/qt/build-qt-everywhere-src-5.12.10/ -a /opt/ 查看配置选项帮助说明: $ ./configure -help 七 配置Qt Creator 首先,在Ubuntu上安装Qt: # 赋予安装程序可执行权限 $ sudo chmod +x qt-opensource-linux-x64-5.12.10.run # 执行安装 $ ./qt-opensource-linux-x64-5.12.10.run # 接下来就是一系列可视化界面配置,和Windows安装软件一样 ...... 我是安装在/opt目录下,安装完成后查看如下: $ ls /opt/Qt5.12.10/ 5.12.10 Examples Licenses network.xml components.xml InstallationLog.txt MaintenanceTool Tools dist installer.dat MaintenanceTool.dat Docs installerResources MaintenanceTool.ini 如果需要卸载就执行如下命令: $ /opt/Qt5.12.10/MaintenanceTool 安装完毕后打开Qt Creator,选择 【工具】 -> 【选项】。 在弹出来的选项配置界面中选择【Kits】->【编译器】, 点击【添加】按钮选择添加【GCC】 ->【C】类型,然后填写名称(arm-none-linux-gnueabihf-9.2.0-gcc)和编译器路径(/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc),最后点击【Apply】完成应用。 同样的方式添加g++编译器:【Kits】->【编译器】->【添加】->【GCC】->【C++】->【名称(arm-none-linux-gnueabihf-9.2.0-g++)】->【编译器路径(/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++)】->【Apply】 然后选择Qt的版本,我们在前面已经交叉编译并安装了qt-everywhere-src-5.12.10,那么在这里只需要将qmake添加进来即可。具体操作如下:在选项配置界面中选择【Kits】->【Qt Versions】,然后点击【添加】按钮,在qt的安装目录下选择qmake(/opt/build-qt-everywhere-src-5.12.10/bin/qmake),添加完成后点击【Apply】完成应用。 最后要添加构建套件。在选项配置界面中选择【Kits】->【Kits】,点击【Add】,然后设置名称(qt-for-arm-linux),选择设备类型(Generic Linux Device),选择编译器(【Compiler】->【C: arm-none-linux-gnueabihf-9.2.0-gcc】->【C++: arm-none-linux-gnueabihf-9.2.0-g++】),选择Qt的版本(Qt version: Qt5.12.10(build-qt-everywhere-src-5.12.10)),最后点击【Apply】完成应用。 八 验证 8.1 完善根文件系统 首先将前面编译好的tslib和qt拷贝到使用Buildroot编译的根文件系统中: # rootfs的/usr/lib目录下创建相关目录 sudo mkdir ./rootfs/usr/lib/tslib ./rootfs/usr/lib/qt # 拷贝tslib sudo cp -r /home/admin/qt/build-tslib-1.22/* ./rootfs/usr/lib/tslib # 拷贝qt sudo cp -r /home/admin/qt/build-qt-everywhere-src-5.12.10/* ./rootfs/usr/lib/qt 接下来设置一些必要的环境变量,rootfs/etc/profile文件添加如下内容: # tslib export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CONFFILE=/usr/lib/tslib/etc/ts.conf export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_PLUGINDIR=/usr/lib/tslib/lib/ts export LD_PRELOAD=/usr/lib/tslib/lib/libts.so # qt export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0 export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins export LD_LIBRARY_PATH=/usr/lib/qt/lib:/usr/lib/qt/plugins/platforms export QT_QPA_FB_TSLIB=1 export QT_QPA_FONTDIR=/usr/share/fonts/dejavu 如果没有export LD_PRELOAD=/usr/lib/tslib/lib/libts.so这个环境变量的话执行tslib测试程序会报错如下: # /usr/lib/tslib/bin/ts_test /usr/lib/tslib/bin/ts_test: error while loading shared libraries: libts.so.0: cannot open shared object file: No such file or directory 8.2 构建Qt软件 前面已经将Qt Creator配置好了,接下来就创建一个工程来编译验证,过程如下: 打开Qt Creator --> 新建文件或项目(N) --> 项目:Application(Qt) --> Qt Widgets Application --> Choose.. --> 填写名称和路径 --> 下一步 --> Build system: qmake --> 下一步 --> 下一步 --> 下一步 --> 选择Desktop Qt 5.12.10 GCC 64bit和qt-for-arm-linux这两个构建套件kit(前者用于Ubuntu后者用于开发板)--> 下一步 --> 完成。 项目创建完成后,窗口调整为800x480,先构建用于Ubuntu的示例软件,如下: 构建完成后在Ubuntu上运行示例效果如下: 注:遇到/usr/bin/ld: cannot find -lGL报错的解决方法 先找一下系统中是否存在相关库,如下: $ sudo find / | grep 'libGL.so' /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so.1.7.0 ...... 确定系统存在相关库的话就创建该库符号链接,如下: $ sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1.7.0 /usr/lib/libGL.so 如果系统中找不到这个库就安装,如下: $ sudo apt install libgl1-mesa-dev 然后构建用于开发板运行的软件(构建套件选择qt-for-arm-linux,构建的软件只能在开发板上运行),查看构建完成的可执行文件信息,如下: $ file build-test-qt_for_arm_linux-Debug/test build-test-qt_for_arm_linux-Debug/test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped 将该文件拷贝到开发板rootfs中: $ sudo cp /home/admin/qt/project/build-test-qt_for_arm_linux-Debug/test ./rootfs/usr/local/qt-app/ 启动开发板,运行软件:/usr/local/qt-app/test。LCD屏幕显示如下: 至此,Qt软件就在开发板上运行起来了,移植完毕。 附录 Buildroot配置文件stm32mp157d_custom_defconfig: BR2_HAVE_DOT_CONFIG=y BR2_HOST_GCC_AT_LEAST_4_9=y BR2_HOST_GCC_AT_LEAST_5=y BR2_HOST_GCC_AT_LEAST_6=y BR2_HOST_GCC_AT_LEAST_7=y BR2_HOST_GCC_AT_LEAST_8=y BR2_HOST_GCC_AT_LEAST_9=y BR2_ARCH_HAS_MMU_OPTIONAL=y BR2_arm=y BR2_ARCH_HAS_TOOLCHAIN_BUILDROOT=y BR2_ARCH='arm' BR2_ENDIAN='LITTLE' BR2_GCC_TARGET_ABI='aapcs-linux' BR2_GCC_TARGET_CPU='cortex-a7' BR2_GCC_TARGET_FPU='neon-vfpv4' BR2_GCC_TARGET_FLOAT_ABI='hard' BR2_GCC_TARGET_MODE='arm' BR2_BINFMT_SUPPORTS_SHARED=y BR2_READELF_ARCH_NAME='ARM' BR2_BINFMT_ELF=y BR2_ARM_CPU_HAS_NEON=y BR2_ARM_CPU_HAS_FPU=y BR2_ARM_CPU_HAS_VFPV2=y BR2_ARM_CPU_HAS_VFPV3=y BR2_ARM_CPU_HAS_VFPV4=y BR2_ARM_CPU_HAS_ARM=y BR2_ARM_CPU_HAS_THUMB2=y BR2_ARM_CPU_ARMV7A=y BR2_cortex_a7=y BR2_ARM_EABIHF=y BR2_ARM_FPU_NEON_VFPV4=y BR2_ARM_INSTRUCTIONS_ARM=y BR2_WGET='wget --passive-ftp -nd -t 3' BR2_SVN='svn --non-interactive' BR2_BZR='bzr' BR2_GIT='git' BR2_CVS='cvs' BR2_LOCALFILES='cp' BR2_SCP='scp' BR2_HG='hg' BR2_ZCAT='gzip -d -c' BR2_BZCAT='bzcat' BR2_XZCAT='xzcat' BR2_LZCAT='lzip -d -c' BR2_TAR_OPTIONS='' BR2_DEFCONFIG='$(CONFIG_DIR)/defconfig' BR2_DL_DIR='$(TOPDIR)/dl' BR2_HOST_DIR='$(BASE_DIR)/host' BR2_PRIMARY_SITE='' BR2_BACKUP_SITE='http://sources.buildroot.net' BR2_KERNEL_MIRROR='https://cdn.kernel.org/pub' BR2_GNU_MIRROR='http://ftpmirror.gnu.org' BR2_LUAROCKS_MIRROR='http://rocks.moonscript.org' BR2_CPAN_MIRROR='http://cpan.metacpan.org' BR2_JLEVEL=0 BR2_STRIP_strip=y BR2_STRIP_EXCLUDE_FILES='' BR2_STRIP_EXCLUDE_DIRS='' BR2_OPTIMIZE_S=y BR2_SHARED_LIBS=y BR2_PACKAGE_OVERRIDE_FILE='$(CONFIG_DIR)/local.mk' BR2_GLOBAL_PATCH_DIR='' BR2_COMPILER_PARANOID_UNSAFE_PATH=y BR2_PIC_PIE_ARCH_SUPPORTS=y BR2_SSP_NONE=y BR2_RELRO_NONE=y BR2_FORTIFY_SOURCE_ARCH_SUPPORTS=y BR2_FORTIFY_SOURCE_NONE=y BR2_TOOLCHAIN=y BR2_TOOLCHAIN_USES_GLIBC=y BR2_TOOLCHAIN_EXTERNAL=y BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y BR2_TOOLCHAIN_EXTERNAL_PREINSTALLED=y BR2_TOOLCHAIN_EXTERNAL_PATH='/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf' BR2_TOOLCHAIN_EXTERNAL_GLIBC=y BR2_PACKAGE_HAS_TOOLCHAIN_EXTERNAL=y BR2_PACKAGE_PROVIDES_TOOLCHAIN_EXTERNAL='toolchain-external-custom' BR2_TOOLCHAIN_EXTERNAL_PREFIX='$(ARCH)-none-linux-gnueabihf' BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_ARCH_SUPPORTS=y BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX='$(ARCH)-none-linux-gnueabihf' BR2_TOOLCHAIN_EXTERNAL_GCC_9=y BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_20=y BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y BR2_TOOLCHAIN_EXTERNAL_HAS_SSP=y BR2_TOOLCHAIN_EXTERNAL_HAS_SSP_STRONG=y BR2_TOOLCHAIN_EXTERNAL_INET_RPC=y BR2_TOOLCHAIN_EXTERNAL_CXX=y BR2_PACKAGE_HOST_GDB_ARCH_SUPPORTS=y BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS=y BR2_TOOLCHAIN_SUPPORTS_VARIADIC_MI_THUNK=y BR2_TOOLCHAIN_HAS_NATIVE_RPC=y BR2_USE_WCHAR=y BR2_ENABLE_LOCALE=y BR2_INSTALL_LIBSTDCPP=y BR2_TOOLCHAIN_HAS_THREADS=y BR2_TOOLCHAIN_HAS_THREADS_DEBUG=y BR2_TOOLCHAIN_HAS_THREADS_NPTL=y BR2_TOOLCHAIN_HAS_SSP=y BR2_TOOLCHAIN_HAS_SSP_STRONG=y BR2_TOOLCHAIN_HAS_UCONTEXT=y BR2_TOOLCHAIN_SUPPORTS_PIE=y BR2_TOOLCHAIN_EXTRA_LIBS='' BR2_TOOLCHAIN_HAS_FULL_GETTEXT=y BR2_USE_MMU=y BR2_TARGET_OPTIMIZATION='' BR2_TARGET_LDFLAGS='' BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_0=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_2=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_3=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_4=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_5=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_6=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_7=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_8=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_9=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_10=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_11=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_12=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_13=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_14=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_15=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_16=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_18=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_19=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_0=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_1=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_2=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_3=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_4=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_5=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_6=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_7=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_8=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_9=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_10=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_11=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_12=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_13=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_14=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_15=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_16=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_17=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_18=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_19=y BR2_TOOLCHAIN_HEADERS_AT_LEAST_4_20=y BR2_TOOLCHAIN_HEADERS_AT_LEAST='4.20' BR2_TOOLCHAIN_GCC_AT_LEAST_4_3=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_4=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_5=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_6=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_7=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_8=y BR2_TOOLCHAIN_GCC_AT_LEAST_4_9=y BR2_TOOLCHAIN_GCC_AT_LEAST_5=y BR2_TOOLCHAIN_GCC_AT_LEAST_6=y BR2_TOOLCHAIN_GCC_AT_LEAST_7=y BR2_TOOLCHAIN_GCC_AT_LEAST_8=y BR2_TOOLCHAIN_GCC_AT_LEAST_9=y BR2_TOOLCHAIN_GCC_AT_LEAST='9' BR2_TOOLCHAIN_HAS_MNAN_OPTION=y BR2_TOOLCHAIN_HAS_SYNC_1=y BR2_TOOLCHAIN_HAS_SYNC_2=y BR2_TOOLCHAIN_HAS_SYNC_4=y BR2_TOOLCHAIN_ARM_HAS_SYNC_8=y BR2_TOOLCHAIN_HAS_SYNC_8=y BR2_TOOLCHAIN_HAS_LIBATOMIC=y BR2_TOOLCHAIN_HAS_ATOMIC=y BR2_ROOTFS_SKELETON_DEFAULT=y BR2_TARGET_GENERIC_HOSTNAME='buildroot' BR2_TARGET_GENERIC_ISSUE='Welcome to Buildroot' BR2_TARGET_GENERIC_PASSWD_SHA256=y BR2_TARGET_GENERIC_PASSWD_METHOD='sha-256' BR2_INIT_BUSYBOX=y BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y BR2_ROOTFS_DEVICE_TABLE='system/device_table.txt' BR2_TARGET_ENABLE_ROOT_LOGIN=y BR2_TARGET_GENERIC_ROOT_PASSWD='root' BR2_SYSTEM_BIN_SH_BUSYBOX=y BR2_TARGET_GENERIC_GETTY=y BR2_TARGET_GENERIC_GETTY_PORT='ttySTM0' BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y BR2_TARGET_GENERIC_GETTY_BAUDRATE='115200' BR2_TARGET_GENERIC_GETTY_TERM='vt100' BR2_TARGET_GENERIC_GETTY_OPTIONS='' BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW=y BR2_SYSTEM_DHCP='' BR2_SYSTEM_DEFAULT_PATH='/bin:/sbin:/usr/bin:/usr/sbin' BR2_ENABLE_LOCALE_PURGE=y BR2_ENABLE_LOCALE_WHITELIST='C en_US' BR2_GENERATE_LOCALE='' BR2_ROOTFS_USERS_TABLES='' BR2_ROOTFS_OVERLAY='' BR2_ROOTFS_POST_BUILD_SCRIPT='' BR2_ROOTFS_POST_FAKEROOT_SCRIPT='' BR2_ROOTFS_POST_IMAGE_SCRIPT='' BR2_PACKAGE_BUSYBOX=y BR2_PACKAGE_BUSYBOX_CONFIG='package/busybox/busybox.config' BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES='' BR2_PACKAGE_SKELETON=y BR2_PACKAGE_HAS_SKELETON=y BR2_PACKAGE_PROVIDES_SKELETON='skeleton-init-sysv' BR2_PACKAGE_SKELETON_INIT_COMMON=y BR2_PACKAGE_SKELETON_INIT_SYSV=y BR2_PACKAGE_FFMPEG_ARCH_SUPPORTS=y BR2_PACKAGE_KODI_ARCH_SUPPORTS=y BR2_PACKAGE_PULSEAUDIO_HAS_ATOMIC=y BR2_PACKAGE_GDB_ARCH_SUPPORTS=y BR2_PACKAGE_GOOGLE_BREAKPAD_ARCH_SUPPORTS=y BR2_PACKAGE_KVM_UNIT_TESTS_ARCH_SUPPORTS=y BR2_PACKAGE_LTP_TESTSUITE_ARCH_SUPPORTS=y BR2_PACKAGE_LTRACE_ARCH_SUPPORTS=y BR2_PACKAGE_OPROFILE_ARCH_SUPPORTS=y BR2_PACKAGE_PLY_ARCH_SUPPORTS=y BR2_PACKAGE_PTM2HUMAN_ARCH_SUPPORTS=y BR2_PACKAGE_TCF_AGENT_ARCH='arm' BR2_PACKAGE_TCF_AGENT_ARCH_SUPPORTS=y BR2_PACKAGE_TRINITY_ARCH_SUPPORTS=y BR2_PACKAGE_VALGRIND_ARCH_SUPPORTS=y BR2_PACKAGE_CMAKE_ARCH_SUPPORTS=y BR2_PACKAGE_PROVIDES_HOST_GETTEXT='host-gettext-tiny' BR2_PACKAGE_DEJAVU=y BR2_PACKAGE_DEJAVU_MONO=y BR2_PACKAGE_DEJAVU_SANS=y BR2_PACKAGE_DEJAVU_SERIF=y BR2_PACKAGE_DEJAVU_SANS_CONDENSED=y BR2_PACKAGE_DEJAVU_SERIF_CONDENSED=y BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y BR2_PACKAGE_QT5_JSCORE_AVAILABLE=y BR2_PACKAGE_CPUBURN_ARM_ARCH_SUPPORTS=y BR2_PACKAGE_EVTEST=y BR2_PACKAGE_FLASHROM_ARCH_SUPPORTS=y BR2_PACKAGE_SEDUTIL_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_ERLANG_ARCH_SUPPORTS=y BR2_PACKAGE_ERLANG_ARCH_SUPPORTS=y BR2_PACKAGE_GAUCHE_ARCH_SUPPORTS=y BR2_PACKAGE_PROVIDES_HOST_LUAINTERPRETER='host-lua' BR2_PACKAGE_LUAJIT_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_MONO_ARCH_SUPPORTS=y BR2_PACKAGE_MONO_ARCH_SUPPORTS=y BR2_PACKAGE_NODEJS_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS=y BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS=y BR2_PACKAGE_FDK_AAC_ARCH_SUPPORTS=y BR2_PACKAGE_OPENAL_ARCH_SUPPORTS=y BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING_ARCH_SUPPORTS=y BR2_PACKAGE_ZLIB_NG_ARCH_SUPPORTS=y BR2_PACKAGE_ZLIB=y BR2_PACKAGE_LIBZLIB=y BR2_PACKAGE_HAS_ZLIB=y BR2_PACKAGE_PROVIDES_ZLIB='libzlib' BR2_PACKAGE_PROVIDES_HOST_ZLIB='host-libzlib' BR2_PACKAGE_BOTAN_ARCH_SUPPORTS=y BR2_PACKAGE_LIBGPG_ERROR_ARCH_SUPPORTS=y BR2_PACKAGE_LIBGPG_ERROR_SYSCFG='arm-unknown-linux-gnueabi' BR2_PACKAGE_LIBOPENSSL_ARCH_SUPPORTS=y BR2_PACKAGE_OPENSSL=y BR2_PACKAGE_LIBOPENSSL=y BR2_PACKAGE_LIBOPENSSL_TARGET_ARCH='linux-armv4' BR2_PACKAGE_HAS_OPENSSL=y BR2_PACKAGE_PROVIDES_OPENSSL='libopenssl' BR2_PACKAGE_PROVIDES_HOST_OPENSSL='host-libopenssl' BR2_PACKAGE_MONGODB_ARCH_SUPPORTS=y BR2_PACKAGE_FONTCONFIG=y BR2_PACKAGE_FREETYPE=y BR2_PACKAGE_JPEG_SIMD_SUPPORT=y BR2_PACKAGE_LIBDRM=y BR2_PACKAGE_LIBDRM_HAS_ATOMIC=y BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y BR2_PACKAGE_WEBKITGTK_ARCH_SUPPORTS=y BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y BR2_PACKAGE_GNU_EFI_ARCH_SUPPORTS=y BR2_PACKAGE_MRAA_ARCH_SUPPORTS=y BR2_PACKAGE_NE10_ARCH_SUPPORTS=y BR2_PACKAGE_SPIDERMONKEY_ARCH_SUPPORTS=y BR2_PACKAGE_SPIDERMONKEY_JIT_ARCH_SUPPORTS=y BR2_PACKAGE_EXPAT=yBR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y BR2_PACKAGE_LIBOPENH264_ARCH_SUPPORTS=y BR2_PACKAGE_CANFESTIVAL_ARCH_SUPPORTS=yBR2_PACKAGE_GOBJECT_INTROSPECTION_ARCH_SUPPORTS=yBR2_PACKAGE_JEMALLOC_ARCH_SUPPORTS=y BR2_PACKAGE_LIBABSEIL_CPP_ARCH_SUPPORTS=yBR2_PACKAGE_LIBATOMIC_OPS_ARCH_SUPPORTS=yBR2_PACKAGE_LIBBSD_ARCH_SUPPORTS=y BR2_PACKAGE_LIBNSPR_ARCH_SUPPORT=y BR2_PACKAGE_LIBPTHREAD_STUBS=yBR2_PACKAGE_LIBSECCOMP_ARCH_SUPPORTS=yBR2_PACKAGE_LIBSIGSEGV_ARCH_SUPPORTS=yBR2_PACKAGE_LIBUNWIND_ARCH_SUPPORTS=yBR2_PACKAGE_LIBURCU_ARCH_SUPPORTS=y BR2_PACKAGE_LLVM_ARCH_SUPPORTS=y BR2_PACKAGE_LLVM_TARGET_ARCH='ARM' BR2_PACKAGE_OPENBLAS_DEFAULT_TARGET='ARMV7' BR2_PACKAGE_OPENBLAS_ARCH_SUPPORTS=y BR2_PACKAGE_POCO_ARCH_SUPPORTS=yBR2_PACKAGE_PROTOBUF_ARCH_SUPPORTS=yBR2_PACKAGE_PCRE2=y BR2_PACKAGE_PCRE2_16=yBR2_PACKAGE_PCRE2_JIT_ARCH_SUPPORTS=yBR2_PACKAGE_BITCOIN_ARCH_SUPPORTS=yBR2_PACKAGE_QEMU_ARCH_SUPPORTS_TARGET=y BR2_PACKAGE_HAPROXY_ARCH_SUPPORTS=y BR2_PACKAGE_IFUPDOWN_SCRIPTS=yBR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y BR2_PACKAGE_OPENSSH=y BR2_PACKAGE_OPENSSH_CLIENT=y BR2_PACKAGE_OPENSSH_SERVER=y BR2_PACKAGE_OPENSSH_KEY_UTILS=yBR2_PACKAGE_VSFTPD=y BR2_PACKAGE_XENOMAI_COBALT_ARCH_SUPPORTS=y BR2_PACKAGE_URANDOM_SCRIPTS=yBR2_PACKAGE_AUDIT_ARCH_SUPPORTS=yBR2_PACKAGE_EFIVAR_ARCH_SUPPORTS=y BR2_PACKAGE_INITSCRIPTS=yBR2_PACKAGE_KMOD=y BR2_PACKAGE_MAKEDUMPFILE_ARCH_SUPPORTS=y BR2_PACKAGE_SYSTEMD_ARCH_SUPPORTS=y BR2_PACKAGE_SYSTEMD_BOOTCHART_ARCH_SUPPORTS=y BR2_PACKAGE_UTIL_LINUX=yBR2_PACKAGE_UTIL_LINUX_LIBUUID=y BR2_PACKAGE_XVISOR_ARCH_SUPPORTS=yBR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_GEN=4 BR2_TARGET_ROOTFS_EXT2_REV=1 BR2_TARGET_ROOTFS_EXT2_LABEL='rootfs' BR2_TARGET_ROOTFS_EXT2_SIZE='1G' BR2_TARGET_ROOTFS_EXT2_INODES=0 BR2_TARGET_ROOTFS_EXT2_RESBLKS=5 BR2_TARGET_ROOTFS_EXT2_MKFS_OPTIONS='-O ^64bit' BR2_TARGET_ROOTFS_EXT2_NONE=yBR2_TARGET_ROOTFS_TAR=y BR2_TARGET_ROOTFS_TAR_NONE=yBR2_TARGET_ROOTFS_TAR_OPTIONS='' BR2_TARGET_GRUB2_ARCH_SUPPORTS=yBR2_PACKAGE_HOST_E2FSPROGS=yBR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_GO_TARGET_CGO_LINKING_SUPPORTS=y BR2_PACKAGE_HOST_GO_HOST_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_GO_BOOTSTRAP_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_GOOGLE_BREAKPAD_ARCH_SUPPORTS=yBR2_PACKAGE_HOST_MKPASSWD=y BR2_PACKAGE_HOST_PATCHELF=y BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_QEMU_SYSTEM_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS=yBR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS=y BR2_PACKAGE_HOST_RUSTC_ARCH='armv7' BR2_PACKAGE_HOST_RUSTC_ABI='eabihf'BR2_PACKAGE_PROVIDES_HOST_RUSTC='host-rust-bin'BR2_PACKAGE_HOST_TI_CGT_PRU_ARCH_SUPPORTS=yBR2_PACKAGE_HOST_UTIL_LINUX=y BR2_PACKAGE_REFPOLICY_POLICY_VERSION=''BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS=''BR2_XTENSA_OVERLAY_DIR='' BR2_XTENSA_CUSTOM_NAME=''BR2_TARGET_ROOTFS_EXT2_BLOCKS=0 BR2_TARGET_ROOTFS_EXT2_EXTRA_INODES=0BR2_TARGET_ROOTFS_EXT2_EXTRA_BLOCKS=0BR2_TARGET_UBOOT_CUSTOM_PATCH_DIR=''







- STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植
- STM32MP157开发板调试笔记
- stm32mp157教程案例 STM32MP157移植LVGL
- 基于STM32MP157的Linux操作系统移植—系统镜像烧写
- 基于STM32MP157的Linux操作系统移植 —Trusted Firmware-A移植
- ALINX技术教程:Zynq UltraScale+ MPSoC平台PYNQ 3.1.2系统移植指南
- 【教程】STM32H743驱动RGB屏幕并移植LVGL v8.0
- 移植FreeRTOS到STM32(嵌入式入门)
- 【STM32 HAL库】HAL库的移植及工程模板的建立
- STM32移植U8g2图形库——玩转OLED显示
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




