为MTK 9300开发板移植Linux系统(以Debian为例)的详细技术指南

以下是为MTK 9300开发板移植Linux系统(以Debian为例)的详细技术指南,涵盖环境搭建、内核移植、驱动适配(摄像头/显示器/WiFi)、系统集成与优化。


MTK 9300开发板Linux系统移植全流程指南

1 项目概述

1.1 硬件平台

SoC:MediaTek MTK9300 (ARMv8-A架构,4×Cortex-A78 + 4×Cortex-A55)
外设

MIPI CSI-2摄像头接口 ×2
HDMI 2.1 + MIPI DSI显示输出
MT7921K WiFi6/BT5.2模块
4GB LPDDR5 + 64GB UFS 3.1

开发板接口:USB 3.0 Type-C ×2, PCIe 3.0 ×1, 40-pin GPIO扩展口

1.2 软件起点

基线代码:Android 13 (Kernel 5.10 LTS)
目标系统:Debian 12 Bookworm (ARM64)


2 开发环境搭建

2.1 主机系统配置

# Ubuntu 22.04 LTS
sudo apt install gcc-aarch64-linux-gnu u-boot-tools 
flex bison libssl-dev device-tree-compiler 
git-lfs swig python3-dev

2.2 交叉工具链

# ARM官方工具链 (aarch64-none-linux-gnu)
wget https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
tar xvf arm-gnu-toolchain-*.tar.xz
export CROSS_COMPILE=/path/to/bin/aarch64-none-linux-gnu-

2.3 源码仓库

# 内核源码 (基于MTK官方仓库)
git clone -b mtk-5.10 https://github.com/mediatek/linux.git
# U-Boot源码
git clone https://github.com/u-boot/u-boot.git
# Debian根文件系统
wget https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/debian-12.4.0-arm64-netinst.iso

3 Bootloader移植

3.1 U-Boot配置适配

文件:u-boot/arch/arm/dts/mt9300-evb.dts

/ {
    memory@40000000 {
        device_type = "memory";
        reg = <0x40000000 0x10000000>; // 匹配开发板内存布局
    };

    chosen {
        stdout-path = &uart0;
    };
};

&uart0 {
    status = "okay";
};

&usb0 {
    dr_mode = "otg";
    status = "okay";
};

3.2 DDR初始化参数提取

使用MTK专有工具从Android bootloader提取:

python3 mtk_bootinfo_extract.py preloader.bin > ddr_init_params.h

在U-Boot board初始化代码中包含该头文件:

// u-boot/board/mediatek/mt9300/init.c
#include "ddr_init_params.h"

void mtk_ddr_init() {
            
    // 应用时序参数
    writel(DDR_CFG_REG1, 0x10000000);
    ...
}

3.3 编译与烧写

make mt9300_evb_defconfig
make -j8

使用fastboot烧录:

fastboot flash u-boot u-boot.bin

4 Linux内核移植

4.1 设备树适配

关键文件:linux/arch/arm64/boot/dts/mediatek/mt9300-evb.dts

4.1.1 显示子系统
&mipi_dsi {
    status = "okay";
    panel@0 {
        compatible = "panel-dpi";
        reg = <0>;
        port {
            panel_in: endpoint {
                remote-endpoint = <&dsi_out>;
            };
        };
    };

    ports {
        port@0 {
            dsi_out: endpoint {
                remote-endpoint = <&panel_in>;
            };
        };
    };
};

&hdmi {
    status = "okay";
    hdmi-supply = <&hdmi_reg>;
};
4.1.2 摄像头接口
&i2c1 {
    status = "okay";
    clock-frequency = <400000>;

    camera_sensor: ov13855@36 {
        compatible = "ovti,ov13855";
        reg = <0x36>;
        reset-gpios = <&pio 15 GPIO_ACTIVE_LOW>;
        avdd-supply = <&camera_power>;
        clocks = <&camera_clk>;
        port {
            camera_out: endpoint {
                remote-endpoint = <&csi_in>;
            };
        };
    };
};

&csi {
    status = "okay";
    port {
        csi_in: endpoint {
            remote-endpoint = <&camera_out>;
        };
    };
};

4.2 内核配置

# 启用关键驱动
make ARCH=arm64 menuconfig

# 配置选项:
CONFIG_DRM_MEDIATEK=y
CONFIG_DRM_MEDIATEK_HDMI=y
CONFIG_MEDIA_PLATFORM_DRIVERS=y
CONFIG_VIDEO_MEDIATEK_CSI=y
CONFIG_MT7921E=m  # WiFi驱动
CONFIG_SND_SOC_MTK_SOF=y # 音频

4.3 编译内核与模块

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j8
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules_install INSTALL_MOD_PATH=./modules_out

5 外设驱动适配

5.1 WiFi驱动 (MT7921K)

步骤:

固件准备:从Android提取mt7921_rom_patch.binmt7921_wa.bin
内核驱动配置

CONFIG_MT7921E=m
CONFIG_MT7921S=m  # SDIO版本

加载验证

insmod mt7921e.ko
dmesg | grep mt7921  # 查看驱动加载日志

5.2 摄像头驱动

OV13855驱动适配:

// drivers/media/i2c/ov13855.c
static const struct regval ov13855_init_settings[] = {
            
    {
            0x0100, 0x00}, // 软复位
    {
            0x0103, 0x01},
    ...
};

// 添加设备树匹配
static const struct of_device_id ov13855_of_match[] = {
            
    {
             .compatible = "ovti,ov13855" },
    {
            }
};

5.3 显示输出调试

DRM调试命令:

# 查看显示接口状态
cat /sys/kernel/debug/dri/0/state

# 强制HDMI输出模式
echo 1920x1080-60 > /sys/class/drm/card0-HDMI-A-1/mode

6 Debian系统构建

6.1 根文件系统制作

# 解压Debian基础系统
mkdir rootfs && cd rootfs
7z x debian-12.4.0-arm64-netinst.iso

# 配置APT源
echo "deb http://deb.debian.org/debian bookworm main" > etc/apt/sources.list

# 安装必要软件
chroot . /bin/bash
apt install ssh net-tools wireless-tools

6.2 系统服务配置

文件:/etc/systemd/system/wifi-setup.service

[Unit]
Description=WiFi Initialization
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/iw dev wlan0 set type managed
ExecStart=/usr/bin/ip link set wlan0 up
ExecStart=/usr/bin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

[Install]
WantedBy=multi-user.target

6.3 镜像打包

# 生成ext4镜像
dd if=/dev/zero of=rootfs.img bs=1M count=2048
mkfs.ext4 rootfs.img
mount -o loop rootfs.img /mnt
cp -a rootfs/* /mnt
umount /mnt

# 整合到Android boot镜像
mkbootimg --kernel arch/arm64/boot/Image.gz 
          --ramdisk rootfs.img 
          --output boot-linux.img

7 系统启动与调试

7.1 U-Boot启动参数

# 设置内核启动命令
setenv bootargs 'console=ttyS0,115200 earlycon=uart8250,mmio32,0x11002000 root=/dev/mmcblk0p2 rw'
saveenv

7.2 内核启动日志分析

常见问题排查:

[    1.235600] mmc_host mmc0: Bus speed (slot 0) = 200000Hz (mode 0)  # SD卡未初始化成功
[    2.110000] mtk-drm 14000000.display-controller: Failed to find panel  # 显示设备树错误
[    3.450000] ov13855 1-0036: Could not get control 'avdd'  # 电源管理未配置

7.3 性能优化

内核参数调整:

# /etc/sysctl.conf
vm.swappiness=10
kernel.sched_latency_ns=6000000
kernel.sched_migration_cost_ns=500000

8 外设功能验证

8.1 摄像头测试

# 安装v4l2工具
apt install v4l-utils

# 检测设备
v4l2-ctl --list-devices

# 捕获图像
ffmpeg -f v4l2 -i /dev/video0 -frames 1 test.jpg

8.2 WiFi连接测试

# 扫描网络
iw dev wlan0 scan

# 创建WPA配置
wpa_passphrase "SSID" "password" > /etc/wpa_supplicant.conf

# 连接网络
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B
dhclient wlan0

8.3 显示输出测试

# 安装X11测试工具
apt install x11-apps

# 运行测试程序
xeyes -geometry 1920x1080+0+0

9 高级功能扩展

9.1 GPU加速支持

# 编译Mali G610驱动
git clone https://github.com/mediatek/kernel_modules_gpu.git
cd kernel_modules_gpu
make -C /lib/modules/$(uname -r)/build M=$PWD

# 验证OpenGL
glmark2-es2-wayland --fullscreen

9.2 功耗管理优化

// 添加CPU闲置状态
&cpu0 {
    cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
};

&cluster0 {
    idle-states {
        CLUSTER_SLEEP_0: cluster-sleep-0 {
            compatible = "arm,idle-state";
            entry-latency-us = <500>;
            exit-latency-us = <1000>;
            min-residency-us = <2500>;
        };
    };
};

10 附录

10.1 关键命令速查

功能 命令
重新编译设备树 make dtbs
查看中断分配 cat /proc/interrupts
调试I2C设备 i2cdetect -y 1
显示时钟树 cat /sys/kernel/debug/clk/clk_summary

10.2 参考文档

[MTK9300 Datasheet v1.2] MediaTek Confidential
[ARMv8-A Architecture Reference Manual] ARM DDI 0487I.a
[Debian ARM Port] https://wiki.debian.org/Arm64Port

10.3 已知问题跟踪

问题 状态 解决方案
HDMI音频输出无声 已修复 更新ALSA配置参数
WiFi吞吐量低于预期 调查中 优化MT7921固件加载时序
摄像头长时间工作掉帧 未解决 调整CSI-2时钟相位
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容