0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

迅为RK3576开发板Android?多屏显示

北京迅为电子 ? 2025-01-16 16:58 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

迅为RK3576开发板Android多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。

wKgZO2eIybuAMNxlAARecmFVpTQ112.png

1.1 Android 多屏同显

iTOP-RK3576开发板支持以下屏幕

迅为 MIPI 7 寸屏幕

标准 HDMI 屏幕(通过 HDMI 线连接)

迅为 LVDS 7 寸屏幕

迅为 LVDS 10.1 寸 1024*600 屏幕

迅为 LVDS 10.1 寸 1280*800 屏幕

然后修改Android源码kernel-6.1/arch/arm64/boot/dts/rockchip/topeet-screen-lcds.dtsi中的

设备树文件,如下图所示。LVDS屏幕是MIPI通过转接板连接显示的,RK3576不支持LVDS

显示接口

wKgZPGeIyUiASj4nAAEmytkXx3g796.png

我们可以根据自己的需求来修改topeet-screen-lcds.dtsi文件。总之,修改

topeet_screen_choose.dtsi的规律是:打开所连接的屏幕对应的宏定义,rk3576有三个显示通

道vp0 vp1 vp2,所打开的宏定义对应的vp通道不能重复。默认打开对应的宏定义为多屏同显。

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271,需要将

kernel-6.1/arch/arm64/configs/rockchip_defconfig文件中的

CONFIG_TOUCHSCREEN_GT9271=y宏定义使能,然后再编译源码。

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1024x600_GT911,需要将

kernel-6.1/arch/arm64/configs/rockchip_defconfig文件中的CONFIG_TOUCHSCREEN_GT9XX

宏定义使能,然后再编译源码。

1.2 Android 多屏异显

如果要支持多屏异显,首先要调试好双屏或多屏都可以正常显示,并且分别挂载在不同的

vp上,可以参考上一个小节根据自己的需求打开topeet-screen-lcds.dtsi设备树中的宏定义。默

认开启后,多屏显示的是同一个画面(如果要支持双屏或者多屏异显,需要应用支持异显,才会显示不同的内容)。查看当前的屏幕显示状态输入以下命令

cat /sys/kernel/debug/dri/0/summary

如果双屏或者多屏的显示器分辨率比例不同,比如说主屏是16:9,副屏是4:3,那么副

屏显示的画面会拉伸或者缩小,原因是副屏的画面是主屏映射过去的,所以副屏上显示的是

主屏的分辨率。如果同样的屏幕情况下,应用支持异显,那么副屏会显示实际正常的分辨率。

所以如果要支持双屏或者多屏同显并要求显示正常,双屏或者多屏的屏幕的分辨率比要一致。

1.2.1 指定主副屏

多屏异显的实际应用中,需要指定哪个是主屏,哪个是副屏。修改Android14源码目录下

rk3576_android14/device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk文件,添加如下内容:

如果要指定MIPI屏幕为主屏,HDMI屏幕为副屏,如下设置:

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A

如果要指定MIPI屏幕为主屏,EDP屏幕为副屏,如下设置:

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP

如果需要定义多个主副屏时,需要用逗号隔开,比如指定MIPI eDP为主屏,HDMI-A为副屏,

设置如下:

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI,eDP

PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A

1.2.2 异显方案介绍

目前有两种异显方案分别是Android PresentationAndorid Activity指定屏幕启动

Android Presentation,需要APP应用开发中调用相应接口使指定的view (Presentation

view是一个特殊的dialog类型view)在副屏中显示。

Android Activity指定屏幕启动,APP在启动activity时可以使用display id参数在对应

的屏幕上直接显示。

两者主要区别在:

1前者的acitivity需要独立开发,把需要显示的内容投到副屏,后者可以不需要源码,调用命令行或者系统接口把第三方app的acitivity投送到副屏;

2 .前者只有一个activity在顶层,通过特殊的dialog将指定内容显示在副屏,后者是两

个activity分别显示在主副屏。

接下来我们详细讲述这俩种方法。

1.2.3 Android Presentation

本小节讲解Android Presentation异显方案,瑞芯微和迅为提供了使用Android Presentation

编写好的APP例程,接下来进行测试。

1.2.3.1 ApiDemos APP

在Android12源码中瑞芯微已经提供了使用Presentation接口的测试APP,在源码

development/samples/ApiDemos目录下,需要使用mm命令编译APP。迅为提供了编译好的

测试APP在网盘资料“iTOP-RK3576开发板/02_【iTOP-RK3576开发板】/07_多屏显示配套

资料/Android/ApiDemosAPK”目录下。

此APP源码在Android源码rk3576_android14/development/samples/ApiDemos目录下,进

入此目录,输入“mm”命令进行编译,如下图所示:

wKgZPGeIyUqABUf4AAQ0JGCcDzU066.png

然后使用adb命令安装APP,依次点击App->Activity->Presentation选项,即可进入

Presentation调用界面。如下图所示:

wKgZO2eIyUiAWgKjAAB7Se4vTw0487.pngwKgZPGeIyUmAL7VSAACK53Wr-XY954.pngwKgZPGeIyUiAG6hEAADEAAimUw8294.png

在该界面需点击如下副屏的checkbox选项,即可在副屏显示相应图片。如下所示:

wKgZO2eIyUiAFWpYAAE5CTu94PI088.png

副屏HDMi屏幕显示图片,如下所示:

wKgZO2eIyUuAYdfNAAViRR-P6Xs796.png

1.2.3.2 Presentation sampleAPP

此APP在网盘资料“iTOP-RK3576开发板/02_【iTOP-RK3576开发板】/07_多屏显示配

套资料/Android/Presentation-sample”目录下,下载此APP工程,然后用Androidstudio打开,

并编译apk。编译成功之后,安装APP,APP安装成功之后如下图所示:

wKgZO2eIyUqAYjMWAAGIffsm2d0284.png

打开APP如下图所示:

wKgZO2eIyUiAGBvKAACFwurXbeU138.png

点击“显示副屏”按钮,会在副屏显示,如下图所示:

wKgZPGeIyUqALpOBAARhm67I8RU118.png

APP重要知识点讲解:

随着用户的需求增多,特别是对于一些Android平板电脑以及其他的一些Android智能

备可能有多个屏幕,用户不仅想要在主屏幕上显示内容,同样在第二屏幕上也要显示想要的

内容,这样可以达到更好的体验效果。Google也是不负众望在Android4.2版本以后提供了

Presentation类,可以轻松实现在两块屏幕上同时显示不同的内容。Presentation是一个特殊的

dialog,它的目的是显示内容到第二屏幕。在Presentation创建的时候关联一个目标设备,确

定Presentation要显示在那个设备上,根据这个设备的信息来配置Presentation的context和

resources信息。目前系统提供了两种方式来与目标显示屏进行绑定。

1通过MediaRouter接口获取并绑定:

选择显示presentation的设备最简单的方法就是使用Media Router,media router服务持续

追踪在系统中哪个音频视频线路是可用的,当routes被选择或者不被选择,或者更好的显

示presentation display的线路发生改变后media router就会发送消息。所以一些应用程序可以

自动监视这些消息来在首选设备上显示或取消presentation。

首选显示presentation的设备是Media Router进行推荐的,如果应用想要显示内容在第二

屏幕上就该使用该设备。下面将给出如何使用media router在主屏的设备创建和显示

presentation。

MediaRouter mediaRouter =(MediaRouter)

context.getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route =

mediaRouter.getSelectedRoute();

if(route !=null){

Display presentationDisplay = route.getPresentationDisplay();

if(presentationDisplay !=null){

Presentation presentation =newMyPresentation(context, presentationDisplay);

presentation.show();

}

}

根据上面代码可以看出通过系统服务Media Router来选择一个合适的route,从route中来

获取首选的display,如果display不为空就会创建该presentation,创建完成后调用presentation

的show方法将该presentation显示出来。

2通过DisplayManager接口获取并绑定

另外一个获取首选display的方法是直接使用display Manager来获取。display manager服

务提供方法枚举和描述系统中所有的设备,包括可以显示presentation的设备。display manager

持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示presentation,例如,如果

一个Activity试图在主屏幕上显示一个presentation,它可能会掩盖自己的内容,这就像在

Activity上打开一个dialog一样。

DisplayManager displayManager =(DisplayManager)

context.getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays

=displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);

if(presentationDisplays.length >0){

// If there is more than one suitable presentation display, then we could consider

// giving the user a choice. For this example, we simply choose the first display

// which is the one the system recommends as the preferred presentation display.

Display display = presentationDisplays[1]; // displays[1]是副屏

Presentation presentation =new MyPresentation(context, presentationDisplay);

presentation.show();

}

根据上面代码可以看出通过系统服务Display Manager来获取所有适合显示presentation的

display列表,如果获取到了多个适合display对象,我们选择副屏的display。最后显示

presentation。

1.2.4 Android Activity 指定屏幕启动

本小节讲解Android Activity指定屏幕启动异显方案,瑞芯微提供了使用Android Activity

指定屏幕启动编写好的APP例程,接下来进行测试。

1.2.4.1 dualscreendemo APP

RK DualScreen主要区别与android presentation,在于它实现了应用的派发,允许厂商快

速根据现有的app功能,进行模块的集成,减少开发周期和研发成本。示例代码为

DualScreenDemo.zip工程,在网盘资料“iTOP-RK3576开发板/02_【iTOP-RK3576开发板】/07_

多屏显示配套资料/Android/DualScreenDemo”目录下下载。

使用Androidstudio打开此工程代码,编译安装APP,安装完成后如下所示:

打开此APP,如下所示,有三个按钮。

第三个按钮使用了Android Activity指定屏幕启动,关键代码如下所示,第一个和第二个

按钮使用了Presentation。

private void showSecondByActivity(Context context){

ActivityOptions options = ActivityOptions.makeBasic();

MediaRouter mediaRouter = (MediaRouter)

context.getSystemService(Context.MEDIA_ROUTER_SERVICE);

MediaRouter.RouteInfo route =

mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);

if (route != null) {

Display presentationDisplay = route.getPresentationDisplay();

options.setLaunchDisplayId(presentationDisplay.getDisplayId());

Intent intent = new Intent("android.intent.action.MUSIC_PLAYER");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent, options.toBundle());

}

}

在startActivity接口参数中设置指定屏幕的display id,Activity将在指定屏幕上直接启

动显示。

Activity的多显示器支持需要设备支持

name="android.software.activities_on_secondary_displays" />。

同时application或者activity需要支持分屏属性即或者标签下设

置新的属性android:resizeableActivity="true",这个属性在你target到Android N后

android:resizeableActivity的默认值就是true。

ActivityOptions提供两个新函数以支持多个显示器,分别是setLaunchDisplayId()和

getLaunchDisplayId()。

setLaunchDisplayId()指定Activity在启动后应显示在哪个显示器上。

getLaunchDisplayId()返回操作组件的当前启动显示器。

在上述代码中使用MediaRouter接口获取副屏的display id,同理也可以使用

DisplayManager接口获取响应的display id。

1.2.5 支持输入法在副屏显示

修改Android14源码下的device/rockchip/common/display_settings.xml文件,如下所示:

将设置相应屏幕shouldShowIme为true,如上配置支持输入法在local:1的副屏上显示。

1.2.6 副屏 DPI 设置

修改Android14源码下的device/rockchip/common/display_settings.xml文件,如下所示:

修改forcedDensity的值可以修改副屏的屏幕密度。

1.2.7 主屏幕可以触摸,副屏不触摸

如果想要实现主屏可以触摸,副屏不用触摸的功能。有两种解决方式:第一种是在App

应用代码中实现。第二种需要修改framework层的源码。

第一种方式:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

第二种方式:

修改Android14源码frameworks/native/services/inputflinger/reader/EventHub.cpp文件,屏蔽掉device->classes |= InputDeviceClass::EXTERNAL;属性,如下图所示:

1.2.8 多屏异触

多屏异触需要指定主副屏。这里使用修改Android源码的方式实现绑定副屏触摸芯片。这

样设置以后,系统开机会自动将ft5x06触摸绑定到副屏上面去。修改文件:

frameworks/native/services/inputflinger/reader/EventHub.cpp,添加如下加红的代码。通过修改

EventHub.cpp文件,在isExternalDeviceLocked函数中判断设备名称为指定的副屏设备(比如

副屏的设备名称是generic ft5x06 (79)),则返回true。

bool EventHub::Device::isExternalDeviceLocked() {

const char *I2C_DEVICE_NAME = "generic ft5x06 (79)";

ALOGE("input deviceis '%s' ",device->identifier.name.c_str());

if (strcmp(device->identifier.name.c_str(), I2C_DEVICE_NAME) == 0) {

return true;

}

if (configuration) {

std::optional isInternal = configuration->getBool("device.internal");

if (isInternal.has_value()) {

return !isInternal.value();

}

}

return identifier.bus == BUS_USB || identifier.bus == BUS_BLUETOOTH;

}

这里的I2C_DEVICE_NAME需要根据实际情况添加,用户可根据ALOGE打印信息在

logcat中寻找识别到的芯片实际的名字。下面是添加了ALOGE打印信息后在logcat中得到的

设备名字的截图:

wKgZO2eIyUuAFsRCAAJwkLI6_ag298.png

上图中的goodix-ts和generic ft5x06 (79)即为这里使用的触摸IC芯片的名字,将这个复制

到代码中即可。修改完毕,重新编译Android镜像,用户测试的时候可以直接使用ApiDemo APP

进行测试。

1.2.9 鼠标异屏切换

在多屏异显情况下,修改以下代码使鼠标箭头可以移动到需要的副屏上去进行操作。

我们需要修改Android14源码中

frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp文件

搜索"sys.mouse.presentation",然后将下面的代码中0改为1。

//-----rk-code----

char mMousePresentation[PROPERTY_VALUE_MAX] = {1};

property_get("sys.mouse.presentation", mMousePresentation, "1");

if (strcmp(mMousePresentation, "1") == 0) {

if (std::optional rect = mPointerController->getBounds();

rect.has_value()) {

if(xCursorPosition==rect->left||xCursorPosition==rect->right||yCursorPosition==rect->top||yCursor

Position==rect->bottom){

mDisplayId=getPolicy()->notifyDisplayIdChanged();

}

}

}else{

mDisplayId = mPointerController->getDisplayId();

}

然后重新编译Android源码,然后烧写镜像。
1.2.10 副屏显示配置

1.2.10.1 副屏全屏显示

设置副屏(副屏1、副屏2等)是否全屏显示可通过修改persist.sys.rotation.efull-n(n=1、

2、3、….)参数的取值进行配置,若配置为true则会进行全屏显示。

现以MIPI主屏、HDMI副 屏 为 例 ,修改如下:

在device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk文件中添加如下内容,使得

HDMI副屏可以全屏显示(由于副屏图像参考主屏宽高比进行缩放,若宽高比不一致,则出

现黑边,所以默认HDMI副屏显示会有黑边):

PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true

修改完成后,保存退出,重新编译烧写镜像即可。

注:由于mipi竖屏显示与HDMI宽高比相差较大,HDMI设置全屏显示后拉伸较明显!

1.2.10.2 副屏显示方向

副屏的旋转角度可通过persist.sys.rotation.einit-n(n=1、2、3、….)属性控制,该属性用

于设置副屏(副屏1、副屏2等)的显示方向,可取值为0/1/2/3,分别表示将副屏显示方

向旋转(顺时针)0度、90度、180度、270度。

现以MIPI主屏、HDMI副 屏 为 例 ,修改如下:

在device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk文件中添加如下内容,使得

HDMI副屏的显示方向旋转90度:

PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1

PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=false

wKgZO2eIyUqAT54qAAGeRm3RRp4498.png

修改完成后,保存退出,重新编译烧写镜像即可,HDMI会旋转90°竖屏显示。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3974

    浏览量

    130491
  • 开发板
    +关注

    关注

    25

    文章

    5725

    浏览量

    105605
  • rk3576
    +关注

    关注

    1

    文章

    185

    浏览量

    807
  • 迅为电子
    +关注

    关注

    0

    文章

    68

    浏览量

    187
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于RK3576开发板的PWN使用说明

    RK3576开发板使用PWN教程及Demo
    的头像 发表于 05-07 14:07 ?1358次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的PWN使用说明

    基于RK3576开发板的RTC使用说明

    文章主要展示RK3576开发板的RTC信息和快速上手例程
    的头像 发表于 05-07 15:04 ?915次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的RTC使用说明

    基于RK3576开发板的人脸识别算法

    RK3576开发板展示人脸识别算法例程和API说明
    的头像 发表于 05-07 16:48 ?2028次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的人脸识别算法

    敬请期待 | RK3576开发板即将发布

    敬请期待 | RK3576开发板即将发布
    的头像 发表于 11-22 15:13 ?672次阅读
    敬请期待 | <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>即将发布

    RK3576开发板核心与底板接口硬件介绍

    RK3576开发板核心与底板接口硬件介绍
    的头像 发表于 01-14 15:15 ?1603次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>核心<b class='flag-5'>板</b>与底板接口硬件介绍

    电子推出iTOP-RK3576开发板

    随着人工智能、物联网和边缘计算的飞速发展,公司重磅推出iTOP-RK3576开发板。这款开发板搭载瑞芯微
    的头像 发表于 01-15 17:22 ?927次阅读

    RK3588 vs RK3576开发板旗舰与次旗舰的终极对决

    RK3588 vs RK3576开发板旗舰与次旗舰的终极对决
    的头像 发表于 03-24 14:09 ?915次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK</b>3588 vs <b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>旗舰与次旗舰的终极对决

    iTOP-RK3576人工智能开发板Android?系统接口功能测试

    iTOP-RK3576人工智能开发板Android?系统接口功能测试
    的头像 发表于 03-28 14:45 ?2929次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b>iTOP-<b class='flag-5'>RK3576</b>人工智能<b class='flag-5'>开发板</b><b class='flag-5'>Android</b>?系统接口功能测试

    RK3576开发板高算力低成本工业级核心板卡开发平台

    RK3576开发板高算力低成本工业级核心板卡开发平台
    的头像 发表于 06-09 15:13 ?753次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>高算力低成本工业级核心板卡<b class='flag-5'>开发</b>平台

    RK3576核心高算力AI开发板开启智能应用新时代

    RK3576核心高算力AI开发板开启智能应用新时代
    的头像 发表于 06-10 14:13 ?628次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b>核心<b class='flag-5'>板</b>高算力AI<b class='flag-5'>开发板</b>开启智能应用新时代

    RK3576开发板NPU例程测试-rknn-toolkit2环境搭建和使用

    RK3576开发板NPU例程测试-rknn-toolkit2环境搭建和使用
    的头像 发表于 06-17 13:46 ?620次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>NPU例程测试-rknn-toolkit2环境搭建和使用

    RK3576开发板NPUrknn-toolkit2环境搭建和使用docker环境安装

    RK3576开发板NPUrknn-toolkit2环境搭建和使用docker环境安装
    的头像 发表于 06-18 15:22 ?586次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>NPUrknn-toolkit2环境搭建和使用docker环境安装

    RK3576开发板NPU环境搭建和使用rknn-toolkit2功能演示连推理

    RK3576开发板NPU环境搭建和使用rknn-toolkit2功能演示连推理
    的头像 发表于 06-23 13:54 ?506次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>NPU环境搭建和使用rknn-toolkit2功能演示连<b class='flag-5'>板</b>推理

    高情性6TOPS算力的RK3576开发板NPU rknn-model-zoo例程演示

    RK3576开发板NPU rknn-model-zoo例程演示
    的头像 发表于 07-01 14:54 ?1023次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b>高情性6TOPS算力的<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>NPU rknn-model-zoo例程演示

    RK3576开发板摄像头实时推理测试-ppseg?图像分割

    RK3576开发板摄像头实时推理测试-ppseg 图像分割
    的头像 发表于 07-11 14:31 ?440次阅读
    <b class='flag-5'>迅</b><b class='flag-5'>为</b><b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>摄像头实时推理测试-ppseg?图像分割