我们公司把蓝牙芯片的电源控制代码放在了rfkill模块里面,然后通过
echo 1 /sys/class/rfkill/rfkill0/state 和 echo 0 /sys/class/rfkill/rfkill0/state 分别打开和关闭蓝牙电源。
rfkill_init_sw_state(rfkill, true);
结果,我们的蓝牙服务不能正常启动了。我们发现 echo 1 /sys/class/rfkill/rfkill0/state是起作用的(确实能打开蓝牙电源),但是应用层的服务起不来了,而且hciconfig hci0发现mac地址为0。
一
开始我们以为要在set_block里面调用rfkill_set_sw_state,但是根本没用。后来研究rfkill的代码,发现原来
net/rfkill/core.c里面有一个全局变量rfkill_global_states,这个变量用来记录rfkill的状态。当使用echo
XXX
/sys/class/rfkill/rfkill0/state的时候,这个变量并没有变。这个变量只有在rfkill_fop_write被调用时才
被改写,也就是说,要在应用层打开rfkill并写它,才能改变这个变量的值,从而真正开启或关闭rfkill。
很 多 计 算 机 系 统 包 含 无 线 电 传 输 ,其 中 包 括 Wi-Fi、 蓝 牙 和 3G 设 备 。 这 些 设 备 消 耗 电 源 ,在 不 使 用 这 些 设 备 时 是 一 种 浪 费 。
RFKill是 Linux 内 核 中 的 一 个 子 系 统 ,它 可 提 供 一 个 界 面 ,在 此 界 面 中 可 查 询 、 激 活 并 取 消 激 活 计 算 机 系 统 中 的 无 线 电 传 输 。 当 取 消 激 活 传 输 时 ,可
使 其 处 于 可 被 软 件 重 新 激 活 的 状 态 (软 锁 定)或 者 将 其 放 在 软 件 无 法 重 新 激 活 的 位 置 (硬
锁 定)。
RFKill 核 为 子 系 统 提 供 应 用 程 序 编 程 界 面 (API)。 内 核 驱 动 程 序 被 设 计 为 支 持
RFKill 使 用 这 个 API 注 册 内 核 ,并 包 含 启 用 和 禁 用 这 个 设 备 的 方 法 。 另 外 ,RFKill 核
提 供 用 户 程 序 可 解 读 的 通 知 以 及 用 户 程 序 查 询 传 输 状 态 的 方 法 。
RFKill 界 面 位 于/dev/rfkill,其
中 包 含 系 统 中 所 有 无 线 电 传 输 的 当 前 状 态 。 每 个 设 备 都 在sysfs中
注 册 当 前 RFKill 状 态 。 另 外 ,在 启 用 了 RFKill 的 设 备 中 每 当 状 态 更 改 时 ,RFKill 会 发 出uevents。
Rfkill是 一 个
命 令 行 工 具 ,您 可 使 用 它 查 询 和 更 改 系 统 中 启 用 了 RFKill 的 设 备 。 要 获 得 这 个 工 具 ,请 安 装rfkill软 件 包 。
使 用 命 令rfkill
list获 得 设 备 列 表 ,每 个 都 包 含 与 之 关 联 的索 引 号,从0开
始 。 您 可 以 使 用 这 个 索 引 号 让rfkill停
止 使 用 或 者 使 用 某 个 设 备 ,例 如 :
rfkill block 0
停 用 系 统 中 第 一 个 启 用 RFKill 的 设 备 。
您 还 可 以 使 用rfkill阻
断 某 一 类 设 备 ,或 者 所 有 启 用 了 RFKill 的 设 备 。 例 如 :
rfkill block wifi
停 用 系 统 中 的 所 有 Wi-Fi 设 备 。 要 停 用 所 有 启 用 了 RFKill 的 设 备 ,请 运 行 :
rfkill block all
要 重 新 使 用 设 备 ,请 运 行rfkill
unblock,而 不 是rfkill
block。 要 获 得rfkill可
停 用 的 完 整 设 备 类 别 列 表 ,请 运 行rfkill
help。