概念
RFKill, 就是RF(射频) 设备的开关,有类似一键关闭所有射频外设的功能,比如当我们在飞机上飞行开启飞行模式时候, 所有这些RF相关的设备都需要关闭.
linux的rfkill子系统提供了用于禁用系统中任何无线电发射器的通用接口, 发射设备关闭时.不得辐射任何功率. RFKill的出现方便管理各种RF芯片的开关. 目前已经很多厂商的设备使用的是RFKill的驱动来管理一些无线设备的电源了, 都是和RF相关的芯片, 比如WIFI, 蓝牙, NFC, FM, GPS等等. 由于这个rfkill的功能是管理无线设备的电源开关, 所以这和硬件的关联是直接的,一般都会涉及到硬件的power或reset引脚.
rfkill子系统有"hard"和"soft" block的概念, block的意思就是发射器关闭, hard block和soft block的差异在于
hard block : 软件无法管控到的只读类型的无线模块
soft block: 系统软件可设置的无线模块(可不需要读权限)
rfkill子系统由三个主要组件组成:
1.rfkill core
2.rfkill-input模块(不推荐使用的, 输入层处理程序,已由用户空间策略代码代替)
3.rfkill驱动程序
rfkill core为驱动程序提供了API,让驱动程序可向内核注册无线电发射器设备, 以及打开和关闭内核的方法, 这样系统就知道怎么禁用设备硬件. rfkill core还向用户空间通知状态更改,并为用户空间提供查询当前状态的方法.
hal层一般使用/dev/rfkill设备节点来操作设备使能/禁用, 用户空间一般都操作这个设备节点来写程序. linux下有rfkill工具, 有兴趣的朋友可以去玩下, 就是开关无线设备功能. 比如我电脑ubuntu上的:
zkh@zkh-ThinkPad-Edge-E430c:~$ rfkill
Usage: rfkill [options] command
Options:
--version show version (0.5-1ubuntu3.1 (Ubuntu))
Commands:
help
event
list [IDENTIFIER]
block IDENTIFIER
unblock IDENTIFIER
where IDENTIFIER is the index no.