Android 尝试在Xperia E C1504上打开/dev/radio0返回EBUSY

Android 尝试在Xperia E C1504上打开/dev/radio0返回EBUSY,android,linux,shell,v4l2,fcntl,Android,Linux,Shell,V4l2,Fcntl,我有一个根Xperia E C1504,我想在上面访问我正在开发的自定义调频收音机应用程序的调频接收器芯片组。问题是我对/dev/radio0的fcntl open调用不断返回EBUSY errno 16:设备或资源正忙。下面是我用来尝试打开在根shell中执行的设备的代码: #define DEFAULT_RADIO_DEVICE "/dev/radio0" ... radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR); 我还尝试了openDEFAULT

我有一个根Xperia E C1504,我想在上面访问我正在开发的自定义调频收音机应用程序的调频接收器芯片组。问题是我对/dev/radio0的fcntl open调用不断返回EBUSY errno 16:设备或资源正忙。下面是我用来尝试打开在根shell中执行的设备的代码:

#define DEFAULT_RADIO_DEVICE "/dev/radio0"
...
radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR);
我还尝试了openDEFAULT_RADIO_设备,O_RDONLY,尽管我非常确定我需要对该设备进行写访问,但仍然收到了EBUSY

我通过stock FM radio应用程序验证了无线电设备的功能,该应用程序能够调谐到某个频率并成功接收PCM。我通过它的电源按钮图标关闭了这个应用程序,这应该会释放/dev/radio0,对吗?并从设置->应用程序菜单显式强制停止stock FM Radio应用程序,甚至使用根浏览器从/system/Apps中删除Radio.apk stock FM Radio应用程序包,然后重新启动手机,但我的程序在执行上述指令时继续返回EBUSY

调查哪个进程可能在/dev/radio0上持有锁并将其杀死的最佳方法是什么?我尝试了[adb shell su-c'lsof/dev/radio0',但返回的列表中没有与/dev/radio0完全匹配的条目。有相当多的“/dev/log/radio”和近300个“radio”这个词,但我希望看到一些列出来的东西正好使用/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

固件版本:库存内核Xperia E C1505_11.3.A.0.47应该也适用于C1504


根植于:SRSRoot和“甘道夫”的剥削。

原来是我自己的计划造成的;我的主要目标是:

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中的第二个错误的开放调用。我通过从testV4L2Functionality例程中删除fcntl函数调用修复了该问题。

不幸的是,现在每当我出于某种原因尝试调用VIDIOC_S_频率ioctl命令时,都会出现错误5“I/O错误”。。。