作者:zzssdd2
E-mail:zzssdd2@foxmail.com
一 说明
- 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 <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>] set a plane
-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>] set a mode
-C test hw cursor
-v test vsynced page flipping
-r set the preferred mode for all connectors
-w <obj_id>:<prop_name>:<value> set property
-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 <future>... yes
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 <random>... yes
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 ........................ <none>
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=""