RPi 树莓派 DSI 接口研究 MIPI raspberry pi

摘要:
我已经玩树莓派很久了。我发现尚未使用DSI显示界面。经过一些研究,我发现它很有趣。我稍后会记录相关信息。(更新1:目前,整个网络上有很多方案来研究hdmi和mipi之间的相互转换方案:a.)mipi屏幕+hdmi界面:大多数都是因为有很多mipi屏幕和漂亮的参数而被研究的。详细信息:谷歌,得益于包括智汇在内的各种大神的研发,如Pocket LCD方案。最困难的是MIPI的技术解决方案是NDA,屏幕参数

之前一直在玩树莓派,发现有个DSI显示接口一直没有被用上,经过一番研究发现有点意思,记录一下相关资料以后再说。

(update1: 目前全网已经有非常多的方案研究hdmi和mipi的互转方案:

a. ) mipi屏幕+hdmi接口:研究最多因为mipi屏幕很多且参数美好。详情google,感谢包括稚晖在内的各路大神的研发,例如pocketLCD方案。 其中最困难的在于MIPI的技术方案是NDA的,而且屏幕的参数因为厂商的小算盘也是严格保密的,但是功夫不负有心人,还是有很多解决方案,甚至在闲鱼又发现使用fpga去自动计算/测试mipi的驱动参数的工具,大概是因为商机很大引来了专业玩家。这里我没有跟多研究,有兴趣可以尝试下。

b.) hdmi屏幕模块+mipi接口:这个是本文之前想解决的问题,其实是一个corner的需求,主要是想利用树莓派的dsi接口实现双屏幕;而mipi直接匹配的屏幕是官方垄断的,屏幕参数直接写死在启动固件里面,且屏幕巨贵品质一般。于是希望能实现一般的屏幕接口往mipi转换,这个难度更大。需要欺骗mipi的host端。不过好在BCM的gpu与视频输出有关的VC4内核开放了代码,如果想搞也许是可以解决的,印象里面在淘宝看到过类似的方案? 不是到是不是有高手已经解决了这个问题。本文原先写作时时间较早,结论仅供参考,仅作为参考和历史记忆。

(update2:视频领域的封闭协议简直是***,不管是mipi还是dp/thunder/hdmi这些视频输出协议之间的转换,制造了无穷多的麻烦和电子垃圾。开放的通用的统一的接口才是未来的方向。)

  (update3: pi4 已经是双hdmi了,算是官方解决了这个需求:一路输出内置屏幕,一路预留作为视频输出。只是如果未来能集成EDP这种开放的内屏接口就更实用了,最好能替代专有的DSI;另外故意留这个使用率并不高的DSI接口是BCM为了促进MIPI的应用?貌似除了Zero,所有的RPi无论代数和版本都留着这个接口。)

1. DSI接口直接从BCM283x的CPU里面引出来,对应的是VC4(GPU核心)的一个输出,树莓派一共有两个DSI输出,DSI0只在树莓派的CM型号中引出。驱动这个端口目前有两种方法:

  • 官方(实际上是Broadcom和树莓派基金会)提供的闭源GPU驱动/firmware+kernel patch
  • 开源的DRM驱动,目前已经被整合到kernel当中,但在树莓派官方系统里面是可选项

2. DSI接口跑的具体协议是MIPI DSI协议,是MIPI组织规定的一种专有的视频传输协议,常见于手机屏幕。这种协议目前并不公开,相关的开发研究较为困难(在某些论坛散落者零星的资料)。与此类似的是CSI摄像头协议,但目前CSI协议已经被泄露,可以在网上找到详尽的spec。很久之前还有MIPI DPI协议,这个因为长时间的研究基本上已经被研究清楚,网上可以找到大量资料。

3 关于视频传输格式,基本可以分为三类,HDMI,VGA,A/V,DVI等面向最终用户的接口,这种接口比较常见,相关资料比较全面也容易适配,但是注意,这些接口一般需要芯片进行转换,为了通用性实际上无法直接驱动屏幕面板。第二类是一些通用的屏幕接口如edp,lvds,rgb(ttl)等等,这里所说的这些接口往往是可以直接驱动面板的,是直接编码的像素信息,复杂的是需要考虑时序和屏幕自身的参数(刷新时间,空白时间等等),另外这些协议设计的主要是像素编码和物理传输层的规定。第三类就是一些专用的屏幕接口,如MIPI DSI,MIPI DPI等等,这类接口的特性更为复杂,通过一些特定的指令序列进行控制和视频数据传输。

(补充,也有一些接口既可以外部连接,也可以直接用在屏幕上,比如DP和EDP)

4.关于树莓派的显示系统,视频相关的过程应当分为两部分分析:视频的渲染和视频的输出(编码)。

  • 视频渲染大体分为两种:直接渲染和GPU渲染,前者类似早期dos中的图形界面实现方法,几乎是在利用CPU进行直接解算,而后者是原生的驱动GPU进行渲染。
  • 视频的输出:除了某些奇葩的SPI接口屏幕,大部分的输出都是靠GPU(或者BCM283x里的专用模块:注意,树莓派非常集成,除了电源其他所有功能几乎全部由这片集成的BCM283x芯片实现),包括hdmi,dsi,dpi,a/v等等。目前就树莓派论坛的讨论看,似乎可以利用主屏幕+软件直接写入另一个屏幕的方式实现树莓派双屏。当然这样对于GPU来说压力较大(主要是渲染能力有限。对于输出来说是由芯片里某些专用模块实现的,负载并不大——当然前提是你能同时驱动这几路输出模块,目前的官方闭源驱动只能选择一个输出路径作为主屏,至于开源驱动目前可以用但是调试起来很复杂)

5. 目前,全网只有一个方案成功利用了树莓派的dsi接口,即官方屏幕,DF家也有一块类似的屏幕。利用dsi屏幕的难点有两个:硬件和软件

  • 硬件上,目前除了拆机的,基本没有能用的mipi dsi屏幕,这一类屏幕往往是定制生产的高清手机屏,专用于某些机型,不可能公开驱动和设计阐述。dpi屏幕也不多。而与此同时,非常常见而且廉价的是rgb、lvds和其他集成了驱动的hdmi成品屏幕。所以,这直接造成了树莓派的dsi接口难以被直接利用。
  • 软件上,dsi协议的握手指令等需要主机端自行发出,这一方面需要知道如何驱动gpu在dsi通道上发送这些指令,另一方面还需要知道与屏幕参数对应的dsi指令是什么。由于dsi规范并不公开,而且厂商基本也不会为个人用户提供具体的dsi驱动方法,这造成了在linux内核这一端,需要根据不同的屏幕写不同的patch,这也决定了dsi接口很难适用通用屏幕,官方往往只为个别屏幕专门写了dsi的驱动方法,而且一般是写死/hardcode在kernel和firmware里面的,更别说还有大部分的驱动是以blob的闭源形式提供的。而且,即使是进行桥接,将dsi桥接到其他格式,也需要首先配置桥接芯片的参数,这一般也是写死在firmware和kernel里的。

6. 如何解决。官方的方案是dsi->dpi桥接(TC3587系列),DF家的方案是dsi->rgb(icn6211),类似的方案还有TI家的DSI8x系列等等。这些方案的难点是:桥接芯片需要进行配置以适配输入的dsi信号和输出给的屏幕参数:要么使用单片机,要么办法让host发送这些指令(写在firmware/kernel里,驱动gpu或其他模块发送)。对应的,软件端(包括firmware kernel os 甚至software)必须进行patch并且完全的适配具体屏幕。如果自己做板子,还要考虑高频数字电路的一些玄学问题(干扰,同步,EMI等等)。总之,这个DSI接口用起来是很难了。

7. 补充:有牛人直接写FPGA来驱动dsi屏幕的,这个应该是终极解决方案。而且这个足够硬核,是反向的利用通用信号hdmi去驱动专用屏幕dsi。不过如果有这个技术。。。。应该也不会纠结树莓派用什么屏幕这种小问题了。

8. 一些思路:

  • 方案A:使用开源驱动,想办法直接驱动gpu里面的dsi输出功能,利用TC3587桥接到lvds等通用接口。难度可能在于软件端需要大量的工作,而且没有验证过TC3587系列芯片到底是否能够这么用。至少可以确认的是,树莓派自身的dsi应该不能输出官方屏之外的分辨率,如果需要其他的分辨率乃至屏幕参数,使用开源驱动是必要的。
  • 方案B:使用桥接芯片,利用外置的单片机发送初始参数给桥接芯片。host只需要简单的控制单片机就可以。但问题是dsi利用树莓派官方的闭源驱动还是无法输出其他分辨率,即使可以用单片机解决其他的dsi参数初始化问题。
  • 方案C:模拟/替换树莓派的DPI输出。树莓派在dpi驱动上开发较为完善,提供了多种分辨率支持,并且已经有大量的方案验证过这个dpi输出确实可用。痛点在于,dpi输出需要重定向到gpio上,占用了大量的gpio口比较浪费。如果能过想办法利用dsi接口走dpi的数据,或者效仿官方方案,利用dsi->dpi,想办法利用dpi的成熟驱动进行软件端的处理(分辨率等),也许可以实现dsi口的利用

9. 补充:希望下一代的树莓派可以将dpi单独导出来,这样就可以从根本上解决问题而不再为dsi困扰。Broadcom的意图很明显,希望利用RPi的DSI接口促进开发者对于BCM系芯片的高级视频功能的研究(DSI是为高清视频设计的,手机屏幕上已经大量采用了,不出意外应该是下一代的通用屏幕接口,当然,如果能开源的话),但目前看来,如果没有官方的支持,用户似乎不会对这些功能感兴趣,最多也就是感到不便而无可奈何,业余开发者根本不可能去进行这些功能的研究。目前所有的这些成功的尝试,要么本身就是Broadcom或者RPiF的工程师,要么就是有雄厚财力支持的第三方开发者。苦逼如笔者之类连100M以上示波器都没有的业余玩家,也许只能洗洗睡了。(哦,对了,我的100M示波器怕是也该还了)。

(全文终)

另:

可能有用的资料

http://m.elecfans.com/article/578395.html

https://www.amobbs.com/thread-5552741-1-1.html

https://toshiba-semicon-storage.com/us/product/assp/interface-bridge/display-interface.html

http://www.ti.com/product/SN65DSI83

(P.S. DSI Tuner 2.0)

https://www.raspberrypi.org/forums/viewtopic.php?t=213625

https://www.raspberrypi.org/forums/viewtopic.php?t=153954

https://raspberrypi.stackexchange.com/questions/49450/does-the-raspberry-pi-touch-display-work-with-regular-kernel

https://www.raspberrypi.org/forums/viewtopic.php?t=178179

https://github.com/anholt/linux/wiki/Raspberry-Pi-and-other-MIPI-DSI-display-panels

http://raspi.tv/2014/raspberry-pi-official-7-inch-dsi-prototype-preview

https://github.com/daveshah1/DSITx

https://www.raspberrypi.org/forums/viewtopic.php?f=45&t=157109

https://hackaday.io/project/364-mipi-dsi-display-shieldhdmi-adapter/details

https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual

https://www.raspberrypi.org/forums/viewtopic.php?t=188908

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2f733d6194bd58b26b705698f96b0f0bd9225369

https://dri.freedesktop.org/docs/drm/gpu/vc4.html

@anholt

@6by9 

@hermanhermitage @openedev 

@aBUGSworstnightmare @es_pi_user 

https://www.raspberrypi.org/forums/index.php

https://github.com

https://www.google.com

https://blog.csdn.net

最后,不是很喜欢论坛里大量的不可能、不行的说法,这也是进行这番研究的最初目的。

没有什么不可能,仅仅是时间和成本是否值得付出。

免责声明:文章转载自《RPi 树莓派 DSI 接口研究 MIPI raspberry pi》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML5表单之input 类型- Date Pickers(日期选择器)Linux系统glibc库版本信息查看下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编写你的第一个 Java 版 Raft 分布式 KV 存储

前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目。该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现;该项目的目标是:在复杂的分布式环境中,多个存储节点能够保证数据强一致性。 项目地址:https://github.com/stateIs0/lu-raft-kv 欢...

Django-rest-framework --- 总结

目录 drf回顾总结 drf基础知识点 1.drf框架安装 安装 drf框架规矩的封装风格 drf请求生命周期 2.接口 3.restful接口规范 4.基于restful规范的原生Django接口 主路由:url.py api组件的子路由:api/url.py 模型层:model.py 后台层:admin.py 数据库迁移 视图层:vi...

微信小程序接口测试时appid为空如何解决

一、web接口测试和app/微信小程序接口测试的区别 web接口一般是通过浏览器访问,app接口是通过手机端访问的,所以他们header头部请求是不一样的,一样的就是User Agent这个参数。 web请求的header请求中的User Agent以谷歌为例: MAC:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_1...

Java SPI机制

最近在一个日志标准化的项目中,使用了责任链模式来链接每一个具体的处理Handler.但是在实例化时,需要每一个都去创建实例。如: /** * 初始化具体的处理类 */ private void initConcreteHandler() { handlers.add(new BasicParamHandler()); hand...

Mac OS X下给树莓派安装Raspbian系统

先到树莓派的官方网站去下载一个系统镜像,推荐下载最新版的Raspbian系统。 将下载的ZIP压缩包解压后,将得到树莓派Raspbian系统的img镜像文件,打开MAC OS X自带“终端”,并切换当前目录到镜像所在位置,然后按照以下步骤即可将Raspbian系统刷入。 1. 确认镜像位于当前目录下 查看当前目录文件及其大小: ls -lh 得到如下类似...

【Unity】Compute Shader粒子效果模拟

在UE4引擎中,已经实现了GPU的粒子系统,可以快速计算数百万的粒子及其碰撞。在Unity中,可以简单的使用Compute Shader,来尝试实现GPU粒子的效果。 实现一个简单的立方体粒子效果,图片压缩的很厉害……粒子数量在6w+ 第一步,我们实现一个脚本,挂在在摄像机组件上,这个脚本我们用来控制粒子的渲染。 1 usingSystem.Colle...