之前一直在玩树莓派,发现有个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

RPi 树莓派 DSI 接口研究 MIPI raspberry pi相关推荐

  1. 树莓派上手实战之把Raspberry Pi 配置成无线路由器

    原文 上 中 下 http://www.raspicn.com/thread-83-1-1.html http://www.raspicn.com/thread-84-1-1.html http:// ...

  2. 少年派的一生,树莓派的十年,Raspberry Pi上市十周年

    整理 | 丁广辉 出品 | CSDN(ID:CSDNnews) Raspberry Pi,中文名称树莓派,一款由剑桥大学的工程师和计算机科学家设计的微型单板计算机,目的是以低价的硬件及自由软件来促进学 ...

  3. 树莓派3b+ CENTOS7 制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令)[转载]...

    2019独角兽企业重金招聘Python工程师标准>>> 之前复制或者备份树莓派的SD卡,都是用dd命令全盘复制,可以用,但是这样有两大缺点: 1. 慢 2. 一个大的SD卡,比如64 ...

  4. 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...

    靓照: 功耗测试 测试工具:USB数码管3位(4位)测试 树莓派3b+ 条件:送的充电器,初始桌面,没有连接wifi 电压:5.13v 电流:0.35A 条件:送的充电器,初始桌面,连接wifi,鼠标 ...

  5. window连接树莓派linux桌面,远程连接Raspberry Pi(树莓派)图形用户界面(X Window)

    背景:有的时候,我们希望能远程连接一台linux的图形界面用来管理机器,这里需要用到tightvncserver和xtightvncviewer两个工具 我的树莓派的ip是10.141.247.134 ...

  6. 树莓派4代开发板Raspberry Pi 4B 8G ARM主板电脑 树莓派4-8G现货 主板

    查看详情:https://buy.icxbk.com/index.php?ctl=Product&met=detail&item_id=5197

  7. 一篇文章让你了解这个基于Raspberry Pi / 树莓派而设计的工业计算机- 2

    CM4 Nano是一款基于Raspberry Pi / 树莓派 Compute Module 4(简称CM4),由EDATEC面向工业应用设计的嵌入式计算机, 充分利用CM4在结构上灵活性解决CPU, ...

  8. Raspberry Pi 4B树莓派 |#入门教程02# 树莓派GPIO控制(Python、C)

    树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边奇数,右边偶数:1-40 通过打开终端窗口并运行命令,可以在Raspberry Pi上访问方便的参考pinout.该工具由GPIO零 Py ...

  9. linux下安装树梅派系统,优麒麟树莓派系统(优麒麟 for Raspberry Pi)的安装方法...

    要安装优麒麟树莓派系统(优麒麟 for Raspberry Pi),得先下载 ubuntukylin-focal-beta-raspi+arm64.img.xz,然后通过以下步骤引导您烧录优麒麟到您的 ...

最新文章

  1. HTML5之音频audio知识(部分vedio)
  2. python模块引用
  3. Android网络连接监听
  4. MyBatis关键配置-创建会话工厂
  5. Vim-安装 YouCompleteMe
  6. java 字段构造函数_依赖注入–字段vs构造函数vs方法
  7. 全局变量_Python函数中的全局变量与局部变量
  8. python 异步 生产者 消费者_python 线程通信 生产者与消费者
  9. 【洛谷】1600:天天爱跑步【LCA】【开桶】【容斥】【推式子】
  10. Spring Cloud 架构 五大神兽的功能
  11. 肇庆学院计算机类宿舍哪里,肇庆学院宿舍怎么样 住宿条件好不好
  12. 华为端口聚合命令_华为交换机两种端口聚合模式使用实例
  13. listview刷新
  14. 批处理大全Win10版工具箱
  15. 专题·数学概率与期望【including 条件概率,贝叶斯定理, 全概率公式,数学期望, 绿豆蛙的归宿
  16. 最简单易懂的ios p12证书 和描述文件的创建,IPA上传,最完整的ios上架苹果商店教程
  17. MySQL中更新时间字段的更新时点问题
  18. python识别文字坐标_【Python 教程】使用 Python 和大漠插件进行文字识别
  19. python Graphillion简介
  20. 如何查看网页上的图片体积大小或容量大小?

热门文章

  1. iPhone客户端开发笔记(八)
  2. TFBOY 养成记 一些比较好多文章。
  3. 浏览器json格式化插件 yformater
  4. 用java实现zip压缩
  5. 这是个将近3万人点赞,涉及9大模块,专为程序员准备的面试宝典
  6. Spring容器与上下文理解
  7. linux-Centos 7下bond与vlan技术的结合
  8. 条款20:为指针的关联容器指定比较类型
  9. Swift 总结使用问号(?)和感叹号(!)-备用
  10. JAVA中的方法和构造方法有什么区别