跳转至

defconfig 配置指南

1. 文档说明

本文档面向需要在 Comake D3 板 上定制自己 defconfig 的客户,说明如何以 D3 标准 defconfig 为基准,按模块(USB、以太网、存储、显示、音频、串口等)修改内核配置、设备树(DTS)与 Padmux。

本文只讲"需要配置什么、在哪里、怎么改",不展开原理。每个模块给出:内核 defconfig 项、DTS 节点(先完整引用原文,再列可改项)、Padmux 项,并在关键处区分 linux(Pure Linux)与 debian 两套体系的差异。

配置信息:

  • 芯片:mhera(D3 为板型/产品代号)
  • 板型:D3(project/board/mhera/D3/
  • 架构:ARM64,内核 6.1
  • 存储:eMMC,文件系统 ext4
  • 内存:4096MB(DDR,LPDDR4X)
  • 两个标准 defconfig 变体:linux-(Pure Linux)与 debian-

配置层次(一次 make defconfig 会串联起以下全部文件):

Project Defconfig
    ├── linux:  project/configs/demo/defconfigs/linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig
    ├── debian: project/configs/demo/defconfigs/debian-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig
    ├── CONFIG_KERNEL_CONFIG      → Kernel Defconfig
    ├── CONFIG_UBOOT_CONFIG       → U-Boot Defconfig
    ├── CONFIG_IMAGE_CONFIG       → 分区表 config
    ├── CONFIG_SDK_GENERIC_CONFIG → SDK Generic Defconfig
    ├── CONFIG_BOARD="D3"         → project/board/mhera/D3/config/ (板级 json)
    └── (屏参)                     → project/board/mhera/screen_param/config_disp.json
Kernel Defconfig (kernel/arch/arm64/configs/)
    ├── linux:  mhera_comake_d3_linux_emmc_defconfig → CONFIG_SGS_DTB_NAME="mhera-comake-d3-purelinux"
    └── debian: mhera_comake_d3_debian_emmc_defconfig → CONFIG_SGS_DTB_NAME="mhera-comake-d3-debian"
Device Tree (kernel/arch/arm64/boot/dts/sgs/)
    ├── mhera-comake-d3-purelinux.dts   (linux 板级)
    ├── mhera-comake-d3-debian.dts      (debian 板级)
    ├── mhera.dtsi                      (SoC 级节点)
    ├── mhera-display-subsystem.dtsi    (显示子系统)
    ├── mhera-comake-d3-padmux.dtsi     (Padmux,linux/debian 共用)
    └── panel-*.dtsi                    (屏参数)

2. 快速上手(改配置总流程)

2.1. 定制起点:从标准 defconfig 派生出你自己的

  1. 选变体:确定用 linux-(Pure Linux)还是 debian-(两者显示框架不同,见第 3 章)。
  2. 复制改名:新板子的配置分散在 project / kernel / boot / dts 四处,都要从 D3 拷贝一份并改成自己的板名(以 myboard 为例):

    # ① project defconfig(project/configs/demo/defconfigs/)
    cd project/configs/demo/defconfigs
    cp linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig \
       linux-myboard_mhera.emmc.glibc-12.4.0-arm64-ext4.myboard.4096.fccsp16_lpddr4x_defconfig
    
    # ② kernel defconfig(kernel/arch/arm64/configs/)
    cd kernel/arch/arm64/configs
    cp mhera_comake_d3_linux_emmc_defconfig mhera_myboard_linux_emmc_defconfig
    
    # ③ kernel dts(kernel/arch/arm64/boot/dts/sgs/):板级 dts + padmux
    cd kernel/arch/arm64/boot/dts/sgs
    cp mhera-comake-d3-purelinux.dts mhera-myboard-purelinux.dts      # debian 用 -debian.dts
    cp mhera-comake-d3-padmux.dtsi   mhera-myboard-padmux.dtsi
    
    # ④ u-boot(boot/configs/ 与 boot/arch/arm/dts/)
    cd boot
    cp configs/mhera_comake_d3_emmc_arm64_defconfig configs/mhera_myboard_emmc_arm64_defconfig
    cp arch/arm/dts/mhera-comake-d3.dts        arch/arm/dts/mhera-myboard.dts
    cp arch/arm/dts/mhera-comake-d3-padmux.dtsi arch/arm/dts/mhera-myboard-padmux.dtsi
    
    # ⑤ 板级配置目录(project/board/mhera/)
    cd project/board/mhera
    cp -r D3 myboard    # 内含 config_board.json / config_fb.json 等
    
  3. 改名与指向

    • ① 中把 CONFIG_BOARD="D3" / CONFIG_BOARD_NAME="D3" 改成你的板名,CONFIG_KERNEL_CONFIG 指向 ② 的新 defconfig,CONFIG_UBOOT_CONFIG 指向 ④ 的新 defconfig;
    • ② 中把 CONFIG_SGS_DTB_NAME="mhera-comake-d3-purelinux" 改成 ③ 的新 dts 名(不含扩展名);
    • ④ 的 uboot defconfig 中把 CONFIG_DEFAULT_DEVICE_TREE="mhera-comake-d3" 改成新 dts 名。
  4. 按模块改配置:对照下方速查表和正文各章,改 kernel defconfig / DTS / Padmux / 板级 json。

  5. 编译cd project && make linux-myboard_mhera.emmc.glibc-12.4.0-arm64-ext4.myboard.4096.fccsp16_lpddr4x_defconfig && make clean && make image -j16

2.2. 常见需求速查表

我想… 看第几章 主要改哪里
换 MIPI/HDMI 屏、改分辨率 第 3 章 屏参见官方屏参配置指南;DTS/padmux 见第 3 章
开以太网(GMAC) 第 4 章 已启用(SGS_GMAC 默认 y),改 DTS phy-mode/max-speed
用 U 盘 / USB 摄像头 / USB 串口 第 5 章 kernel defconfig(UVC 摄像头仅 debian)
接 SATA 硬盘 第 6 章 已启用,只改 DTS 速率/去加重
用 PCIe 设备 第 7 章 已启用,只改 lane/速率
eMMC/SD 切换速率模式 第 8 章 DTS bus-width / mmc-hs200
调串口(波特率/流控/映射) 第 9 章 DTS sctp_enable / aliases + padmux
用 SPI 设备 第 10 章 kernel CONFIG_SGS_MSPI +(SPI_SPIDEV/SGS_SPI_DEVICE 二选一)+ DTS spidev 子节点
加 I2C 传感器 第 11 章 DTS speed + i2c 子节点
调背光/风扇 PWM 第 12 章 DTS period/duty_cycle + padmux
放音频 / 录音(I2S/DMIC) 第 13 章 DTS sound 节点 + padmux
用 GPIO 做控制 第 14 章 padmux PINMUX_FOR_GPIO_MODE + pad_init
调内存分配(MMA/CMA/FB) 第 15 章 详见第 15 章

3. 显示输出(MIPI DSI + HDMI)

本章涉及文件mhera-comake-d3-purelinux.dts / mhera-comake-d3-debian.dts(板级)、mhera-display-subsystem.dtsipanel-*.dtsi(屏参内容详见官方屏参配置指南)、mhera-comake-d3-padmux.dtsiconfig_disp.json(屏参,同上外链)、config_board.json(选屏,同上外链)。

D3 板显示为 MIPI DSI 4-lane(RM68200 720×1280)+ HDMI(DACOUT_1080P_60),无 DPI/TTL 屏。

3.1. 内核配置

✅ 标准 defconfig 已包含显示框架,无需改动。

配置项 linux debian 说明
CONFIG_FB=y framebuffer 框架
CONFIG_DRM=y DRM 框架(debian)
CONFIG_SGS_DRM=y SGS DRM 驱动(debian)

3.2. DTS 配置

① 板级 DTS(linux:mhera-comake-d3-purelinux.dts

显示部分无特别配置,触摸默认使用 goodix 触摸 IC(purelinux 走 FB/mi_disp 体系,不涉及 display-subsystem 拓扑):

/* GT911 电容触摸(I2C1) */
&i2c1 {
    goodix_gt911@5d {
        compatible = "goodix,gt911";
        reg = <0x5D>;
        reset = <PAD_GPIO17>;
        irq = <PAD_GPIO18>;
        // ...
    };
};

可改项(linux 板级 DTS):

含义 取值
drive-current-level 面板驱动电流档位 整数
u8Channel MIPI 通道选择 0=Reserved 1=mipi_tx1 2=mipi_tx2
eLaneNum MIPI lane 数 整数(D3 为 4)
u8PolCh0~4 各 lane 极性 0/1
u8SwapCh0~4 各 lane 交换序号 按实际面板接线

② 板级 DTS(debian:mhera-comake-d3-debian.dts

在 linux 版基础上,增加 DRM 显示拓扑:HDMI→disp0、MIPI→disp1,用 /delete-node/ 删除不用的 endpoint(DRM 要求一对一连接):

/ {
    /* ... */

    display-subsystem {
        panels {
            panel_misc {
                drive-current-level = <1>;          // 可改
                mipi-lane-config {
                    u8Channel = <1>;                    // 可改
                    eLaneNum = <4>;                     // 可改
                    u8PolCh0 = <0>;                     // 可改
                    u8PolCh1 = <0>;                     // 可改
                    u8PolCh2 = <0>;                     // 可改
                    u8PolCh3 = <0>;                     // 可改
                    u8PolCh4 = <0>;                     // 可改
                    u8SwapCh0 = <2>;                    // 可改
                    u8SwapCh1 = <0>;                    // 可改
                    u8SwapCh2 = <1>;                    // 可改
                    u8SwapCh3 = <3>;                    // 可改
                    u8SwapCh4 = <4>;                    // 可改
                };
            };
        };
    };
};

/* DPI: not used on D3 */
&disp0 {
    port {
        /delete-node/ endpoint@0; /* disp0_out_dpi */
    };
};

&disp1 {
    port {
        /delete-node/ endpoint@0; /* disp1_out_dpi */
    };
};

&dpi_dev {
    ports {
        /delete-node/ port@0; /* disconnect dpi_in_disp0/dpi_in_disp1 */
    };
};

/* MIPI: only disp1 drives the MIPI panel — disconnect disp0 */
&disp0 {
    port {
        /delete-node/ endpoint@1; /* disp0_out_mipi */
    };
};

&{/display-subsystem/drm-device/mipi_dsi} {
    ports {
        port@0 {
            /delete-node/ endpoint@0; /* mipi_in_disp0 */
        };
    };
};

/* HDMI: only disp0 drives HDMI output — disconnect disp1 */
&disp1 {
    port {
        /delete-node/ endpoint@2; /* disp1_out_hdmi */
    };
};

&{/display-subsystem/drm-device/hdmi} {
    ports {
        port@0 {
            /delete-node/ endpoint@1; /* hdmi_in_disp1 */
        };
    };
};

可改项(debian 板级 DTS 增量):

含义 取值
/delete-node/ 断开方式 DPI 通道删除 D3 无 DPI 屏,保持删除
debian 的 disp↔通道配对 HDMI 固定 disp0、MIPI 固定 disp1 改 topology 时同步增删对应 endpoint

③ 显示子系统(mhera-display-subsystem.dtsi:仅 debian(DRM)使用;purelinux 完全不走 DRM 体系,此文件中与 DRM 相关的部分不生效:

/ {
    display-subsystem {
        compatible = "sgs,display-subsystem","simple-mfd";

        drm-device {
            compatible = "sgs,drm","simple-mfd";   // 仅 debian

            disp0: port@0 {
                dev-id = <0>;
                preferred = <1>;              // 可改
                mop-layers = <4 0 32                // 可改(图层配置)
                              3 0 1
                              3 1 1>;
                port {
                    disp0_out_dpi: endpoint@0 { remote-endpoint = <&dpi_in_disp0>; };    // 可改(换屏时改指向)
                    disp0_out_mipi: endpoint@1 { remote-endpoint = <&mipi_in_disp0>; };   // 可改(换屏时改指向)
                    disp0_out_hdmi: endpoint@2 { remote-endpoint = <&hdmi_in_disp0>; };   // 可改(换屏时改指向)
                };
            };

            /* ... */
            dpi_dev: dpi {
                compatible = "sgs,dpi";
                status = "okay";      // 可改
                /* ... */
            };

            mipi_dsi {
                compatible = "sgs,mipi-dsi";
                status = "okay";   // 可改
                /* ... */
            };

            hdmi {
                compatible = "sgs,hdmi";
                status = "okay";     // 可改
                /* ... */
            };
        };

        drmscl { rdma-support = <0>; rot-support = <1>; rdmaid = <1>; sclid = <0x2>; };

        panels: panels {
            compatible = "simple-mfd";
            backlight_dev1: backlight_dev1 { };
            panel_misc: panel_misc { };
            panel_misc_edp: panel_misc_edp { };
        };

        bridges: bridges { };
    };
};

#include "panel-SAT070AT50H18BH.dtsi"
#include "panel-RM68200HDH40145.dtsi"

可改项(仅 debian 生效):

含义 取值
disp0/disp1mop-layers 图层配置 <layerType subType winCount ...>
dpi/mipi_dsi/hdmistatus 通道使能 "okay" / "disabled"
endpointremote-endpoint 面板接到哪条通道 换屏时改
panels 里的 backlight_dev1 背光控制 配合 PWM

其余(compatibleregdev-id、各 #*-cells)为固定值,勿改。

3.3. Padmux 配置(mhera-comake-d3-padmux.dtsi

MIPI DSI 4-lane + I2C1#if 1):

<PAD_OUTP_TX0_CH0  PINMUX_FOR_MIPITX_OUT_MODE_1  MDRV_PUSE_TX_MIPI_P_CH0>,
<PAD_OUTN_TX0_CH0  PINMUX_FOR_MIPITX_OUT_MODE_1  MDRV_PUSE_TX_MIPI_N_CH0>,
/* CH1~CH4 同理,共 4 lane */
<PAD_I2C1_SCL      PINMUX_FOR_I2C1_MODE_1        MDRV_PUSE_I2C1_SCL>,
<PAD_I2C1_SDA      PINMUX_FOR_I2C1_MODE_1        MDRV_PUSE_I2C1_SDA>,

HDMI TX#if 1):

<PAD_HDMITX_HPD  PINMUX_FOR_GPIO_MODE    MDRV_PUSE_HDMI_HOT_PLUG>,
<PAD_HDMITX_SCL  PINMUX_FOR_I2C0_MODE_1  MDRV_PUSE_HDMI_RX_SCL>,
<PAD_HDMITX_SDA  PINMUX_FOR_I2C0_MODE_1  MDRV_PUSE_HDMI_RX_SDA>,

对应原理图:

MIPI DSI Padmux 原理图

图 3-1 MIPI DSI Padmux 原理图

HDMI Padmux 原理图

图 3-2 HDMI Padmux 原理图

3.4. 屏参配置

屏参(面板时序、config_disp.jsonconfig_board.json 选屏等)的详细配置方法 不在本文档展开,请参考官方文档:

Comake 屏参配置指南

3.5. 验证命令

ls /dev/fb*                          # 预期:看到 fb0/fb1(linux)
ls /sys/class/drm/                   # 预期:看到 card0 等(debian)
cat /proc/mi_modules/mi_disp/mi_disp0   # 预期:回读屏参(linux)

3.6. 相关链接


4. 以太网(GMAC0 / GMAC1)

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(gmac0/gmac1)、mhera-comake-d3-padmux.dtsi(RGMII/RMII 块)。

D3 支持双千兆 GMAC(GMAC0/1,RGMII 接 Gphy / RMII 接 Ephy)。

4.1. 内核配置

✅ 标准 defconfig 已启用 GMAC:CONFIG_SGS_GMAC 在内核 Kconfig 里 default y,并自动 select STMMAC_ETH,无需手动添加。(debian/linux 差异:无)

如需显式控制(或编译成 sgs_gmac.ko 模块),可显式写:

CONFIG_SGS_GMAC=y          # SGS GMAC 驱动(default y)
CONFIG_STMMAC_ETH=y        # 由 SGS_GMAC 自动 select

4.2. DTS 配置(mhera.dtsi

节点示例(固定项已省略):

#if IS_ENABLED(CONFIG_SGS_GMAC)
        gmac0: gmac0 {
            compatible = "sgs,gmac","snps,dwmac-5.10a";
            // ...
            reset-io = /bits/ 8 <PAD_RGMII0_RSTN>;   // 可改:PHY 复位脚
            mclk = /bits/ 8 <25>;                    // 可改:0 不出 / 25:25MHz / 50:50MHz
            disable-txfc = /bits/ 8 <1>;             // 可改:1 关流控 / 0 开流控
            snps,tso;                                // 可改:注释该行则关 TSO
            phy-mode = "rgmii";                       // 可改:rgmii / rmii
            max-speed = <1000>;                       // 可改:10 / 100 / 1000
            status = "ok";                            // 可改

            /* ... */
        };
        /* gmac1 结构相同:reg=0x1F34B400,reset-io=<PAD_RGMII1_RSTN>,phy-handle=<&phy1> */
#endif

可改项:

含义 取值
phy-mode PHY 接口 "rgmii" / "rmii"
max-speed 最大速率 10 / 100 / 1000
mclk 是否输出时钟给 PHY 0=不输出 25=25MHz 50=50MHz
reset-io PHY 复位脚 PAD_RGMII0_RSTN
disable-txfc 关闭硬件流控 1=关闭 0=开启
snps,tso 使能 TSO 注释该行则关闭
status 使能 "ok" / "disabled"

4.3. Padmux 配置

GMAC0/1 的 RGMII 已 #if 1,RMII 为 #if 0(二选一,改接口时切换):

  • RGMII(默认)PAD_RGMII0_RSTN(GPIO)、PAD_RGMII0_MCLK/RXCLK/RXCTL/RXD0~3/TXCLK/TXCTL/TXD0~3/MDIO/MDC,PUSE 为 MDRV_PUSE_ETH0_*
  • RMII(备选)PAD_RGMII0_RXCLK/RXCTL/RXD0~1/TXCTL/TXD0~1/MDIO/MDCPINMUX_FOR_RMII0_MODE_1

对应原理图:

GMAC Padmux 原理图

图 4-1 GMAC Padmux 原理图

4.4. 验证命令

ifconfig -a        # 预期:出现 eth0/eth1

4.5. 相关链接


5. USB

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(ehci/dwc3)、mhera-comake-d3-padmux.dtsi(VBUS 检测)。

mhera 支持 4 个 USB 口:2 个 USB2.0 host-only,2 个 USB3.0(Port2/Port3,可 host/device)。标准 D3 defconfig 已启用。

5.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian 额外:USB 串口、UVC 摄像头,见下方说明)

CONFIG_USB=y
CONFIG_USB_XHCI_HCD=m              # USB3.0 host (xhci-hcd.ko)
CONFIG_USB_EHCI_HCD=m              # USB2.0 host (ehci-hcd.ko)
CONFIG_USB_STORAGE=m               # U 盘
CONFIG_SGS_USB_DWC3_OF_SIMPLE=m    # DWC3 glue (sgs-dwc3-of-simple.ko)
CONFIG_SGS_USB3_PHY=m              # USB3 PHY (sgs-usb3-phy.ko)
CONFIG_SGS_USB2_PHY=m              # USB2 PHY (sgs-usb2-phy.ko)
  • linux 额外:CONFIG_USB_SERIAL=y(USB 串口)、CONFIG_USB_NET_RNDIS_HOST=y
  • debian 额外:CONFIG_USB_SERIAL=m(CH341/CP210X)、CONFIG_USB_VIDEO_CLASS=m(UVC 摄像头)。
  • 如需 USB Device(gadget):加 CONFIG_USB_GADGET=m + 对应 function(configfs/adb/UVC)。D3 标准配置当前以 host 为主。

5.2. DTS 配置(mhera.dtsi

① USB2.0 host(Port0/Port1):节点示例(固定项已省略):

sgs_u2phy1: sgs-usb2-phy1 {
    compatible = "sgs,u2phy";
    // ...
    status = "okay";
};

sgs-ehci-1 {
    compatible = "sgs,ehci";
    // ...
    phys = <&sgs_u2phy1>;
    phy-names = "usb";
    status = "ok";   // 可改
};
/* sgs_u2phy2 + sgs-ehci-2(Port1)结构相同,reg=0x1f286400,port_id=<1> */

可改项:status"ok"/"disabled")。其余(compatible/reg/clocks/interrupts/phys)为固定值。

② USB3.0(Port3,独立 PIPE PHY):节点示例(固定项已省略):

u3phy_p3_utmi: utmi@1f286e00 {
    compatible = "sgs,generic-utmi";
    // ...
    status = "okay";
};

u3phy_p3_pipe: pipe@1f2a5200 {
    compatible = "sgs,generic-pipe";
    // ...
    status = "okay";
};

/* ... */
usb3drd_p3: usb3-p3 {
    compatible = "sgs,generic-dwc3";
    // ...
    usb-phy = <&u3phy_p3_utmi>;
    status = "okay";

    dwc3_p3: dwc3 {
        dr_mode = "host";                 // 可改:host / peripheral
        compatible = "snps,dwc3";
        // ...
        maximum-speed = "super-speed";    // 可改:super-speed / high-speed
        phys = <&u3phy_p3_utmi>, <&u3phy_p3_pipe>;   // 可改:按实际 PHY 改
        phy-names = "usb2-phy", "usb3-phy";          // 可改:与 phys 对应
        // ...
        status = "okay";                  // 可改
    };
};

可改项:

含义 取值
dwc3.dr_mode 模式 "host" 主机 / "peripheral" 设备
dwc3.maximum-speed 最大速率 "super-speed"/"high-speed"
dwc3.phys / phy-names PHY 引用 按实际使用的 PHY 改
usb3drd_p3.status / dwc3.status 使能 "okay"/"disabled"

Port2 与 PCIE0 共用同一 PHY(SUPPHY lane1),默认是"PCIE0 2x + Port2 仅 USB2.0"。要让 Port2 跑 USB3.0 需把 SUPPHY 让给 Port2(disable PCIE0 或降 1x),并改 u3phy_p2_pipe/usb3drd_p2 状态与 phys 引用(节点 u3phy_p2_utmi/u3phy_p2_pipe/usb3drd_p2,结构与 Port3 相同)。其余 compatible/reg/clocks/interrupts/snps,* quirk 等为固定值勿改。

5.3. Padmux 配置

/* USB VBUS 检测 */
<PAD_SAR_GPIO3  PINMUX_FOR_VBUS0_DET_MODE_1  MDRV_PUSE_USB3_VBUS_DETECT>,
<PAD_SAR_GPIO4  PINMUX_FOR_VBUS1_DET_MODE_1  MDRV_PUSE_USB2_VBUS_DETECT>,

对应原理图:

USB Padmux 原理图

图 5-1 USB Padmux 原理图

5.4. 验证命令

lsusb             # 预期:列出 USB 设备
ls /dev/sd*        # 预期:如果有插入U盘出现 sda/sdb

5.5. USB VBUS 设置

USB 口的 VBUS 供电由 USB 驱动自动控制,无需应用层干预,也无需额外 DTS 属性:驱动在 host 控制器初始化时自动到 padmux 表里查找该口的 VBUS 供电 GPIO 并拉高上电,控制器移除/挂起时拉低断电。

因此只需在 mhera-comake-d3-padmux.dtsi 的引脚列表里,为需要控制 VBUS 的口加一行(必须用 GPIO 模式):

<PAD_xxx  PINMUX_FOR_GPIO_MODE  MDRV_PUSE_USBx_VBUS>,
  • PAD_xxx:硬件上接到该 USB 口 VBUS 使能脚的 pad(查原理图)。
  • MDRV_PUSE_USBx_VBUSx 换成 USB 口号(0/½/3)。
  • VBUS **检测**引脚(MDRV_PUSE_USBx_VBUS_DETECT)与供电引脚是两回事,检测已在 5.3 节 配置。

D3 现状mhera-comake-d3-padmux.dtsi 目前只有 VBUS 检测(见 5.3 节),没有 VBUS 供电设计。若某口需要驱动控制 VBUS,按上例补一行即可。注意:

  • 驱动默认 高电平有效(拉高=上电);硬件若低电平有效需改驱动,DTS 层无极性开关。
  • 引脚必须写成 PINMUX_FOR_GPIO_MODE,否则驱动不接管。
  • padmux 为开机静态配置,probe 时自动查表,配好后无需其它操作;同一 pad 勿被多个 pin use 占用。

5.6. 相关链接


6. SATA

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(sataphy/sata)。

D3 支持双 SATA 口(连接硬盘/SSD)。标准 defconfig 已启用。

6.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_SATA_AHCI_PLATFORM=y    # AHCI 平台驱动
CONFIG_SGS_SATA_HOST=y         # SGS SATA 主机控制器

6.2. DTS 配置(mhera.dtsi

节点示例(固定项已省略):

sgs_sataphy: sgs-sata-phy {
    compatible = "sgs,sataphy";
    // ...
    phy_mode = <2>;                            // 可改:0=GEN1 1=GEN2 2=GEN3
    tx_ssc_mode = <0>;                         // 可改:0=关 1=开
    tx_gen1_gen2_Vpp = <0xFF>,<0xFF>;          // 可改:0xFF=默认
    tx_gen3_de_emphasis = <0xFF>,<0xFF>,<0xFF>;// 可改:0xFF=默认
    rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>;          // 可改:0xFF=默认
    rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>;          // 可改:0xFF=默认
    rx_eq_ctle = <0xFF>;                       // 可改:0xFF=默认
    status = "ok";                          // 可改
};

sata {
    compatible = "sgs,sata";
    // ...
    phys = <&sgs_sataphy>;
    fbs_mode;                 // 可改(加即开)
    //sata_acp;               // 可改(加即开)
    //dma-coherent;           // 可改(加即开)
};
/* sgs_sata1phy + sata1(Port1)结构相同,reg 用 0x1F288* / 0x1F346A00 */

可改项:

含义 取值
phy_mode PHY 速率 0=GEN1 1=GEN2 2=GEN3
tx_ssc_mode 扩频时钟 0=关 1=开
tx_gen1_gen2_Vpp GEN1/GEN2 电压摆幅 0xFF=默认
tx_gen3_de_emphasis GEN3 去加重 <enable>,<db>,<level>0xFF=默认
rx_eq_rs1/rs2/ctle 接收均衡参数 0xFF=默认
fbs_mode FIS-Based Switching 加即开
sata_acp / dma-coherent ACP / DMA 一致性 加即开
status 使能 "ok" / "disabled"

compatible/reg/reg-names/interrupts/clocks/phys 为固定值勿改。

6.3. Padmux

SATA 无需额外 padmux(其 GPIO 复用于 DMIC,见音频章节)。

对应原理图:

SATA 原理图

图 6-1 SATA 原理图

6.4. 验证命令

ls /dev/sd*        # 预期:硬盘出现 sda

6.5. 相关链接


7. PCIe

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(pcie0/pcie1)、mhera-comake-d3-padmux.dtsi(PCIE1_PERST)。

D3 支持 PCIe RC/EP/热插拔。标准 defconfig 已启用。

7.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_PCI=y
CONFIG_SGS_PCIE_HOST=y
CONFIG_SGS_PCIE_EP=y
CONFIG_SGS_PCIE_HOTPLUG=y

7.2. DTS 配置(mhera.dtsi

节点示例(pcie0 为例,固定项已省略):

pcie0: pcie@1F356000 {
    compatible = "sgs,dw-pcie-earlyparam"; /* [rc]"sgs,dw-pcie" [ep]"sgs,dw-pcie-ep" */
    // ...
    device_type = "pci";
    bus-range = <0x00 0xff>;        // 可改:总线号范围

    /* ... */

    linux,pci-domain = <0>;
    num-lanes = <2>;                // 可改:1 / 2
    max-link-speed = <2>;           // 可改:1=Gen1 2=Gen2
    // ...
    dma_read_channel_number = <8>;  // 可改:DMA 读通道数
    dma_write_channel_number = <8>; // 可改:DMA 写通道数
    clk_source = <0>;               // 可改:0=internal 1=internal_2 2=external 3=wire
    //ssc_enable;
    status = "okay";            // 可改
};
/* pcie1 结构相同:portid=<1>,reg 0x1f35a000,linux,pci-domain=<1> */

可改项:

含义 取值
num-lanes 链路宽度 1 / 2
max-link-speed 最大链路速率 1=Gen1 2=Gen2
clk_source 时钟源选择 0=internal 1=internal_2 2=external 3=wire
bus-range / ranges 总线号/地址映射 按实际配置
dma_read/write_channel_number DMA 通道数 默认 8
status 使能 "okay" / "disabled"

注意:PCIE0 与 USB Port2 共享 SUPPHY(见 USB 章节),若要 Port2 跑 USB3.0 需在此 disable PCIE0 或降 1x。D3 板上 I2C2 用作 PCIE0 控制、I2C4 用作 PCIE1 控制(见 I2C 章节)。

7.3. 验证命令

lspci             # 预期:列出 PCIe 设备

7.4. 相关链接


8. eMMC / SD 卡

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(sgs_sdmmc0/1)、mhera-comake-d3-padmux.dtsi(eMMC/SD0 块)。

标准 defconfig 已启用(eMMC 作系统盘,SD 卡作扩展存储)。

8.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_MMC=y
CONFIG_SGS_SDMMC=y
CONFIG_SUPPORT_SD30=y       # SD3.0
CONFIG_SUPPORT_EMMC50=y     # eMMC5.0

8.2. DTS 配置(mhera.dtsi

节点示例(固定项已省略):

#if IS_ENABLED(CONFIG_SGS_SDMMC)
        // emmc
        sgs_sdmmc0: sgs_sdmmc0 {
            compatible = "sgs,sdmmc";
            bus-width = <8>;                    // 可改:8 / 4 / 1
            max-frequency = <200000000>;        // 可改:Hz
            non-removable;
            //broken-cd;
            cap-mmc-highspeed;
            mmc-hs200-1_8v;
            mmc-hs400-1_8v;
            //mmc-hs600-1_8v;
            no-sdio;
            no-sd;
            // ...
            clk-driving = <0xffffffff>;         // 可改:0xffffffff=默认
            cmd-driving = <0xffffffff>;         // 可改:0xffffffff=默认
            data-driving = <0xffffffff>;         // 可改:0xffffffff=默认
            en-clk-phase = /bits/ 8 <0>;        // 可改:相位 tuning
            rx-clk-phase = <0>;                 // 可改:0~3
            tx-clk-phase = <0>;                 // 可改:0~3
            status = "ok";
        };

        // sd
        sgs_sdmmc1: sgs_sdmmc1 {
            compatible = "sgs,sdmmc";
            bus-width = <4>;                    // 可改:4 / 1
            max-frequency = <200000000>;        // 可改:Hz
            cap-sd-highspeed;                    // 可改(加即开)
            sd-uhs-sdr104;                     // 可改(加即开)
            cap-sdio-irq;                        // 可改(加即开)
            no-mmc;
            // ...
            pwr-pad = <PAD_SD0_GPIO0>;          // 可改:电源脚
            cdz-pad = <PAD_SD0_CDZ>;            // 可改:卡检测脚
            pwr-on-delay = <1>;                 // 可改:ms
            pwr-off-delay = <30>;               // 可改:ms
            clk-driving = <1>;                  // 可改
            cmd-driving = <1>;                  // 可改
            data-driving = <1>;                // 可改
            en-clk-phase = /bits/ 8 <0>;        // 可改:相位 tuning
            rx-clk-phase = <0>;                 // 可改:0~3
            tx-clk-phase = <0>;                 // 可改:0~3
            status = "ok";
        };
#endif

可改项:

含义 取值
bus-width 总线宽度 eMMC 8 / SD 4(或 1
max-frequency 最大时钟 数值(Hz)
cap-mmc-highspeed / cap-sd-highspeed 高速模式 加即开
mmc-hs200-1_8v / mmc-hs400-1_8v / mmc-hs600-1_8v eMMC 高速模式 加即开(需对应 CONFIG)
sd-uhs-sdr50 / sd-uhs-sdr104 / sd-uhs-ddr50 SD UHS 速率 加即开
non-removable / broken-cd 不可移除/无卡检测 加即开
no-sd / no-sdio / no-mmc 禁用协议 按卡类型选
cap-sdio-irq SDIO 中断模式 加即开
pwr-pad / cdz-pad 电源/卡检测脚 <PAD_xxx>
fake-cdz / rev-cdz 卡检测方式 0/1
pwr-on-delay / pwr-off-delay 上下电延时 ms
sdio-use-1bit SDIO 用 1bit 0/1
clk-driving / cmd-driving / data-driving 各信号驱动能力 档位,0xffffffff=默认
en-clk-phase / rx-clk-phase / tx-clk-phase 四相位 tuning 0/10~3
en-eight-phase / rx-eight-phase / tx-eight-phase 八相位 tuning 0/1
status 使能 "ok" / "disabled"

8.3. Padmux 配置

  • eMMC(8bit)PAD_EMMC_D0~D7 / PAD_EMMC_CLK / PAD_EMMC_CMD / PAD_EMMC_DS / PAD_EMMC_RSTN,用 PINMUX_FOR_EMMC_8B_MODE_1
  • SD 卡PAD_SD0_D0~D3 / PAD_SD0_CLK / PAD_SD0_CMDPINMUX_FOR_SD0_MODE_1PAD_SD0_GPIO0(电源,GPIO 模式)、PAD_SD0_CDZ(卡检测,PINMUX_FOR_SD0_CDZ_MODE_1)。

对应原理图:

eMMC / SD 卡原理图

图 8-1 eMMC / SD 卡原理图

8.4. 验证命令

ls /dev/mmcblk*        # 预期:mmcblk0(eMMC)、mmcblk1(SD)

8.5. 相关链接


9. UART

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(fuart/uart0~3 + aliases)、mhera-comake-d3-padmux.dtsi(FUART/UART½/3 块)。

控制台为 uart0console=ttyS0);另有 FUART(4 线,硬件流控,ttyS2)、UART½/3。标准 defconfig 已启用。

9.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_SGS_UART=y
CONFIG_SGS_URDMA_TXFIFO=y

9.2. DTS 配置(mhera.dtsi

节点示例(fuart + uart0 为例,其余结构相同,固定项已省略):

fuart: fuart@1F220400 {
    compatible = "sgs,uart";
    // ...
    sctp_enable = <0>;        // 可改:硬件 CTS/RTS 流控(仅 FUART)
    digmux = <1>;             // 固定(各 uart 不可重复)
    rx_fifo_level = <0>;      // 可改:0~3
    tx_fifo_level = <0>;      // 可改:0~3
    status = "okay";         // 可改
};

uart0: uart0@1F221000 {
    compatible = "sgs,uart";
    // ...
    digmux = <0>;             // 固定(各 uart 不可重复)
    dma-enable;               // 可改(加即开)
    rx_fifo_level = <0>;      // 可改:0~3
    tx_fifo_level = <0>;      // 可改:0~3
    status = "okay";         // 可改
};
/* uart1/uart2/uart3 结构相同,reg 分别为 0x1F221200/0x1F221400/0x1F221600 */

别名(决定 /dev/ttySN 映射):

aliases {
    console = &uart0;   /* 控制台 = /dev/ttyS0 */
    serial0 = &uart0;
    serial1 = &uart1;   /* ttyS1 */
    serial2 = &fuart;   /* ttyS2 */
    serial3 = &uart2;   /* ttyS3 */
    serial4 = &uart3;   /* ttyS4 */
};

可改项:

含义 取值
dma-enable 使能 DMA 模式 加即开
sctp_enable 硬件 CTS/RTS 流控(仅 FUART) 1=开 0=关
rx_fifo_level 接收中断水位 0=1字符 1=¼满 2=½满 3=差2满
tx_fifo_level 发送中断水位 0=空 1=2字符 2=¼满 3=½满
status 使能 "okay" / "disabled"

digmux(各 uart 值不可重复)、compatible/reg/interrupts/clocks 为固定值勿改。

9.3. Padmux 配置

  • FUART(4 线)#if 1):PAD_FUART_TX/RX/RTS/CTSPINMUX_FOR_FUART_MODE_1
  • UART1(金手指,#if 1):PAD_UART1_TX/RXPINMUX_FOR_UART1_MODE_1
  • UART2(金手指,#if 1):PAD_UART2_TX/RXPINMUX_FOR_UART2_MODE_1
  • UART3(复用 HSYNC/VSYNC 引脚,#if 1):PAD_HSYNC/PAD_VSYNCPINMUX_FOR_UART3_MODE_4

对应原理图:

UART Padmux 原理图

图 9-1 UART Padmux 原理图

9.4. 验证命令

ls /dev/ttyS*        # 预期:ttyS0 ~ ttyS4

9.5. RS232/485 设置

RS485 与 RS232 都复用 UART 硬件通道,Linux 下统一走 /dev/ttyS* 标准节点。两者的配置差异:

项目 RS485(半双工,多从机总线) RS232(全双工,点对点)
方向控制 需一颗 GPIO 切外部收发器方向,由内核 RS485 框架(serial_rs485 + TIOCSRS485 ioctl)自动完成
DTS 额外配置 rs485-gpios
应用层额外步骤 初始化时 TIOCGRS485/TIOCSRS485 使能内核 RS485 模式
  • RS232:按 9.2 节(节点+别名)与 9.3 节(TX/RX 两线 padmux)配好即可,无额外配置。
  • RS485:在 9.2/9.3 基础上,还需两步:

  • 打开 gpio 节点的 gpio-controller 绑定(默认未声明,rs485-gpios 引用 GPIO 前必须打开):

    &gpio {
        gpio-controller;
        #gpio-cells = <2>;
    };
    
  • 在对应 uart 节点加方向控制 GPIO(第三参数为极性:1=GPIO_ACTIVE_LOW 低电平发送,0=GPIO_ACTIVE_HIGH 高电平发送):

    &uart1 {
        rs485-gpios = <&gpio 43 1>; /* GPIO_ACTIVE_LOW:低=发送,高=接收 */
    };
    
  • 应用层:RS232 直接 open/read/write;RS485 初始化时额外调用一次 TIOCGRS485/TIOCSRS485flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND),方向切换由内核在发/收时自动完成。若没配 rs485-gpiosTIOCSRS485 虽可能执行成功但方向不会切换,会一直停在接收态发不出数据。

示例仅以 UART1(/dev/ttyS1)作 RS485、UART2(/dev/ttyS3)作 RS232;任何 UART 通道都可用同样方式,换设备节点并完成 9.2/9.3 配置即可(RS232 无需 rs485-gpios)。rs485-gpios 里的 43 为示例 GPIO 编号,按实际方向控制脚接线修改。

9.6. 相关链接


10. SPI

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(spi0/spi1)、mhera-comake-d3-padmux.dtsi(SPI0/1 块)。

D3 有 2 组 MSPI(SPI0 用 GPIO8~11,SPI1 用 GPIO12~15,均走金手指)。MSPI 只能作 master;FIFO 模式支持全双工/半双工,DMA 模式仅半双工。标准 defconfig 已启用。

10.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

SPI 分两层:MSPI 控制器驱动(必开)+ 设备驱动(二选一)

# ① 控制器驱动(必开)
CONFIG_SPI=y          # SPI 子系统框架
CONFIG_SGS_MSPI=y     # SGS MSPI 控制器驱动(匹配 DTS compatible="sgs,mspi")
配置项 驱动 DTS 子节点 compatible /dev 节点 使用方式
CONFIG_SPI_SPIDEV=y Linux 标准 spidev "lwn,bk4" spidev<bus>.<cs> 用户态 open/read/write/ioctl,配合 tools/spi/spidev_test
CONFIG_SGS_SPI_DEVICE=y SGS 自研 spidev "sgs,mspidev" ❌ 无 内核态走 drv_mspi.hdrv_mspi_open/read/write/transfer API,Linux/Uboot 通用

二选一,不能同时开启。D3 标准 defconfig 默认开 CONFIG_SPI_SPIDEV(生成 /dev/spidev0.0/dev/spidev1.0 等)。若改用 SGS spidev:关 SPI_SPIDEV、开 SGS_SPI_DEVICE,并把 10.2 节 spidev 子节点的 compatible 改为 "sgs,mspidev"

10.2. DTS 配置(mhera.dtsi

节点示例(spi0 为例):

spi0: spi@1f222000 {
    compatible = "sgs,mspi";
    reg = <0x1F222000 0x200>;
    mspi-group = <0>;                 // 固定(SPI 硬件编号)
    clocks = <&CLK_mspi0>;            // 固定
    interrupts = <GIC_SPI INT_IRQ_MSPI0 IRQ_TYPE_LEVEL_HIGH>;  // 固定
    #address-cells = <1>;             // 固定
    #size-cells = <0>;                // 固定
    dma-enable;                       // 可改:DMA 模式(仅半双工)
    cs-num = <2>;                     // 可改:硬件 CS 数量(0~n-1)
    //cs-auto;                        // 可改:硬件自动片选
    //nohandshake;                    // 可改:DMA 不握手
    cs-setup-fifo = <0>;              // 可改:ns(片选延时,依赖 cs-auto)
    cs-hold-fifo = <0>;               // 可改:ns(依赖 cs-auto)
    cs-setup-dmatx = <0>;             // 可改:ns(依赖 cs-auto)
    cs-hold-dmatx = <0>;              // 可改:ns(依赖 cs-auto)
    cs-setup-dmarx = <0>;             // 可改:ns(依赖 cs-auto)
    cs-hold-dmarx = <0>;              // 可改:ns(依赖 cs-auto)
    //cs-ext = <PAD_UNKNOWN>;         // 可改:额外 GPIO 片选(序号从 cs-num 开始)
    //4to3-mode;                      // 可改:4 线当 3 线
    //clk-out-mode = <27000000>;      // 可改:输出方波时钟
    status = "ok";                    // 可改

#ifdef CONFIG_SPI_SPIDEV
    spidev0@0 { compatible = "lwn,bk4"; spi-max-frequency = <2000000>; reg = <0>; };   // 可改:spidev 设备
    spidev1@1 { compatible = "lwn,bk4"; spi-max-frequency = <2000000>; reg = <1>; };   // 可改:spidev 设备
#endif
};
/* spi1 结构相同:mspi-group=<1>,reg=0x1F222200,中断 INT_IRQ_MSPI1 */

可改项:

含义 取值
dma-enable 使能 DMA 模式 加即开;DMA 仅半双工,全双工传输自动回退 FIFO
nohandshake DMA 不握手(补连续波形) 加即开
cs-num 硬件 CS 数量 整数 n(软件片选 0~n-1)
cs-ext 额外 GPIO 片选 <PAD_xxx>;序号从 cs-num 开始,需在 padmux 配 GPIO 模式
cs-auto 硬件自动片选 加即开(setup/hold 延时依赖它)
cs-setup/hold-fifo fifo 模式片选延时 ns(依赖 cs-auto
cs-setup/hold-dmatx/dmarx dma 模式片选延时 ns(依赖 cs-auto
4to3-mode 4 线当 3 线用 加即开(MSPI 相关引脚不能再复用它途)
clk-out-mode 输出方波时钟(不收发数据) 频率 Hz
status 使能 "ok" / "disabled"
spidev* 子节点 片选设备(标准 spidev) compatible="lwn,bk4" / spi-max-frequency / reg(片选号)
spi_device 子节点 片选设备(SGS spidev,走 drv_mspi.h compatible="sgs,mspidev" / reg(片选号)

mspi-group/compatible/reg/clocks/interrupts/#address-cells/#size-cells 为固定值勿改。

10.3. Padmux 配置

/* SPI0: GPIO8~11 */
<PAD_GPIO8   PINMUX_FOR_MSPI0_MODE_1  MDRV_PUSE_SPI0_DO>,
<PAD_GPIO9   PINMUX_FOR_MSPI0_MODE_1  MDRV_PUSE_SPI0_DI>,
<PAD_GPIO10  PINMUX_FOR_MSPI0_MODE_1  MDRV_PUSE_SPI0_CK>,
<PAD_GPIO11  PINMUX_FOR_MSPI0_MODE_1  MDRV_PUSE_SPI0_CZ>,
/* SPI1: GPIO12~15,PINMUX_FOR_MSPI1_MODE_1,MDRV_PUSE_SPI1_* */

对应原理图:

SPI Padmux 原理图

图 10-1 SPI Padmux 原理图

10.4. 验证命令

ls /dev/spidev*        # 预期:spidev0.0 / spidev0.1 / spidev1.0 / spidev1.1(cs-num=2 时)

/dev 节点数量取决于 cs-num+cs-ext 之和:总片选数为 2 时才会生成 spidev<bus>.1;且仅标准 spidev(SPI_SPIDEV)会生成 /dev 节点,SGS spidev 无 /dev 节点。

10.5. 相关链接


11. I2C

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(i2c04)、mhera-comake-d3-padmux.dtsi(I2C04 块)。

D3 用到 5 组 I2C(I2C0=HDMI DDC、I2C1=面板控制、I2C2=PCIE0、I2C3=通用、I2C4=PCIE1)。标准 defconfig 已启用。

11.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y      # /dev/i2c-N 接口
CONFIG_SGS_I2C=y

11.2. DTS 配置(mhera.dtsi

节点示例(i2c0 为例,固定项已省略):

i2c0: i2c@1f222800 {
    compatible = "sgs,i2c";
    // ...
    dma-enable;               // 可改(加即开)
    group = <0>;              // 固定(I2C 硬件编号)
    speed = <200000>;         // 可改:50kHz~1.5MHz
    //t-su-sta = <0>;         // 可改:时序 ns(非零才生效)
    //t-hd-sta = <0>;          // 可改
    //t-su-sto = <0>;          // 可改
    //t-hd-sto = <0>;          // 可改
    output-mode = <2>;        // 可改:1=开漏 2=开漏+推1T 3=开漏+推多T 4=推挽
    status = "ok";            // 可改
};
/* i2c1~i2c4 结构相同,reg 分别为 0x1F222A00/0x1F222C00/0x1F222E00/0x1F223000 */

可改项:

含义 取值
speed I2C 速率 实际值(如 200000),50kHz~1.5MHz
dma-enable 使能 DMA 模式 加即开
t-su-sta / t-hd-sta / t-su-sto / t-hd-sto 时序(ns) 默认 0,非零才生效
output-mode 输出方式 1=开漏 2=开漏+推1T 3=开漏+推多T 4=推挽
status 使能 "ok" / "disabled"

group(I2C 硬件编号)、compatible/reg/interrupts/clocks/rd-ack-delay 为固定值勿改。

11.3. Padmux 配置

<PAD_HDMITX_SCL  PINMUX_FOR_I2C0_MODE_1  MDRV_PUSE_HDMI_RX_SCL>,  /* I2C0 */
<PAD_HDMITX_SDA  PINMUX_FOR_I2C0_MODE_1  MDRV_PUSE_HDMI_RX_SDA>,
<PAD_I2C1_SCL    PINMUX_FOR_I2C1_MODE_1  MDRV_PUSE_I2C1_SCL>,     /* I2C1 */
<PAD_I2C1_SDA    PINMUX_FOR_I2C1_MODE_1  MDRV_PUSE_I2C1_SDA>,
<PAD_I2C2_SCL    PINMUX_FOR_I2C2_MODE_1  MDRV_PUSE_I2C2_SCL>,     /* I2C2 */
<PAD_I2C2_SDA    PINMUX_FOR_I2C2_MODE_1  MDRV_PUSE_I2C2_SDA>,
<PAD_I2C3_SCL    PINMUX_FOR_I2C3_MODE_1  MDRV_PUSE_I2C3_SCL>,     /* I2C3 */
<PAD_I2C3_SDA    PINMUX_FOR_I2C3_MODE_1  MDRV_PUSE_I2C3_SDA>,
<PAD_I2C4_SCL    PINMUX_FOR_I2C4_MODE_1  MDRV_PUSE_I2C4_SCL>,     /* I2C4 */
<PAD_I2C4_SDA    PINMUX_FOR_I2C4_MODE_1  MDRV_PUSE_I2C4_SDA>,

对应原理图:

I2C Padmux 原理图

图 11-1 I2C Padmux 原理图

11.4. 验证命令

ls /dev/i2c-*        # 预期:i2c-0 ~ i2c-4
i2cdetect -y 0        # 预期:扫描到挂接设备地址

11.5. 相关链接


12. PWM

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(pwm0~3)、mhera-comake-d3-padmux.dtsi(PWM0/½ 块)。

D3 用 PWM0 作 LCD 背光、PWM1 通用、PWM2 风扇。标准 defconfig 已启用。

12.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)

CONFIG_PWM=y

12.2. DTS 配置(mhera.dtsi

节点示例(pwm0 为例,固定项已省略):

pwm0: pwm@0x1F203200 {
    compatible = "sgs,pwm";
    reg = <0x0 0x1F203200 0x40>;
    interrupts = <GIC_SPI INT_IRQ_PWM_GROUP0 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&CLK_pwm>;
    #pwm-cells = <3>;
    channel = <0>;            // 固定(0~3)
    group = <0>;              // 可改:0~3,不配置则不加入
    clk-select = <0>;         // 可改:时钟档位
    status = "ok";            // 可改
};
/* pwm1~pwm3 结构相同,reg 分别为 0x1F203240/0x1F203280/0x1F2032C0,channel 分别为 1/2/3 */

可改项:

含义 取值
clk-select 时钟档位 按速度范围
group 是否加入 group 0/1/2/3,不配置则不加入
period 开机周期 普通精度=Hz,高精度=ns
duty_cycle 开机占空比 普通精度=%,高精度=ns
polarity 开机极性 0=正常 1=反向
status 使能 "ok" / "disabled"

channel(0~3)、compatible/reg/interrupts/clocks 为固定值勿改。

12.3. Padmux 配置

<PAD_PWM0  PINMUX_FOR_PWM0_MODE_1  MDRV_PUSE_PWM0>,   /* LCD 背光 */
<PAD_PWM1  PINMUX_FOR_PWM1_MODE_1  MDRV_PUSE_PWM1>,
<PAD_PWM2  PINMUX_FOR_PWM2_MODE_1  MDRV_PUSE_PWM2>,

对应原理图:

PWM Padmux 原理图

图 12-1 PWM Padmux 原理图

12.4. 相关链接


13. 音频(I2S TX + DMIC)

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(sound 节点)、mhera-comake-d3-padmux.dtsi(I2S0/DMIC/AMP 块)。

D3 支持 I2S0 TX 音频输出(功放)与 DMIC 数字麦克风输入。标准 defconfig 已启用音频框架。

13.1. 内核配置

✅ 标准 defconfig 已包含,无需改动。(debian 额外:CONFIG_SND_USB_AUDIO

CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SGS_SND_SOC=y
CONFIG_SND_SOC_SGS_DUMMY_CODEC=y

13.2. DTS 配置(mhera.dtsisound 节点)

节点示例(固定项已省略):

sound {
    compatible = "sgs,audio";
    // ...
    amp-pad = <PAD_UNKNOWN 1 PAD_UNKNOWN 1 PAD_UNKNOWN 1 PAD_UNKNOWN 1>;  // 可改:功放引脚电平

    /* ... */
    i2s-tx0-tdm-mode    = <1>;   // 可改:1:master 2:slave
    i2s-tx0-tdm-fmt     = <1>;   // 可改:1:i2s 2:left justified
    i2s-tx0-tdm-wiremode = <2>;  // 可改:1:4wire 2:6wire
    i2s-tx0-channel  = <2>;      // 可改:通道数
    i2s-tx0-soundbar-mode = <1>; // 可改:0:OFF 1:ON
    // ...

    // DMIC 时钟模式
    /* 0:not select 1:(8k,600kHz) 2:(8k,1200kHz) ... b:(48k,4800kHz) */
    dmic-bck-mode = <3 6 8 10>;         // 可改
    dmic-bck-ext-mode = <0>;    // 可改:0=内部 1=I2S RX BCK

    // HPF <switch cutoffHz>
    hpf-adc1-level = <1 20>;    // 可改:<开关 截止Hz>
    hpf-dmic-level = <1 20>;   // 可改:<开关 截止Hz>

    keep-adc-power-on = <0>;   // 可改:0/1
    keep-dac-power-on = <0>;   // 可改:0/1
    status = "okay";           // 可改
};

可改项:

含义 取值
i2s-tx0/rx0-tdm-mode 主/从 1=master 2=slave
i2s-tx0/rx0-tdm-fmt 格式 1=i2s 2=left justified
i2s-tx0/rx0-tdm-wiremode 线数 1=4wire 2=6wire
i2s-tx0/rx0-channel 通道数 整数
i2s-tx0/rx0-tdm-ws-pgm/width/inv/bck-inv WS/BCK 可编程/宽度/反相 见注释
i2s-tx0-tdm-active-slot 有效 slot bitN→slotN
dmic-bck-mode DMIC 时钟模式 0~b(见注释表)
dmic-bck-ext-mode DMIC 时钟源 0=内部 1=I2S RX BCK
hpf-adc1-level / hpf-dmic-level 高通滤波 <switch cutoffHz>
amp-pad 功放引脚电平 <PAD 1 PAD 1 ...>
keep-adc/dac-power-on 常开电源 0/1
status 使能 "okay"/"disabled"

compatible/interrupts/clocks/各 *-padmux 值为固定值勿改。

13.3. Padmux 配置

/* I2S0 TX 4 线 */
<PAD_I2S0_MCLK  PINMUX_FOR_I2S0_MCLK_MODE_1  MDRV_PUSE_I2S0_MCK>,
<PAD_I2S0_TX_SDO PINMUX_FOR_I2S0_TX_MODE_1   MDRV_PUSE_I2S0_TX_SDO>,
<PAD_I2S0_TX_WCK PINMUX_FOR_I2S0_TX_MODE_1   MDRV_PUSE_I2S0_TX_WCK>,
<PAD_I2S0_TX_BCK PINMUX_FOR_I2S0_TX_MODE_1   MDRV_PUSE_I2S0_TX_BCK>,
/* DMIC(8CH 模式) */
<PAD_PM_GPIO1   PINMUX_FOR_DMIC_8CH_MODE_1  MDRV_PUSE_DMIC0_CLK>,
<PAD_PM_GPIO6   PINMUX_FOR_DMIC_8CH_MODE_1  MDRV_PUSE_DMIC0_D0>,
<PAD_PM_GPIO7   PINMUX_FOR_DMIC_8CH_MODE_1  MDRV_PUSE_DMIC0_D1>,
<PAD_SATA_GPIO0 PINMUX_FOR_DMIC_8CH_MODE_1  MDRV_PUSE_DMIC0_D2>,
<PAD_SATA_GPIO1 PINMUX_FOR_DMIC_8CH_MODE_1  MDRV_PUSE_DMIC0_D3>,
/* 功放电源控制(GPIO 模式) */
<PAD_GPIO19     PINMUX_FOR_GPIO_MODE        MDRV_PUSE_AIO_AMP_PWR>,

对应原理图:

音频(I2S)原理图

图 13-1 音频(I2S)原理图

音频(DMIC/功放)原理图

图 13-2 音频(DMIC/功放)原理图

13.4. 验证命令

cat /proc/asound/cards   # 预期:列出声卡
aplay -l                 # 预期:列出播放设备

13.5. 相关链接


14. GPIO 与 PAD_INIT

本章涉及文件mhera_comake_d3_linux_emmc_defconfig / mhera_comake_d3_debian_emmc_defconfigmhera.dtsi(gpio 节点)、mhera-comake-d3-padmux.dtsi(schematic + pad_init)。

14.1. 内核配置

CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y        # /sys/class/gpio 接口
CONFIG_SGS_PAD_INIT=y      # 引脚初始状态驱动

(上下拉/驱动能力 sysfs 接口需另开 CONFIG_MSYS_GPIO

14.2. DTS 配置

gpio 节点(mhera.dtsi):

gpio {
    compatible = "sgs,gpio";
    #gpio-cells = <2>;   /* cell0=gpio号, cell1=有效电平 */
    status = "okay";   // 可改
};

普通 GPIO 无需额外配置,#gpio-cells 为固定值。

14.3. Padmux 配置

复用功能schematic 列表 <PAD_xxx PINMUX_FOR_xxx_MODE_n MDRV_PUSE_xxx>,GPIO 模式用 PINMUX_FOR_GPIO_MODE

上电默认状态pad_init 节点配置引脚在上电时的默认方向/电平/上下拉/驱动能力(内核启动前、驱动加载前引脚就处于这里设定的状态,用于保证外设电源/复位脚在上电瞬间即为正确电平)。D3 的实际配置:

pad_init {
    schematic =
        <PAD_PM_GPIO0   GPIO_DIR_OUT  GPIO_LEVEL_HIGH  PAD_PULL_DEFAULT  PAD_DRV_DEFAULT>,   // 可改
        <PAD_SAR_GPIO2  GPIO_DIR_OUT  GPIO_LEVEL_HIGH  PAD_PULL_DEFAULT  PAD_DRV_DEFAULT>,   // 可改
        <GPIO_NR        GPIO_DIR_NA   GPIO_LEVEL_NA    PAD_PULL_DEFAULT  PAD_DRV_DEFAULT>;
};

PAD_PM_GPIO0 输出高是 D3 开发板的专用设定:该脚控制底板外设电源,上电即拉高给外设供电。自己的板子若电源控制脚不同(或不需要),改成对应脚或删掉该行;PAD_SAR_GPIO2(系统 LED)同理。格式:<Pad_Index Direction Level Pull Driving>,取值 GPIO_DIR_IN/OUT/NAGPIO_LEVEL_HIGH/LOW/NAPAD_PULL_UP/DOWN/HIZ/DEFAULTPAD_DRV_0/1/2/.../DEFAULT

14.4. 相关链接


15. 内存相关配置

内存通常存在多种分配情况,了解板端的内存分配情况对于开发非常重要。本章以 Comake D3 开发板为例,介绍如何查看、理解、设置板端的内存分配。

15.1. 配置查看与修改

以 D3 的 linux defconfig 为例,打开 project/configs/demo/defconfigs/linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig,可以查看到:

CONFIG_DRAM_SIZE="0x100000000"
CONFIG_LX_MEM_SIZE="0x100000000"
CONFIG_MMA_MEM_SIZE="0x20000000"
CONFIG_CMA_MEM_SIZE="0x400000"
CONFIG_LOGO_MEM_SIZE="0x800000"
CONFIG_FB_MEM_SIZE="0x4048000"

这里即为内存分配设置,对照理解:

配置项 数值 含义说明
CONFIG_DRAM_SIZE 0x100000000 总 DRAM 大小 = 4GB
CONFIG_LX_MEM_SIZE 0x100000000 Linux 可用内存 = 4GB
CONFIG_MMA_MEM_SIZE 0x20000000 多媒体 / 专用内存 = 512MB
CONFIG_CMA_MEM_SIZE 0x400000 CMA(连续内存分配)= 4MB
CONFIG_LOGO_MEM_SIZE 0x800000 Logo 显示缓冲 = 8MB
CONFIG_FB_MEM_SIZE 0x4048000 Framebuffer = ~64.28MB

可以看到 DRAM_SIZE 对应了实际 DDR 的内存大小。这里 LX_MEM_SIZE,即分配给 Linux 的可用内存,分配了整 4GB,全部分配。这是因为后面的 MMA、CMA、LOGO、FB,都是从 LX_MEM 里取出的,即存在关系:

DRAM_SIZE=LX_MEM_SIZE=Linux可用内存+MMA_MEM_SIZE+CMA_MEM_SIZE+LOGO_MEM_SIZE+FB_MEM_SIZE

根据公式实际代入有:

DRAM_SIZE(4GB)=LX_MEM_SIZE(4GB)≈Linux可用内存+MMA_MEM_SIZE(512MB)+CMA_MEM_SIZE(4MB)+LOGO_MEM_SIZE(8MB)+FB_MEM_SIZE(64.28MB)

这里的 Linux 可用内存,即对应了 cat /proc/meminfo 看到的内存情况。因为计算有约数,此处为约等于,但可以看出对应的分配关系,是具有包含关系的分配。

15.2. 内存分配说明

  • Linux 可用内存:提供给 Linux 可见的内存,供 kernel 下的程序申请使用。
  • MMA_MEM:提供给 MIU 的内存,专用于 MI 模块内部申请使用或者 MIU 申请使用。属于被单独划分的内存池,所以 Linux 看不见,在 meminfo 里也不包含。
  • CMA_MEM:给硬件 DMA 预留的连续物理内存池,用来让驱动动态申请大块连续 buffer,避免内存碎片化导致分配失败。
  • LOGO_MEM:开机时的 bootlogo 占用的内存。
  • FB_MEM:Framebuffer,提供给 fb 用来做显存。

这里还可以注意,MMA 都是用的 64 位地址表示的,还有可能会用 10E 地址作为起始偏移,申请到的地址可能超过 32 位可以表示的范围;而内核中 fbdev 的地址是用 32 位表示,如果直接用 MMA,地址会越界/截断,就会导致踩内存/数据丢失问题。所以这里是单独预留一块给 fb 用。

15.3. boot 下查看

内存分配是通过 bootargs 传递给 kernel 的,我们也可以通过查看 bootargs 了解当前板端的内存配置情况。bootargs 按照格式规定了内存的分配情况,与 defconfig 中的内容对应。因为是通过 bootargs 传递给 kernel 分配内存的,因此如果是临时修改,也可以通过 setbootargs xxxxxxx 的方式,来手动修改内存分配状态。

15.4. 相关链接


16. 附录 A:配置文件路径总览

类别 路径
Project Defconfig(linux) project/configs/demo/defconfigs/linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig(另有 2048 内存变体)
Project Defconfig(debian) project/configs/demo/defconfigs/debian-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig
Kernel Defconfig(linux) kernel/arch/arm64/configs/mhera_comake_d3_linux_emmc_defconfig
Kernel Defconfig(debian) kernel/arch/arm64/configs/mhera_comake_d3_debian_emmc_defconfig
U-Boot Defconfig boot/configs/mhera_comake_d3_emmc_arm64_defconfig
U-Boot DTS boot/arch/arm/dts/mhera-comake-d3.dts(+ mhera-comake-d3-padmux.dtsi
SDK Generic Defconfig project/configs/generic/defconfigs/mhera_sdk_generic_defconfig
分区表(linux) project/image/configs/general/emmc_linux-comake.ext4fs.tfa.partition.config
分区表(debian) project/image/configs/general/emmc_debian-comake.ext4fs.tfa.dualenv.partition.config
板级 DTS(linux) kernel/arch/arm64/boot/dts/sgs/mhera-comake-d3-purelinux.dts
板级 DTS(debian) kernel/arch/arm64/boot/dts/sgs/mhera-comake-d3-debian.dts
SoC 级 DTS kernel/arch/arm64/boot/dts/sgs/mhera.dtsi
显示子系统 kernel/arch/arm64/boot/dts/sgs/mhera-display-subsystem.dtsi
Padmux kernel/arch/arm64/boot/dts/sgs/mhera-comake-d3-padmux.dtsi
屏参数(kernel 侧) kernel/arch/arm64/boot/dts/sgs/panel-*.dtsi
板级配置 project/board/mhera/D3/config/{config_board.json, config_fb.json, config.json}
屏参数(SDK 侧) project/board/mhera/screen_param/config_disp.json

16.1. 原理图页索引

Padmux 里的每个 PAD_xxx 都对应原理图上的一个网络。各章节内已插入对应电路的图,如需查看完整页面可打开原 PDF 对应页:

外设 / Padmux 原理图页
MIPI DSI 第 8 页
HDMI_TX 第 9 页
RGMII0 / RGMII1(GMAC) 第 7 页
USB(P0/P2 Host、USB3) 第 10 页
SATA_P0 / SATA_P1 第 13 页
SD 卡(SD0) 第 5 页
DMIC / Debug UART / GPIO 第 3 页
音频(MIC / Speaker / AMP) 第 6 页
SPI / I2C / PWM / PCIe / UART1~3 第 2 页(金手指/总览)

eMMC 位于核心板,不在本底板(D3_BASE)原理图内。


17. 附录 B:各外设默认启用/禁用状态汇总

外设 内核配置 DTS 节点 Padmux 状态 是否启用 debian/linux 差异
MIPI DSI FB(linux)/ DRM(debian) mipi_dsi + panel dtsi + 板级 dts #if 1 框架不同:linux=FB/mi_disp,debian=DRM;板级 dts 也是两份,debian 固定 HDMI→disp0、MIPI→disp1
HDMI 同上 hdmi #if 1 同上
触摸 GT911 TOUCHSCREEN_GOODIX(linux)/ HID_MULTITOUCH(debian) goodix_gt911@5d(板级 dts) GPIO17/18 linux 用 goodix 驱动,debian 走 HID/evdev
GMAC0/1 CONFIG_SGS_GMAC(default y)+ STMMAC gmac0/gmac1 #if 1(RGMII)
USB USB_XHCI/EHCI/STORAGE + SGS PHY sgs-ehci-½、usb3drd_p2/p3 ✅ VBUS linux 额外 USB_SERIAL/RNDIS;debian 额外 UVC/CH341/CP210X
SATA SATA_AHCI_PLATFORM + SGS_SATA_HOST sata/sata1
PCIe SGS_PCIE_HOST/EP/HOTPLUG pcie0/pcie1 GPIO21=PCIE1_PERST
eMMC/SD MMC + SGS_SDMMC + SD30/EMMC50 sgs_sdmmc0/1 ✅ 条件启用
UART SGS_UART fuart/uart0~3 ✅ FUART/UART½/3
SPI SPI + SGS_MSPI +(SPI_SPIDEVSGS_SPI_DEVICE spi0/spi1 ✅ SPI0/1
I2C I2C + I2C_CHARDEV + SGS_I2C i2c0~4 ✅ I2C0~4
PWM PWM pwm0~3 ✅ PWM0/½
音频 SND/SND_SOC/SGS_SND_SOC sound ✅ I2S0/DMIC/AMP debian 额外 SND_USB_AUDIO