2014-02-20 2 views
1

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

#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 в меню Settings-> Apps и даже удалить Radio.apk (запас FM Radio app) из/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 радио], который вернулся

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 процесса выглядело подозрительно, поэтому я попытался его убить, которая не возвращает никаких ошибок, но повторный запуск отфильтрованного списка пса выше показал, что kfmradio все еще в списке процессов (Я полагаю, что ОС перезапустила его?) Любые рекомендации относительно устранения неполадок EBUSY, возвращаемые из вызовов fcntl open(), были бы очень полезными.

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

Linux ядра: 3.4.0

Android OS: 4.1.1

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

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

ответ

0

Оказывается, моя собственная программа виновата; мой основной() выглядит примерно так:

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

+0

К сожалению, теперь я получаю errno 5, 'I/O Error', когда я пытаюсь вызвать команду VIDIOC_S_FREQUENCY ioctl по какой-то причине ... – CCJ