当前位置:   article > 正文

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

wl_reg_on


参考电路解析

在这里插入图片描述

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都是高电平触发,所以默认这里要配置为下拉,如果客户的
是硬件设计是反向的则要改为上拉,总之要初始化为与触发电平相反的状态*/
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
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>;
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/301912
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&