Linux内核(十)WIFI BT电路解析 对应设备树配置解析


参考电路解析

在这里插入图片描述

WIFI相关引脚解析

WL_REG_ON: 主要用于上电,休眠的时候,请保持GPIO上电,否则会丢失WiFi内部的状态,导致WiFi唤醒失败; SDIO注册上WIFI就有电压
WL_HOST_WAKE: 主要用于WiFi设备有数据的时候,唤醒CPU,进入中断。
(其中引脚的电平要看CPU如何配置的,如果配置的是高电平有效,那么默认情况下是低电平,当WiFi有数据过来的时候就拉高,直到主控这边把数据拿完再拉低,如果主控一直没有来拿数据就一直是高电平。)
(通过WL_HOST_WAKE中断实现当有网络数据的时候,才唤醒CPU,平时CPU处于Standby状态下, 达到低功耗的第一步.)
CLK信号: HOST给DEVICE的 时钟信号,每个时钟周期传输一个命令。
CMD信号: 双向 的信号,用于传送 命令 和 反应。
DAT0-DAT3 信号: 四条用于传送的数据线。
XTAL_OUT/TAL_IN: 外部晶振(与wifi和天线输出频率有关,不同WIFI时钟不同)

BT相关引脚解析

LPO: 默认上拉3.3V电压,PMIC_CLK32K_OUT由PMIC电源管理芯片输出。PMIC为开漏输出(只输出低电平),软件配置后,PMIC固定输出低电平,形成32.768M的时钟(这个时钟与蓝牙有关,与wifi没有关系)识别到设备后产生
UART_RXD/UART_TXD: 连接串口收发,对应连接
UART_CTS_N/UART_RTS_N: 连接串口复位/清除功能(注:UART1_CTSn -> UART_RTS_N, UART1_RTSn -> UART_CTS_N )
BT_REG_ON: 蓝牙开关
BT_WAKE_HOST: 蓝牙唤醒主机
HOST_WAKE_BT: 主机唤醒蓝牙


WIFI识别过程以及BT加载过程

WIFI识别过程

WL_REG_ON拉高电平,CPU发送SDIO_DATA_CLK时钟,发送CMD命令,只要是sdio设备会通过DAT0(DAT1-3)返回数据,CPU接收到信号就会和WIFI芯片建立连接。在文件系统可以查看是否识别到设备。

BT加载过程

通过UART串口下载固件,生成hci节点


BUG: 识别不到设备

RK平台识别不到设备,需增加上拉(驱动能力);CLK串22Ω电阻,平滑信号,如下图
在这里插入图片描述
注:其他平台也可以参考,具体查看相关平台的数据手册


设备树配置解析(基于RK3568设备树,其他平台可以参考)

SDIO接口WIFI配置
/* 打开SDIO接口 */
&sdmmc2 {
    max-frequency = <150000000>;      /* sdio接口的最大频率,可调整 */
    supports-sdio;    
    bus-width = <4>;                   /* 4线模式 */
    disable-wp;
    cap-sd-highspeed;
    cap-sdio-irq;
    keep-power-in-suspend;
    mmc-pwrseq = <&sdio_pwrseq>;
    non-removable;
    pinctrl-names = "default";
    pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;
    sd-uhs-sdr104;                   /* 支持SDIO3.0 */
    status = "okay";
};

/* WIFI_REG_ON: Wi-Fi的电源PIN脚 */
sdio_pwrseq: sdio-pwrseq {
    compatible = "mmc-pwrseq-simple";
    clocks = <&rk809 1>;           /* 特别注意:下面的clock属性是开启RK8XX PMU的32.768k的,请按照实际使用的型号填写,否在
SDIO/Wi-Fi无法使用,最新SDK已经把这个属性移到到wireless-wlan节点下,只要不重复配置即可 */
    clock-names = "ext_clock";
    pinctrl-names = "default";
    pinctrl-0 = <&wifi_enable_h>;
    /*
     * On the module itself this is one of these (depending
     * on the actual card populated):
     * - SDIO_RESET_L_WL_REG_ON
     * - PDN (power down when low)
     */
//      post-power-on-delay-ms = <200>;
    reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>;   /* 这里的电平状态恰好跟使能状态相反,比如REG_ON高有效,则这里为LOW;如果REG_ON低有效,
则填HIGH */
};

/* 对应上面的WIFI_REG_ON */
sdio-pwrseq {
    wifi_enable_h: wifi-enable-h {
        rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;
    };
};

/* WIFI_WAKE_HOST: Wi-Fi唤醒主控的PIN脚 */
wireless_wlan: wireless-wlan {
    compatible = "wlan-platdata";
    rockchip,grf = <&grf>;
    wifi_chip_type = "apxxx";        /* 海华/正基模组(AP系列)兼容可以不用修改此名称,realtek需要按实际填写 */
    status = "okay";
};

&wireless_wlan {
    pinctrl-names = "default";
    pinctrl-0 = <&wifi_host_wake_irq>;
    WIFI,host_wake_irq = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;   /* WIFI_WAKE_HOST GPIO_ACTIVE_HIGH特别注意:确认下这个wifi pin脚跟主控的连接关系,
直连的话就是HIGH, 如果中间加了一个反向管就要改成低电平LOW触发 */
    /* 注意USB接口的Wi-Fi需要添加此配置,对应WIFI_REG_ON PIN, 且无需sdio_pwrseq/sdio等
节点 */
    //WIFI,poweren_gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
};

wireless-wlan {
    wifi_host_wake_irq: wifi-host-wake-irq {
        rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>;    /* 注意一般Wi-Fi的wake up pin都是高电平触发,所以默认这里要配置为下拉,如果客户的
是硬件设计是反向的则要改为上拉,总之要初始化为与触发电平相反的状态*/
    };
};
BT设备树配置解析
// 注:不要重复定义,特别是引脚
wireless_bluetooth: wireless-bluetooth {
    // compatible = "bluetooth-platdata";
    // clocks = <&rk809 1>;
    // clock-names = "ext_clock";
    //wifi-bt-power-toggle;
    // uart_rts_gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>;
    // pinctrl-names = "default", "rts_gpio";
    // pinctrl-0 = <&uart8m0_rtsn>;
    // pinctrl-1 = <&uart8_gpios>;
    // BT,reset_gpio    = <&gpio3 RK_PA0 GPIO_ACTIVE_HIGH>;
    // BT,wake_gpio     = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>;
    // BT,wake_host_irq = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>;
    status = "disabled";
};
/* 打开对应的UART配置 */
&uart1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart1m1_xfer &uart1m1_ctsn>;
};

&wireless_bluetooth {
    compatible = "bluetooth-platdata";
    clocks = <&rk809 1>;
    clock-names = "ext_clock";
    //wifi-bt-power-toggle;
    uart_rts_gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_LOW>;       /* 这里要配置为蓝牙所使用uart的rts脚 */
    pinctrl-names = "default", "rts_gpio";
    pinctrl-0 = <&uart1m1_rtsn>;                            /* 定义gpio4 RK_PB6 为uart rst引脚 */
    pinctrl-1 = <&uart1_gpios>;				 /* 定义gpio4 RK_PB6 为蓝牙引脚 */
    BT,reset_gpio    = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>;     /* BT_REG_ON 蓝牙电源的开关 */
    BT,wake_gpio     = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;	  /* HOST_WAKE_BT */
    BT,wake_host_irq = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;     /* BT_WAKE_HOST */
    status = "okay";
};

wireless-bluetooth {
    uart1_gpios: uart1-gpios {
        rockchip,pins = <4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
    };
};
  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要深度解析Linux内核,首先需要获取相应的源码。Linux源码是开放的,可以从官方网站或镜像站点下载。以下是下载和获取Linux内核源码的步骤: 1. 访问官方网站:进入Linux官方网站(https://www.kernel.org/),在页面上找到“Releases”或类似的链接,点击进入。 2. 选择版本:在“Releases”页面上,列出了各个版本的Linux内核。可以根据需要选择特定的版本,或者选择最新版本。 3. 下载源码包:在选择了特定版本后,页面会列出该版本的所有源码包。通常有两个版本可供下载:tarball(后缀为.tar.gz)和patch(后缀为.sign)。下载tarball版本源码包。 4. 解压源码包:下载完成后,使用解压工具(如tar命令)将源码包解压到指定的目录中。例如,使用以下命令解压源码包:tar zxvf linux-x.x.x.tar.gz 5. 进入源码目录:解压完成后,进入解压后的目录:cd linux-x.x.x 6. 开始探索源码:源码目录中包含了Linux内核的各个子系统和模块。可以通过浏览源码文件、查看文档和参考资料等,进行系统的深入了解。 了解Linux内核源码的方式有很多,可以通过阅读相关的书籍、论文以及互联网上的博客和文章进行学习。深入理解Linux内核的关键在于逐步学习每个子系统的实现原理和源码逻辑,并通过实践和调试来加深对内核的理解。 总之,通过下载Linux内核源码,我们可以深入了解内核的实现细节和工作原理,为深度解析内核打下基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bazinga bingo

您的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值