我有一个根深蒂固的 Xperia E C1504,我想在它上面访问 FM 接收器芯片组,用于我正在开发的自定义 FM 收音机应用程序。问题是我对 /dev/radio0 的 fcntl open() 调用不断返回 EBUSY(错误号 16:设备或资源忙)。这是我用来尝试打开设备的代码(在根 shell 中执行):
#define DEFAULT_RADIO_DEVICE "/dev/radio0"
...
radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR);
我也尝试了 open(DEFAULT_RADIO_DEVICE,O_RDONLY),但我很确定我需要对设备的写访问权,并且仍然收到 EBUSY。
我验证了收音机设备与股票 FM Radio 应用程序一起工作,该应用程序能够调谐到一个频率并成功接收 PCM。我通过它的电源按钮图标关闭了这个应用程序(这应该释放 /dev/radio0,对吗?)并从设置->应用程序菜单中明确强制停止股票 FM Radio 应用程序,甚至删除 Radio.apk(股票 FM无线电应用程序包)从 /system/apps 使用根浏览器然后重新启动手机,但我的程序在执行上述指令时继续返回 EBUSY。
调查哪个进程可能会锁定 /dev/radio0 并杀死它的最佳方法是什么?我试过 [adb shell "su -c 'lsof /dev/radio0'"] 但返回的列表没有任何与 /dev/radio0 完全匹配的条目。'/dev/log/radio' 的例子很多,只有 'radio' 这个词有近 300 个例子,但我期待看到列出的东西正好使用 /dev/radio0。我也试过 [adb shell ps | 返回的grep radio]
root 79 2 0 0 ffffffff 00000000 S kfmradio
radio 155 140 20416 3232 ffffffff 00000000 S /system/bin/rild
radio 178 140 7820 2472 ffffffff 00000000 S /system/bin/cnd
radio 215 140 6152 500 ffffffff 00000000 S /system/bin/qmuxd
radio 231 140 7288 752 ffffffff 00000000 S /system/bin/netmgrd
radio 610 157 311448 35704 ffffffff 00000000 S com.android.phone
kfmradio 进程看起来很可疑,所以我尝试杀死它,它没有返回任何错误,但重新运行上面过滤的 ps 列表显示 kfmradio 仍在进程列表中(我想操作系统重新启动它?)有关故障排除的任何建议fcntl open() 调用的 EBUSY 返回将非常有帮助。
设备型号:索尼 Xperia E C1504
Linux内核:3.4.0
安卓操作系统:4.1.1
固件版本:Stock Kernel Xperia E C1505_11.3.A.0.47(应该也适用于 C1504)
植根于:SRSRoot 和“Gandalf”漏洞利用。