In eingebetteten Systemen kann der serielle Port zur Ausgabe von Protokollen zum System-Debugging und auch für die Kommunikation über kurze Distanzen mit niedriger Geschwindigkeit verwendet werden.
In diesem Artikel werden Funktionen vorgestellt , die auf dem Single-Board- Kernel basieren.RockPI 4A
Linux 4.4
RK3399 UART
1. Einführung in UART
UART(Universal Asynchronous Receiver/Transmitter)
: Universeller asynchroner Empfänger-Sender, geeignet für die serielle und Vollduplex-Datenübertragung über kurze Distanzen mit niedriger Geschwindigkeit.
In China bezieht sich der Begriff „serieller Anschluss“ im Allgemeinen auf den seriellen Kommunikationsanschluss. Es gibt 9 Pins mit Ebenen.PC
COM
RS-232
In eingebetteten Systemen bezieht sich der serielle Port im Allgemeinen auf Port. Im Allgemeinen werden 3 Pins und Ebenen verwendet.UART
TTL
TTL/RS-232/RS-485
Bezogen auf den Niveaustandard ist der Unterschied wie folgt:
Niveaustandard | logisch 0 | Logik 1 | Übertragungsmethode |
---|---|---|---|
TTL Ebene |
0 ~ 0.4V |
2.4 ~ 5V |
Vollduplex |
RS-232 Ebene |
3 ~ 15V |
-15 ~ -3V |
Vollduplex |
RS-485 Ebene |
-6 ~ -2V |
2 ~ 6V |
Halbduplex (differentielle Übertragung, größere Entfernung) |
Beim Debuggen der eingebetteten Einzelplatine können Sie das Modul auswählen, um die serielle Kommunikation mit der Einzelplatine zu implementieren, wie in der folgenden Abbildung dargestellt:USB转TTL
PC
RK3399 UART
Controller-Funktionen:
1. Unterstützt 5-Wege-serielle Schnittstelle.
2. Übertragungsmodus unterstützen oder unterbrechen.DMA
3. Unterstützt zwei 64-Byte-Senden und -Empfang .FIFO
4. Unterstützt 5/6/7/8 serielles Senden oder Empfangen von Daten.bit
5. Unterstützt standardmäßige asynchrone Kommunikationsbits wie Start, Stopp und Paritätsprüfung.
6. Die maximale Taktbaudrate kann bis zu 4 unterstützt werden.Mbps
7. Unterstützt den automatischen Flusskontrollmodus.UART0/3
RK3399 UART
Die Pin-Beschreibung ist in der folgenden Abbildung dargestellt:
2. UART-Verbindung
ROCKPi 4A
Das Board verfügt über einen 40-Pin-Erweiterungsport, wie im Bild unten gezeigt:radxa
RockPI 4A
Die einzelne Platine wird als serieller Debug-Port verwendet, und die Pin-Verbindungsmethode für die Konvertierung in einen seriellen Port ist wie folgt:UART2
USB
TTL
RockPI4A-Einzelplatine | Serieller USB-zu-TTL-Anschluss |
---|---|
PIN8 (UART2_TXD) | RXD |
PIN9 (GND) | GND |
PIN10 (UART2_RXD) | TXD |
RockPI 4A
Die Debugging-Konfiguration der seriellen Schnittstelle der einzelnen Platine ist in der folgenden Abbildung dargestellt:
Beim Anschließen der seriellen Schnittstelle müssen Sie zunächst sicherstellen, dass die Verbindung korrekt ist, und dann prüfen, ob die Pin-Ebenen der seriellen Schnittstelle kompatibel sind und ob die Parameterkonfiguration der seriellen Schnittstelle korrekt ist. Andernfalls ist die serielle Schnittstelle möglicherweise nicht verfügbar oder verstümmelt.GND
3. UART-Konfiguration
Nehmen Sie als Beispiel eine einzelne Platine, um die Konfiguration in der Einleitung zu konfigurieren .ROCKPI 4A
RK3399 DTS
UART
3.1. Alias der seriellen Schnittstelle
Gewöhnliche Geräte mit serieller Schnittstelle werden entsprechend der Nummer der seriellen Schnittstelle nummeriert und als entsprechendes Gerät registriert .dts
aliases
serialx
ttySx
Konfigurationsdatei: .arch/arm64/boot/dts/rockchip/rk3399.dtsi
RK3399 DTS
ist wie folgt definiert :aliases
Aliase { ... serial0 = &uart0; serial1 = &uart1; serial2 = &uart2; serial3 = &uart3; serial4 = &uart4; };
Wenn Sie die Änderung als registrieren , können Sie die folgenden Änderungen vornehmen:UART4
ttyS1
aliases { ... serial0 = &uart0; serial1 = &uart4 ## Verwenden Sie uart4, um uart1 zu ersetzen ... serial4 = &uart1 };
3.2. Konfiguration der seriellen Schnittstelle
Konfigurationsdatei: .arch/arm64/boot/dts/rockchip/rk3399.dtsi
UART0 dts
Die Konfiguration ist wie folgt:
uart0: serial@ff180000 { kompatibel = "rockchip,rk3399-uart", "snps,dw-apb-uart"; reg = <0x0 0xff180000 0x0 0x100>; ## uart0 Registeradresse 0xff180000 und Zuordnungsgröße 0x100 Uhren = <&cru SCLK_UART0 >, <&cru PCLK_UART0>; ## Der von uart0 verwendete Taktgeber = "baudclk", "apb_pclk"; <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH 0>; , DMA-Modus wird nicht verwendet reg-shift = <2>; ## Die Registeradresse wird um 2 Bit versetzt, dh offset+4 reg-io-width = <4> ; . pinctrl-names = "default"; pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>; ## uart0 verwendet den Flusskontroll-Pin status = "disabled" };
UART0 pinmux
Konfiguration, einschließlich Flusskontrollstiften .cts/rts
uart0 { uart0_xfer: uart0-xfer { rockchip,pins = <2 16 RK_FUNC_1 &pcfg_pull_up>, <2 17 RK_FUNC_1 &pcfg_pull_none>; }; uart0_cts : uart0-cts { rockchip,pins = <2 18 RK_FUNC_1 &pcfg_pull_none>; }; uart0_rts : uart0-rts { rockchip,pins = <2 19 RK_FUNC_1 &pcfg_pull_none>; }; };
Notiz:
RK3399 UART0
Die Interrupt-Nummer ist 131. Die Interrupt-Nummer beginnt bei 32 und die Interrupt-Nummer in beginnt standardmäßig bei 0. Die konfigurierte Interrupt-Nummer lautet also: 131-32, also 99.SPI
dts
SPI
UART0
Nach dem Systemstart können Sie die Interrupts der seriellen Schnittstelle (131 und 132) anzeigen:
root@xiaotianbsp:/# cat proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 14: 0 0 0 0 0 0 GICv3 29 Edge arch_timer ... 35: 16 0 0 0 0 0 GICv3 131 Level serial ... 222: 301 0 0 0 0 0 GICv3 132 Level debug ... Fehler: 0
3.3. Aktivierung der seriellen Schnittstelle
Konfigurationsdatei: .arch/arm64/boot/dts/rockchip/rockpi-4-linux.dtsi
UART0 dts
Die Aktivierungskonfiguration ist wie folgt:
&uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_xfer &uart0_cts>; ## okay: Funktion der seriellen Schnittstelle einschalten; }; & uart2 { status = "okay" ## Serielle Schnittstelle 2 aktivieren };
Notiz:
status = "okay"
oder , kann aber nicht verwendet werden ."ok"
enable
Der Kernel-Parsing-Code lautet wie folgt:
static bool __of_device_is_available(const struct device_node *device) { ... status = __of_get_property(device, "status", &statlen); ... if (statlen > 0) { if (!strcmp(status, "okay") || !strcmp(status, "ok")) return true; } return false; }
3.4、ttyFIQ0
Das System wird als Gerät verwendet./dev/ttyFIQ0
console
Konfigurationsdatei: Der Inhalt lautet wie folgt:arch/arm64/boot/dts/rockchip/rockpi-4-linux.dtsi
fiq_debugger: fiq-debugger { status = "disabled"; kompatibel = "rockchip,fiq-debugger" ; und schalten Sie gleichzeitig den Pinmux des seriellen Ports um rockchip ,signal-irq = <0> ; * Wenn enable uart irq anstelle von fiq verwendet */ rockchip ,baudrate = <1500000>; * Nur 115200 und 1500000 */ pinctrl -0 = <&uart2c_xfer>; -Ausweis };
RockPI 4A
Legen Sie die Parameter für das vom Board verwendete System in der Konfigurationsdatei fest.Debian
extlinux.conf
console
root@xiaotianbsp:/boot/extlinux# cat extlinux.conf Timeout 10 Menütitel Select Kernel Label Kernel-4.4.154-90-rockchip-ga14f6502e045 Kernel /vmlinuz-4.4.154-90-rockchip-ga14f6502e045 Devicetreedir /dtbs/4.4 .154-90-rockchip-ga14f6502e045 ## Early Printk aktivieren, ttyFIQ0 wird als Konsolengerät verwendet, die Baudrate des seriellen Ports beträgt 1,5 MB, 8 Datenbits, 1 Stoppbit, frühes Drucken anhängen console=ttyFIQ0,1500000n8 init=/sbin/ init root=PARTUUID=b921b045-1d rw rootwait rootfstype=ext4
Nachdem das System gestartet ist, können Sie es durchsehen.cmdline
root@xiaotianbsp:~# cat /proc/cmdline Earlyprintk console=ttyFIQ0,1500000n8 init=/sbin/init root=PARTUUID=b921b045-1d rw rootwait rootfstype=ext4
4. UART-Treiber
RK3399 Linux4.4
Der Kernel- Treiber verwendet den 8250-Universaltreiber, der Typ ist . Hauptimplementierungsdateien:UART
16550A
drivers/tty/serial/8250/8250_dma.c ## UART-DMA-Implementierung drivers/tty/serial/8250/8250_dw.c ## Synopsys DesignWare 8250 serieller Port-Treiber drivers/tty/serial/8250/8250_early.c ## frühe Konsole Implementierung drivers/tty/serial/8250/8250_port.c ## Verwandte Schnittstellen für die UART-Port-Konfiguration
UART
Treiber und Debugging werden später vorgestellt.
5. Debuggen des Kernel-Protokolls
In eingebetteten Systemen wird am häufigsten die serielle Schnittstelle zur Ausgabe von Kernel-Protokollen für das Funktionsdebuggen verwendet.Linux
5.1、printk
Im Kernel stehen Funktionen zur Ausgabe von Kernel-Informationen an den Kernel-Informationspuffer zur Verfügung.Linux
printk()
Die Kernel-Protokollausgabe ist in verschiedene Ebenen unterteilt, Definitionsdatei:, einschließlich:include/linux/kern_levels.h
#define LOGLEVEL_EMERG 0 /* System ist unbrauchbar */ #define LOGLEVEL_ALERT 1 /* Maßnahmen müssen sofort ergriffen werden */ #define LOGLEVEL_CRIT 2 /* kritische Bedingungen */ #define LOGLEVEL_ERR 3 /* Fehlerbedingungen */ #define LOGLEVEL_WARNING 4 /* Warnbedingungen */ #define LOGLEVEL_NOTICE 5 /* normale, aber wichtige Bedingung */ #define LOGLEVEL_INFO 6 /* informativ */ #define LOGLEVEL_DEBUG 7 /* Meldungen auf Debug-Ebene */
Zusätzlich zu den Funktionen können Sie auch und verwenden .printk()
pr_**()
dev_**()
pr_**
Definitionsdatei: Das Makro ist wie folgt definiert:include/linux/printk.h
#define pr_emerg(fmt, ...) \ printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) #define pr_alert(fmt, ...) \ printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) #define pr_crit( fmt, ...) \ printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) #define pr_err(fmt, ...) \ printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) #define pr_warning(fmt, .. .) \ printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) #define pr_warn pr_warning #define pr_notice(fmt, ...) \ printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) #define pr_info(fmt, .. .) \ printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
dev_**
Definitionsdatei: Die Funktion ist wie folgt definiert:drivers/base/core.c
#define define_dev_printk_level(func, kern_level) \ void func(const struct device *dev, const char *fmt, ...) \ { \ struct va_format vaf; \ va_list args; \ \ va_start(args, fmt); \ \ vaf.fmt = fmt; \ vaf.va = &args; \ \ __dev_printk(kern_level, dev, &vaf); \ \ va_end(args); \ } \ EXPORT_SYMBOL(func); define_dev_printk_level (dev_emerg, KERN_EMERG); define_dev_printk_level(dev_alert, KERN_ALERT); define_dev_printk_level(dev_crit, KERN_CRIT); define_dev_printk_level(dev_err, KERN_ERR); define_dev_printk_level(dev_warn, KERN_WARNING); define_dev_printk_level(dev_notice, KERN_NOTICE); define_dev_printk_level(_dev_info, KERN_INFO);
5.1.1. Protokollausgabeebene
Die Ausgabestufe des Kernel-Protokolls kann durch Ändern des Werts von oder angepasst werden.loglevel
/proc/sys/kernel/printk
Bevor das System startet, können Sie die Protokollausgabe der seriellen Schnittstelle über die Konfiguration anpassen.loglevel
root@xiaotianbsp:~# cat /boot/extlinux/extlinux.conf ... label kernel-debug kernel /debug/Image fdt /debug/rk3399-rock-pi-4a.dtb ## Ändern Sie die Protokollebene, um die Ausgabe der seriellen Schnittstelle anzupassen Protokollebene anhängen Earlyprintk Console=ttyFIQ0,1500000n8 Protokollebene=4 init=/sbin/init root=PARTUUID=b921b045-1d rw rootwait rootfstype=ext4 no_console_suspend initcall_debug
Andere Systeme (wie: oder ) werden im Allgemeinen in geändert .Ubuntun、Buildroot
Android
bootargs
loglevel
Notiz:
no_console_suspend
Wird für das Debuggen der Energieverwaltung des Linux-Systems verwendet. Dies bedeutet, dass die serielle Schnittstelle nach dem Ruhezustand (Suspendieren) des Systems nicht in den Ruhezustand wechselt und weiterhin ausgeben kann.
Nach dem Systemstart kann der Protokollausgabepegel der seriellen Schnittstelle auch dynamisch angepasst werden.
root@xiaotianbsp:/proc/sys/kernel# cat printk 7 4 1 7 root@xiaotianbsp:/proc/sys/kernel# echo 4 > printk root@xiaotianbsp:/proc/sys/kernel# cat printk 4 4 1 7
printk
Die Zahlen in entsprechen den verschiedenen Protokollierungsstufen. Ändern Sie einfach die Protokollierungsstufe des Ports.console
int console_printk[4] = { CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */ ## Konsolenprotokollebene MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel */ ## Standardnachrichtenprotokollebene CONSOLE_LOGLEVEL_MIN, /* Minimum_console_loglevel */ ## Minimale Konsolenprotokollebene CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel */ ##Standardprotokollebene der Konsole };
5.1.2. Zeitstempel protokollieren
Nach dem Systemstart kann die Anzeige der Kernel-Log-Zeitstempel dynamisch angepasst werden.
## 1. Der Zeitwert ist Y, was bedeutet, dass der Zeitstempel root@xiaotianbsp:/# cat /sys/module/printk/parameters/time Y ## 2. Zu diesem Zeitpunkt zeigt das Protokoll einen Zeitstempel root@xiaotianbsp:/ # find . -name time [ 1719.836194] FAT-fs (sda4): Fehler, ungültiger Zugriff auf FAT (Eintrag 0x07b03538) [ 1719.836874] FAT-fs (sda4): Fehler, ungültiger Zugriff auf FAT (Eintrag 0x07b03538) ## 3. Stellen Sie den Zeitwert auf N root@xiaotianbsp:/# echo N > /sys/module/printk/parameters/time ## 4 ein. Zu diesem Zeitpunkt zeigt das Protokoll einen Zeitstempel root@xiaotianbsp:/# find -name time FAT -fs (sda4): Fehler, ungültiger Zugriff auf FAT (Eintrag 0x07b03538) FAT-fs (sda4): Fehler, ungültiger Zugriff auf FAT (Eintrag 0x07b03538)
5.2、dmesg
Wenn Sie nach dem Systemstart die Kernel-Startphase verpasst haben oder einen nicht seriellen Port (z. B. Login) zum Anschließen des Debugging-Boards verwenden, können Sie das Kernel-Protokoll anzeigen.adb/ssh
dmesg
dmesg
Die Nutzung ist wie folgt:
root@xiaotianbsp:/# dmesg -h Verwendung : dmesg [Optionen] Zeigt oder steuert den Kernel-Ringpuffer. Optionen : -C, --clear löscht den Kernel-Ringpuffer -c, --read-clear lesen und löschen alle Nachrichten -D, --console-off das Drucken von Nachrichten auf der Konsole deaktivieren -E, --console-on das Drucken von Nachrichten auf der Konsole aktivieren -F, --file <Datei> die Datei anstelle des Kernel-Protokollpuffers verwenden -f, - -facility <list> beschränkt die Ausgabe auf definierte Einrichtungen -H, --human menschenlesbare Ausgabe -k, --kernel zeigt Kernel-Meldungen an -L, --color[=<when>] färbt Meldungen ein (automatisch, immer oder nie) in Farben sind standardmäßig aktiviert -l, --level <list> beschränkt die Ausgabe auf definierte Ebenen -n, --console-level <level> legt die Ebene der auf der Konsole gedruckten Nachrichten fest -P, --nopager leitet die Ausgabe nicht an einen Pager weiter - r, --raw druckt den Rohnachrichtenpuffer -S, --syslog erzwingt die Verwendung von syslog(2) anstelle von /dev/kmsg -s, --buffer-size <Größe> Puffergröße zum Abfragen des Kernel-Ringpuffers -u , --userspace Userspace-Nachrichten anzeigen -w, --follow auf neue Nachrichten warten -x, --decode Dekodierfunktion und Ebene für lesbare Zeichenfolge -d, --show-delta Zeitdifferenz zwischen gedruckten Nachrichten anzeigen -e, --reltime lokale Zeit und Zeitdelta in lesbarem Format anzeigen -T, --ctime menschenlesbaren Zeitstempel anzeigen (möglicherweise ungenau!) -t, --notime keinen Zeitstempel mit Nachrichten anzeigen --time-format <format> Zeitstempel anzeigen unter Verwendung des angegebenen Formats: [delta|reltime|ctime|notime|iso] Durch das Anhalten/Fortsetzen werden ctime- und ISO-Zeitstempel ungenau. -h , --help zeigt diese Hilfe an und beendet -V, --version gibt Versionsinformationen aus und beendet Unterstützte Protokollfunktionen: Kern – Kernel-Nachrichten Benutzer – Zufällige Nachrichten auf Benutzerebene Mail – Mail-System- Daemon – System-Daemons- Authentifizierung – Sicherheits-/Autorisierungsnachrichten Syslog – intern von Syslogd generierte Nachrichten LPR – Zeilendrucker-Subsystem -News – Netzwerk-News-Subsystem Unterstütztes Protokoll Stufen (Prioritäten): Emerg – System ist unbrauchbar Alert – Maßnahmen müssen sofort ergriffen werden Crit – Kritische Bedingungen err – Fehlerbedingungen Warnung – Warnbedingungen Hinweis – normale, aber wichtige Zustandsinformationen – informatives Debuggen – Meldungen auf Debug-Ebene Weitere Einzelheiten finden Sie unter dmesg(1).
5.2.1. Kernel-Protokolle anzeigen
root@xiaotianbsp:/# dmesg [ 0,000000] Booten von Linux auf physischer CPU 0x0 [ 0,000000] Initialisieren von cgroup subsys cpuset [ 0,000000] Initialisieren von cgroup subsys cpu [ 0,000000] Initialisieren von cgroup subsys cpuacct [ 0,000000] Linux-Version 4.4.154-90-rockchip- ga14f6502e045 (root@2705a206000b) (gcc Version 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701] (Linaro GCC 7.3-2018.05) #22 SMP Di 30. Juli 10:32:28 UTC 2019
5.2.2. Protokollausgabeebene begrenzen
## 仅输出error信息 root@xiaotianbsp:/# dmesg -l err [ 2.170152] rockchip-pcie f8000000.pcie: PCIe Link Training Gen1 Timeout! [ 2.175658] rk-vcodec ff650000.vpu_service: power_model-Knoten konnte nicht gefunden werden [ 2.180010] rk-vcodec ff660000.rkvdec: power_model-Knoten konnte nicht gefunden werden [ 2.200359] rockchip-vop ff900000.vop: fehlende rockchip,grf-Eigenschaft [ 2.201913] rock Chip- vop ff8f0000.vop: fehlende rockchip,grf-Eigenschaft [2.203632] i2c i2c-9: of_i2c: Modalias-Fehler auf /hdmi@ff940000/ports [2.240381] mali ff9a0000.gpu: Regler [2.240839] mali konnte nicht abgerufen werden. ff9a0000.gpu : Macht Steuerungsinitialisierung fehlgeschlagen [2.260317] rk_gmac-dwmac fe300000.ethernet: Uhr clk_mac_speed kann nicht abgerufen werden
## 同时输出error和warning信息 root@xiaotianbsp:/# dmesg -l err,warn [ 0,000000] rockchip_clk_register_frac_branch: dclk_vop0_frac konnte nicht als übergeordnetes Element von dclk_vop0 gefunden werden, Ratenänderungen funktionieren möglicherweise nicht [ 0,000000] rockchip_clk_register_frac_ Zweig: dclk_vop1_frac konnte nicht als übergeordneter Zweig gefunden werden von dclk_vop1 funktionieren Ratenänderungen möglicherweise nicht [ 0,000000] rockchip_cpuclk_pre_rate_change: Begrenzung des Alt-Dividers 33 auf 31 [ 1,589058] Thermal Thermal_Zone1: Power_Allocator: Sustainable_Power wird geschätzt [ 1,637902] phy. phy-ff770000.syscon:[email protected] : Fehler beim Abrufen des VBUS-Versorgungsreglers [ 1.639962] phy phy-ff770000.syscon:[email protected]: Fehler beim Abrufen des VBUS-Versorgungsreglers [ 2.170152] rockchip-pcie f8000000.pcie: Zeitüberschreitung beim PCIe-Link-Training gen1!
5.2.3. Suchen Sie nach einer bestimmten Information
root@xiaotianbsp:~# dmesg | grep rockchip-vop [ 2.197270] rockchip-vop ff900000.vop: fehlende rockchip,grf-Eigenschaft [ 2.198853] rockchip-vop ff8f0000.vop: fehlende rockchip,grf-Eigenschaft root@xiaotianbsp:~# dmesg | grep xiaotianbsp root@xiaotianbsp:~#
5.2.4. Ringpufferinformationen löschen
root@xiaotianbsp:/# dmesg -c [ 0,000000] Booten von Linux auf physischer CPU 0x0 [ 0,000000] Initialisieren von cgroup subsys cpuset [ 0,000000] Initialisieren von cgroup subsys cpu [ 0,000000] Initialisieren von cgroup subsys cpuacct ... root@xiaotianbsp:/# dmesg root @xiaotianbsp:/#
dmesg
Sie können weitere Verwendungsmöglichkeiten selbst testen.
Hinweis: Bitte geben Sie beim Nachdruck den Autor und die Quelle an.
RustDesk hat den inländischen Dienst Taobao (taobao.com) aufgrund von grassierendem Betrug eingestellt, die Arbeit zur Optimierung der Webversion wurde wieder aufgenommen, Apple veröffentlichte den M4-Chip, High-School-Schüler erstellten im Rahmen einer Coming-of-Age-Zeremonie ihre eigene Open-Source-Programmiersprache – Netizens kommentierten: Verlassen auf Die Verteidigung, Yunfeng sei von Alibaba zurückgetreten und plane, in Zukunft das Ziel für unabhängige Spieleprogrammierer Visual Studio Code 1.89 zu produzieren, wurde von Huawei offiziell bekannt gegeben. Yu Chengdongs Jobanpassung wurde an die „FFmpeg-Säule der Schande“ genagelt „Vor 15 Jahren, aber heute muss er sich bei uns bedanken – Tencent QQ Video rächt seine bisherige Schande?“ Die Open-Source-Spiegelstation der Huazhong University of Science and Technology ist offiziell für den externen Netzwerkzugriff geöffnet