Как загрузить Qualcomm Snapdragon без HDMI - PullRequest
3 голосов
/ 01 октября 2019

Я занимаюсь разработкой видео-приложения для Qualcomm Snapdragon, который работает под управлением Android. У меня есть приложение, которое принимает видеопоток, обрабатывает его и отправляет поток данных на основе изображения. Он также может иметь режим для отображения изображений по HDMI, но это не обязательно. Я также настроил свое приложение на автоматический запуск при запуске.

Важно, чтобы система могла быть запущена без подключенного HDMI. Однако при запуске системы без подключенного монитора процесс загрузки перехватываетсяв бесконечном цикле, когда кажется, что он пытается запустить видео / аудио сервисы, не удается и пытается снова. Когда HDMI подключен, система может завершить загрузку и перейти к начальному экрану. Вот журнал, который я получил по последовательному каналу, который зацикливается навсегда при попытке загрузки без HDMI:

[ 22.471956] init: property_set("ro.boottime.audioserver", "22471598897") failed: property already set
[ 22.481207] init: property_set("ro.boottime.cameraserver", "22480859470") failed: property already set
[ 22.490533] init: property_set("ro.boottime.media", "22490197595") failed: property already set
[ 22.499191] init: property_set("ro.boottime.netd", "22498862751") failed: property already set
[ 22.531151] init: property_set("ro.boottime.wificond", "22530820772") failed: property already set
[ 22.983305] MSM-CPP cpp_init_hardware:1023 stream_cnt:0
[ 23.126367] init: property_set("ro.boottime.zygote", "23125974574") failed: property already set
[ 23.206157] MSM-CPP cpp_init_hardware:1023 stream_cnt:0
[ 23.561725] msm_qti_pp_get_rms_value_control, back not active to query rms be_idx:3
[ 23.573642] msm_voice_sound_focus_get: Error getting Sound Focus Params, err=-22
[ 23.580423] msm_voice_source_tracking_get: Error getting Source Tracking Params, err=-22
[ 23.588465] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.594484] msm_audio_sound_focus_get: Could not get copp idx for port_id=16385
[ 23.602184] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.608040] msm_audio_source_tracking_get: Could not get copp idx for port_id=16385
[ 23.616115] msm_voice_sound_focus_get: Error getting Sound Focus Params, err=-22
[ 23.623421] msm_voice_source_tracking_get: Error getting Source Tracking Params, err=-22
[ 23.631478] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.637464] msm_audio_sound_focus_get: Could not get copp idx for port_id=4101
[ 23.644995] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.651027] msm_audio_source_tracking_get: Could not get copp idx for port_id=4101
[ 23.658855] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.664939] msm_audio_sound_focus_get: Could not get copp idx for port_id=4103
[ 23.672444] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 23.678435] msm_audio_source_tracking_get: Could not get copp idx for port_id=4103
[ 23.688260] msm_pcm_volume_ctl_get substream runtime not found
[ 23.694029] msm_pcm_volume_ctl_get substream runtime not found
[ 23.699605] msm_pcm_volume_ctl_get substream runtime not found
[ 23.705037] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.712576] msm_pcm_volume_ctl_get substream runtime not found
[ 23.717709] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.725125] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.731802] msm_pcm_volume_ctl_get substream runtime not found
[ 23.737211] msm_pcm_volume_ctl_get substream or runtime not found
[ 23.744698] msm_pcm_volume_ctl_get substream runtime not found
[ 23.749964] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.757250] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.764110] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.770790] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.777327] msm_compr_audio_effects_config_get: stream or effects inactive
[ 23.784724] msm_compr_audio_effects_config_get: stream or effects inactive
[ 25.705018] init: property_set("ro.boottime.surfaceflinger", "25704640562") failed: property already set
[ 25.705499] init: Failed to bind socket 'pdx/system/vr/display/client': No such file or directory
[ 25.705779] init: Failed to bind socket 'pdx/system/vr/display/manager': No such file or directory
[ 25.706060] init: Failed to bind socket 'pdx/system/vr/display/vsync': No such file or directory
[ 26.052708] init: Unable to open '/sys/android_power/request_state': No such file or directory
[ 26.060404] init: Unable to write to '/sys/power/state': Invalid argument
[ 26.138413] init: property_set("ro.boottime.hwcomposer-2-1", "26138041187") failed: property already set
[ 26.534961] init: property_set("ro.boottime.audio-hal-2-0", "26534542802") failed: property already set
[ 27.048016] msm_qti_pp_get_rms_value_control, back not active to query rms be_idx:3
[ 27.057638] msm_voice_sound_focus_get: Error getting Sound Focus Params, err=-22
[ 27.064137] msm_voice_source_tracking_get: Error getting Source Tracking Params, err=-22
[ 27.072189] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.078398] msm_audio_sound_focus_get: Could not get copp idx for port_id=16385
[ 27.085828] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.092048] msm_audio_source_tracking_get: Could not get copp idx for port_id=16385
[ 27.099817] msm_voice_sound_focus_get: Error getting Sound Focus Params, err=-22
[ 27.107172] msm_voice_source_tracking_get: Error getting Source Tracking Params, err=-22
[ 27.115220] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.121482] msm_audio_sound_focus_get: Could not get copp idx for port_id=4101
[ 27.128760] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.135023] msm_audio_source_tracking_get: Could not get copp idx for port_id=4101
[ 27.142667] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.148883] msm_audio_sound_focus_get: Could not get copp idx for port_id=4103
[ 27.156218] msm_audio_get_copp_idx_from_port_id: Invalid FE, exiting
[ 27.162444] msm_audio_source_tracking_get: Could not get copp idx for port_id=4103
[ 27.171810] msm_pcm_volume_ctl_get substream runtime not found
[ 27.177051] msm_pcm_volume_ctl_get substream runtime not found
[ 27.182976] msm_pcm_volume_ctl_get substream runtime not found
[ 27.188378] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.195922] msm_pcm_volume_ctl_get substream runtime not found
[ 27.201188] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.208164] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.215088] msm_pcm_volume_ctl_get substream runtime not found
[ 27.220547] msm_pcm_volume_ctl_get substream or runtime not found
[ 27.227649] msm_pcm_volume_ctl_get substream runtime not found
[ 27.232647] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.239729] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.246622] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.253478] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.260348] msm_compr_audio_effects_config_get: stream or effects inactive
[ 27.267146] msm_compr_audio_effects_config_get: stream or effects inactive

Я считаю, что должен быть какой-то способ отредактировать файл init.rc, чтобы предотвратить работу аудио / видео сервисовзапустить при загрузке, затем зарегистрировать какое-либо «горячее подключение» в ueventd, когда HDMI будет подключен позже, после загрузки.

Пока я изучал эти вещи, я заблудился о том, как на самом деле их реализовать, и я не знаю наверняка, является ли это правильным путем. Любая помощь будет принята с благодарностью!

Редактировать: Кажется, что способ сделать это правильно, отредактировав исходный код Android, намного выше моей зарплаты, но легко исправить это купить фиктивный штекер HDMI, который имитируетМонитор HDMI. По сути, он просто имеет данные EDID в своих регистрах и выплевывает их обратно, когда операционная система первоначально ищет их отображение.

1 Ответ

0 голосов
/ 01 октября 2019

DisplayDevice.cpp привел меня к Композиция виртуального дисплея :

Композиция виртуального дисплея аналогична композиции внешнего дисплея. Разница между составом виртуального дисплея и составом физического дисплея заключается в том, что виртуальные дисплеи отправляют вывод в буфер Gralloc, а не на экран. Hardware Composer (HWC) записывает выходные данные в буфер, обеспечивает ограничение завершения и отправляет буфер потребителю (например, видеокодеру, графическому процессору, центральному процессору и т. Д.). Виртуальные дисплеи могут использовать 2D / блитер или оверлеи, если конвейер дисплея выполняет запись в память.

Также Виртуальные дисплеи объясняют это:

SurfaceFlingerподдерживает внутренний дисплей (встроенный в телефон или планшет), внешние дисплеи (например, телевизор, подключенный через HDMI) и один или несколько виртуальных дисплеев, которые обеспечивают композитный выход в системе. Виртуальные дисплеи могут использоваться для записи экрана или отправки экрана по сети. Кадры, сгенерированные для виртуального дисплея, записываются в BufferQueue.

. Чтобы обеспечить ожидаемый выходной буфер, потребуется подключить виртуальное устройство отображения. После непродолжительного исследования я не совсем уверен, как этого добиться, но при просмотре журнала ... кажется, что он уже облажался при попытке получить дисплей, чтобы показать анимацию загрузки.

Это виртуальное устройство отображения необходимо настроить в качестве основного выходного буфера. Я предполагаю, что это можно настроить с помощью файла system.prop или некоторого *.rc файла или любого init.*.sh, на который он может ссылаться. TYPE_HDMI = 2 и TYPE_VIRTUAL = 5 ... найдено в Display.java . Кажется, что событие, которое вы ищете, при подключении или отключении кабеля HDMI, является DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED.

Не стесняйтесь отправлять лучший ответ, если вы можете узнать, как это работает.

...