Teensy 3.6 触摸屏功能

Teensy 3.6 支持触摸屏,10指触摸,具体的库在\hardware\teensy\avr\cores\teensy3\usb_touch.c 文件中,下面是一个示例代码,使用了2个手指绘制直线:

特别的,需要在菜单中打开 Touch Screen

另外,如果你使用Windows 10 下面的画板进行测试,需要选中 Brushes,只有这个才支持多点触摸绘图:

[......]

阅读全文

Step to UEFI (265)QEMU ACPI Table 的来源

之前介绍过在 Shell 下面查看 ACPI Table 的工具,例如【参考1】提到的:ACPIView。

接下来的问题就是:上面的这个 DSDT 是从哪里来的?

首先,在代码中找了一圈,竟然一无所获;接下来在Debug Log中查找,发现如下信息,其中的一个 Table 长度是 0x1772(6002)非常接近我们在 Shell 下看到的 6009。

这一段 Log 对应的代码在\OvmfPkg\AcpiPlatformDxe\QemuFwCfgAcpi.c 中。

为了验证猜想,在对应代码中加入调试信息,输出读取到QEMU 的 ACPI DSDT,具体在Ovm[......]

阅读全文

内存的奇怪问题

最近遇到了一个奇怪的问题,经过化简得代码表示如下:

简单的说,在 foo1() 中分配100bytes的内存空间,0然后在foo2() 中在分配100Bytes,但是实践发现,前面分配的内存空间被“冲掉”了。更具体的说:

1.运行 foo1(), 之后查看到 value 的内存地址已经赋值为 0xaa

2.接下来执行 foo2(),但是运行之后,Value 对应的内存空间被覆盖为0x11。

有兴趣的朋友可以自己先琢磨五分钟看看能否找到问题。

最终,这个问题是分配内存的 alloca()导致的:alloca分配的是栈区(sta[......]

阅读全文

Step to UEFI (264)代码读取一个 FFS

最近有一个读取 FFS 的需求,具体来说就是在 DXE 阶段需要读取指定的 FFS 文件的内容。针对这个需求,使用QEMU 进行了一番研究。

OVMF 中继承了 Shell,读取这个的动作和我们需求非常类似,于是在 QEMU 的Log中搜索可以看到如下字样:

对应在代码中位于\mdemodulepkg\library\uefibootmanagerlib\BmLoadOption.c

经过追踪可以看到具体工作的是位于 \mdepkg\library\dxeserviceslib\DxeServicesLib.c的如下函数:

进一步研究,上述函数通过 EFI_[......]

阅读全文

一个让你轻松配置ESP32 WIFI的库

ESP32 带有 WIFI 功能,而众所周知要想让一个设备连接WIFI AP 需要告知设备对应 AP 的名称和密码,简单实验的话,可以直接在代码中写死这两个参数,但这种情况下烧写之后设备只能在固定的环境下使用。https://github.com/tzapu/wifimanager 这个项目可以解决上述问题。先说一下这个东西如何使用:

  1. 编译下载Arduino\libraries\WiFiManager-master\examples\OnDemand下面的代码
  2. 上电运行之后短接 Pin0
  3. 用手机查找OnDemandAP 这个 AP
  4. 连接之后自动打开下面的界面

5.选择 Configu[......]

阅读全文

Step to UEFI (263)实验:直接修改QEMU的启动顺序

当我们使用如下 Command 启动 QEMU 的时候,能够将 d:\tmp 目录映射为 fs0:

之后,可以在这个目录中看到一个名为 NvVars 的文件。这次实验的目标是直接修改 NvVars 文件来实现调整启动顺序。例如:启动之后在 Setup 中可以看到如下4个启动设备:

1.进入Shell 后使读取变量的命令,将变量保存在 Result.txt 文件中:

2.在 Debug Log 中可以看到如下字样,就是说 OVMF 在启动过程中会读取NvVars这个文件作为变量:

3.进一步分析,读取动作来自 ovmfpkg\library\nvvarsf[......]

阅读全文

Step to UEFI (262)给 QEMU 的 BIOS 增加 BootMenu快捷键

在实验中,我发现 QEMU 启动的虚拟机并不支持调出 BootMenu,为此研究一下如何修改BIOS 添加这个功能。

前面的实验中,我们在启动项目中插入了自定义的 Application,主要代码在BdsPlatform.c 中。继续查看这个文件,可以看到分配快捷键的代码:

和EmulatorPkg 中的PlatformBdsRegisterStaticBootOptions() 函数进行对比(代码位于 \EmulatorPkg\Library\PlatformBmLib\PlatformBm.c中),可以看到后者注册了多个快捷键对应着不同的功能:

最终修改\Ovmf[......]

阅读全文

NASM Assert 一个错误的方法

有时候为了确定代码是否编译到,我们需要在代码中添加让编译器报错的指令,对于 MASM 来说是 .ERR。在 NASM 中是”%error”【参考1】。编写例子如下:

编译时会自动报错如下:

此外,从我的实验来看,在 BIOS 代码中的 NASM 代码中随意插入字符并不能使得编译过程报错停止下来,所以如果有需要务必使用上述方法。

参考:

  1. https://www.nasm.us/doc/nasmdoc4.html#section-4.9

4.9 Reporting User-Defined Errors: %error, %warning, %fata[......]

阅读全文

Windows 全自动安装

之前介绍过的通过WinPE启动,通过软件将安装好的硬盘制作成镜像,然后当有需要时直接恢复的方法。但是更多时候我们出于测试的目的,需要安装最新版本的 Pure OS​。 这次介绍的全自动安装也就是无人值守模式安装,就是说只需要启动到安装盘上,Windows会自动完成包括分区格式化在内的全部工作。这是Windows自带的功能,只需要将特定的autounattend.xml 放置在启动盘的根目录下即可。具体做法如下:

1. 在 https://schneegans.de/windows/unattend-generator/ 根据需要生成 autounattend.xml 文件;

[......]

阅读全文