之前一直在玩树莓派,发现有个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
最后,不是很喜欢论坛里大量的不可能、不行的说法,这也是进行这番研究的最初目的。
没有什么不可能,仅仅是时间和成本是否值得付出。