1

我有一个根深蒂固的 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”漏洞利用。

4

1 回答 1

0

原来我自己的程序是罪魁祸首;我的 main() 看起来像:

bindFmRx(); //wrapped the open() fcntl function
testV4L2Functionality(); //tested a number of V4L2 functions, and also included an errant 
                         //open() call on /dev/radio0 that I thought I'd removed X|
releaseFmRx();//close()ed the /dev/radio0 device

所以我看到的 EBUSY 来自 testV4L2Functionality() 中的第二个错误的 open() 调用。我通过从 testV4L2Functionality() 例程中删除 fcntl 函数调用解决了这个问题。

于 2014-02-22T11:04:30.910 回答