单片机esp32s2实现win10之USB副屏_iddsampledriver-程序员宅基地

技术标签: DIY  嵌入式硬件  干货  单片机  

视频演示:

骚气双副屏,单片机实现win10 USB副屏演示esp32 s2_哔哩哔哩_bilibili-icon-default.png?t=N7T8https://www.bilibili.com/video/BV1tU4y1F7B6?spm_id_from=333.999.0.0

开源计划

2021年最后一天,庆祝新年。
github开源地址如下,欢迎复刻魔改。发b站的可以@我,给三连打call。
https://github.com/chuanjinpang/win10_idd_xfz1986_usb_graphic_driver_display

概要

单片机esp32s2+SPI屏实现一个win10 USB接口显示器。

本项目借鉴了众多开源项目,主要借鉴:

1.github.com/microsoft/Windows-driver-samples/tree/master/video/IndirectDisplay

2.git://github.com/roshkins/IddSampleDriver.git

3.Bodmer/TFT_eSPI.git

4.nopnop2002/esp-idf-ili9340,

5.serge-rgb/TinyJPEG.git

6.TJpgDec。

目前FPS在~13FPS,纯黑屏幕时能摸到20FPS。

主机使用IDD显示驱动方案,将屏幕进行JPEG压缩,然后通过URB(USB请求包)发送到下位机。下位机解压并发DMA传输写屏达到高性能。下位机esp32s2只支持全速度12Mhz,所以必须高压缩的JPEG才能有高FPS.

为了获得较稳定的FPS,采用了动态码率策略,会依据图像情况,进行压缩率调整。

  1. 器件清单

以下链接与卖家只是我买的地方,仅作参考,只是型号是一样的,东西是同一种,有门道能找到更便宜的卖家最好。

像ESP-12H-Kit单独买模块小板就只要10块,适合自己做PCB板。

最近也支持了st7789这种屏。

名称

数量

参考图

参考链接

说明

1

ESP-12H-Kit/开发板

1个

3.0哈RJViXrMySIx! https://m.tb.cn/h.fW0rvEj?sm=7e7b4b  NodeMCU系列WiFi模块ESP32-S2F芯片 ESP-12H-Kit/开发板

2

2.4寸4线SPI串口TFT液晶显示屏模块 ILI9341驱动LCD触摸屏240*320

1个

7.0!vC8RXro0LDp嘻 https://m.tb.cn/h.fW0F9GF?sm=557ab4  2.4寸4线SPI串口TFT液晶显示屏模块 ILI9341驱动LCD触摸屏240*320

1.不用买触摸,软件目前不支持触摸功能。

用mouse更方便。

2.

其它类型的320*240屏也可以,比如st7789。不过软件目前只有9341驱动,将来会加上更多的屏。主要是合别人的代码。

3

MICRO USB转Dip 母座

1个

2信8fXpXroYDr0, https://m.tb.cn/h.fW0wxi2?sm=c95448  MICRO USB转Dip 母座B型 麦克5p 贴片转直插 转接板 已焊接 母头

4

2.54mm杜邦线

12根

自备

5

Micro USB线

1根

自备

  1. 整机组装图

这个是组双屏的效果,通常一个屏就好了。

3.硬件连接图

4 .安装说明

4.1 ESP32-S2固件更新

使用下载工具更新固件。第一次应该要更新所有的文件,包括bootloader.bin,partion-table.bin

4.2 windows驱动安装

因为目前没有给驱动签名,所以要关掉windows对驱动的检查,使用测试模式。

如果相对比较稳定后,看要不要弄个签名,淘宝上卖家签名一次要300!

4.2.1 启用测试模式

使用管理员身份打开命令行cmd

bcdedit /set testsigning on

重启系统,桌面右下角会有一个测试模式的水印。如下图。

如果要关掉,使用bcdedit /set testsigning off 然后重启即可。

4.2.2 安装驱动

1. 插入已经更新好esp32s2设备,这一步应该的固件。会被windows识别为未知设备,如下图。我们的USB设备号为:USB\VID_303A&PID_1986

2. 复制驱动文件到桌面,或者其它地方。

  1. 右键设备,选择浏览查找

  1. 找到驱动文件夹

  1. 选择始终安装此驱动,因为没有正式签名。系统给出警告。

  1. 安装完毕,会在显示适配器下面出现xfz1986_usb_graphic(demo). 正常就能看到windows桌面了。

  1. 本驱动目前只支持2种分辨率320*240,640*480.对于640会进行2:1缩放。

有兴趣的可以自己魔改,增加更多的设置,和更大的屏幕。

  1. 固件与驱动编译

4.1 esp32s2 设备固件编译

Esp-idf版本:v4.3-beta3

4.1.1. esp32s2_usbdisp 复制到esp-idf目录下

本身就是一个esp-idf工程

4.1.2 更新tinyusb

Tinyusb.tgz 解压合并放入esp-idf/components/tinyusb。图省事没有生成patch.大家可以用比较工具比较差异,改动并不大,主要是增加 vendor模式。需要注意的是,目前USB的改法是个临时方案,可能会对其它tinyusb有影响

4.1.3 配置工程

进入esp32s2_usbdisp

idf.py set-target esp32s2   #设置目标芯片

idf.py menuconfig #修改配置,

相关4个配置如下:主要是配置LCD管脚,提高CPU频率到 240M,编译为O2性能模式,使能 tinyUSB

4.1.4 编译

idf.py build

生成固件

4.1.5 可选的杂项

串口连接S2查看工作状态

默认打印FPS

开机logo

实现了一个开机图片,一个重要的功能是表明屏驱动在工作。是内嵌jpeg 文件的数组。具体是 logo.c 实现。

只要替换这个logo_jpg数组的内容即可。大小不要超过320*240.

我是用 git://github.com/Jamesits/bin2array.git 实现转换的,python小工具。

4.2 windows驱动编译

本人使用是vs2015+wdk10,也可以使用vs2019+wdk10等。大家可以自己看情况,网上也有相关教程。如果不想魔改,这个驱动也应该够用了。能魔改更好。

打开工程,右键工程,选择生成。

然后会在类似下面的路径生成驱动包。这个是x64的,应该没人用32位的系统吧?

  1. 软件架构

从设计实现上,本软件是支持2种数据模式,一种rgb565直传,一种是jpeg压缩数据。

USB传输也实现了两种:一种是同步,一种是异步模式。异步从理论上讲性能要好一些。

rgb565直传,同步模式主要是为了调试而存在了。

6.1 ESP32固件架构

Usb实现了一个vendor自己定义的USB设备,有一个in 管道。

注册一个回调处理函数tud_vendor_rx_cb,收到一个数据包64字节。

先进行头解析,如果是起始包byte[0] bit7 置位,表明一个操作开始,解析相应参数(total_size,top,bottom,...)。

然后将数据推入缓存disp_rx_ring_buf中。

显示线程,从disp_rx_ring_buf抽取数据进程处理,目前都是jpeg的显示数据,所以都会走jpeg显示处理,边接收数据边解码,积累到足够多时(一次多传输点,能降低额外开销,提高速度),启动SPI dma进行送显。同时会交换ping-pong buffer. 并行进行,提高FPS.

主机与设备通讯协议是沿用rpusbdisp的协议。就是消息头改了下:

该协议的要点:

USB是包消息,并且是固定长度64byte(大体如此),最后一个包例外。所以每个包第一个字节是协议占用,表明类型。好处是方便定位消息头部:如果第一个字节的bit7置位,就是一个新的操作,否则是数据。这样利于出错恢复。

解码与屏幕刷新:
1.这种是dma模式的spi,跑的是40Mhz,理论带宽可以跑到30 fps,如果spi是80Mhz的.屏幕也支持的话,就加倍了60fps。
2.另外一个关键点是边解码边刷数据,并行做。比如数据一帧要50ms.传输也要50ms.那串行就要100.并行就只要50ms.
3.一次刷dma数据不要太少,建议一次传5kb,降低非必要开销。具体大小要和数据配合调优。

6.2 windows驱动架构

大体框架是基于MS的idd驱动sampledriver,所以我只讲增加的部分。

1.在void SwapChainProcessor::RunCore()采集屏幕数据,当前没有找dirty区域,因为懒。

直接复制整个屏幕.

  1. 在这里,存在一个将GPU 数据转换为CPU能访问的数据区域,具体是创建了一个ID3D11Texture2D对象,其有D3D11_CPU_ACCESS_READ能力。然后复制出GPU 数据.
  2. 自动适应屏幕大小缩放。如果是640*480就2:1缩放。
  3. 然后调用usb_send_jpeg_image()发送
  4. 具体是先生成包头,内容jpeg编码压缩,这里有一个自动压缩率算法,目的是保证FPS能稳定在13-15fps。下位机能力比较弱,使用固定压缩质量,复杂画面容易把fps拉到10fps.
  5. 编码成usb协议包,也就是为每64byte增加一个特别的头。
  6. 调用usb_send_msg_async()进行真正的USB传输。

  1. 开发者

不才,欢迎相互交流下经验。

7.1 windows调试:

主要有2种,一种是用tracevew来查看驱动日志,另一种是windbg。

目前没有明显的bug,应该都用不上。只是开发过程中用得比较多。

7.2 esp32调试:

主要是log,当然也有一些高级点的调试,比如通过panic dump信息来正面刚来调试。

7.进一步的工作:

提高FPS,当前的瓶颈在于JPEG解码开销。 可能的方法:

  1. 采用 S3 双核并发提高JPEG 解码速度。

320*240对于桌面来说,分辨率小了些。因此可以考虑用安卓手机来当下位机显示器。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pcj2007/article/details/121158087

智能推荐

FX3/CX3 JLINK 调试_ezusbsuite_qsg.pdf-程序员宅基地

文章浏览阅读2.1k次。FX3 JLINK调试是一个有些麻烦的事情,经常有些莫名其妙的问题。 设置参见 c:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\doc\firmware 下的 EzUsbSuite_UG.pdf 文档。 常见问题: 1.装了多个版本的jlink,使用了未注册或不适当的版本 选择一个正确的版本。JLinkARM_V408l,JLinkA_ezusbsuite_qsg.pdf

用openGL+QT简单实现二进制stl文件读取显示并通过鼠标旋转缩放_qopengl如何鼠标控制旋转-程序员宅基地

文章浏览阅读2.6k次。** 本文仅通过用openGL+QT简单实现二进制stl文件读取显示并通过鼠标旋转缩放, 是比较入门的级别,由于个人能力有限,新手级别,所以未能施加光影灯光等操作, 未能让显示的stl文件更加真实。****效果图:**1. main.cpp```cpp#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); _qopengl如何鼠标控制旋转

刘焕勇&王昊奋|ChatGPT对知识图谱的影响讨论实录-程序员宅基地

文章浏览阅读943次,点赞22次,收藏19次。以大规模预训练语言模型为基础的chatgpt成功出圈,在近几日已经给人工智能板块带来了多次涨停,这足够说明这一风口的到来。而作为曾经的风口“知识图谱”而言,如何找到其与chatgpt之间的区别,找好自身的定位显得尤为重要。形式化知识和参数化知识在表现形式上一直都是大家考虑的问题,两种技术都应该有自己的定位与价值所在。知识图谱构建往往是抽取式的,而且往往包含一系列知识冲突检测、消解过程,整个过程都能溯源。以这样的知识作为输入,能在相当程度上解决当前ChatGPT的事实谬误问题,并具有可解释性。

如何实现tomcat的热部署_tomcat热部署-程序员宅基地

文章浏览阅读1.3k次。最重要的一点,一定是degbug的方式启动,不然热部署不会生效,注意,注意!_tomcat热部署

用HTML5做一个个人网站,此文仅展示个人主页界面。内附源代码下载地址_个人主页源码-程序员宅基地

文章浏览阅读10w+次,点赞56次,收藏482次。html5 ,用css去修饰自己的个人主页代码如下:&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;html xmlns="http://www.w3.org/1999/xh..._个人主页源码

程序员公开上班摸鱼神器!有了它,老板都不好意思打扰你!-程序员宅基地

文章浏览阅读201次。开发者(KaiFaX)面向全栈工程师的开发者专注于前端、Java/Python/Go/PHP的技术社区来源:开源最前线链接:https://github.com/svenstaro/gen..._程序员怎么上班摸鱼

随便推点

UG\NX二次开发 改变Block UI界面的尺寸_ug二次开发 调整 对话框大小-程序员宅基地

文章浏览阅读1.3k次。改变Block UI界面的尺寸_ug二次开发 调整 对话框大小

基于深度学习的股票预测(完整版,有代码)_基于深度学习的股票操纵识别研究python代码-程序员宅基地

文章浏览阅读1.3w次,点赞18次,收藏291次。基于深度学习的股票预测数据获取数据转换LSTM模型搭建训练模型预测结果数据获取采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , 助力智能投资与创新型投资。)python可以直接使用pip安装tushare!pip install tushareCollecting tushare Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e74_基于深度学习的股票操纵识别研究python代码

中科网威工业级防火墙通过电力行业测评_电力行业防火墙有哪些-程序员宅基地

文章浏览阅读2k次。【IT168 厂商动态】 近日,北京中科网威(NETPOWER)工业级防火墙通过了中国电力工业电力设备及仪表质量检验测试中心(厂站自动化及远动)测试,并成为中国首家通过电力协议访问控制专业测评的工业级防火墙生产厂商。   北京中科网威(NETPOWER)工业级防火墙专为工业及恶劣环境下的网络安全需求而设计,它采用了非X86的高可靠嵌入式处理器并采用无风扇设计,整机功耗不到22W,具备极_电力行业防火墙有哪些

第十三周 ——项目二 “二叉树排序树中查找的路径”-程序员宅基地

文章浏览阅读206次。/*烟台大学计算机学院 作者:董玉祥 完成日期: 2017 12 3 问题描述:二叉树排序树中查找的路径 */#include #include #define MaxSize 100typedef int KeyType; //定义关键字类型typedef char InfoType;typedef struct node

C语言基础 -- scanf函数的返回值及其应用_c语言ignoring return value-程序员宅基地

文章浏览阅读775次。当时老师一定会告诉你,这个一个"warning"的报警,可以不用管它,也确实如此。不过,这条报警信息我们至少可以知道一点,就是scanf函数调用完之后是有一个返回值的,下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。_c语言ignoring return value

数字医疗时代的数据安全如何保障?_数字医疗服务保障方案-程序员宅基地

文章浏览阅读9.6k次。十四五规划下,数据安全成为国家、社会发展面临的重要议题,《数据安全法》《个人信息保护法》《关键信息基础设施安全保护条例》已陆续施行。如何做好“数据安全建设”是数字时代的必答题。_数字医疗服务保障方案

推荐文章

热门文章

相关标签