博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RPi 树莓派 DSI 接口研究 MIPI raspberry pi
阅读量:5067 次
发布时间:2019-06-12

本文共 4418 字,大约阅读时间需要 14 分钟。

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

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

 

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

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

 

转载于:https://www.cnblogs.com/B1ue/p/10334900.html

你可能感兴趣的文章
如何开启firebug显示注释?
查看>>
SyntaxError: missing ; before statement 错误的解决
查看>>
PHPmailer关于Extension missing: openssl报错的解决
查看>>
数据库索引设计
查看>>
插件jfreechart+shh实现树状图 柱状图 折线图
查看>>
CGI与WSGI
查看>>
UVa11729 - Commando War
查看>>
[CQOI2015]选数
查看>>
2015.3.15
查看>>
BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会( dp + dfs )
查看>>
【Weex学习】环境搭建
查看>>
url字符串和对象之间的转换
查看>>
vJine 第三波 之 Lua 来袭 vJine.Lua
查看>>
配置VLFeat
查看>>
LeetCode258:Add Digits
查看>>
Java 接口
查看>>
BZOJ4721: [Noip2016]蚯蚓
查看>>
一个经典的比喻( 关于TCP连接API )
查看>>
scrapy爬取58同城二手房问题与对策
查看>>
索引查找Java实现
查看>>