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_RX
				SC_P_UART1_TX
				SC_P_UART1_CTS_B
				SC_P_UART1_RTS_B

/* wifi */
				SC_P_SPI2_SDO   // IRQ gpio3 8
				SC_P_USDHC2_RESET_B    //ENABLE gpio4 9
				/* USDHC2 SDIO*/
				SC_P_USDHC2_CLK
				SC_P_USDHC2_CMD
				SC_P_USDHC2_DATA0
				SC_P_USDHC2_DATA1
				SC_P_USDHC2_DATA2
				SC_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_SDIO
                if (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 0x18000000
				SC_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	0x06000021
				SC_P_PCIE_CTRL0_WAKE_B_LSIO_GPIO4_IO28		0x04000021
				SC_P_PCIE_CTRL0_PERST_B_LSIO_GPIO4_IO29		0x06000021
				SC_P_LVDS1_I2C0_SDA_LSIO_GPIO1_IO13		0x06000000
				SC_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!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
*************************** Freescale i.MX8QM MEK board *************************** This file documents the Buildroot support for the NXP i.MX8QM MEK board. You will find a reference to the board on nxp.com: https://www.nxp.com/design/development-boards/i.mx-evaluation-and-development-boards/i.mx-8quadmax-multisensory-enablement-kit-mek:MCIMX8QM-CPU You can also find the get started guide here: https://www.nxp.com/document/guide/get-started-with-the-i.mx-8quadmax-mek:GS-iMX-8QM-MEK Build ===== First, configure Buildroot for the i.MX8QM MEK board: $ make freescale_imx8qmmek_defconfig Build all components: $ make You will find in output/images/ the following files: - ahab-container.img - bl31.bin - boot.vfat - fsl-imx8qm-mek.dtb - Image - imx8-boot-sd.bin - mkimg.commit - mx8qm-mek-scfw-tcm.bin - mx8qm-val-scfw-tcm.bin - mx8qm-a0-ddr4-scfw-tcm.bin - mx8qm-a0-mek-scfw-tcm.bin - mx8qm-a0-val-scfw-tcm.bin - mx8qm-ddr4-scfw-tcm.bin - rootfs.ext2 - rootfs.ext4 - rootfs.tar - sdcard.img - u-boot-atf.bin - u-boot.bin - u-boot-hash.bin Create a bootable SD card ========================= To determine the device associated to the SD card have a look in the /proc/partitions file: cat /proc/partitions Buildroot prepares a bootable "sdcard.img" image in the output/images/ directory, ready to be dumped on a SD card. Launch the following command as root: dd if=output/images/sdcard.img of=/dev/ *** WARNING! This will destroy all the card content. Use with care! *** For details about the medium image layout, see the definition in board/freescale/common/imx/genimage.cfg.template_imx8. Boot the i.MX8QM MEK board ========================== To boot your newly created system: - insert the SD card in the SD slot of the board; - Configure the boot switch as follows: SW2: OFF OFF ON ON OFF OFF - put a micro USB cable into the Debug USB Port and connect using a terminal emulator at 115200 bps, 8n1; - power on the b
### 回答1: IMX RT1050是一款功能强大的微控制器,但在调试时遇到问题可能是由以下原因引起的: 首先,调试的问题可能是硬件方面的。请确保IMX RT1050与调试工具之间的连接正确。检查调试工具的电源和连接电缆是否正常工作。还应该确保调试接口的引脚连接正确,例如JTAG或SWD。 其次,调试问题可能是由于软件设置不正确引起的。请检查您使用的调试工具和软件是否兼容IMX RT1050。确保调试配置文件正确设置,例如调试工具与目标设备的设备选项、时钟频率等。还应该检查是否有正确的调试固件和驱动程序。 另外,调试问题还可能是由于代码错误引起的。请仔细检查代码逻辑和语法错误,确保没有悬空指针、内存溢出等问题。可以使用调试工具中的断点和变量监视功能来帮助定位代码错误。 最后,如果以上方法都无法解决调试问题,建议参考IMX RT1050的官方文档和论坛,寻求更多的技术支持和解决方案。厂商可能会提供一些特殊的调试工具或技巧,帮助您解决调试问题。 综上所述,如果无法调试IMX RT1050,您可以从硬件、软件和代码三个方面进行排查和调试。及时仔细检查各个环节,并参考官方文档和论坛,以找出并解决问题。 ### 回答2: 对于imx rt1050无法调试的问题,有以下几个可能的原因和解决方法: 1. 连接问题:首先要确保你的开发板与计算机正确地连接。检查USB连接线是否插入正确,尝试更换USB线,或者使用不同的USB接口。还可以尝试重启计算机和开发板来解决潜在的连接问题。 2. 调试器设置问题:确保你的调试器设置正确。打开你所使用的集成开发环境(IDE),进入调试器设置,选择正确的调试器类型和目标设备类型。确认是否正确设置了调试器的端口和波特率等参数。 3. 软件问题:检查你的开发环境和SDK是否正确安装。确保你使用的是支持imx rt1050的开发环境版本,并且已经正确配置了相关的软件环境。尝试重新安装开发环境和SDK,或者尝试使用不同的开发环境来解决潜在的软件问题。 4. 硬件问题:如果以上方法都无效,有可能是硬件问题导致无法调试。检查你的开发板是否正常工作,例如检查供电是否正常、是否存在硬件损坏等。如果有必要,可以尝试更换开发板或者咨询厂家的技术支持。 总之,当遇到imx rt1050无法调试的问题时,可以从连接问题、调试器设置问题、软件问题和硬件问题等方面逐一排查,并采取相应的解决方法。如果以上方法都无效,建议寻求专业的技术支持来解决问题。 ### 回答3: IMX RT1050 是一款功能强大的嵌入式处理器,用于开发各种实时应用程序,但在进行调试时遇到问题可能是因为以下原因: 1. 硬件连接问题:请确保正确连接使用调试器(如J-Link)与目标板之间的调试接口,确保接口线正常工作,并且没有任何松动或接触不良。 2. 软件设置问题:调试前,请确保使用正确的 IDE(集成开发环境,如Keil MDK)并配置正确的调试选项。例如,选择正确的目标芯片型号(IMX RT1050),正确的调试接口(例如JTAG或SWD),以及正确的调试选项,如时钟频率和调试模式。 3. 编码问题:在程序编写过程中可能存在代码错误或配置问题。请确保您的代码没有任何逻辑错误,并且正确地初始化和配置了相关的硬件资源。 4. 供电问题:请确保目标板的供电电压和电流满足 IMX RT1050 的要求,以避免在调试过程中因为电源不足而出现问题。 5. 调试接口芯片问题:IMX RT1050 主芯片与调试器之间可能由于硬件兼容性问题而导致不能正常映射、调试相关操作。在这种情况下,您可能需要升级调试器固件,或者查找更多关于特定兼容性问题的信息。 如果以上解决方法无效,建议检查嵌入式处理器是否未被损坏,或者与原始设备制造商联系,以获取更详细的技术支持和建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值