一.技术的背景

随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化。基于市场的需求,研发出了基于rk3288平台的双屏异显广告机。

二.技术方案的具体实现

1.硬件层面的实现原理

RK3188 PX3 RK3288 RK3399 的 SOC 内部,都有集成两个 LCDC 控制器,因此这就给双

屏异显功能的实现提供了基础。那么软件上的实现就是通过开辟两块不同的 buffer,对应外部的

物理屏幕。然后每块 buffer,通过不同 LCDC 送给对应的屏幕,即实现了双屏异显的功能。所以

这也是为什么必须有两块 LCDC 的 SOC 才能去做双屏异显功能的原因。

我司采用的rk3288平台就有2个LCD控制器,可以外接两个屏幕。我司采用的方案是,LCDC0接LVDS接口的屏幕(18.5寸的主屏),LCDC1接EDP接口的屏幕(10.1寸的副屏)。硬件逻辑图如下所示:


2.底层软件层面的实现原理

默认情况下,我司rk3288芯片上跑的Android 6.0系统只能通过LCD0控制器输出图像给一个屏幕显示。要支持同时通过LCDC0和LCDC1输出图像给两个屏幕显示,必须修改代码。经过分析软件实现的原理图如下:


下面是对上面原理图的解析:

a.保证两个屏幕单独作为主屏的时候都可以正常显示,这样子保证了两个屏幕的屏参都是正确的,而且两个屏幕的物理连接都正常。

开始调试两个屏幕同时显示

b.双屏显示控制部分的实现:默认情况下rk_screen.c驱动代码里只会去解析dts里主屏的屏参,在里面加入代码使得根据id同时去解析副屏的屏参。然后LCDC0的驱动rk32_lvds.c以及LCDC1的驱动rk32_dp.c同时去获取屏幕的相关参数(读取刚才rk_screen.c里配置的相关结构体)。这样子两个屏幕的LCD控制器部分的驱动都完善了。

c.双屏显示数据部分的实现:已知android系统抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由FrameBuffer设备驱动来完成的。

rk系统里面framebuffer的驱动为rk_fb.c。主屏为/dev/graphics/fb0,副屏为/dev/graphics/fb4,上层通过打开这两个节点返回文件描述符,通过文件描述符写入两个屏幕的数据,然后DMA,把缓冲区里的数据传给屏幕。默认情况下rk_fb.c只会去分配一块缓冲区给主屏用,需要修改代码,根据副屏的屏参分配缓冲区给副屏用,大小为长每个像素的位数。

3.在底层实现双屏同显的基础上,APP中去实现双屏异显

通过前面底层的修改,已经实现了双屏可以同时输出相同的内容。为了支持两个屏幕实现不同的内容,可以在APP中操作。

Android 的标准实现是使用 API Presentation 来实现异显的功能。 Presentation 是扩展自 dialog.

Presentation 是 Android 针对双屏异显所开发的一个类。它可以做到一个 APK 里面,通过给Presentation 单独进行 view 的布局,来实现同一个 APK 在主屏和副屏上面显示不同的 view,来达到异显的效果。它的工作原理是通过调用 DisplayManagerService 的 getDisplays 方法来获取第二个显示设备。将第二个显示设备作为参数传给 Presentation,然后在 Presentation 里面实现自己的 UI内容,最终调用 Presentation 的 show 方法来将 UI 内容显示在第二个显示设备上面。下面是我写的一个简单的 Demo。

public class MainActivity extends Activity

{ private DemoPresentation mPresentation;

private Display[] displays;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

DisplayManager mDisplayManager = (DisplayManager)

getSystemService(Context.DISPLAY_SERVICE);

displays = mDisplayManager.getDisplays();

mPresentation = new DemoPresentation(MainActivity.this, displays[1]);

Button Button1=(Button) findViewById(R.id.button1);

Button1.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v)

{

//这里进行副屏显示的调用

mPresentation.show();

}

});

}

public class DemoPresentation extends Presentation {

//private PresentationContents mContents;

public DemoPresentation(Context outerContext, Display display) {

super(outerContext, display);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Resources r=getContext().getResources();//根据 prsentation 的上下文获取到资源文件

setContentView(R.layout.main2);

Button Button2=(Button) findViewById(R.id.button2);

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

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

File file = Environment.getExternalStorageDirectory();

File videoFile = new File(file, “testvideo.mp4”);

if (videoFile.exists()) {

uri = Uri.fromFile(videoFile);

videoView1.setVideoURI(uri);

VideoView1.setMediaController(controller);

videoView1.requestFocus();

playVideo();

}

}

}

这个 Demo 最终实现的是同一个 APK,主屏显示一些如 button 等的 view,然后副屏可以显示一个SurfaceView,及播放一个视频。

作者:妄念和涤生
链接:https://www.jianshu.com/p/01534039693f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

基于RK3288的双屏异显实现相关推荐

  1. RK3288 增加双屏异显 eDP+LVDS

    CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...

  2. RK3288 双屏异显,两屏默认方向不一致

    CPU:RK3288 系统:Android 5.1 RK3288 支持双屏异显,一般都会同方向显示,如果遇到两个 lcd 的默认方向不一致,只需修改下面参数即可. 例如:主屏为mipi接口,分辨率为 ...

  3. rk3288android强制横屏,RK3288 6.0 双屏异显,横屏+竖屏【转】

    RK3288 6.0 双屏异显,横屏+竖屏 由于是横屏+竖屏的组合,目前考虑两种实现方案.1.副屏存在黑边 2.对副屏内容进行拉伸. 默认情况下,我们设置的双屏初始rotation都为Surface. ...

  4. 一种基于安卓系统的双屏异显技术的实现

    一.技术的背景 随着电梯传媒行业的飞速发展,双屏视频播放机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化. ...

  5. android双屏不同apk,android rk3288 rk3399 双屏双触 双屏异显 验证apk

    [实例简介] android rk3288 rk3399 双屏双触 双屏异显 验证apk,android rk3288 rk3399 双屏双触 双屏异显 验证apk,android rk3288 rk ...

  6. 基于Android5.1的双屏异显分析

    平台:android5.1  场景:客户的设备需要使用到双屏异显.分析双屏异显时,framework所做的准备.  时间:2016.9.28 Android从4.2开始支持双屏异显,其Java使用示例 ...

  7. 【RK3288 Android 7.1 / KEN】双屏异显流程

    RK3288_Android 7.1 双屏异显流程 异显功能使能 控制代码位置: 触发异显 控制代码位置: 方法 1 主要流程: 方法 2 关键步骤: 异显流程 控制代码位置: setOnlyShow ...

  8. 安卓系统双屏异显_双屏异显在Android系统上的实现

    康金荣+彭宏利 摘 要:提出了一种在ARM/Android平台上实现双屏异显功能的方法.所谓双屏异显,即在同一软硬件平台上,实现同时驱动两块LCD屏幕,并且这两块屏幕所显示的内容可以不同.这种功能的实 ...

  9. 【转载】Android 双屏异显方案

    一.技术的背景 随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化. ...

最新文章

  1. application.xml定时
  2. 卧式储罐液位体积计算公式excel_ELL外测式液位计在氢氟酸储罐上的实际应用
  3. 全局eslint不生效的处理
  4. tms320c2000 c语言伪指令,TMS320F240XDSP汇编及C语言多功能控制应用(附光盘)
  5. 唤起你对c#曾经的记忆
  6. javagui点击按钮弹出另一个界面_界面设计如何提高转化率和易用性(10则)
  7. C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
  8. VGG16—perceptual loss in keras感知损失【Keras】
  9. IDEA中java文件的左下角有个像乐符一样的J符号
  10. VS2017安装MFC
  11. 传统直线检测算法与基于深度学习的直线检测算法
  12. 工业以太网与现场总线
  13. RHEL 5 x86-64 无限制全速下载
  14. LNMP一键安装包如何重装Nginx
  15. openoffice jodconverter 文档转换pdf过坑记录
  16. Java实现AD域登录认证
  17. 大规模太空资源开采,在未来十年将成为现实
  18. Linux 查看日历
  19. 为什么诉讼融资会火?
  20. jquery 视觉特效(新闻滚动浏览)

热门文章

  1. 充电桩加盟有免费的吗
  2. 怎么输入文字生成图片?分享三个文字自动生成绘画的方法
  3. MIT-JOS系列3:启动内核
  4. 微信小程序开发demo
  5. Android Framework(一)--对Zygote的理解
  6. 使用ST官方CAD资源生成Altium Designer封装库
  7. Visual Studio 2022如何设置背景图片以及如何恢复默认背景
  8. 数字信号处理翻转课堂笔记4
  9. ecshop商城SEO优化自动内链接插件,ecshop自动内链接提高搜索引擎排名收录,ECSHOP自动内链插件,ECSHOP商城优化插件,seo优化插件
  10. Python3 IP 处理库 IPy