PICO 的 VGA/TV 驱动库 PicoVGA

MicroPython相关代码、库、软件、工具
回复
头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

PICO 的 VGA/TV 驱动库 PicoVGA

#1

帖子 shaoziyang »

来自:
隐藏内容
你必须登入/注册才可观看隐藏内容
github
隐藏内容
你必须登入/注册才可观看隐藏内容
picovga1_m.jpg
picovga1_m.jpg (68.67 KiB) 查看 1943 次

picovga.jpg
picovga.jpg (61.67 KiB) 查看 1942 次
 


PicoVGA 库允许从树莓派PICO输出信号到 VGA 监视器或 PAL/NTSC 电视,重点是技术和游戏应用中的易用性。它提供了4个透明的图形覆盖层,近30帧缓冲,可以自由地相互结合,仅使有限的RAM内存。将输出限制为 8 位也有助于节省 RAM。

RP2040 处理器包含 264 KB 的 RAM。这对于更高的分辨率图像输出来说并不够多,因此 RAM 需要非常节省。在技术实践和复古游戏(处理器没有足够性能),R3G3B2格式的8位图形输出(即红色3位,绿色3位和蓝色2位)是完全足够的。在正常情况下,16 或 24 位的输出没有意义,因为树莓派PICO没有足够的内存和性能处理如此大量的数据。使用抖动技术,即使输出 8 位,也能实现有趣的显示结果。

要使用 PicoVGA库,在最简单的情况下,只需 8 个电阻器,将其连接到输出 GP0 到 GP7 到 VGA 或 SCART TV 的 RGB 连接器,将 HSync (CSync) 连接到 GP8,将耳机连接到 GP19,并通过USB 加载演示程序(程序已编译到库中)。如果需要键盘控制,请运行控制台程序,如begPutty,但大多数程序在没有键盘的情况下工作。
PicoVGA_diagram2.jpg
PicoVGA_diagram2.jpg (46.66 KiB) 查看 1943 次

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: PICO 的 VGA/TV 驱动库 PicoVGA

#2

帖子 shaoziyang »

PicoVGA主要功能
  • 使用 PIO0 模块,使用具有透明度的 1 个基本层和 3 个覆盖层
  • R3G3B2 格式的 8 位输出
  • VGA 显示器输出为 256x192 至 1280x960 分辨率
  • 在PAL或NTSC隔行模式下输出分辨率高达1024x576或848x480
  • 近 30 帧缓冲格式:8/4/2/1 位图形、磁贴、文本、特殊格式(图表)
  • 有限bit位的文本模式和图形格式调色板
  • 不同格式的帧缓冲区可以在图像中以条带和段的形式组合在一起
  • RLE 图像压缩(适合绘图)
  • 具有可选关键颜色的透明度模式
  • 覆盖层中的硬件精灵
  • 层输出仅到指定输出引脚(彩色平面)
  • 根据指定的分辨率和时间自动配置视频模式
  • 根据所需的分辨率自动超频处理器
  • 库使用处理器的第二个内核,第一个内核保留给主程序
  • 附加 PWM 音频输出(不是必要)
这里是一个以隔行模式输出到电视的例子,从VGA连接器到SCART电视连接器。VGA/SCART减少到只包含一个简单的连接器引脚连接,可能还有一个用于消隐信号的电阻器。
 
 
picovga2_m.jpg
picovga2_m.jpg (44.05 KiB) 查看 1941 次
 
 

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: PICO 的 VGA/TV 驱动库 PicoVGA

#3

帖子 shaoziyang »

PicoVGA库使用规则

Pico上的图像生成受处理器利用率限制,程序必须遵循它。使用PicoVGA库时,需要记住以下几个原则:

库总是在处理器的第二个核上运行,程序总是在第一个核上运行。渲染图像会使CPU内核完全过载,并且通常无法用于其他用途。核心功能的分离还有一个优点,即核心之间不相互影响,不需要相互锁定。第一个核心简单地使用对帧缓冲区的写操作,第二个核心显示帧缓冲区的内容,而不在它们之间进行任何通信。这使得整体工作更容易和更快。

如果第二个核心不繁忙(例如,当显示仅使用DMA传输传输的8位图形时),它也可以用于主程序工作。但是,应考虑到一些限制:第二个核心中的程序不应使用中断(它会干扰渲染功能),应谨慎使用插值单元(渲染功能不保存其状态),并且不得禁用中断。

一条重要的规则是,PicoVGA库访问的所有数据必须存储在RAM中。外部闪存速度慢,不能用于渲染功能。例如,如果要显示flash图像,则必须首先将其复制到RAM中的缓冲区,然后将指向图像的RAM副本的指针传递给呈现函数。如果将指向flash中图像的指针传递给它,那么访问flash的速度慢将导致视频丢失。除了图像,这也适用于字体和瓷砖模式。

在安排屏幕布局时,必须考虑有限的渲染速度。有些模式渲染速度非常快(例如,使用DMA从帧缓冲区传输8位图形),有些模式渲染强度非常高:例如,以慢速模式渲染精灵。当使用渲染时,某些视频可能无法在要求的时间内足够快地渲染,视频图像将中断(失去同步)。在这种情况下,有必要使用其他模式,或减少渲染区域(添加其他更快的模式,例如在屏幕两侧添加平铺控件),降低屏幕分辨率或提高CPU时钟速度。视频是分开呈现的,因此它始终只是一个视频线上的内容,视频线之间不会相互影响。例如,可以通过将所有精灵水平相邻放置(最具挑战性的情况)来测试精灵渲染的速度,并检查视频同步是否失败。

使用DMA传输时也必须小心。DMA用于将数据传输到PIO。尽管传输使用FIFO缓存,但使用不同的DMA信道可能会导致渲染DMA信道延迟,从而导致视频丢失。例如,当RAM中的大数据块被快速传输时,DMA可能发生过载。然而,最大的负载是来自闪存的数据DMA传输。在这种情况下,DMA通道等待通过QSPI从flash读取数据,从而阻塞DMA呈现通道。

CPU时钟频率也必须服从图像发生器。在初始化视频节点之前,库将计算所需的系统时钟频率,以便定时符合要求,并且处理器速度足以满足所需的图像分辨率。最好先打印出计算出的时钟频率,以便在控制台上进行检查。可以禁止库改变系统时钟,或者仅规定某个范围,在这种情况下,某些模式可能无法访问(或者视频图像可能中断)。

图像缓冲区必须对齐到4字节(32位CPU字),图像段必须水平对齐到4像素-这是指段的水平位置、宽度、对齐(wrapx)和偏移(offx)。对齐不适用于垂直方向。此限制是必要的,因为图像信息是使用32位DMA传输传输到PIO控制器的,并且必须与32位字对齐。一个32位字包含4个像素(1个像素包含8位),因此图像中的水平数据也必须与4个像素对齐。因此,您不能以1像素的增量对图像进行精细的水平滚动(该限制不适用于垂直滚动),而只能以4像素的增量进行。例外是慢精灵,这是软件渲染到视频线,因此可以滚动1像素的增量。类似地,该限制不适用于将软件渲染到帧缓冲区(例如,可以将图像渲染到任何坐标的视频存储器)。

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: PICO 的 VGA/TV 驱动库 PicoVGA

#4

帖子 shaoziyang »

安装

PicoVGA库可以在Windows环境中进行简化编译,只需要安装ARM-GCC编译器。针对Linux的编译还没有准备好,我将这个领域留给更熟悉Linux环境的人。;-)

您需要ARM-GCC编译器进行编译。您可以在此处下载:

https://developer.arm.com/tools-and-sof ... /downloads

目前,版本为gcc-arm-none-eabi-10-2020-q4-major-win32.exe。我建议将编译器安装到C:\ARM10文件夹,并在安装时禁用将路径添加到路径的选项。编译器的不同版本并不总是完全可互换的,因此安装多个版本(C:\ARM9、C:\ARM8等)并将路径添加到命令文件中使用的编译器版本是可行的。PicoVGA中的编译文件也是这样准备的。如果您想更改编译器文件夹的路径,可以在_c1.bat和_boot2\c.bat编译文件中找到它。如果不想使用多个版本的编译器,请将安装保留在默认文件夹中,并启用将路径添加到路径的选项,编译也将正常工作。

将PicoVGA库解压到任何文件夹中。任何你想工作的地方……安装到此为止。:-)

有关如何在Windows中轻松使用RaspberryPicoSDK库的更多建议,请参阅“在Windows下轻松编译Raspberry Pico”的说明:http://www.breatharian.eu/hw/rasppico/index_en.html .

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: PICO 的 VGA/TV 驱动库 PicoVGA

#5

帖子 shaoziyang »

接线图

在这里不介绍整体电路,因为这个库是用树莓Pico创建的复古游戏电脑的一部分,目前还在开发中。以下是VGA监视器输出的简化接线图(添加了音频PWM输出):
 
PicoVGA_diagram.jpg
PicoVGA_diagram.jpg (83.07 KiB) 查看 1927 次
 

输出的格式为 CSYNC 同步混合(复合同步,HSYNC+VSYNC)。计算机监视器支持CSYNC混合同步。信号被馈送到HSYNC输入端(也称为CSYNC)。音频输出送到VGA接口的VSYNC引脚,以方便输出到电视。VGA监视器在该引脚上的输入阻抗为75欧姆,这会导致音频信号被VGA监视器衰减和忽略,而不被视为垂直同步。插入音频接口后,VGA显示器的输出将断开,音频信号将输出到外部(例如,音频耳机)。

电视通过一个简化的接口连接到VGA输出,该接口将VGA连接器的引脚连接到SCART连接器的相应引脚。在这种情况下,还使用送到VGA接口的音频信号。因此,设备不必包括用于TV的特殊连接器。引脚9的5V电压用作SCART接头的控制电压:SCART接头的引脚16(消隐)通过100欧姆电阻器连接,引脚8(开关)直接连接。

这里没有绘制键盘连接。所有示例程序都已设置,以便通过USB虚拟端口上的控制台使用程序控制。只需通过用于编程的USB电缆将Pico连接到PC,然后运行控制台程序(例如begPutty)。有关连接的更详细说明,请参阅SDK说明。
 
 

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: PICO 的 VGA/TV 驱动库 PicoVGA

#6

帖子 shaoziyang »

集成到项目中

将PicoVGA库合并到项目中最简单的方法是使用现有的示例项目。为了最大限度地简化,所有源文件都包含在项目中。虽然编译需要更长的时间,但它不需要选择编译的文件和调整顺序,从而简化了生成的工作。

将库合并到现有项目中时,必须接管包含picovga库源文件的_picovga文件夹。global.h文件包含要包含在项目中的*.h头文件(_picovga/define.h等)。要添加的编译文件可以在Makefile.inc文件中找到。首先是汇编文件组ASM picovga,其次是C源代码C picovga。

PicoVGA库需要vga.pio文件,由pioasm.exe编译器编译成vga.pio.h文件。在当前项目文件夹中,它查找include.h文件,其中列出了所有头文件,包括vga.pio.h。

它还会在当前文件夹中搜索vga_config.h文件。它包含PicoVGA库设置,例如渲染缓冲区的大小。通常不需要关注vga_config.h文件。在以下情况下,通常必须对其进行修改:
  • 使用大于640x480像素的显示分辨率时。通常,配置文件将最大分辨率设置为640x480。这必须以更高的分辨率进行调整,以允许库为呈现函数保留更大的缓冲区。
  • 第二种情况是,如果没有足够的RAM,则需要修改配置。还有一些空间,你可以节省一些内存。首先,可以将MAXX、MAXY和MAXLINE分辨率设置降低到实际值。接下来,您可以将层的数量减少到实际使用的值(在1到4的范围内)。最后,您可以将段和条纹的数量减少到实际值SEGMAX和STRIPMAX(最小值为1)。
  • 第三种情况是使用了大量的显示条纹和线段。通常,此处的值设置为8个条纹(=水平带)和8段(=每个带的垂直分割)。
项目编制

PicoVGA中的所有演示示例都已编译(编译后的文件始终命名为program.uf2)-为VGA监视器和USB控制台键盘编译。只需运行e.bat(=“Export”)将它们加载到Pico中。如果要更改代码中的任何内容,可以通过运行c.bat(=“Compile”)获得新的编译。在FAR中,只需按c<Enter>。要清理编译,请运行d.bat(=“Delete”)。这将删除所有中间文件,只保留生成的编译文件program.uf2。

在编译过程中,确保在编辑 *.c、*.asm和*.cpp文件时,只编译更改的文件,而不编译整个项目。因此,不需要在每次代码更改之后进行完整的编译。但是,没有提供依赖于*.h头文件的编译,应该记住这一点。因此,通常使用c.bat快速编译,并且只有在*.h中有更重要的更改之后,或者如果有可疑行为,则首先使用d.bat删除旧编译,然后执行完整编译。

在PicoVGA base文件夹中,您还可以找到文件c_all.bat和d_all.bat-这些文件用于批量编译或清理所有演示程序的编译。

在每个项目旁边的Makefile文件中,可以找到项目设置。通常,您可以通过向csc变量添加额外的*.c源文件和向SRC变量添加*.cpp文件来获得。如果将*.h头文件添加到项目中,请将它们添加到src\include.h文件中。在每个*.c和*.cpp文件的开头输入link include.h。

您可以通过鼠标拖放或使用e.bat命令文件将编译后的程序加载到Pico中。为此,统一命名磁盘很有帮助,例如R:(=Raspberry)。重命名在计算机管理中完成-通过此计算机/管理。或编辑_e1.bat文件中的磁盘名。
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章