当前位置: 首页 > news >正文

O2072PM Wi-Fi7 移植 Linux5.4

O2072PM为高通最新的QCC2072芯片模组,支持Wi-Fi7和蓝牙6.0,部分客户产品因场景需求需要使低内核版本,本文将介绍在Xilinx Zynq UltraScale+MPSoC平台移植O2072PM至Linux5.4内核。

  • 平台信息

主芯片:Zynq UltraScale+MPSoC
Kernel: Linux5.4
系统:Linux

  • 硬件连接与识别

系统起来后执行 lspci 命令查看是否识别到模组

root@DTS_zynqMP:~# lspci 01:00.0 Network controller: Qualcomm Device 1112(rev 01)
  • 驱动编译及加载

1、编译驱动
解压驱动后 cd 到 qcc2072-r00042.1-linux5.4/chss_proc/host/AIO/build目录下
设置交叉编译环境

vi scripts/cgn-f10/config.cgn-f10 export KERNELPATH=/mnt/d/test/kernel5.4 export TOOLCHAIN=/mnt/d/test/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/ export KERNELARCH=arm64 export CROSS_COMPILE=${TOOLCHAIN}/aarch64-linux-gnu- export TOOLPREFIX=${CROSS_COMPILE}

设置完之后在当前build目录下执行make CONFIG_PERF_BUILD=y drivers 进行编译
编译完之后ko文件在AIO/rootfs-cgn-f10.build/lib/modules目录下
2、加载驱动及常见错误处理
空指针错误
加载wlan_cnss_core_pcie.ko时出现内核空指针解引用错误关键报错信息如下:

[ 52.313257] Modules linked in: wlan_cnss_core_pcie(O+) [ 52.313722] CPU: 3 PID: 2204 Comm: insmod Tainted: G O 6.1.99 #57 [ 52.314380] Hardware name: Rockchip RK3588 EVB7 V11 Board (DT) [ 52.314894] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 52.315508] pc : cnss_initialize+0x2fc/0xa2c [wlan_cnss_core_pcie] [ 52.316176] lr : cnss_initialize+0x2fc/0xa2c [wlan_cnss_core_pcie] [ 52.316826] sp : ffffffc00d163ad0

根据反汇编结果进行溯源最终调用点为cnss_init_sol_gpio函数
解决方式是将这两处注释处理

/drivers/core_tech_modules/cnss2/main.c b/drivers/core_tech_modules/cnss2/main.c static int cnss_misc_init(struct cnss_plat_data *plat_priv) { int ret; - ret = cnss_init_sol_gpio(plat_priv); - if (ret) - return ret; static int cnss_misc_init(struct cnss_plat_data *plat_priv) cnss_sram_dump_init(plat_priv); - if (of_property_read_bool(plat_priv->plat_dev->dev.of_node, - "qcom,rc-ep-short-channel")) - cnss_set_feature_list(plat_priv, CNSS_RC_EP_ULTRASHORT_CHANNEL_V01);

初始化错误
重新编译驱动再次加载,cnss初始化成功,但是wlan初始化失败,报错如下:

pc : mhi_driver_unregister+0x64/0x230 [wlan_cnss_core_pcie] lr : mhi_driver_unregister+0x74/0x230 [wlan_cnss_core_pcie] 有时报错又如下: pc : mhi_match+0x24/0x5c [wlan_cnss_core_pcie] lr : mhi_match+0x34/0x5c [wlan_cnss_core_pcie]

根据反汇编结果进行溯源最终调用点为mhi_match函数
解决方式是将代码此处注释即可

drivers/core_tech_modules/mhi/core/init.c static int mhi_match(struct device *dev, struct device_driver *drv) { struct mhi_device *mhi_dev = to_mhi_device(dev); struct mhi_driver *mhi_drv = to_mhi_driver(drv); struct mhi_device_id *id; /* * If the device is a controller type then there is no client driver * associated with it */ if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER) return 0; /* for (id = mhi_drv->id_table; id->chan[0]; id++) if (!strcmp(mhi_dev->name, id->chan)) { mhi_dev->id = id; return 1; } */ return 1; }

DMA内存分配错误
然后重新编译驱动不会报上面这错误了,但是又报了分配内存失败如下

wlan: [444:W:QDF] qdf_aligned_mem_alloc_consistent_fl: Failed to alloc 196608B @ dp_prealloc_init:1150 wlan: [444:W:DP] dp_prealloc_init: i 1: unable to preallocate 196608 bytes memory! wlan: [444:E:DP] dp_prealloc_init: unable to allocate consistent memory! wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_all_objects_per_psoc: Ref counts of PEER wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_all_objects_per_psoc: Ref counts of VDEV wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_all_objects_per_psoc: Ref counts of PDEV wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_all_objects_per_psoc: Ref counts of PSOC wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_ids: Pending references of object wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_ids: WLAN_OBJMGR_ID(0) -- 1 wlan: [444:F:OBJMGR] wlan_objmgr_print_ref_ids: WLAN_HDD_ID_OBJ_MGR(5) -- 1 wlan: [444:I:OBJMGR] wlan_objmgr_psoc_obj_delete: Logically deleting psoc 0 wlan: [444:I:OBJMGR] wlan_objmgr_psoc_obj_destroy: Physically deleting psoc 0 wlan: [444:I:QDF] wlan_cp_stats_cstats_deinit: Chipset Stats feature is disabled wlan: [444:E:HDD] __hdd_soc_probe: consecutive probe failures:1 [ 322.332221] cnss: Failed to probe host driver, err = -1

这主要是跟内核DMA机制有关,解决方式是注释内核这段代码

/kernel/dma/remap.c void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, unsigned long attrs) { struct page *page = NULL; void *ret; size = PAGE_ALIGN(size); /* if (!gfpflags_allow_blocking(flags)) { ret = dma_alloc_from_pool(size, &page, flags); if (!ret) return NULL; goto done; } */ page = __dma_direct_alloc_pages(dev, size, dma_handle, flags, attrs);

修改内核后重新编译内核并烧录到板子上
再次加载驱动成功,有wlan节点加载成功

root@DTS_zynqMP:~# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:0A:35:00:22:01 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:138 (138.0 B) TX bytes:2358 (2.3 KiB) Interrupt:28 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) p2p0 Link encap:Ethernet HWaddr 02:03:7F:93:63:15 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) sit0 Link encap:IPv6-in-IPv4 NOARP MTU:1480 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wifi-aware0 Link encap:Ethernet HWaddr 02:03:7F:94:63:15 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wlan0 Link encap:Ethernet HWaddr 00:03:7F:12:63:15 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Qogrisys专业致力于为客户提供完善的物联网连接解决方案,对于要求高品质高稳定性的客户,高通WIFI6E/WIFI7系列模组供客户选型,我们有经验丰富的软件支持工程师,能为客户在移植、适配中提供全面的技术支持。

http://www.jsqmd.com/news/133491/

相关文章:

  • 北京小程序定制开发公司怎么选,北京本地定制服务商筛选4大指标微信小程序/寺庙小程序/活动小程序/电商小程序开发公司推荐 - 品牌2026
  • AudioShare终极指南:5步实现Windows音频无线传输到安卓设备
  • 为什么这6大压缩算法能让你的文件处理效率翻倍?
  • 门窗选购指南:科技、安全与性价比兼具的品牌推荐 - mypinpai
  • 2025年终五大化工原料公司推荐榜:聚焦植物提取与绿色工艺,这五家实力派值得关注 - 十大品牌推荐
  • 3步搞定全网内容订阅:RSSHub-Radar智能发现工具使用指南
  • 南方网通渠道服务公司的实力怎样?行业口碑好不好? - 工业品牌热点
  • 基于stm32的香薰灯(有完整资料)
  • 2025年辨证准确智慧中医院管理系统推荐:专业的智慧中医院权威平台有哪些? - 工业推荐榜
  • PCPcat行动:48小时内6万台Next.js服务器遭劫持
  • 脑影像分割
  • Elsa 3.0工作流自动化:从零到精通的实战指南
  • 2025年热门的红外压片机厂家最新推荐排行榜 - 品牌宣传支持者
  • 2025水性聚氨酯地坪源头工厂:优质水性聚氨酯地坪厂家清单 - 栗子测评
  • M9A游戏自动化助手:智能解放你的游戏时间
  • HoRNDIS终极指南:解决Mac与Android USB网络共享的完整方案
  • Alexa Fluor 647-Labeled B7-H3/CD276 Fc Chimera:免疫微环境解析的“远红外精准定位器“
  • 产品开发周期模型实战系列之瀑布模型:以线性流程标准化,保障需求明确型项目稳定交付
  • 深入剖析大数据领域Hadoop的故障排除方法
  • Open-AutoGLM架构设计全揭秘(20年架构师亲述实践精髓)
  • 金仓数据库发布能源行业Oracle迁移新方案,传输加密技术达国际安全标准
  • GPT-SoVITS训练资源估算工具开发:精准预估GPU需求
  • 告别在线阅读烦恼:用Python打造个人小说收藏馆
  • PokeMMO终极指南:快速构建你的专属Pokemon在线世界
  • 国产数据库领航者:金仓数据库重塑企业数据根基,定义行业新标准
  • 如何用BiliRaffle一键搞定B站动态抽奖?2025最新免费神器全攻略
  • 2025年五大化工原料公司实力解析:聚焦细分领域专精特新与供应链韧性 - 十大品牌推荐
  • 2025年靠谱的咨询艺考培训机构推荐,专业艺考培训服务学校新测评榜单 - mypinpai
  • YACReader快速入门指南:跨平台漫画阅读器的完整使用教程
  • 北京小程序定制开发公司如何选择,定制成本+交付周期平衡指南律所小程序/教育小程序/课程小程序/硬件小程序开发公司推荐 - 品牌2026