# 使用 TrustZone 加载 QUP v3 串口引擎固件

Source: [https://docs.qualcomm.com/doc/80-70029-8SC/topic/load-linux-firmware.html](https://docs.qualcomm.com/doc/80-70029-8SC/topic/load-linux-firmware.html)

QUP v3 串行引擎将所需协议的固件加载到串行引擎上。协议（I2C、SPI、I3C）和通信模式（[FIFO](https://docs.qualcomm.com/doc/80-70029-8SC/topic/references.html#qup-v3-supported-transfer-modes__ul_unp_cdt_qzb)、[GSI](https://docs.qualcomm.com/doc/80-70029-8SC/topic/references.html#qup-v3-supported-transfer-modes__b_zzd_rsp_rcc)）的配置是在安全执行环境（如 Qualcomm TEE `devcfg`）中进行的。对于开源开发，此配置在 Linux `devkit` 中执行，以支持非安全用例。但是，对于安全用例，则使用 Qualcomm TEE `devcfg`。

## 默认配置

每个串行引擎的默认配置（包括所选的数据传输模式和所有权）位于 /TZ.XF.5.0/core.tz/2.0/settings/buses/qup\_accesscontrol/qupv3/config/lemans/QUPAC\_Access.c 文件中。

在默认配置中，Linux 拥有所有串行引擎。所有安全用例均由 Qualcomm TEE 处理。

    const QUPv3_se_security_permissions_type qupv3_perms_default =
    {
      /*   PeriphID,         ProtocolID,               Mode,      NsOwner,         bAllowFifo, bLoad, bModExcl  */
      /*QUPV3_0_SE0*/
      /*QUPV3_0_SE1*/
      /*QUPV3_0_SE2*/
      { QUPV3_0_SE3, QUPV3_PROTOCOL_UART_4W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // BT UART (2nd Hastings)
      { QUPV3_0_SE4, QUPV3_PROTOCOL_UART_2W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // VIP UART/SPI (SOC SLAVE)
      /*QUPV3_0_SE5*/                                                                                       // Spare
      { QUPV3_1_SE0, QUPV3_PROTOCOL_I2C,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // I2C Carplay
      /*QUPV3_1_SE1*/
      { QUPV3_1_SE2, QUPV3_PROTOCOL_UART_2W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // Tuner
      { QUPV3_1_SE3, QUPV3_PROTOCOL_UART_2W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE, FALSE, FALSE }, // Debug UART
      { QUPV3_1_SE4, QUPV3_PROTOCOL_I2C,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // I2C A2B Controller & Audio port expander
      { QUPV3_1_SE5, QUPV3_PROTOCOL_UART_2W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // GNSS
      /*QUPV3_1_SE6*/
      { QUPV3_2_SE0, QUPV3_PROTOCOL_SPI,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // FPGA
      { QUPV3_2_SE1, QUPV3_PROTOCOL_I2C,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // PCIe I2C MUX
      { QUPV3_2_SE2, QUPV3_PROTOCOL_SPI,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // SPI - Audio
      { QUPV3_2_SE3, QUPV3_PROTOCOL_UART_4W,   QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // BT UART
      { QUPV3_2_SE4, QUPV3_PROTOCOL_I2C,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // I2C Display 1
      { QUPV3_2_SE5, QUPV3_PROTOCOL_I2C,       QUPV3_MODE_FIFO,   AC_HLOS,            TRUE,  TRUE, FALSE }, // I2C Sensor
      /*QUPV3_2_SE6 */
      { QUPV3_3_SE0,  QUPV3_PROTOCOL_SPI,       QUPV3_MODE_FIFO,   AC_HLOS,           TRUE,  FALSE, FALSE }, // SPI
    };
    Copy to clipboard

## 加载 Linux 固件

要加载 Linux 固件，请执行以下操作：
1. 在以下文件中启用 CONFIG\_QUP\_FW\_LOAD：
    - 在 arch/arm64/configs/qcom\_defconfig 中设置 `CONFIG_QCOM_QUP_FW_LOAD=y`
    - 在 arch/arm64/configs/qcom\_vm\_defconfig 中设置 `CONFIG_QCOM_QUP_FW_LOAD=m`
2. 要加载具有所需协议的固件，请在设备树节点中包含 `qcom,load-firmware` 属性。
3. 配置传输模式。

        GENI_SE_INVALID,  	// 0
        GENI_SE_FIFO,	//1
        GENI_SE_DMA,	//2
        GENI_GPI_DMA,	//3
        Copy to clipboard
4. 将固件加载到串行引擎。 
例如，当通过 FIFO 通信模式从 Linux 加载 QUPv3\_2\_SE2 (0x00888000) 时，请使用以下 DTSI 属性。

        spi16: spi@888000 {
                 compatible = "qcom,geni-spi";
                 reg = <0x0 0x00888000 0x0 0x4000>;
                 interrupts = <GIC_SPI 584 IRQ_TYPE_LEVEL_HIGH>;
                 clocks = <&gcc GCC_QUPV3_WRAP2_S2_CLK>;
                 clock-names = "se";
                 interconnects = <&clk_virt MASTER_QUP_CORE_2 QCOM_ICC_TAG_ALWAYS
                         &clk_virt SLAVE_QUP_CORE_2 QCOM_ICC_TAG_ALWAYS>,
                         <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS
                         &config_noc SLAVE_QUP_2 QCOM_ICC_TAG_ALWAYS>,
                         <&aggre2_noc MASTER_QUP_2 QCOM_ICC_TAG_ALWAYS
                         &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
                 interconnect-names = "qup-core",
                         "qup-config",
                         "qup-memory";
                 power-domains = <&rpmhpd SA8775P_CX>;
                        dmas = <&gpi_dma2 0 2 QCOM_GPI_SPI>,
                        <&gpi_dma2 1 2 QCOM_GPI_SPI>;
                        dma-names = "tx", "rx";
                 address-cells = <1>;
                 #size-cells = <0>;   qcom,load-firmware;   xfer-mode = <1>;
                 status = "disabled";
                           };
        Copy to clipboard
5. 加载 GPI 固件。

        gpi_dma2: qcom,gpi-dma@800000  {		#dma-cells = <3>;		compatible = "qcom,sm6350-gpi-dma";		reg = <0x0 0x00800000 0x0 0x60000>;		interrupts = <GIC_SPI 588 IRQ_TYPE_LEVEL_HIGH>,		     <GIC_SPI 589 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 590 IRQ_TYPE_LEVEL_HIGH>,	     <GIC_SPI 591 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 592 IRQ_TYPE_LEVEL_HIGH>,		     <GIC_SPI 593 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 594 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 595 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 596 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 597 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 598 IRQ_TYPE_LEVEL_HIGH>,			     <GIC_SPI 599 IRQ_TYPE_LEVEL_HIGH>;		dma-channels = <12>;		dma-channel-mask = <0xfff>;
        iommus = <&apps_smmu 0x5b6 0x0>;
        qcom,load-firmware;
        xfer-mode = <3>;		status = "disabled";	};
        Copy to clipboard

Last Published: Apr 16, 2026