Buildroot 开发
轉載:https://wiki.t-firefly.com/AIO-3288C/buildroot_develop.html
學習連接: 制作根文件系統
Buildroot 開發?
Buildroot 是 Linux 平臺上一個構建嵌入式 Linux 系統的框架。整個 Buildroot 是由 Makefile(*.mk) 腳本和 Kconfig(Config.in) 配置文件構成的。你可以和編譯 Linux 內核一樣,通過 buildroot 配置,menuconfig 修改,編譯出一個完整的可以直接燒寫到機器上運行的 Linux 系統軟件(包含 boot、kernel、rootfs 以及 rootfs 中的各種庫和應用程序)。
Buildroot 官網
Buildroot 開發手冊
目錄結構?
buildroot/ ├── arch # CPU 架構的構建、配置文件 ├── board # 具體單板相關的文件 ├── boot # Bootloaders 的構建、配置文件 ├── build ├── CHANGES # Buildroot 修改日志 ├── Config.in ├── Config.in.legacy ├── configs # 具體單板的 Buildroot 配置文件 ├── COPYING ├── DEVELOPERS ├── dl # 下載的程序、源碼壓縮包、補丁等 ├── docs # 文檔 ├── fs # 各種文件系統的構建、配置文件 ├── linux # Linux 的構建、配置文件 ├── Makefile ├── Makefile.legacy ├── output # 編譯輸出目錄 ├── package # 所有軟件包的構建、配置文件 ├── README # Buildroot 簡單說明 ├── support # 為 Bulidroot 提供功能支持的腳本、配置文件 ├── system # 制作根文件系統的構建、配置文件 ├── toolchain # 交叉編譯工具鏈的構建、配置文件 └── utils # 實用工具配置?
選擇默認配置文件:
# 進入 SDK 根目錄 cd path/to/SDK/ # 選擇配置文件 # `configs/rockchip_rk3288_defconfig` source envsetup.sh rockchip_rk3288執行完成后會生成編譯輸出目錄,output/rockchip_rk3288,后續也可以在該目錄下執行 make 相關操作。
軟件包配置?
打開配置界面:
make menuconfig我們可以在配置界面添加或裁剪一些工具,按需求定制系統功能。以添加 qt53d 為例:
輸入 / 進入搜索界面,輸入要查找的內容 qt53d,按回車進行搜索:
選擇 1 跳轉到對應頁面,按空格選中配置:
配置完成后,移動到 Save 按回車保存到 .config;移動到 Exit 按回車退出。
保存配置文件:
make savedefconfig將修改保存到配置文件 configs/rockchip_rk3288_defconfig。
Busybox 配置?
打開配置界面,進行配置:
make busybox-menuconfig配置完成后,移動到 Exit 按回車退出,在彈窗頁面選擇 Yes 保存到 .config。
保存配置文件:
make busybox-update-config將修改保存到配置文件 board/rockchip/common/base/busybox.config。
編譯?
配置好 Buildroot 后,直接運行 make 進行編譯。
編譯說明?
運行 make 進行編譯時,會執行以下過程:
下載源碼;
配置、編譯、安裝交叉編譯工具鏈;
配置、編譯、安裝選擇的軟件包;
按選擇的格式生成根文件系統;
關于 make 的更多用法,可通過 make help 獲得。
編譯軟件包?
我們可以執行 make <package> 單獨編譯某個軟件包。軟件包的編譯主要包括下載,解壓,打補丁,配置,編譯,安裝等過程,具體可以查看 package/pkg-generic.mk。
下載
Buildroot 會根據配置 package/<package>/<package>.mk,自動從網絡獲取對應的軟件包,包括一些第三方庫,插件,實用工具等,放在 dl/ 目錄。
解壓
軟件包會解壓在 output/rockchip_rk3288/build/<package>-<version> 目錄下。
打補丁
補丁集中放在 package/<packgae>/ 目錄,Buildroot 會在解壓軟件包后為其打上相應的補丁。如果要修改源碼,可以通過打補丁的方式進行修改。
配置
編譯
安裝
編譯完成后,會將需要的編譯生成文件拷貝到 output/rockchip_rk3288/target/ 目錄。
對于某個軟件包,我們可以通過 make <package>-<target> 調用軟件包構建中的某一步驟,如下:
Package-specific:<pkg> - Build and install <pkg> and all its dependencies<pkg>-source - Only download the source files for <pkg><pkg>-extract - Extract <pkg> sources<pkg>-patch - Apply patches to <pkg><pkg>-depends - Build <pkg>'s dependencies <pkg>-configure - Build <pkg> up to the configure step <pkg>-build - Build <pkg> up to the build step <pkg>-graph-depends - Generate a graph of <pkg>'s dependencies<pkg>-dirclean - Remove <pkg> build directory<pkg>-reconfigure - Restart the build from the configure step<pkg>-rebuild - Restart the build from the build step編譯輸出目錄?
編譯完成后,在編譯輸出目錄 output/rockchip_rk3288 會生成子目錄,說明如下:
build/ 包含所有的源文件,包括 Buildroot 所需主機工具和選擇的軟件包,這個目錄包含所有軟件包源碼。
host/ 主機端編譯需要的工具,包括交叉編譯工具。
images/ 包含壓縮好的根文件系統鏡像文件。
staging/ 這個目錄類似根文件系統的目錄結構,包含編譯生成的所有頭文件和庫,以及其他開發文件,不過他們沒有裁剪,比較龐大,不適用于目標文件系統。
target/ 包含完整的根文件系統,對比 staging/,它沒有開發文件,不包含頭文件,二進制文件也經過 strip 處理。
交叉編譯工具?
Buildroot 編譯完成后,會在 output/rockchip_rk3288/host/ 目錄下,生成交叉編譯工具,我們可以用來編譯目標程序。
交叉編譯工具目錄
output/rockchip_rk3288/host/bin/
編譯示例 hello.c
int main(int argc, char *argv[])
{
printf(“Hello World!\n”);
return 0;
}
編譯
運行
將可執行程序 hello 拷貝到設備,運行 ./hello,則會看到打印信息 Hello World!。
重建?
對于重建的具體說明,可以查看文檔 buildroot/docs/manual/rebuilding-packages.txt。
重建軟件包?
在開發過程中,若修改了某個軟件包的源碼,Buildroot 是不會重新編譯該軟件包的。可以按如下方式操作:
方式一
方式二
完全重建?
當通過 make menuconfig,make xconfig 或其他配置工具之一更改系統配置時,Buildroot 不會嘗試檢測應重建系統的哪些部分。在某些情況下,Buildroot 應該重建整個系統,在某些情況下,僅應重建軟件包的特定子集。但是以完全可靠的方式檢測到這一點非常困難,因此 Buildroot 開發人員已決定不嘗試這樣做。
何時需要完全重建?
更改目標體系結構配置時,需要完全重建;
更改工具鏈配置時,需要完全重建;
將其他軟件包添加到配置中時,不一定需要完全重建;
從配置中刪除軟件包時,Buildroot 不會執行任何特殊操作。它不會從目標根文件系統或工具鏈中刪除此軟件包安裝的文件。需要完全重建才能刪除這些文件;
更改軟件包的子選項時,不會自動重建軟件包;
對根文件系統框架進行更改時,需要完全重建;
一般而言,當你遇到構建錯誤并且不確定所做的配置更改可能帶來的后果時,請進行完全重建。具體說明可以查看文檔 rebuilding-packages.txt。
如何完全重建?
方式一
直接刪除編譯輸出目錄,之后重新進行配置、編譯。
rm -rf output/方式二
執行如下命令,會刪除編譯輸出并重新編譯。
make clean all新增本地源碼包?
開發過程中,Buildroot 自帶的軟件包有時可能無法滿足我們的需求,為此我們需要添加自定義的軟件包。Buildroot 支持多種格式的軟件包,包括 generic-package、cmake-package、autotools-package 等,我們以 generic-package 舉例說明。
創建工程目錄
新建 Config.in
在 firefly_demo/ 下添加 Config.in:
config BR2_PACKAGE_FIREFLY_DEMObool "Simple Firefly Demo"新建 firefly_demo.mk
在 firefly_demo/ 下添加 firefly_demo.mk:
################################################## ########### # ### firefly_demo # ################################################## ########### ifeq ($(BR2_PACKAGE_FIREFLY_DEMO), y) FIREFLY_DEMO_VERSION:<span class="o">=</span><span class="m">1</span>.0.0<span class="nv">FIREFLY_DEMO_SITE</span><span class="o">=</span><span class="k">$(</span>TOPDIR<span class="k">)</span>/../external/firefly_demo/src<span class="nv">FIREFLY_DEMO_SITE_METHOD</span><span class="o">=</span><span class="nb">local</span>define FIREFLY_DEMO_BUILD_CMDS
(</span>TARGETMAKEENV<spanclass="k">)</span><spanclass="k">(</span>TARGET_MAKE_ENV<span class="k">)</span> <span class="k">(</span>TARGETM?AKEE?NV<spanclass="k">)</span><spanclass="k">(MAKE) CC=(</span>TARGETCC<spanclass="k">)</span><spanclass="nv">CXX</span><spanclass="o">=</span><spanclass="k">(</span>TARGET_CC<span class="k">)</span> <span class="nv">CXX</span><span class="o">=</span><span class="k">(</span>TARGETC?C<spanclass="k">)</span><spanclass="nv">CXX</span><spanclass="o">=</span><spanclass="k">(TARGET_CXX) -C $(@D)
endef
define FIREFLY_DEMO_CLEAN_CMDS
(</span>TARGETMAKEENV<spanclass="k">)</span><spanclass="k">(</span>TARGET_MAKE_ENV<span class="k">)</span> <span class="k">(</span>TARGETM?AKEE?NV<spanclass="k">)</span><spanclass="k">(MAKE) -C $(@D) clean
endef
define FIREFLY_DEMO_INSTALL_TARGET_CMDS
(</span>TARGETMAKEENV<spanclass="k">)</span><spanclass="k">(</span>TARGET_MAKE_ENV<span class="k">)</span> <span class="k">(</span>TARGETM?AKEE?NV<spanclass="k">)</span><spanclass="k">(MAKE) -C $(@D) install
endef
define FIREFLY_DEMO_UNINSTALL_TARGET_CMDS
(</span>TARGETMAKEENV<spanclass="k">)</span><spanclass="k">(</span>TARGET_MAKE_ENV<span class="k">)</span> <span class="k">(</span>TARGETM?AKEE?NV<spanclass="k">)</span><spanclass="k">(MAKE) -C $(@D) uninstall
endef
(</span><spanclass="nv">eval</span><spanclass="k">(</span><span class="nv">eval</span> <span class="k">(</span><spanclass="nv">eval</span><spanclass="k">(generic-package))
endif
創建源碼目錄
上文的 Makefile 文件里已經指定了源碼目錄 external/firefly_demo/src。
cd path/to/SDK/ mkdir external/firefly_demo/src編寫源碼 firefly_demo.c
在 firefly_demo/src/ 下添加 firefly_demo.c:
#include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[])
{
printf(“Hello World!\n”);
return 0;
}
編寫 Makefile
在 firefly_demo/src/ 下添加 Makefile:
DEPS = OBJ = firefly_demo.o CFLAGS = %.o: %.c $(DEPS)$(CC) -c -o $@ $< $(CFLAGS)firefly_demo: (</span><spanclass="nv">OBJ</span><spanclass="k">)</span><spanclass="k">(</span><span class="nv">OBJ</span><span class="k">)</span> <span class="k">(</span><spanclass="nv">OBJ</span><spanclass="k">)</span><spanclass="k">(CXX) -o $@ <spanclass="k">^ <span class="k"><spanclass="k">(CFLAGS)
.PHONY: clean
clean:
rm -f *.o *~ firefly_demo
.PHONY: install
install:
cp -f firefly_demo $(TARGET_DIR)/usr/bin/
.PHONY: uninstall
uninstall:
rm -f $(TARGET_DIR)/usr/bin/firefly_demo
修改上一級 Config.in
在 buildroot/package/rockchip/Config.in 末尾添加一行:
source "package/rockchip/firefly_demo/Config.in"配置軟件包
打開配置菜單 make menuconfig,找到 firefly_demo 并選中配置。
編譯
rootfs-overlay?
rootfs-overly 是一個相當不錯的功能,它能夠在目標文件系統編譯完成后將指定文件覆蓋到某個目錄。通過這種方式,我們可以方便地添加或修改一些文件到根文件系統。
假設我們要在根文件系統的 /etc/ 目錄下添加文件 overlay-test,可以按如下步驟操作:
設置 rootfs-overlay 根目錄
打開配置菜單 make menuconfig,通過設置 BR2_ROOTFS_OVERLAY 選項,添加用于覆蓋的根目錄。對于 rk3288,默認已添加了目錄 board/rockchip/rk3288/fs-overlay/。
添加文件到覆蓋目錄
編譯
下載根文件系統
將編譯好的根文件系統 output/rockchip_rk3288/images/rootfs.ext2 下載到設備。啟動設備,可以看到已添加文件 /etc/overlay-test。
也可以通過查看 target/ 目錄,驗證是否添加成功:
ls buildroot/output/rockchip_rk3288/target/etc/overlay-test交叉編譯 Qt-5.12.2?
交叉編譯工具鏈?
Firefly 提取了 Buildroot 的交叉編譯工具鏈,用戶可以直接使用該工具鏈開發 Buildroot 上的 Qt 應用程序,而無需下載編譯 SDK 代碼。
工具鏈支持 EGLFS、LinuxFB、Wayland 等插件。
使用環境:
主機:x86-64 / Ubuntu 16.04/18.04 設備: Firefly RK3399 RK3288 PX30 .. / Buildroot下載?
對于 32位芯片,如 rk3288,下載 firefly-qt-5.12.2-arm.tar.gz;對于其它 64位芯片,如 rk3399,下載 firefly-qt-5.12.2-aarch64.tar.gz。
下載鏈接(提取碼:6dg7)
下文將以 firefly-qt-5.12.2-aarch64.tar.gz 為例進行說明。
目錄結構?
解壓下載好的壓縮包:
tar -zxvf firefly-qt-5.12.2-aarch64.tar.gz目錄結構:
firefly-qt-5.12.2-aarch64/ ├── aarch64.tar.gz # 用于 Qt 程序運行的庫文件、插件等 ├── demo │?? └── mainwindow # demo 程序 ├── firefly-qt-5.12.2-aarch64 # 交叉編譯工具鏈 └── ReadMe # 使用說明配置交叉編譯環境?
將工具鏈拷貝到主機的指定目錄:
cd firefly-qt-5.12.2-aarch64/ # 該目錄 `/opt/` 不可修改 cp -rdf firefly-qt-5.12.2-aarch64 /opt/若拷貝失敗,先修改下目錄權限,再執行上述操作:
sudo chmod 777 /opt/交叉編譯?
以 demo 程序為例,運行如下命令:
cd demo/mainwindow/ /opt/firefly-qt-5.12.2-aarch64/host/bin/qmake make編譯完成后,會生成可執行程序 demo/mainwindow/mainwindow。
配置運行環境?
使用 U盤將 aarch64.tar 拷貝到設備上:
cp /media/usb0/aarch64.tar /userdata/解壓:
cd /userdata/ tar -xvf aarch64.tar將文件拷貝到對應目錄:
cd aarch64/ cp -rdf usr/lib/* /usr/lib/ cp -rdf usr/qml/* /usr/qml/ cp usr/bin/gdbserver /usr/bin/運行程序?
將編譯好的可執行程序 mainwindow 拷貝到設備上。
默認板子運行了 Wayland 桌面環境,按如下方式運行:
# 設置環境變量 export XDG_RUNTIME_DIR=/tmp/.xdg # 運行 ./mainwindow -platform wayland使用 eglfs 插件運行:
# 退出 Wayland 桌面環境 /etc/init.d/S50launcher stop # 運行 ./mainwindow -platform eglfsQt Creator?
下面介紹 Qt Creator 的使用說明,在操作前,請先按前面的步驟配置好交叉編譯環境和運行環境。
安裝?
進入 Qt 官方下載頁面,下載 qt-opensource-linux-x64-5.12.2.run,下載完成之后,運行安裝。
配置?
安裝完成后,啟動 Qt Creator,打開菜單 Tools -> Options,找到 Kits。
配置 Qt Versions
qmake:/opt/firefly-qt-5.12.2-aarch64/host/bin/qmake
配置 Compilers
g++:/opt/firefly-qt-5.12.2-aarch64/host/bin/aarch64-buildroot-linux-gnu-g++
gcc:/opt/firefly-qt-5.12.2-aarch64/host/bin/aarch64-buildroot-linux-gnu-gcc
為方便調試,配置 Debuggers 和 Devices 用于在線調試:
配置 Debuggers
gdb:/opt/firefly-qt-5.12.2-aarch64/host/bin/aarch64-buildroot-linux-gnu-gdb
配置 Devices
設置好設備的 IP、用戶名(root)和密碼(rockchip)。為了方便調試,可以在設備上設置靜態 IP。
配置 Kits
將前面設置的配置項添加到 Kits。
編譯運行?
打開 demo 程序,Welcome -> Open Project,選擇要使用的 Kits:
之后打開 Projects -> Run,配置命令行參數,這里設置為 -platform wayland:
配置環境變量,即 export XDG_RUNTIME_DIR=/tmp/.xdg:
編譯運行:
點擊 Build 交叉編譯 Qt 程序;點擊 Run 或 Debug 在設備上運行或調試程序。要重新運行程序時,記得手動點擊 Stop 關閉已經運行的程序。
編譯生成目錄在 demo/build-mainwindow-qt_5_12_2_aarch64-Debug。
桌面應用?
官方發布的 Buildroot 固件,默認已支持 Wayland 桌面環境以及一些 Qt 應用,如下圖:
這些 Qt 應用提供了一些基礎功能,如,攝像頭預覽,文件管理器,多媒體播放器,WiFi 連接等。
用戶和密碼?
用戶:root
密碼:rockchip
WiFi 連接?
# wifi_start.sh wifi-ssid password wifi_start.sh wifi-test 12345678音/視頻播放?
# 播放 wav aplay test.wav gstwavplay.sh test.wav# 播放 mp3
mp3play.sh test.mp3
gstmp3play.sh test.mp3
# 播放 mp4
gstmp4play.sh test.mp4
gstvideoplay.sh test.mp4
SSH?
Buildroot 默認已支持 SSH 服務。
ssh 登錄設備
讓設備處于聯網狀態,在 PC 端執行登錄命令:
# 用戶:root;密碼:rockchip # IP:192.168.27.129 ~$ ssh root@192.168.27.129 The authenticity of host '192.168.27.129 (192.168.27.129)' can't be established. ECDSA key fingerprint is SHA256:+NwFawDiU0EwLHRFrIA/7snmlMc9ZfN6Nxa5vUSC7Pg. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.27.129' (ECDSA) to the list of known hosts. root@192.168.27.129's password: [root@rk3288:~]#scp
在 PC 端執行命令,拷貝文件到設備:
~$ scp ./file root@192.168.27.129:/ root@192.168.27.129's password: file 100% 154 0.2KB/s 00:00MIPI 攝像頭(OV13850)?
查看 ISP 驅動是否加載成功,成功可以看到如下設備信息:
root@firefly:~# grep '' /sys/class/video4linux/video*/name /sys/class/video4linux/video0/name:rkisp1_mainpath /sys/class/video4linux/video1/name:rkisp1_selfpath /sys/class/video4linux/video2/name:rkisp1_dmapath /sys/class/video4linux/video3/name:rkisp1-statistics /sys/class/video4linux/video4/name:rkisp1-input-paramsroot@firefly:~# ls /dev/video*
video0 video1 video2 video3 video4
查看 OV13850 設備是否注冊成功,成功可以看到如下打印:
root@firefly:~# dmesg |grep 13850 [ 3.911130] ov13850 3-0010: driver version: 00.01.03 [ 3.911168] ov13850 3-0010: GPIO lookup for consumer reset [ 3.911171] ov13850 3-0010: using device tree for GPIO lookup [ 3.911187] of_get_named_gpiod_flags: parsed 'reset-gpios' property of node '/i2c@ff150000/ov13850@10[0]' - status (0) [ 3.911370] ov13850 3-0010: could not get default pinstate [ 3.911373] ov13850 3-0010: could not get sleep pinstate [ 3.911376] ov13850 3-0010: GPIO lookup for consumer pwdn [ 3.911379] ov13850 3-0010: using device tree for GPIO lookup [ 3.911403] of_get_named_gpiod_flags: parsed 'pwdn-gpios' property of node '/i2c@ff150000/ov13850@10[0]' - status (0) # 成功獲取設備 ID [ 3.914401] ov13850 3-0010: Detected OV00d850 sensor, REVISION 0xb2預覽:
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480, framerate=30/1 ! videoconvert ! kmssink &# 或者
export XDG_RUNTIME_DIR=/tmp/.xdg
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480, framerate=30/1 ! videoconvert ! waylandsink &
外部存儲設備?
Buildroot 支持自動掛載外部存儲設備:
U 盤掛載路徑:/udisk
TF 卡掛載路徑:/sdcard
恢復出廠設置?
Buildroot 支持恢復出廠設置。直接運行 update 或者加上 factory/reset 參數均可進入 recovery 恢復出廠設置。
注意:此出廠設置表示恢復為設備最后一次升級固件之后的初始狀態。
update # 或者 update factory / update reset升級固件?
Buildroot 支持從外部存儲設備升級固件,以下是升級流程說明。
制作升級固件
按照正常的固件編譯流程,制作用于升級的固件。《編譯 Buildroot 固件》
升級固件不一定要全分區升級,可修改 package-file 文件,將不要升級的分區去掉,這樣可以減少升級包的大小。
例如,修改文件 tools/linux/Linux_Pack_Firmware/rockdev/rk3288-package-file,將 rootfs 的相對路徑改為 RESERVED,這樣就不會打包根文件系統,即不升級根文件系統分區。
# name relative path # #hwdef hwdef package-file package-file bootloader image/miniloaderall.bin parameter image/parameter.txt trust image/trust.img uboot image/uboot.img misc image/misc.img boot image/boot.img recovery image/recovery.img rootfs RESERVED oem image/oem.img userdata:grow image/userdata.img backup RESERVED將制作好的升級固件拷貝到 U 盤、TF 卡或者設備的 /userdata/ 目錄下,重命名為 update.img。
注意: 若將升級固件放至設備的 /userdata/ 目錄,則不要打包 userdata.img,將 image/userdata.img 改為 RESERVED。
升級
啟動設備,在命令行執行升級命令,update ota path/to/update.img,設備會進入 recovery 進行升級。
# U 盤 update ota /udisk/update.img # TF 卡 update ota /sdcard/update.img # /userdata/ update ota /userdata/udpate.img等待升級完成,升級成功后,設備會重新啟動進入系統。
FirmwareOta?
firmwareota 是一個 Qt 桌面應用,支持從網絡下載固件進行固件升級,下面是使用說明。
添加桌面應用?
下載
下載鏈接(提取碼:1234)
解壓
按照目錄結構,將文件拷貝到設備
重啟桌面
啟動
設置完成后,則可以在桌面啟動應用。
設置下載地址?
程序會通過默認的 Http 地址下載列表文件 ota_list,解析列表文件獲取固件下載鏈接。
列表文件格式,例:
firmware_name_1 http://192.168.2.11:8000/firmware_name_1 firmware_name_2 http://192.168.2.11:8000/firmware_name_2 ...我們可以通過添加 /userdata/list_url 文件,設置指定列表文件下載地址,例:
http://192.168.2.11:8000/ota_listWeston 配置?
我們可以通過配置 Weston 對顯示進行一些自定義設置,下文對部分設置進行說明。
狀態欄設置?
Weston 支持在 weston.ini 配置文件的 shell 段設置狀態欄的背景色、位置,以及在 launcher 段設置快捷啟動程序,如:
# /etc/xdg/weston/weston.ini[shell]
# 顏色格式為 ARGB8888
panel-color=0xff002244
# top|bottom|left|right|none
panel-position=bottom
[launcher]
icon=/usr/share/weston/terminal.png
path=/usr/bin/weston-terminal
[launcher]
# 圖標路徑
icon=/usr/share/weston/icon_flower.png
# 快捷啟動命令
path=/usr/bin/qsetting
背景設置?
Weston 支持在 weston.ini 配置文件的 shell 段設置背景圖案、顏色,如:
# /etc/xdg/weston/weston.ini[shell]
# 背景圖案(壁紙)絕對路徑
background-image=/usr/share/weston/background.png
# scale|scale-crop|tile
background-type=scale
# 顏色格式為 ARGB8888,未設置背景圖案時生效
background-color=0xff002244
待機及鎖屏配置?
Weston 的超時待機時長可以在啟動參數中配置,也可以在 weston.ini 的 core 段配置,如:
# /etc/init.d/S50launcherstart)...# 0 為禁止待機,單位為秒weston --tty=2 -B=drm-backend.so --idle-time=0&或者:
# /etc/xdg/weston/weston.ini[core]
# 設置 5 秒未操作后進入待機狀態
idle-time=5
顯示顏色格式配置?
Buildroot SDK 內 Weston 目前默認顯示格式為 ARGB8888,對于某些低性能平臺,可以在 weston.ini 的 core 段配置為 RGB565,如:
# /etc/xdg/weston/weston.ini[core]
# xrgb8888|rgb565|xrgb2101010
gbm-format=rgb565
也可以在 weston.ini 的 output 段單獨配置每個屏幕的顯示格式,如:
# /etc/xdg/weston/weston.ini[output]
# output 的 name 可以查看 /sys/class/drm/card0-name
name=LVDS-1
# xrgb8888|rgb565|xrgb2101010
gbm-format=rgb565
屏幕方向設置?
Weston 的屏幕顯示方向可以在 weston.ini 的 output 段配置,如:
# /etc/xdg/weston/weston.ini[output]
name=LVDS-1
# normal|90|180|270|flipped|flipped-90|flipped-180|flipped-270
transform=180
如果需要動態配置屏幕方向,可以通過動態配置文件,如:
echo "output:all:rotate90" > /tmp/.weston_drm.conf # 所有屏幕旋轉 90 度 echo "output:eDP-1:rotate180" > /tmp/.weston_drm.conf # eDP-1 旋轉 180 度分辨率及縮放配置?
Weston 的屏幕分辨率及縮放可以在 weston.ini 的 output 段配置,如:
# /etc/xdg/weston/weston.ini[output]
name=HDMI-A-1
# 需為屏幕支持的有效分辨率
mode=1920x1080
# 需為整數倍數
scale=2
如果需要動態配置分辨率及縮放,可以通過動態配置文件,如:
echo "output:HDMI-A-1:mode=800x600" > /tmp/.weston_drm.conf # 修改 HDMI-A-1 分辨率為800x600這種方式縮放時需要依賴 RGA 加速。
凍結屏幕?
在啟動 Weston 時,開機 logo 到 UI 顯示之間存在短暫切換黑屏。如需要防止黑屏,可以通過以下種動態配置文件方式短暫凍結 Weston 屏幕內容:
# /etc/init.d/S50launcherstart)...export WESTON_FREEZE_DISPLAY=/tmp/.weston_freeze # 設置特殊配置文件路徑touch /tmp/.weston_freeze # 凍結顯示weston --tty=2 -B=drm-backend.so --idle-time=0&...sleep 1 && rm /tmp/.weston_freeze& # 1 秒后解凍多屏配置?
Buildroot SDK 的 Weston 支持多屏同異顯及熱拔插等功能,不同顯示器屏幕的區分根據 drm 的 name (通過 /sys/class/drm/card0-name 獲取),相關配置通過環境變量設置,如:
# /etc/init.d/S50launcher start<span class="o">)</span>...<span class="nb">export</span> <span class="nv">WESTON_DRM_PRIMARY</span><span class="o">=</span>HDMI-A-1 <span class="c1"># 指定主顯為 HDMI-A-1</span><span class="nb">export</span> <span class="nv">WESTON_DRM_MIRROR</span><span class="o">=</span><span class="m">1</span> <span class="c1"># 使用鏡像模式(多屏同顯),不設置此環境變量即為異顯</span><span class="nb">export</span> <span class="nv">WESTON_DRM_KEEP_RATIO</span><span class="o">=</span><span class="m">1</span> <span class="c1"># 鏡像模式下縮放保持縱橫比,不設置此變量即為強制全屏</span><span class="nb">export</span> <span class="nv">WESTON_DRM_PREFER_EXTERNAL</span><span class="o">=</span><span class="m">1</span> <span class="c1"># 外置顯示器連接時自動關閉內置顯示器</span><span class="nb">export</span> <span class="nv">WESTON_DRM_PREFER_EXTERNAL_DUAL</span><span class="o">=</span><span class="m">1</span> <span class="c1"># 外置顯示器連接時默認以第一個外顯為主顯</span>weston --tty<span class="o">=</span><span class="m">2</span> -B<span class="o">=</span>drm-backend.so --idle-time<span class="o">=</span><span class="m">0</span><span class="p">&</span>鏡像模式縮放顯示內容時需要依賴 RGA 加速。
同時也支持在 weston.ini 的 output 段單獨禁用指定屏幕:
# /etc/xdg/weston/weston.ini[output]
name=LVDS-1
mode=off
# off|current|preferred|<WIDTHxHEIGHT@RATE>
輸入設備相關配置?
Weston 服務默認需要至少一個輸入設備,如無輸入設備,則需要在 weston.ini 中的 core 段特殊設置:
# /etc/xdg/weston/weston.ini[core]
require-input=false
總結
以上是生活随笔為你收集整理的Buildroot 开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习储备(12):二项分布的例子解析
- 下一篇: 星空主题设计理念_设计星空 | 刘红蕾: