RFKill、休眠唤醒与 Wi-Fi 共存

RFKill、休眠唤醒与 Wi-Fi 共存

1. 标准RFKill

Bluetooth HCI设备注册rfkill,software block控制radio policy。rfkill list/block/unblock bluetooth不保证物理断电,具体取决于driver。

2. Rockchip平台实现

本厂商树另有:

  • net/rfkill/rfkill-bt.c
  • net/rfkill/rfkill-wlan.c
  • CONFIG_RFKILL_RK=y

它解析 compatible = "bluetooth-platdata"的旧式属性并控制power/reset/wake/RTS/clock。

3. Power sequence

rfkill_rk_set_power()协调:

-combo shared rail;
-BT reset/power GPIO;
-device wake;
-host wake IRQ;
-RTS pin state;
-external clock;
-与Wi-Fi当前power state。

因此HCI UART transport本身可能不知道真正电源状态。

4. Wake signals

  • BT,wake_gpio:host通知controller保持唤醒;
  • BT,wake_host_irq:controller唤醒host;
  • polarity由GPIO flags定义;
    -IRQ需配置wake;
    -suspend前切换sleep状态。

5. RTS GPIO

板型提供 uart_rts_gpios以及 default/rts_gpio pinctrl states。Suspend时把RTS从UART复用切到GPIO可防止模块误唤醒或实现厂商低功耗握手。

6. Shared power

Wi-Fi/BT combo可能共享VBAT/VIO/32k clock。单独重启BT时不可无条件关闭shared rail;rfkill-wlan.crfkill-bt.c通过全局状态协调。

7. 并发与限制

平台实现使用全局 g_rfkill,天然偏单实例;GPIO属性名称为厂商旧binding。它不同于标准UART Bluetooth child/serdev模型,迁移时不能同时让两套driver控制同一GPIO。

8. Suspend问题

常见失败:

-host wake polarity错;
-IRQ未标wake;
-wake GPIO过早拉低;
-RTS pinctrl错误;
-32k clock停;
-UART RX clock gated;
-Wi-Fi driver关闭shared rail;
-延迟work与suspend竞态。

9. 调试

1
2
3
4
rfkill list
cat /proc/interrupts | grep -i -E 'bt|gpio'
cat /sys/kernel/debug/gpio
cat /sys/kernel/debug/pinctrl/*/pinmux-pins

文章互动

阅读 --

留言

0 条留言

正在加载留言…