https://www.cnblogs.com/zyly/p/17453829.html 一、rfkill子系统 1.1 rfkill概述 rfki是Linux内核提供的一个框架,用于控制无线通信硬件(如WiFi、蓝牙、NFC等)的开关和状态。rfkll就是RF(射频)设备的开关,有类似一键关闭所有射频外设的功能rki的出现方便管理各种RF芯片的开关,目前已经很多厂商的设备使用的是rfkill的驱动来管理一些无线设备的电源了,都是和RF相关的芯片,比如WiFi,蓝牙,NFC,FM,GPS等等。 由于这个rfkill的功能是管理无线设备的电源开关,所以这和硬件的关联是直接的,一般都会涉及到硬件的power或reset引脚。 rfkill子系统有”hard”和”soft”blocked的概念,blocked的意思就是发射器关闭 ·soft blocked::表示软件层面对无线设备进行的阻止(比如说,通过运行rkl激活命令)。在这种情况下,无线电器的硬件电源依旧是打开的,只是被软件控制给关掉了; ·hard blocked:表示硬件层面对无线设备进行的阻止,通常是由于硬件按键或者物理开关进行的关闭。在这种情况下,即使在操作系统层面执行启动命令,也无法使无线电器工作;区别在于软硬件控制的不同。soft blocked是软件层面的禁用,硬件还是打开的,可以通过命令解除禁用;而hard blocked是硬件层面的禁用,无论从软件还是命令层面都无法解除。 1.2rfkill子系统框架 rfkill子系统主要三个部分组成: 了rfkill工具,用于开启和关闭无线设备功能; ·rfkill input模块:输入层处理程序,不推荐使用的,已由用户空间策略代码代替; ·rfkill驱动程序:需要实现不同芯片的rkfill驱动程序;比如我们需要提供AP6356的rfkill驱动程序,实现AP6356设备的开启和关闭;我们要做的一般是调试厂商已经做好的rfkill驱动,或者我们自己实现API的接口,这个并不难,其实最终就是操作GPIO引脚。 1.2.1rfkill命令查看无线设备在linux系统下可以通过rfkill工具查看无线设备的功能:

root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: yes
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
root@rk3399:/lib/modules# rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth bt_default blocked unblocked
1 wlan phy0 unblocked unblocked

这里看到有两个无线设备,一个是蓝牙的,另一个WiFi的,蓝牙设备默认是禁用的。 1.2.2开启关闭无线设备 我们可以通过执行如下命令开启蓝牙设备;

root@rk3399:/lib/modules# rfkill unblock 0
root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no

同样我们可以通过命令关闭WiFi设备,可以看到当关闭WiFi设备后,就无法通过ifconfig看到设备了;

root@rk3399:/lib/modules# rfkill block 1
root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
root@rk3399:/lib/modules# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255
ether 92:a7:05:0f:19:86 txqueuelen 1000 (Ethernet)
RX packets 719 bytes 677554 (677.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 438 bytes 36520 (36.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 24

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 195 bytes 15221 (15.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 195 bytes 15221 (15.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

此时我们通过ifconfig wlan0 up命令是无法启用WiFi的;

root@rk3399:/lib/modules# ifconfig wlan0 up
SIOCSIFFLAGS: Operation not possible due to RF-kill