查看 PMC Firmware版本的工具

很多时候,我们需要得知当前系统中的 PMC Firmware版本。最简单的方法是进入 Setup 查看。但是不幸的是很多时候BIOS会主动隐藏这个选项。因此,编写一个 Shell 下的工具。用户可以直接获得当前系统 PMC版本号:

显示PMC版本的 Shell 工具

当然,除此之外还可以使用 MEInfo.efi (在 CSME Release Package 中)看到 PMC 的版本信息:

MEINFO 显示PMC版本信息

Arduino USB Host Shield PL2302 Debug Message

问题:当我运行USB Host Shield Library 中关于 Pl2303 的例子(比如 pl2303_gprs_terminal)的时候,在串口会有下面的 Debug 信息:

Start
0000: 09 02 27 00 01 01 00 80 32 09 04 00 00 03 FF 00 
0010: 00 00 07 05 81 03 0A 00 01 07 05 02 02 40 00 00 
0020: 07 05 83 02 40 00 00

经过研究,产生的位置在  Usb.cpp 下面函数中

uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) {

下面这个代码处:

// Invoke callback function if inTransfer completed successfully and callback function pointer is specified
   if(!rcode && p)
     ((USBReadParser*)p)->Parse(read, dataptr, total - left);

但是很明显,这里是调用设定的 callback 函数。

经过查找,最终确定实际生效的代码是hexdump.h 文件中下面的代码:

template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
void HexDumper<BASE_CLASS, LEN_TYPE, OFFSET_TYPE>::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset __attribute__((unused))) {
        if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug.
                for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) {
                        if(!byteCount) {
                                PrintHex<OFFSET_TYPE > (byteTotal, 0x80);
                                E_Notify(PSTR(": "), 0x80);
                        }
                        PrintHex<uint8_t > (pbuf[j], 0x80);
                        E_Notify(PSTR(" "), 0x80);

                        if(byteCount == 15) {
                                E_Notify(PSTR("\r\n"), 0x80);
                                byteCount = 0xFF;
                        }
                }
        }
}

因为其他地方对 UsbDEBUGlvl 赋值为 0x80,所以会输出一下信息用于Debug。

最近阅读 USB Host Shield 感觉风格不是很统一,比如,用于 Debug 的定义开关有很多处,估计是因为后来的代码是很多人合作的结果。

参考:

1.http://www.lab-z.com/atu9/

Windows10 Lite 版本

最近下载了一个 Win 10 lite 版本,专门用在虚拟机中配合 PHM 查看 Log (我不建议在工作机上安装 PHM ,因为在安装过程中会安装后一些服务会拖慢系统,导致系统降低,因此建议大家用额外的机器安装PHM 查看Log)。镜像来自下面的链接:

https://www.majorgeeks.com/files/details/windows_10_lite.html

这个版本具体的参数如下:

Technical Setup Details

Full NameWindows 10 Lite
Full Setup Size2.4 GB (For 32 Bit), 2.6 GB (For 64 Bit)
CompatibilityCompatible with 32 Bit (x86) / 64 Bit (x64)
Setup TypeOffline Installer / Full Standalone Setup
DevelopersMicrosoft

Minimum System Requirements

Memory (RAM)Minimum 1 GB
HDD (Hard Disk Drive)Minimum 16 GB Free Space Required
ProcessorIntel Pentium 4 Or Advance

在虚拟机中安装之后,还需要安装微软的 Edge 浏览器,之后就可以正常使用PHM。

虚拟机中的 Win10 Lite

链接: https://pan.baidu.com/s/1vlYXOvFDoDgfEBvbQKJ0-w 提取码: h6hn

参考:

1.https://www.lab-z.com/phm/ PowerHouse Mountain 的安装

ESP32 上使用 USB Host Mini

之前介绍过祖国版的 USB Host Mini 【参考1】,这里介绍一些如何在 ESP32 上使用USB Host 功能。试验的板子是 DFRobot 的 FireBeelte:

来自【参考2】

USB  Host Mini 上有24个Pin, 但是实际用到的只有9个,按照下图将它和 FireBeelte 接起来即可:

USB Host Library 直接兼容 ES32 ,. 建议先运行 例子中的Board_QC 来验证板子是否工作正常。

下面是取得 USB 描述符的例子运行结果:

=========================================================

20201027 补充在 ESP32-WROOM-32 上的实验

连接方式:

库中代码修改:

1.USB_Host_Shield_Library_2.0\avrpins.h

// Pinout for ESP32 dev module

MAKE_PIN(P0, 0);
MAKE_PIN(P1, 1); // TX0
MAKE_PIN(P10, 10); // TX1
MAKE_PIN(P3, 3); // RX0
MAKE_PIN(P21, 21); // SDA
MAKE_PIN(P22, 22); // SCL
MAKE_PIN(P19, 19); // MISO
MAKE_PIN(P23, 23); // MOSI
MAKE_PIN(P18, 18); // SCK
//LabZ_Start
MAKE_PIN(P13, 13); // SS
MAKE_PIN(P26, 26); // INT
//LabZ_End

2.USB_Host_Shield_Library_2.0\UsbCore.h

#elif defined(ESP8266)
typedef MAX3421e&lt;P15, P5> MAX3421E; // ESP8266 boards
#elif defined(ESP32)
//LABZ_Debug typedef MAX3421e&lt;P5, P17> MAX3421E; // ESP32 boards
typedef MAX3421e&lt;P13, P26> MAX3421E; // ESP32 boards  //LABZ_Debug
#else
typedef MAX3421e&lt;P10, P9> MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x
#endif

3.USB_Host_Shield_Library_2.0\usbhost.h

#elif defined(ESP8266)
typedef SPi&lt; P14, P13, P12, P15 > spi;
#elif defined(ESP32)
//LABZ_Debug typedef SPi&lt; P18, P23, P19, P5 > spi;
typedef SPi&lt; P18, P23, P19, P13 > spi; //LABZ_Debug 
#else
#error "No SPI entry in usbhost.h"
#endif

参考:

  1. https://www.lab-z.com/cuhm/
  2. http://wiki.dfrobot.com.cn/index.php?title=%E6%96%87%E4%BB%B6:DFR0478%E5%BC%95%E8%84%9A%E5%9B%BE01.png

WPA 的安装

WPA 是 Windows Performance Analyzer的缩写,主要用途是用来分析代码性能【参考1】。在Debug Modern Standby S0 相关问题的时候非常有用,比如:​它可以告诉你谁在占用 CPU 使其处于S0状态,或者哪个中断将CPU 唤醒到S0。本文介绍一下这个工具的安装:

  1. 这个工具在 SDK 中,另外在ADK 中也有。

 2.选择路径

3.选择不要发送

4.选中 “Windows Performance Toolkit” 这就是我们需要的 WPA。从提示可以看出,其中包括 Windows Performance Recorder (记录器),Windows Performance Analyzer (分析器)和 Xperf (分析单个程序性能的工具)

5.下面只需要等待安装完成即可

6.输入 WPA 即可启用

如果你系统中有 WPA,但是无法打开 etl 那么请检查你安装的版本是否和 etl 的相匹配。

参考:

1. https://docs.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-analyzer

Arduino ESP32 安装指南

理论上 Arduino 支持 ESP32 的主控板是非常简单的事情,在IDE 中操作就可以了。但是因为众所周知的原因经常会出现错误,这里就介绍一下另外的方法。

  1. 在首选项中“附加开发板管理器网址”中加入下面这个网址:

https://dl.espressif.com/dl/package_esp32_index.json

2.这里设置好之后可以直接到开发板管理器中搜索 ESP32,如果能够正常搜索到ESP32,然后顺利完成下载,那么久无需阅读下面部分。

上面Step2 失败,出现错误,需要手工操作如下:

A. 将 package_esp32_index.json 放在C:\Users\[用户名]\AppData\Local\Arduino15 下面。比如,我当前登录账号是 Administrator ,name 对应路径是

C:\Users\Administrator\AppData\Local\Arduino15;

B. 找到 C:\Users\[用户名]\AppData\Local\Arduino15\preferences.txt 文件中的下面两行修改为:

target_package=esp32
target_platform=esp32

C. 再次来到开发板管理器中,同样会出错,但是这次可以搜索到 esp32 的开发板了

D. 在安装之前,将开发板Package和编译工具放置在下面的路径下:

C:\Users\[用户名Data\Local\Arduino15\staging\packages

E.选择你需要的版本,即可安装

F. 从原理上将,Step A告诉Arduino 我要加入新板子,新板子的描述在 一个JSON文件中。Arduino 会根据描述在开发板管理器中加入这个板子的型号,同时尝试去JSON文件给出的网址下载开发包等等工具,同时因为 JSON 文件给出了这些文件的 Checksum,当 Arduino 发现目录下存在对应的文件后,不会再次下载而是会去校验,校验结果Pass即可继续安装,从而顺利完成 Arduino ESP32的安装。

所以上述动作能够“骗过” Arduino 在没有网络下载的情况下正常安装。

本文提到的安装包有如下文件

esp32-1.0.0.zip
esp32-1.0.1.zip
esp32-1.0.2.zip
esp32-1.0.3.zip
esp32-1.0.4.zip
esptool-2.3.1-windows.zip
esptool-2.6.0-windows.zip
esptool-2.6.1-windows.zip
mkspiffs-0.2.3-arduino-esp32-win32.zip
xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip

可以在这里下载链接:https://pan.baidu.com/s/19GoaTbeSAGZ4ourMcWiCOg

提取码:sxsr

SystemInfo命令

这个命令能够显示计算机及其操作系统的详细配置信息,包括操作系统配置、安全信息、产品 ID 和硬件属性,如 RAM、磁盘空间和网卡和补丁信息等。比如,有人希望你确认操作系统版本信息,除了使用 WinVer, 还可以试试这个命令。例如,运行结果如下:

此外,还可以直接显示需要的结果,比如直接获得系统型号,可以和 findstr 配合使用

特别注意:很多资料说可以使用 find,但是根据我的实验,这条指令在中文操作系统下无法正常工作,推荐使用 findstr。

通过这样的工具,如果下次有人需要你提供当前版本信息,可以直接生成全部信息提供给他了。

参考:

  1. https://www.cnblogs.com/sfccl/p/12344416.html win10系统systeminfo命令的过滤用法
  2. https://baike.baidu.com/item/systeminfo systeminfo

制作一个 WinPE 启动盘

FAT32 分区存在着单个文件无法大于4G的限制,NTFS分区存在着无法启动的限制。将U盘制作成具有分别是FAT32和NTFS格式的分区可以结合二者优点避免上述限制。下面介绍一下具体制作方法。因为 Windows不支持对U盘分区,所以需要使用第三方工具,这里推荐 DiskGenius。官方网站 http://www.diskgenius.cn/

  1. 准备一个U盘,越大越好。
  2. 使用DiskGenius打开U盘,首先删除之前U盘上的分区,下面是一个14G的U盘

3, 选择新建分区,出现下面的画面,选择取消

4. 接下来新建第一个分区,注意需要设置为 NTFS 分区,我这边分配给他 13G

操作之后U盘分配如下

5.接下来继续在空闲的空间建立分区

这次选择 FAT32 格式,大小为1GB

之后,U盘空间分配如下

6.保存更改,工具会提示是否格式化,选择是自动格式化。

7. 经过这样的处理后U盘上有两个分区,分别是 NTFS 和 FAT32。对于 Win7 Win8 和 Win10 早期版本,只能看到 NTFS 分区,后面的FAT32分区是不可见的。

8. 继续使用 DiskGenuis, 选中U盘第二个分区,使用“浏览文件”

9.解压之前的 WinPELABZ.ISO, 将解压后的文件拖到第二个分区中。这个ISO是450MB大小,因此理论上只要分区大于这个值都可以放进去。同样的,如果你有其他的工具,比如DISM++,可以使用同样的方法放在这个分区上。

10.拷贝完成后即制作完成。

11.在启动时,调出 Boot Menu 选择从这个U盘启动即可。

在使用的时候,可以将硬盘镜像存放在 NTFS 格式的分区上,这样用一个U盘就能完成系统的恢复或者备份,非常方便。