У меня есть рутированный 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 и эксплойтом «Гэндальф».