попытка открыть /dev/radio0 на Xperia E C1504 возвращает EBUSY

У меня есть рутированный Xperia E C1504, на котором я хотел бы получить доступ к набору микросхем FM-приемника для пользовательского приложения FM-радио, над которым я работаю. Проблема в том, что мой вызов fcntl open() к /dev/radio0 продолжает возвращать EBUSY (ошибка 16: устройство или ресурс заняты). Вот код, который я использую, чтобы попытаться открыть устройство (выполняется в корневой оболочке):

#define DEFAULT_RADIO_DEVICE "/dev/radio0"
...
radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR);

Я также попытался открыть (DEFAULT_RADIO_DEVICE, O_RDONLY), хотя я почти уверен, что мне нужен доступ для записи к устройству, и все равно получил EBUSY.

Я проверил работоспособность радиоустройства с помощью стандартного приложения FM Radio, которое смогло настроиться на частоту и успешно принять PCM. Я отключил это приложение с помощью значка кнопки питания (это должно освободить /dev/radio0, верно?) и явно принудительно остановил стандартное приложение FM-радио из меню «Настройки» -> «Приложения» и даже удалил Radio.apk (стандартный FM-радио). Пакет приложений для радио) из /system/apps с помощью Root Browser и последующей перезагрузки телефона, но моя программа продолжает возвращать EBUSY при выполнении вышеуказанной инструкции.

Каков наилучший способ выяснить, какой процесс может блокировать /dev/radio0, и убить его? Я попробовал [adb shell "su -c 'lsof /dev/radio0'"], но в возвращаемом списке не было записей, точно соответствующих /dev/radio0. Было довольно много случаев «/dev/log/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 все еще находится в списке процессов (я полагаю, ОС перезапустила его?) Любые советы по устранению неполадок Возврат EBUSY из вызовов fcntl open() был бы очень полезен.

Модель устройства: Sony Xperia E C1504

Ядро Linux: 3.4.0

ОС Android: 4.1.1

Версия прошивки: Stock Kernel Xperia E C1505_11.3.A.0.47 (должно работать и на C1504)

Укоренено с: SRSRoot и эксплойтом «Гэндальф».


person CCJ    schedule 20.02.2014    source источник


Ответы (1)


оказывается виновата моя собственная программа; мой 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, который я видел, исходил от второго ошибочного вызова open() в testV4L2Functionality(). Я исправил проблему, удалив вызовы функций fcntl из подпрограммы testV4L2Functionality().

person CCJ    schedule 22.02.2014
comment
к сожалению, теперь я получаю errno 5, «Ошибка ввода-вывода», всякий раз, когда я по какой-то причине пытаюсь вызвать команду ioctl VIDIOC_S_FREQUENCY... - person CCJ; 22.02.2014