Реализация двухэкранного дифференциального дисплея на базе RK3288.

1. Техническая подготовка

С быстрым развитием индустрии рекламы в лифтах появились рекламные машины с двумя экранами.Клиенты могут создавать контент для двух экранов в соответствии со своими потребностями и воспроизводить контент, подходящий для отображения на экране соответственно, например, воспроизведение видео сверху и изображений. внизу., диверсифицируя эффект рекламы. В соответствии с требованиями рынка на базе платформы rk3288 была разработана двухэкранная рекламная машина с дифференциальным дисплеем.

2. Конкретная реализация технических решений.

1. Принцип реализации на аппаратном уровне

RK3188 PX3 RK3288 RK3399 имеет два контроллера LCDC, встроенных в SOC, что обеспечивает двойной

Он обеспечивает основу для реализации функции отображения экрана. Тогда программная реализация заключается в открытии двух разных буферов, соответствующих внешнему

Физический экран. Затем каждый буфер отправляется на соответствующий экран через разные ЖК-дисплеи, реализуя, таким образом, функцию дифференциального отображения на двух экранах. так

Это также причина, по которой необходимо иметь два SOC LCDC для достижения функции дифференциального отображения с двумя экранами.

Платформа rk3288, используемая нашей компанией, имеет 2 ЖК-контроллера и может быть подключена к двум внешним экранам. Решение, принятое нашей компанией, заключается в том, что LCDC0 подключается к экрану с интерфейсом LVDS (18,5-дюймовый основной экран), а LCDC1 подключается к экрану с интерфейсом EDP (10,1-дюймовый дополнительный экран). Аппаратная логическая схема выглядит следующим образом:

Вставьте сюда описание изображения
2. Принципы реализации на уровне базового программного обеспечения

По умолчанию система Android 6.0, работающая на нашем чипе rk3288, может выводить изображения для отображения на одном экране только через контроллер LCD0. Для поддержки вывода изображений на два экрана одновременно через LCDC0 и LCDC1 необходимо изменить код. Принципиальная схема, реализованная с помощью программного обеспечения для анализа, выглядит следующим образом:

Вставьте сюда описание изображения
Ниже приводится анализ приведенной выше схематической диаграммы:

А. Убедитесь, что оба экрана могут нормально отображаться при использовании отдельно в качестве главного экрана. Это гарантирует, что параметры обоих экранов правильные, а физическое соединение двух экранов нормальное.

Запустите отладку и отобразите два экрана одновременно

б. Реализация части управления двумя экранами: по умолчанию код драйвера rk_screen.c будет анализировать только параметры главного экрана в dts. Добавьте к нему код для одновременного анализа параметров вторичного экрана. время на основе идентификатора. Затем драйвер rk32_lvds.c LCDC0 и драйвер rk32_dp.c LCDC1 одновременно получают соответствующие параметры экрана (только что прочтите соответствующую структуру, настроенную в rk_screen.c). Таким образом, драйверы для частей ЖК-контроллера двух экранов завершены.

в. Реализация части данных дисплея с двумя экранами: известно, что система Android абстрагирует устройство FrameBuffer для процессов пользовательского режима для прямой записи на экран. Механизм FrameBuffer имитирует функции видеокарты и абстрагирует аппаратную структуру видеокарты. Графической памятью можно напрямую управлять посредством чтения и записи FrameBuffer. Пользователи могут воспринимать FrameBuffer как образ памяти дисплея. После сопоставления его с адресным пространством процесса они могут напрямую выполнять операции чтения и записи, а операции записи могут быть немедленно отражены на экране. Эта операция абстрактна и унифицирована. Пользователям не нужно заботиться о конкретных деталях, таких как расположение физической видеопамяти, механизм подкачки и т. д. Все это выполняется драйвером устройства FrameBuffer.

Драйвер кадрового буфера в системе rk — rk_fb.c. Главный экран — /dev/graphics/fb0, а дополнительный экран — /dev/graphics/fb4. Верхний уровень возвращает дескриптор файла, открывая эти два узла, записывает данные двух экранов через дескриптор файла, а затем DMA передает данные в буфер, данные передаются на экран. По умолчанию rk_fb.c выделяет буфер только для основного экрана.Вам необходимо изменить код и выделить буфер для вторичного экрана в соответствии с параметрами экрана вторичного экрана.Размер — это количество пикселей на пиксель в длина и ширина .

3. На основе одновременного отображения двух экранов на нижнем уровне в приложении реализовано дифференциальное отображение двух экранов.

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

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

Презентация — это класс, разработанный Android для отображения на двух экранах. Его можно реализовать в APK. Путем отдельного размещения представлений презентации один и тот же APK может отображать разные представления на главном и дополнительном экранах для достижения эффекта разных дисплеев. Он работает путем вызова метода getDisplays службы DisplayManagerService для получения второго устройства отображения. Передайте второе устройство отображения в качестве параметра в Presentation, затем реализуйте собственный контент пользовательского интерфейса в Presentation и, наконец, вызовите метод show класса Presentation, чтобы отобразить содержимое пользовательского интерфейса на втором устройстве отображения. Ниже приведена простая демонстрация, которую я написал.

публичный класс MainActivity расширяет Activity

{ частная демонстрационная презентация mPresentation;

частные отображения Display[];

@Override

protected void onCreate (Bundle saveInstanceState) {

super.onCreate(saveInstanceState);

setContentView(R.layout.activity_main);

Дисплейманажер mDisplayManager = (Дисплейменеджер)

getSystemService(Context.DISPLAY_SERVICE);

отображает = mDisplayManager.getDisplays();

mPresentation = новая DemoPresentation(MainActivity.this, display[1]);

Кнопка Button1=(Кнопка) findViewById(R.id.button1);

Button1.setOnClickListener(new Button.OnClickListener() {

общественная недействительность onClick (Просмотр v)

{

//Здесь вызываем дополнительный экран

mPresentation.show();

}

});

}

публичный класс DemoPresentation расширяет презентацию {

//частное PresentationContents mContents;

public DemoPresentation (Контекст externalContext, Отображение дисплея) {

супер (outerContext, дисплей);

}

@Override

protected void onCreate (Bundle saveInstanceState) {

super.onCreate(saveInstanceState);

Ресурсы r=getContext().getResources();//Получаем файлы ресурсов на основе контекста представления

setContentView(R.layout.main2);

Кнопка Button2=(Кнопка) findViewById(R.id.button2);

videoView1 = (VideoView) findViewById(R.id.videoView1);

если (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

Файл file = Environment.getExternalStorageDirectory();

Файл videoFile = новый файл (файл, «testvideo.mp4»);

если (videoFile.exists()) {

uri = Uri.fromFile(видеофайл);

videoView1.setVideoURI(uri);

VideoView1.setMediaController(контроллер);

videoView1.requestFocus();

проиграть видео();

}

}

}

В конечном итоге в этой демоверсии реализован тот же APK. На главном экране отображаются некоторые представления, такие как кнопки, а затем на дополнительном экране может отображаться SurfaceView и воспроизводить видео.

Автор: Ван Нянь Хэ Дишэн
Ссылка: https://www.jianshu.com/p/01534039693f
Источник: Цзяньшу
Авторские права принадлежат автору. При коммерческой перепечатке просьба обращаться за разрешением к автору, при некоммерческой перепечатке просьба указывать источник.

Supongo que te gusta

Origin blog.csdn.net/qq_45763093/article/details/119319298
Recomendado
Clasificación