Step to UEFI (290)Cpp UEFI 006 抄一个 Print

前面编写测试代码的过程中,总感觉没有 Print 直接输出来的顺手,于是研究了一下 Print 的实现。基本原理是,对变量格式化后输出到一个 字符串Buffer 中,然后直接输出Buffer。

首先,编写一个测试的 CPP:

其中使用了 Print.h 头文件,定义如下:

接下来编写Print.cpp,关键代码来自\MdePkg\Library\UefiLib\UefiLibPrint.c

其中的InternalPrint() 函数有较大改动,直接在函数中开了一个内存用于当作 Buffer (CharBuffer[]),不需要AllocatePool()动态[......]

阅读全文

基于Ch554 制作的USB喇叭

很早之前使用 Arduino Pro Micro 实现过USB耳机转接器,这次尝试使用 WCH 的 Ch554 来实现(实际上可以使用 更见偏移的 Ch552 来实现,但是因为 Ch552 有烧写次数限制,所以最终是在 Ch554上进行开发)。

无需过多了解 USB Audio的相关知识,所作的工作基本上只有:通过描述符报告自己是一个USB Audio 设备。之后 Windows 就会发送 48Khz 16位双声道的采样数据给设备(如果想了解更多,推荐去USB中文网阅读相关内容)。我们在设备响应的 OUTPUT 端点上即可收到数据。

需要特别注意的是,代码中有一个向HOST 汇报当[......]

阅读全文

Step to UEFI (289)Cpp UEFI 005 C++函数默认参数

C++ 定义函数时可以直接给形参指定默认值,如果调用函数没有给形参赋值,那就直接使用默认值。这个功能非常容易理解。编写如下代码进行验证:

上面定义了 void func(int a, int b=2, int c=3) 这个函数,当通过func(30)调用时,相当于只给 a 赋值 30,其余的直接使用了默认值。

需要注意的是,在使用时有一些限制。比如:C++规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值,那么它后面的所有形参都必须有默认值。

参考:

1. https://c.biancheng.net/view/2204.html C++函数的[......]

阅读全文

ESP32 S3 虚拟摄像头播放 SD 卡内容

前面介绍了使用 ESP32 S3 播放 SPINOR 中的内容,美中不足的是 SPI 容量有限无法播放长视频。这次的作品能够实现读取和发送SD卡中的JPG 图片,从而实现长时间的播放。

实验是基于DFRobot 的ESP32-S3-WROOM-1-N4模组(DFR0896)【参考1】来实现的,需要注意的是:这个模组没有 PSRAM,项目中需要关闭PSRAM。为了读取 SD 卡,需要使用上一次设计的 OV2640 Shield,其中的 SD 卡是4线模式。

插入SD卡,板子堆叠起来即可工作。接下来着手代码设计。

和之前相比,代码改动较大,主要修改有:

[......]

阅读全文

ESP32 S3 虚拟摄像头播放 SPIFFS 内容

这次带来一个好玩的 ESP32 项目:虚拟摄像头,就是将ESP32 S3 的板子烧录之后,系统中会出现一个USB摄像头,打开Camera后能够看到播放出来的视频。

下面介绍具体的实现方式。

目前 Arduino ESP32 尚不支持 USB Camera,因此,这次的项目是基于IDF 来完成的。特别注意:对于硬件有如下要求:

1.必须是 ESP32 S2或者 S3,其他型号的ESP32 目前不支持原生USB编程,所以只能使用 S2 或者 S3;

2.必须带有 PSRAM,因为这个项目是根据Demo 修改而来,Demo 要求带有 PSRAM。我对编译环境不熟悉,这部分没有[......]

阅读全文

ESP32 S3 OV2640 实现USB摄像头

ESP32 官方提供了一个USB 摄像头的例子,但是他们使用带有 PSRAM 的ESP32,经过研究,不支持 PSRAM的模组可以通过修改代码的方式实现相同的功能。本文以ESP32-S3-WROOM-1-N4模组(DFR0896)【参考1】为例,介绍实现方式。

首先使用这个模组制作一个底板【参考2】

接下来设计给摄像头模块使用的连接器,摄像头选择的是微雪电子的 OV2640模块。OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA(1632*1232)图像传感器; 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹等自动控制功能。 UXGA[......]

阅读全文

Step to UEFI (288)Cpp UEFI 004 C++ 的 New 和 Delete

C++还有两个重要的函数:new 和 delete。根据《UEFI 原理与编程》 10.2.6 讲述,我们需要自行实现函数。

上述书籍对应的代码提供了 new 和 delete 的实现,可以看到基本的思路就是使用 gSt-> BootServices ->AllocatePool 分配和gSt-> BootServices->FreePool回收内存:

运行之后可以在屏幕上看到 123 的字样。

接下来实验使用 new 和 delete 创建对象的情况,基本的代码如下:

运行结果如下:

可以看到,当我们 new 创建对象的时候,自动运行了 Time 的[......]

阅读全文

ESP32 S3: USB键盘转蓝牙

无线能够给用户带来极大的便利,对于我这样工作台很乱的人来说,无线大大降低了线路绊倒水杯之类物品的可能行。现在的计算机特别是笔记本电脑都随着 WIFI 模块自带了蓝牙功能,这次介绍的作品就是使用ESP32 S3 将有线的 USB 键盘转化为一个蓝牙键盘,这样就可以直接连接到工作的计算机上。

具体的使用方法可以通过下面的视频了解:

接下来就开始介绍如何实现。这次设计的核心是ESP32-S3 ,它是一款2020年底推出的,集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片。这款搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MH[......]

阅读全文