Tencent Aurora 4 Pro

Can I obtain blob adaptation information using the command “dmesg | grep -i blob”?

What blob info?

In Android 10 and above systems, “blob closed-source binary files” refer to key component files in the system that do not disclose source codes and exist in binary form, mainly related to hardware drivers and core system functions. They can be understood from the following perspectives:

  • Nature: These files are “precompiled binary programs” that the Android system depends on during operation. They are provided by chip manufacturers (such as Qualcomm, MediaTek) or device manufacturers (such as Samsung, Xiaomi) and belong to the “closed-source” category - ordinary users and developers cannot view their source codes and can only make them run through system calls.
  • Functions: Android 10 and above have higher requirements for hardware compatibility and security (such as privacy protection, sandbox mechanism). Blob files are mainly responsible for the interaction between hardware and the system, for example:
  • Driving hardware such as cameras, sensors, and basebands (communication modules) to work properly;
  • Supporting the underlying implementation of new functions such as 5G and Wi-Fi 6;
  • Adapting to system features introduced by Android 10 such as “scoped storage” and “dark mode”.
  • Specificity: The Android system itself is based on the open-source Linux kernel and AOSP (Android Open Source Project), but the core functions related to hardware depend on the closed-source blob files from manufacturers. This is because hardware details are part of manufacturers’ technical secrets, and there are great hardware differences between different devices, requiring exclusive binary files for adaptation to ensure the stable operation of the system.

In simple terms, the blob closed-source binary files in Android 10 and above are “manufacturers’ closed-source hardware drivers and core components”. They are crucial for the system to be compatible with hardware and realize new functions, and also reflect the “open-source framework + closed-source hardware adaptation” mode of the Android system.

And your point is what? Yes, there are binary blobs used.

The core function of CoreELEC calling Blobs (mainly referring to closed-source drivers, device tree files and other binary files) from the Android system is to solve hardware compatibility issues, enabling the CoreELEC system to properly drive device hardware and achieve complete functionality. Specifically, it includes the following aspects:

  • Driving hardware devices: As a lightweight media center system, CoreELEC has limited open-source drivers. However, the drivers for many hardware components (such as WiFi modules, Bluetooth chips, GPUs, audio decoding chips, etc.) are provided by manufacturers in the form of closed-source Blobs (pre-installed only in the Android system). Calling these Blobs allows CoreELEC to recognize and drive such hardware, for example, making WiFi and Bluetooth work properly, or supporting audio decoding of specific formats.
  • Adapting device trees: A device tree is a file that describes the hardware structure, and the hardware layouts of devices of different brands/models vary. The device tree Blob of the Android system contains the hardware details of the device (such as interface definitions, hardware addresses, etc.). By calling these device trees, CoreELEC can correctly identify the hardware components on the motherboard (such as USB interfaces, HDMI ports, etc.), ensuring the stability of system startup and operation.
  • Implementing proprietary functions: Some advanced functions (such as Dolby Vision decoding, adaptation of specific models of infrared remote controls, etc.) rely on closed-source driver Blobs from manufacturers. By calling these Blobs, CoreELEC can unlock functions that were originally only supported by the Android system, enhancing the media playback experience.

In simple terms, Android Blobs are equivalent to the “instruction manual + driver program” of the hardware. Only by calling them can CoreELEC run stably on different hardware devices and exert its full performance.

Okay, I understand that blobs are being used. My question is to solve the WiFi issue with the Tencent Aurora 4pro box.

No one has this device and no one is working on this issue.

Support any drivers without hw to test is just a pain. You just have no luck. Use USB wifi dongle.

dmesg | grep -i firmware
[    0.000000@0]d psci: PSCIv1.0 detected in firmware.
[    0.795521@1]- aml_aucpu aucpu: Direct firmware load for aucpu_fw.bin failed with error -2
[    4.907290@1]- kernel-overlays-setup: added firmware from /usr/lib/kernel-overlays/base/lib/firmware
[    6.150649@1]- Registered firmware driver success.
[    6.172591@3]- load firmware size : 76288, Name : video/h264_enc.bin.
[    6.200960@1]- load firmware size : 1871104, Name : video/video_ucode.bin.
[   13.347399@0]- [TEE] E/TA:   MM-module-name:Video firmware TA,Version:1.0.1-gb173c81(build:369)

The aucpu_fw.bin file is located in the /vendor/lib/firmware directory. If it’s convenient, could you please handle the error: “aml_aucpu aucpu: Direct firmware load for aucpu_fw.bin failed with error -2”? Thank you. @vpeter

Why?
This firmware is for a complete other task!

Please stop pushing without a solution or PR!
We can not make one as we don’t have hardware access.

How to modify the MTU value to 9000 in CoreELEC and ensure it doesn’t change after each reboot.

pcieA@f5000000 {
	compatible = "amlogic,amlogic-pcie-v2\0snps,dw-pcie"; // 修正:删除compatible字符串中的空格
	reg = <0x00 0xf5000000 0x00 0x400000  // elbi
		   0x00 0xfe02c000 0x00 0x2000    // cfg
		   0x00 0xf5400000 0x00 0x200000  // ctrl(原"config"命名错误,改为驱动匹配的"ctrl")
		   0x00 0xfe02a000 0x00 0x2000    // phy
		   0x00 0xfe002044 0x00 0x10>;    // reset
	reg-names = "elbi\0cfg\0ctrl\0phy\0reset"; // 同步修正寄存器命名
	interrupts = <0x00 0x8d 0x00>;
	#interrupt-cells = <0x01>;
	bus-range = <0x00 0xff>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	interrupt-map-mask = <0x00 0x00 0x00 0x07>; // 修正:PCIe INTx标准中断掩码,原0x00导致中断映射无效
	interrupt-map = <0x00 0x00 0x00 0x01 0x00 0x00 0x8e 0x01  // 匹配INTx中断,中断号0x8e(S905X4 PCIe标准中断)
					 0x00 0x00 0x00 0x02 0x00 0x00 0x8f 0x01
					 0x00 0x00 0x00 0x03 0x00 0x00 0x90 0x01
					 0x00 0x00 0x00 0x04 0x00 0x00 0x91 0x01>;
	device_type = "pci";
	ranges = <0x81000000 0x00 0x00000000 0x00 0xf5600000 0x00 0x00100000  // IO空间
			  0x82000000 0x00 0xf5700000 0x00 0xf5700000 0x00 0x01900000>; // 内存空间(地址范围无误)
	num-lanes = <0x01>; // S905X4 PCIeA仅支持1 lane,无需修改
	pcie-num = <0x01>;
	clocks = <0x02 0x05 0x02 0xea 0x02 0xec 0x02 0x11>; // 修正:最后一个时钟索引(原0x10改为0x11,匹配"pcie_phy_ref")
	clock-names = "pcie_ref\0pcie_hc\0pcie_phy\0pcie_phy_ref"; // 修正:删除错误的"pcie_refpll""pcie_hcsl",用S905X4标准时钟名
	gpio-type = <0x02>;
	pcie-apb-rst-bit = <0x0e>; // S905X4复位位标准值,无需修改
	pcie-phy-rst-bit = <0x0d>;
	pcie-ctrl-a-rst-bit = <0x0c>;
	pwr-ctl = <0x00>; // 修正:原0x02无效,S905X4供电控制设为0x00
	status = "okay"; // 开启PCIeA(用户需确保此值为okay)
	reset-gpio = <0x16 0x47 0x00>; // 修正:腾讯极光4Pro PCIe复位引脚为GPIOX_7(0x16=GPIO控制器phandle,0x47=GPIOX_7编号)
	phandle = <0x100>;
};

The above configuration fixes the PCIeA setup for the NG version. It is recommended to compile a separate DTB file for adaptation. Thank you.

So, this modification is correct fix for PCIe under the old obsolete NG version?

No extra modification needed?! (just removed the Chinese text)

pcieA@f5000000 {
	compatible = "amlogic,amlogic-pcie-v2\0snps,dw-pcie";
	reg = <0x00 0xf5000000 0x00 0x400000 0x00 0xfe02c000 0x00 0x2000 0x00 0xf5400000 0x00 0x200000 0x00 0xfe02a000 0x00 0x2000 0x00 0xfe002044 0x00 0x10>;
	reg-names = "elbi\0cfg\0ctrl\0phy\0reset";
	interrupts = <0x00 0x8d 0x00>;
	#interrupt-cells = <0x01>;
	bus-range = <0x00 0xff>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	interrupt-map-mask = <0x00 0x00 0x00 0x07>;
	interrupt-map = <0x00 0x00 0x00 0x01 0x00 0x00 0x8e 0x01
					 0x00 0x00 0x00 0x02 0x00 0x00 0x8f 0x01
					 0x00 0x00 0x00 0x03 0x00 0x00 0x90 0x01
					 0x00 0x00 0x00 0x04 0x00 0x00 0x91 0x01>;
	device_type = "pci";
	ranges = <0x81000000 0x00 0x00000000 0x00 0xf5600000 0x00 0x00100000	 0x82000000 0x00 0xf5700000 0x00 0xf5700000 0x00 0x01900000>;
	num-lanes = <0x01>;
	pcie-num = <0x01>;
	clocks = <0x02 0x05 0x02 0xea 0x02 0xec 0x02 0x11>;
	clock-names = "pcie_ref\0pcie_hc\0pcie_phy\0pcie_phy_ref";
	gpio-type = <0x02>;
	pcie-apb-rst-bit = <0x0e>;
	pcie-phy-rst-bit = <0x0d>;
	pcie-ctrl-a-rst-bit = <0x0c>;
	pwr-ctl = <0x00>;
	status = "okay";
	reset-gpio = <0x16 0x47 0x00>;
	phandle = <0x100>;
};

That’s correct. This fixes the issue where the logo gets stuck during boot when PCIe is enabled on the NG version.

Do you have time to test if you can access the system? Once you get in, check if Wi-Fi and Bluetooth are available. I haven’t tested this yet. It may be necessary to port the drivers, as the 4.9.269 kernel does not natively support PCIe devices.

Could you please help compile and share it? Thanks a lot.

/dts-v1/;

#include "meson-sc2.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/clock/gxbb-clkc.h>
#include <dt-bindings/power/meson-gxbb-power.h>
#include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>

/ {
    model = "Tencent Aurora 4Pro (S905X4-J)";
    compatible = "amlogic,sc2", "amlogic,meson-sc2";
    interrupt-parent = <&gic>;
    #address-cells = <2>;
    #size-cells = <2>;

    aliases {
        serial0 = &uart_AO;
        serial1 = &uart_A;
        mmc0 = &sd_emmc_a;
        mmc1 = &sd_emmc_b;
        mmc2 = &sd_emmc_c;
        ethernet0 = &ethmac;
        wifi0 = &sdio;
    };

    chosen {
        stdout-path = "serial0:115200n8";
        bootargs = "console=ttyS0,115200n8 root=/dev/ram0 rw init=/init rootwait coherent_pool=2M loglevel=1";
    };

    memory@00000000 {
        device_type = "memory";
        reg = <0x0 0x00000000 0x0 0xF0000000>;
    };

    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;

        secmon_reserved: secmon@05000000 {
            no-map;
            reg = <0x0 0x05000000 0x0 0x00200000>;
        };

        logo_reserved: logo@05200000 {
            no-map;
            reg = <0x0 0x05200000 0x0 0x00800000>;
        };

        dump_reserved: dump@05a00000 {
            no-map;
            reg = <0x0 0x05a00000 0x0 0x00200000>;
        };

        ramdump_reserved: ramdump@05c00000 {
            no-map;
            reg = <0x0 0x05c00000 0x0 0x04000000>;
        };

        di_reserved: di@09c00000 {
            no-map;
            reg = <0x0 0x09c00000 0x0 0x01400000>;
        };

        codec_reserved: codec@0b000000 {
            no-map;
            reg = <0x0 0x0b000000 0x0 0x00800000>;
        };

        ion_reserved: ion@0b800000 {
            no-map;
            reg = <0x0 0x0b800000 0x0 0x00800000>;
        };

        ramoops@bc00000 {
            compatible = "ramoops";
            reg = <0x0 0x0bc00000 0x0 0x00400000>;
            record-size = <0x0 0x00020000>;
            console-size = <0x0 0x00200000>;
            ftrace-size = <0x0 0x00000000>;
            pmsg-size = <0x0 0x00080000>;
        };

        linux,cma {
            compatible = "shared-dma-pool";
            reusable;
            size = <0x0 0x10000000>;
            alignment = <0x0 0x400000>;
            linux,cma-default;
        };
    };

    cpus {
        #address-cells = <2>;
        #size-cells = <0>;

        cpu0: cpu@0 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x0>;
            enable-method = "psci";
            clocks = <&scmi_clk 0>;
            operating-points-v2 = <&cpu_opp_table>;
            capacity-dmips-mhz = <1024>;
            #cooling-cells = <2>;
        };

        cpu1: cpu@1 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x1>;
            enable-method = "psci";
            clocks = <&scmi_clk 0>;
            operating-points-v2 = <&cpu_opp_table>;
            capacity-dmips-mhz = <1024>;
            #cooling-cells = <2>;
        };

        cpu2: cpu@2 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x2>;
            enable-method = "psci";
            clocks = <&scmi_clk 0>;
            operating-points-v2 = <&cpu_opp_table>;
            capacity-dmips-mhz = <1024>;
            #cooling-cells = <2>;
        };

        cpu3: cpu@3 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x3>;
            enable-method = "psci";
            clocks = <&scmi_clk 0>;
            operating-points-v2 = <&cpu_opp_table>;
            capacity-dmips-mhz = <1024>;
            #cooling-cells = <2>;
        };
    };

    cpu_opp_table: cpu-opp-table {
        compatible = "operating-points-v2";
        opp-shared;

        opp-100000000 {
            opp-hz = /bits/ 64 <100000000>;
            opp-microvolt = <730000>;
            clock-latency-ns = <500000>;
        };
        opp-250000000 {
            opp-hz = /bits/ 64 <250000000>;
            opp-microvolt = <730000>;
            clock-latency-ns = <500000>;
        };
        opp-500000000 {
            opp-hz = /bits/ 64 <500000000>;
            opp-microvolt = <730000>;
            clock-latency-ns = <500000>;
        };
        opp-667000000 {
            opp-hz = /bits/ 64 <667000000>;
            opp-microvolt = <750000>;
            clock-latency-ns = <500000>;
        };
        opp-1000000000 {
            opp-hz = /bits/ 64 <1000000000>;
            opp-microvolt = <770000>;
            clock-latency-ns = <500000>;
        };
        opp-1200000000 {
            opp-hz = /bits/ 64 <1200000000>;
            opp-microvolt = <790000>;
            clock-latency-ns = <500000>;
        };
        opp-1500000000 {
            opp-hz = /bits/ 64 <1500000000>;
opp-microvolt = <830000>;
            clock-latency-ns = <500000>;
        };
        opp-1800000000 {
            opp-hz = /bits/ 64 <1800000000>;
            opp-microvolt = <860000>;
            clock-latency-ns = <500000>;
        };
        opp-1908000000 {
            opp-hz = /bits/ 64 <1908000000>;
            opp-microvolt = <880000>;
            clock-latency-ns = <500000>;
            opp-supported-hw = <0x03>;
        };
        opp-2016000000 {
            opp-hz = /bits/ 64 <2016000000>;
            opp-microvolt = <900000>;
            clock-latency-ns = <500000>;
            opp-supported-hw = <0x03>;
        };
    };

    psci {
        compatible = "arm,psci-1.0";
        method = "smc";
    };

    scmi {
        compatible = "arm,scmi-smc";
        arm,smc-id = <0x82000000>;
        shmem = <&scmi_shmem>;
        #address-cells = <1>;
        #size-cells = <0>;

        scmi_shmem: scmi-shmem@fffc0000 {
            compatible = "amlogic,scmi-shmem";
            reg = <0x0 0xfffc0000 0x0 0x1000>;
        };

        protocol@13 {
            reg = <0x13>;
            #clock-cells = <1>;
        };
    };

    gpio-keys {
        compatible = "gpio-keys";
        autorepeat;

        recovery-key {
            label = "recovery";
            linux,code = <KEY_VENDOR>;
            gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;
            debounce-interval = <60>;
            wakeup-source;
        };
    };

    leds {
        compatible = "gpio-leds";

        sys_led: led-0 {
            label = "sys_led";
            gpios = <&gpio GPIOD_11 GPIO_ACTIVE_LOW>;
            default-state = "on";
            linux,default-trigger = "heartbeat";
        };
    };

    vddcpu: regulator-vddcpu {
        compatible = "pwm-regulator";
        regulator-name = "VDDCPU";
        regulator-min-microvolt = <730000>;
        regulator-max-microvolt = <900000>;
        pwm-supply = <&pwm_ab>;
        pwms = <&pwm_ab 0 1250 0>;
        pwm-dutycycle-range = <20 80>;
        regulator-boot-on;
        regulator-always-on;
    };
};

&uart_AO {
    status = "okay";
    pinctrl-0 = <&uart_ao_a_pins>;
    pinctrl-names = "default";
};

&uart_A {
    status = "okay";
    pinctrl-0 = <&uart_a_pins>;
    pinctrl-names = "default";
    /* 蓝牙串口适配 */
    bluetooth {
        compatible = "brcm,bcm43455-bt";
        max-speed = <4000000>;
        reset-gpios = <&gpio GPIOD_10 GPIO_ACTIVE_LOW>;
        wakeup-host = <&gpio GPIOD_9 GPIO_ACTIVE_HIGH>;
        wakeup-device = <&gpio GPIOD_8 GPIO_ACTIVE_HIGH>;
    };
};

/* 禁用红外接收模块 */
&ir {
    status = "disabled";
};

&remote {
    status = "disabled";
};

&pwm_ab {
    status = "okay";
    pinctrl-0 = <&pwm_a_pins>;
    pinctrl-names = "default";
    #pwm-cells = <3>;
};

/* eMMC存储适配 (64GB) */
&sd_emmc_a {
    status = "okay";
    pinctrl-0 = <&emmc_pins>;
    pinctrl-names = "default";
    bus-width = <8>;
    max-frequency = <200000000>;
    non-removable;
    cap-mmc-highspeed;
    mmc-ddr-1_8v;
    mmc-hs200-1_8v;
    disable-wp;
    vmmc-supply = <&vcc_3v3>;
    vqmmc-supply = <&vcc_1v8>;
};

/* SDIO WiFi/蓝牙模块适配 */
&sd_emmc_b {
    status = "okay";
    pinctrl-0 = <&sdcard_pins>;
    pinctrl-names = "default";
    bus-width = <4>;
    max-frequency = <100000000>;
    cap-sd-highspeed;
    sd-uhs-sdr104;
    sd-uhs-sdr50;
    non-removable;
    keep-power-in-suspend;
    wakeup-source;
    vmmc-supply = <&vcc_3v3>;
    vqmmc-supply = <&vcc_1v8>;
};

/* 外置SD卡插槽禁用 (本设备无SD卡槽) */
&sd_emmc_c {
    status = "disabled";
};

/* 千兆以太网适配 */
&ethmac {
    status = "okay";
    pinctrl-0 = <&eth_rgmii_pins>;
    pinctrl-names = "default";
    amlogic,tx-delay-ns = <2>;
    phy-mode = "rgmii";
    phy-handle = <&eth_phy0>;
    snps,reset-gpio = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
    snps,reset-delays-us = <0 10000 1000000>;
    snps,force_thresh_dma_mode;
    snps,axi-config = <&eth_axi_config>;
    snps,txi-config = <&eth_txi_config>;

    mdio {
        compatible = "snps,dwmac-mdio";
        #address-cells = <1>;
        #size-cells = <0>;

        eth_phy0: ethernet-phy@0 {
            reg = <0>;
            compatible = "ethernet-phy-ieee802.3-c22";
            reset-assert-us = <10000>;
            reset-deassert-us = <100000>;
            reset-gpios = <&gpio GPIOZ_15 GPIO_ACTIVE_LOW>;
            interrupt-parent = <&gpio_intc>;
            interrupts = <25 IRQ_TYPE_LEVEL_LOW>;
        };
    };

    eth_axi_config: axi-config {
        snps,lpi_en = <0x0>;
        snps,wr_osr_lmt = <0xf>;
        snps,rd_osr_lmt = <0xf>;
        snps,blen = <0 0 0 0 16 8 4>;
    };

    eth_txi_config: txi-config {
        snps,txpbl = <32>;
        snps,rxpbl = <32>;
    };
};

/* USB 2.0 双接口适配 */
&usb0 {
    status = "okay";
    dr_mode = "host";
};

&usb1 {
    status = "okay";
    dr_mode = "host";
};

&usb2_phy0 {
    status = "okay";
    phy-supply = <&vcc_5v>;
};

&usb2_phy1 
    status = "okay";
    phy-supply = <&vcc_5v>;
};

/* HDMI 音视频输出适配 */
&hdmi_tx {
    status = "okay";
pinctrl-0 = <&hdmitx_hpd_pins>;
    pinctrl-names = "default";
    hdmi-supply = <&vcc_5v>;
};

&hdmitx_phy {
    status = "okay";
};

/* 音频解码模块适配 */
&aiu {
    status = "okay";
    pinctrl-0 = <&i2s_out_ch01_pins>, <&i2s_out_ch23_pins>, <&spdif_out_pins>;
    pinctrl-names = "default";
};

&tdm_format {
    status = "okay";
};

/* 电源域适配 */
&power {
    status = "okay";
};

&scpi {
    status = "okay";
};

&mailbox {
    status = "okay";
};

&watchdog {
    status = "okay";
};

&rtc {
    status = "okay";
};

&crypto {
    status = "okay";
};

&dma {
    status = "okay";
};

&gic {
    status = "okay";
};

&timer_abcde {
    status = "okay";
};

&clk_msr {
    status = "okay";
};

&pmu {
    status = "okay";
};

&reset {
    status = "okay";
};

&secmon {
    status = "okay";
};