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 派生出你自己的¶
- 选变体:确定用
linux-(Pure Linux)还是debian-(两者显示框架不同,见第 3 章)。 -
复制改名:新板子的配置分散在
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 等 -
改名与指向:
- ① 中把
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 名。
- ① 中把
-
按模块改配置:对照下方速查表和正文各章,改 kernel defconfig / DTS / Padmux / 板级 json。
- 编译:
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.dtsi、panel-*.dtsi(屏参内容详见官方屏参配置指南)、mhera-comake-d3-padmux.dtsi、config_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/disp1 的 mop-layers |
图层配置 | <layerType subType winCount ...> |
dpi/mipi_dsi/hdmi 的 status |
通道使能 | "okay" / "disabled" |
各 endpoint 的 remote-endpoint |
面板接到哪条通道 | 换屏时改 |
panels 里的 backlight_dev1 |
背光控制 | 配合 PWM |
其余(
compatible、reg、dev-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>,
对应原理图:

图 3-1 MIPI DSI Padmux 原理图

图 3-2 HDMI Padmux 原理图
3.4. 屏参配置¶
屏参(面板时序、config_disp.json、config_board.json 选屏等)的详细配置方法 不在本文档展开,请参考官方文档:
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. 相关链接¶
- 如果是 linux 下配置显示,可参考 MI DISP API;
- 屏参配置请参考 屏参使用指南。
4. 以太网(GMAC0 / GMAC1)¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.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 模块),可显式写:
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/MDC用PINMUX_FOR_RMII0_MODE_1。
对应原理图:

图 4-1 GMAC Padmux 原理图
4.4. 验证命令¶
4.5. 相关链接¶
5. USB¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.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>,
对应原理图:

图 5-1 USB Padmux 原理图
5.4. 验证命令¶
5.5. USB VBUS 设置¶
USB 口的 VBUS 供电由 USB 驱动自动控制,无需应用层干预,也无需额外 DTS 属性:驱动在 host 控制器初始化时自动到 padmux 表里查找该口的 VBUS 供电 GPIO 并拉高上电,控制器移除/挂起时拉低断电。
因此只需在 mhera-comake-d3-padmux.dtsi 的引脚列表里,为需要控制 VBUS 的口加一行(必须用 GPIO 模式):
PAD_xxx:硬件上接到该 USB 口 VBUS 使能脚的 pad(查原理图)。MDRV_PUSE_USBx_VBUS:x换成 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_defconfig、mhera.dtsi(sataphy/sata)。
D3 支持双 SATA 口(连接硬盘/SSD)。标准 defconfig 已启用。
6.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)
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,见音频章节)。
对应原理图:

图 6-1 SATA 原理图
6.4. 验证命令¶
6.5. 相关链接¶
7. PCIe¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(pcie0/pcie1)、mhera-comake-d3-padmux.dtsi(PCIE1_PERST)。
D3 支持 PCIe RC/EP/热插拔。标准 defconfig 已启用。
7.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)
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. 验证命令¶
7.4. 相关链接¶
8. eMMC / SD 卡¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(sgs_sdmmc0/1)、mhera-comake-d3-padmux.dtsi(eMMC/SD0 块)。
标准 defconfig 已启用(eMMC 作系统盘,SD 卡作扩展存储)。
8.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)
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/1 与 0~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_CMD用PINMUX_FOR_SD0_MODE_1,PAD_SD0_GPIO0(电源,GPIO 模式)、PAD_SD0_CDZ(卡检测,PINMUX_FOR_SD0_CDZ_MODE_1)。
对应原理图:

图 8-1 eMMC / SD 卡原理图
8.4. 验证命令¶
8.5. 相关链接¶
9. UART¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(fuart/uart0~3 + aliases)、mhera-comake-d3-padmux.dtsi(FUART/UART½/3 块)。
控制台为 uart0(console=ttyS0);另有 FUART(4 线,硬件流控,ttyS2)、UART½/3。标准 defconfig 已启用。
9.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)
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/CTS用PINMUX_FOR_FUART_MODE_1。 - UART1(金手指,
#if 1):PAD_UART1_TX/RX用PINMUX_FOR_UART1_MODE_1。 - UART2(金手指,
#if 1):PAD_UART2_TX/RX用PINMUX_FOR_UART2_MODE_1。 - UART3(复用 HSYNC/VSYNC 引脚,
#if 1):PAD_HSYNC/PAD_VSYNC用PINMUX_FOR_UART3_MODE_4。
对应原理图:

图 9-1 UART Padmux 原理图
9.4. 验证命令¶
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/TIOCSRS485(flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND),方向切换由内核在发/收时自动完成。若没配rs485-gpios,TIOCSRS485虽可能执行成功但方向不会切换,会一直停在接收态发不出数据。
示例仅以 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_defconfig、mhera.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.h 的 drv_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_* */
对应原理图:

图 10-1 SPI Padmux 原理图
10.4. 验证命令¶
/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_defconfig、mhera.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 差异:无)
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>,
对应原理图:

图 11-1 I2C Padmux 原理图
11.4. 验证命令¶
11.5. 相关链接¶
12. PWM¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(pwm0~3)、mhera-comake-d3-padmux.dtsi(PWM0/½ 块)。
D3 用 PWM0 作 LCD 背光、PWM1 通用、PWM2 风扇。标准 defconfig 已启用。
12.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian/linux 差异:无)
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>,
对应原理图:

图 12-1 PWM Padmux 原理图
12.4. 相关链接¶
13. 音频(I2S TX + DMIC)¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(sound 节点)、mhera-comake-d3-padmux.dtsi(I2S0/DMIC/AMP 块)。
D3 支持 I2S0 TX 音频输出(功放)与 DMIC 数字麦克风输入。标准 defconfig 已启用音频框架。
13.1. 内核配置¶
✅ 标准 defconfig 已包含,无需改动。(debian 额外:
CONFIG_SND_USB_AUDIO)
13.2. DTS 配置(mhera.dtsi 的 sound 节点)¶
节点示例(固定项已省略):
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>,
对应原理图:

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

图 13-2 音频(DMIC/功放)原理图
13.4. 验证命令¶
13.5. 相关链接¶
14. GPIO 与 PAD_INIT¶
本章涉及文件:
mhera_comake_d3_linux_emmc_defconfig/mhera_comake_d3_debian_emmc_defconfig、mhera.dtsi(gpio 节点)、mhera-comake-d3-padmux.dtsi(schematic + pad_init)。
14.1. 内核配置¶
(上下拉/驱动能力 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/NA、GPIO_LEVEL_HIGH/LOW/NA、PAD_PULL_UP/DOWN/HIZ/DEFAULT、PAD_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(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_SPIDEV 或 SGS_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 |