MTK T750平台:CCCI驱动调试
- 1. T750简介
- 2. CCCI驱动调试
-
- 2.1 调试环境
- 2.2 Release Note
- 2.3 make
- 2.4 error: ‘struct dev_pm_info’ has no member named ‘driver_flags’
- 2.5 error: inlining failed in call to always_inline
- 2.6 error: ‘struct pci_dev’ has no member named ‘priv_flags’
- 2.7 error: missing binary operator before token "("
- 2.8 error: ‘struct net_device’ has no member named ‘max_mtu’
- 2.9 error: ‘atomic_t {aka struct }’ has no member named ‘refs’
- 2.10 Unknown symbol in module
- 3. 验证
- 4. 附件
- 5. 总结
1. T750简介
MediaTek T750 是一款面向新一代5G CPE无线产品,可应用于5G固定无线接入(FWA)和移动热点(MiFi)等设备,为家庭、企业和移动用户带来高速5G连接,芯片平台采用 7nm 制程工艺,高度集成 5G NR FR1 调制解调器,4 核 Arm Cortex-A55 CPU 可提供完整的功能和配置,支持 5G NR Sub-6GHz 下双载波聚合(2CC CA)200MHz 频率,不仅拥有更大的信号覆盖范围,同时也让 5G 的下行速度大幅提升。
在独立组网(SA)中,T750 芯片平台最大下行峰值可达到 4.76Gbps ,上行峰值可达到 1.25Gbps ,可支持两个 2.5Gbps SGMII 接口、多种 LAN 端口配置、多种 Wi-Fi 配置包括单颗 5G 4×4 ,单颗 2.4G 4×4 和 5G 2×2 + 2.4G 2×2 双频 Wi-Fi 6 芯片,在保证网络高速连接的同时,也确保了 Wi-Fi 的稳定性。
2. CCCI驱动调试
2.1 调试环境
主控:NVIDIA XAVIER (ARM)
系统:Ubuntu 16.04
内核:Linux 4.9.0
Modem:MTK T750
驱动:CCCI (Cross Core Communication Interface)
2.2 Release Note
CCCI驱动Release_note:
The host CCCI driver provides standard linux device nodes, which can be find in directory /dev/. User can use this device nodes with linux standard API--open/close and read/write.
You can execute command "make" in driver top directory, then will get driver object files(*.ko) in folder /out, and the directory structure is shown as following.
(Note kernel version: 4.15.0-29-generic, gcc version: 5.4.0 20160609)
从Release_note可以看出MTK仅适配了4.15.0内核版本。为了更快的完成调试工作,我们需要快速的发现和解决问题。
2.3 make
拷贝CCCI驱动到NVIDIA XAVIER (ARM)后,解压直接执行make进行编译时报错:
make[1]: Entering directory '/usr/src/linux-headers-4.9.140-tegra-ubuntu18.04_aarch64/kernel-4.9'
CC [M] /home/sdk/Linux_PCIe_Driver_v1.0.11/./PCIE/core/mtk-pcie.o
gcc: error: unrecognized argument in option ‘-mcmodel=kernel’
gcc: note: valid arguments to ‘-mcmodel=’ are: large small tiny
gcc: error: unrecognized command line option ‘-mno-sse’; did you mean ‘-fno-dse’?
gcc: error: unrecognized command line option ‘-mno-mmx’
gcc: error: unrecognized command line option ‘-mno-sse2’; did you mean ‘-fno-dse’?
gcc: error: unrecognized command line option ‘-mno-3dnow’; did you mean ‘-fno-doc’?
gcc: error: unrecognized command line option ‘-m64’
gcc: error: unrecognized command line option ‘-mno-red-zone’; did you mean ‘-fno-regmove’?
scripts/Makefile.build:335: recipe for target '/home/sdk/Linux_PCIe_Driver_v1.0.11/./PCIE/core/mtk-pcie.o' failed
分析与解决:
- 通过分析,我们发现在顶级目录Makefile中目标架构写成了固定的x86_64,这就导致在编译源码时,编译器无法寻找到合适的交叉编译链,导致编译失败。
COMPILER = "gcc"
LINKER = "ld"
TARGET_ARCH := x86_64
DATE = "BUILD_TIME="
LABEL = "LABEL="
- 针对该问题有如下解决方案:修改TARGET_ARCH 为 arm64,注意,这里只能写成arm64,非aarch64。
COMPILER = "gcc"
LINKER = "ld"
TARGET_ARCH := arm64
DATE = "BUILD_TIME="
LABEL = "LABEL="
2.4 error: ‘struct dev_pm_info’ has no member named ‘driver_flags’
通过上述方法的修改,可以开始编译驱动。出现了诸多“has no member named”错误:
./PCIE/core/mtk-pci.c:374:9: error: implicit declaration of function ‘dev_pm_set_driver_flags’; did you mean ‘devm_get_free_pages’? [-Werror=implicit-function-declaration]
./PCIE/core/mtk-pci.c:374:74: error: ‘DPM_FLAG_NEVER_SKIP’ undeclared (first use in this function); did you mean ‘PF_FREEZER_SKIP’?
./PCIE/core/mtk-pci.c:374:60: error: ‘struct dev_pm_info’ has no member named ‘driver_flags’
./PCIE/core/mtk-pci.c:1391:3: error: ‘const struct pci_error_handlers’ has no member named ‘reset_prepare’
./PCIE/core/mtk-pci.c:1391:19: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
./PCIE/core/mtk-pci.c:1392:3: error: ‘const struct pci_error_handlers’ has no member named ‘reset_done’; did you mean ‘reset_notify’?
./PCIE/core/mtk-pci.c:1478:12: error: ‘struct pci_dev’ has no member named ‘ltr_path’
…
由于NVIDIA XAVIER (ARM)环境的Linux内核版本是4.9.0,而驱动中申明支持4.15.0,怀疑为内核版本差异导致。对比4.9.0和4.15.0版本相关文件:
- struct dev_pm_info结构体:
上图是struct dev_pm_info结构体部分截图,左侧为4.9.0,右侧为4.15.0,可以很明显的看到4.15.0中新增了几个成员用于更好的系统性能,而在4.9.0中是没有的,两者间存在差异,由于是新增功能,未能在4.9.0中找到替代,所以修改CCCI驱动源码,将该结构体相关新增功能进行版本的区分。
static int mtk_pci_pm_init(struct mtk_pci_dev *mtk_dev)
{
…
device_init_wakeup(