最近在用树莓派,然而没有配置好网络,得看下IP,才好操作。然后得抱大显示器,连上电源线,还要转换一下HDMI2VGA,如果只有一个显示器,得挪用,的确很麻烦。
于是想加一个小显示屏,显示出IP信息。后来觉得这个方案还是有点别扭。刚好esp32-s2有USB otg,做一个小尺寸的320*240的小显示器应该是可行的。
速度慢,帧率低点也行的。然后上google找了找,居然找到一个开源项目。
GitHub - robopeak/rpusbdisp: Drivers and Tools for RoboPeak Mini USB Display Project
项目做得挺早的,2013年,然后看了一下,只有上位机软件,下位机是用stm32做的,没开源下位机。
方案架构是fb kernel driver ->usb->display device
也公布了协议。
有这个基础,省事。下位机再找几个开源项目改改应该就成了。B站上面有很多小电视,做得挺好的。
然后几周过去了,做了一个原型机,还可以,就是帧率慢,如果全屏刷新只有2.xFPS。因为fb只会更新需要的区域,所以有时候FPS会比较高。
然后一顿借鉴开源项目:目前还有几个严重的问题,方案大体上没啥大问题。我的目标是全屏8FPS,略有点卡,实际操作还能接受。
借鉴开源项目如下:
1.GitHub - robopeak/rpusbdisp: Drivers and Tools for RoboPeak Mini USB Display Project
上位机内核模块,目前将它的RLE改为jpeg方案来获得更新的帧率。esp32s2是full speed只有12MHz的总线带宽,实现大约能到4Mbps,也就是500KByteps(通常400KBps多点,偶尔接近500KBps)。
2. git://github.com/Bodmer/TFT_eSPI.git
借鉴DMA传SPI屏的数据。降低CPU开销,在解码jpeg时,DMA传输数据上次的解码数据,将300ms一帧减少到了120ms。提升很明显。
3. GitHub - nopnop2002/esp-idf-ili9340: SPI TFT Driver for esp-idf
借鉴SPI屏的驱动,然后裁得只剩个架子了。删除大部分。
4.git://github.com/serge-rgb/TinyJPEG.git
主机linux 内核编码jpeg,它原来是float浮点实现,我改成了整数,也让我重新认识了单位元e,1是特别的。就这个jpeg encoder我找了好几个项目,还是这个好。还能配置quality.
5. TJpgDec
esp32s2用的jpeg解码代码,很轻快。还有一个esp32专用版本。我还是改了一下。整合了DMA,觉得挺合适。
6. esp-idf + tiny USB
反正没有我要的,然后自己改改了vendor,还可以。
7. xserver
这也是挺坑的,挖了坑才用上的,估计还要挖坑。
最后:
大体上快收工了,国庆发一版本到github上,供大家参考。当然还有文档和方案架构。
有没有用esp32s3做24FPS的小伙伴?那货是双核。
横屏版esp32-s2做的usb迷你显示器,60块钱的原型机,还是有不小的优化空间的_哔哩哔哩_bilibili有几年没搞windows了,搭环境费事,数字签名不好搞,已经没有key了https://www.bilibili.com/video/BV1Eq4y1f7Hk?spm_id_from=333.999.0.0