STM32MP157移植Qt5.12.10

作者:zzssdd2
E-mail:zzssdd2@foxmail.com

一 说明

二 屏幕驱动

屏幕是800x480的RGB-LCD,与开发板的硬件接口与ST官方开发板STM32MP157-EVAL的RGB-LTDC接口引脚一致。

首先修改设备树文件arch/arm/boot/dts/stm32mp157d-custom.dts

  • 根节点添加panel_backlightpanel_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 = <&ltdc_ep0_out>;
                };
            };
    	};
        ......
    };
    
  • &ltdc节点追加内容如下:

    &ltdc {
    	pinctrl-names = "default", "sleep";
    	pinctrl-0 = <&ltdc_pins_b>;
    	pinctrl-1 = <&ltdc_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 64bitqt-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=""
posted @ 2022-07-24 14:49  树·哥  阅读(988)  评论(1编辑  收藏  举报