imx8qm wifi sdio调试

2024-06-17 07:32
文章标签 调试 wifi sdio imx8qm

本文主要是介绍imx8qm wifi sdio调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

imx8qm平台用的是有WIFI和BT功能的Murata 芯片,型号是LBEE6U41LQ,WIFI采用sdio接口,由WL_EN控制上电;BT是UART1接口,由BT_EN控制上电;

一.硬件原理

二.引脚信息

/* bt enable*/SC_P_USDHC2_VSELECT 
/* uart1 */SC_P_UART1_RXSC_P_UART1_TXSC_P_UART1_CTS_BSC_P_UART1_RTS_B/* wifi */SC_P_SPI2_SDO   // IRQ gpio3 8SC_P_USDHC2_RESET_B    //ENABLE gpio4 9/* USDHC2 SDIO*/SC_P_USDHC2_CLKSC_P_USDHC2_CMDSC_P_USDHC2_DATA0SC_P_USDHC2_DATA1SC_P_USDHC2_DATA2SC_P_USDHC2_DATA3

三.问题描述

1.SDIO扫描不到设备,wifi起不来,加打印如下,四个频率都扫描不到。

2.wifi enable脚正常情况如下,基本上不会出现掉电:

3.不正常情况在scan sdio时wifi enable脚被拉低7s左右。

四.分析过程

(1)SDIO扫描原理:

1.drivers/mmc/core/core.c -->mmc_rescan,在4个频率下扫描设备(400kHZ,300kHZ,200kHZ,100kHZ)

void mmc_rescan(struct work_struct *work)
{struct mmc_host *host = container_of(work, struct mmc_host, detect.work);int i;if (host->rescan_disable)return;for (i = 0; i < ARRAY_SIZE(freqs); i++) {if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))){printk("%s freq[%d] OK!\n",__func__,freqs[i]);break;}if (freqs[i] <= host->f_min)break;}

2.drivers/mmc/core/core.c  --> mmc_rescan_try_freq ,在扫描前先发个sdio_reset(CMD52)命令,只有sdio设备会有响应,之后按照sdio(CMD5),sd,mmc的顺序扫描,一旦扫到立即返回

static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
{host->f_init = freq;/** sdio_reset sends CMD52 to reset card.  Since we do not know* if the card is being re-initialized, just send it.  CMD52* should be ignored by SD/eMMC cards.* Skip it if we already know that we do not support SDIO commands*/if (!(host->caps2 & MMC_CAP2_NO_SDIO))sdio_reset(host);mmc_go_idle(host);if (!(host->caps2 & MMC_CAP2_NO_SD))mmc_send_if_cond(host, host->ocr_avail);/* Order's important: probe SDIO, then SD, then MMC */if (!(host->caps2 & MMC_CAP2_NO_SDIO))if (!mmc_attach_sdio(host)){printk("%s line=%d\n",__FUNCTION__,__LINE__);return 0;}if (!(host->caps2 & MMC_CAP2_NO_SD))if (!mmc_attach_sd(host))return 0;if (!(host->caps2 & MMC_CAP2_NO_MMC))if (!mmc_attach_mmc(host))return 0;mmc_power_off(host);return -EIO;
}

3.如果成功检测到设备,便会进行后续的mmc_sdio_init_card和mmc_add_card及sdio_add_func,进行建立设备节点等操作。

检测到设备的check方式:

查看节点             

查看开机kernel log        [    8.382000] mmc0: new SDIO card at address 0001

/** Starting point for SDIO card init.*/
int mmc_attach_sdio(struct mmc_host *host)
{int err, i, funcs;u32 ocr, rocr;struct mmc_card *card;printk("%s line=%d\n",__FUNCTION__,__LINE__);WARN_ON(!host->claimed);
.....err = mmc_sdio_init_card(host, rocr, NULL, 0);......for (i = 0; i < funcs; i++, card->sdio_funcs++) {
#ifdef CONFIG_MMC_EMBEDDED_SDIOif (host->embedded_sdio_data.funcs) {struct sdio_func *tmp;tmp = sdio_alloc_func(host->card);} else {
#endif                 printk("%s line=%d\n",__FUNCTION__,__LINE__);err = sdio_init_func(host->card, i + 1);if (err)goto remove;}mmc_release_host(host);err = mmc_add_card(host->card);if (err)goto remove_added;/** ...then the SDIO functions.*/for (i = 0;i < funcs;i++) {err = sdio_add_func(host->card->sdio_func[i]);if (err)goto remove_added;}}

4.接下来将读取sdio CIS值并打印出来。

sdio_init_func

  ---->sdio_read_func_cis(func);

       ----->sdio_read_cis

(2)分析过程

1.首先wifi enable脚入手,原本一直以为是DPU资源调换过来后引起uhsdc3 clock有问题了,后面通过各种对比试验定位到问题在fsl-imx8qm-mek-domu.dts里面。

wifi_en脚是gpio4 9,dts如下:

		pinctrl_wifi: wifi {fsl,pins = <SC_P_USDHC2_RESET_B_LSIO_GPIO4_IO09 0x18000000SC_P_SPI2_SDO_LSIO_GPIO3_IO08 		0x1E000000>;};

发现pcie也用了USDHC2_RESET_B这个脚:

	pinctrl_pciea: pcieagrp{fsl,pins = <SC_P_PCIE_CTRL0_CLKREQ_B_LSIO_GPIO4_IO27	0x06000021SC_P_PCIE_CTRL0_WAKE_B_LSIO_GPIO4_IO28		0x04000021SC_P_PCIE_CTRL0_PERST_B_LSIO_GPIO4_IO29		0x06000021SC_P_LVDS1_I2C0_SDA_LSIO_GPIO1_IO13		0x06000000SC_P_USDHC2_RESET_B_LSIO_GPIO4_IO09		0x06000021>;};
&pciea {ext_osc = <1>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_pciea>;disable-gpio = <&gpio1 13 GPIO_ACTIVE_LOW>;reset-gpio = <&gpio4 29 GPIO_ACTIVE_LOW>;clkreq-gpio = <&gpio4 27 GPIO_ACTIVE_LOW>;epdev_on-supply = <&epdev_on>;status = "disabled";
};epdev_on: fixedregulator@100 {compatible = "regulator-fixed";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-name = "epdev_on";gpio = <&gpio4 9 0>;enable-active-high;};

最后解决方法就是注释掉整个pciea的dts。

mmc2所有打印信息如下:

[    1.155040] sdhci: Secure Digital Host Controller Interface driver
[    1.155054] sdhci: Copyright(c) Pierre Ossman
[    1.155143] sdhci-pltfm: SDHCI platform and OF driver helper
[    1.203808] mmc2: CQHCI version 5.10
[    1.203854] enable-sdio-wakeup ok
[    1.203881] sdhci-esdhc-imx 5b030000.usdhc: assigned as wifi host
[    1.204884] mmc_rescan line=2748
[    1.211333] mmc_attach_sdio line=1136
[    1.250588] mmc2: SDHCI controller on 5b030000.usdhc [5b030000.usdhc] using ADMA
[    1.255110] mmc_rescan line=2748
[    1.255132] mmc2: mmc_rescan_try_freq: trying to init card at 400000 Hz
[    1.264293] Galcore version 6.2.4.190076
[    1.269699] mmc_attach_sdio line=1136
[    1.272419] sdio_read_cis line=239
[    1.280186] mmc2: queuing unknown CIS tuple 0x80 (2 bytes)
[    1.282545] random: fast init done
[    1.285154] mmc2: queuing unknown CIS tuple 0x80 (7 bytes)
[    1.289261] mmc2: queuing unknown CIS tuple 0x80 (6 bytes)
[    1.300245] mmc2: queuing unknown CIS tuple 0x80 (31 bytes)
[    1.303460] mmc2: queuing unknown CIS tuple 0x80 (7 bytes)
[    1.312601] mmc2: queuing unknown CIS tuple 0x80 (25 bytes)
[    1.319569] mmc_rescan freq[400000] OK!
[    1.321768] mmc2: queuing unknown CIS tuple 0x80 (25 bytes)
[    1.369956] sdio_init_func  line=86
[    1.369979] sdio_read_func_cis line=377
[    1.369989] sdio_read_cis line=239
[    1.371074] sdio_init_func line=86
[    1.371086] sdio_read_func_cis line=377
[    1.371095] sdio_read_cis line=239
[    1.372121] sdio_init_func line=86
[    1.372132] sdio_read_func_cis line=377
[    1.372141] sdio_read_cis line=239
[    1.373259] mmc2: new high speed SDIO card at address 0001
[    1.373610] mmc_rescan_try_freq line=2643
[    1.373622] mmc_rescan freq[400000] OK!

这篇关于imx8qm wifi sdio调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068818

相关文章

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

企业安全之WiFi篇

很多的公司都没有安全团队,只有运维来负责整个公司的安全,从而安全问题也大打折扣。我最近一直在给各个公司做安全检测,就把自己的心得写下来,有什么不足之处还望补充。 0×01  无线安全 很多的公司都有不怎么注重公司的无线电安全,有钱的公司买设备,没钱的公司搞人力。但是人的技术在好,没有设备的辅助,人力在牛逼也没有个卵用。一个好的路由器、交换机、IDS就像你装备了 无尽、狂徒、杀人书一

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机,暗影精灵8plus电竞主机,安装ubuntu后wifi怎么都搜不到热点,前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统,我用无线网连接了一下,可以正常上网,说明主机有无限网卡且正常。然后我就直接开始安装Ubuntu20.04了,安装成功后发现wifi有图标但是搜不到热点,我想是不是无线网卡驱动有没有

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

php 7之PhpStorm + Nginx + Xdebug运行调试

操作环境: windows PHP 7.1.10 PhpStorm-2017.2.4 Xdebug 2.5.4 Xdebug helper 1.6.1 nginx-1.12.2 注意查看端口占用情况 netstat -ano //查看所以端口netstat -aon|findstr "80" //查看指定端口占用情况 比如80端口查询情况 TCP 0.0.0.0:8

【2025】基于Python的空气质量综合分析系统的设计与实现(源码+文档+调试+答疑)

博主介绍:     ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。 技术范围:     我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT