CP210x是Silicon Labs 公司出品的一系列USB转串口芯片。目前这一系列有:CP2101, CP2102, CP2103, CP2104, CP2105, 和CP2108。其中不同版本差别在下图可以看到【参考1】:

最近我拿到一个 CP2102 的USB转串口卡,发现Windows10可以通过Windows Update直接安装驱动无需额外下载。另外,它的官方网站提供了大量的资料和参考给人感觉很好。我的目标是使用 Arduino 来直接驱动,因此还需要进行一些额外的研究。非常遗憾,之前介绍的USBlyser抓包结果让人看起来一头雾水,最后只能使用USB逻辑分析仪抓包。一端通过 Arduino 按照 9600,8,None,1,None 模式发送。另外一端使用串口工具读取。数据是单独的 A  2秒后发送“string from www.lab-z.com” 字符串。对照网站提供的AN571可以解读全部数据。

1.打开/关闭串口

2.查询CTS/RTS等等线的状态

这一系列文章并不是按照“由浅入深”的原则排列的,更多的是按照“任务驱动”的方式编写的。就是按照:提出问题,解决问题,为什么能解决问题,是否还有其他解决问题的方法,原理探究的方式进行排列的。这种方式可以帮助你快速掌握编程技术,当然要想实现这个目标更重要的是要亲手操作研读代码。

前面的文章中介绍过 EFI 文件格式的一些简单知识,这里会对一只EFI 做完整的分析,标明每一个字节的含义。

首先,我们选择实验的目标是 \AppPkg\Applications\Hello

#include  <Uefi.h>
#include  <Library/UefiLib.h>
#include  <Library/ShellCEntryLib.h>

/***
  Print a welcoming message.

  Establishes the main structure of the application.

  @retval  0         The application exited normally.
  @retval...								 > Read More
			

如果需要自动测试 Modern Standby 那么需要安装 WDTF (Windows Device Testing Framework)【参考1】, 这个事情在之前的 ZVIRTUALBATTERY工具上有提到过【参考1】,当时我将一个 WDTF 安装包集成到了这个工具中,在安装工具的时候会自动安装。

实际上微软的推荐是需要安装和当前版本相匹配的 WDTF。因此这里就介绍一下如何单独安装。

1.检查当前 Windows 版本,命令  WinVer

2.根据这个版本,找对应的 WDK,通常是 ISO格式

3.可以选择直接挂接,比如下面直接把ISO 虚拟成一个光驱

4.使用命令  E:\Installers>msiexec /i "Windows Driver Testing Framework (WDTF)... > Read More

前面的研究中提到了调用 ConOut 必须满足的2个条件,这次就研究一下其中的另外条件:

“代码起始处的 push rdi , 不一定是RDI,任何8Bytes的寄存器都可以,但是如果没有这语句在调用ConOut的时候这个函数内部会发生错误”

针对这个问题,使用单步跟踪的方式,尝试定位出现问题的位置:

1.CoreStartImage() 函数中的下列代码, 准备跳入 Hello.EFI 代码执行

Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);

0000000075829870 48 8B 53 38          mov  ...								 > Read More
			

前面的研究中提到了调用 ConOut 必须满足的2个条件,这次就研究一下其中的一个条件:

“实践发现在调用 SystemTable->ConOut 的时候会损坏堆栈,比如下面的调用方式(按道理2个参数的情况下是通过寄存器来进行参数传递的)

push rdx 
Call ConOut
pop rdx 

运行之后会发现 rdx 值发生了变化”

首先需要明确的是:堆栈生长方向是从高向低。比如:PUSH RAX执行之后,会将RSP=RSP-8, RAX值存放在 RSP 给出的位置,然后;POP 动作与之相反。

开始跟踪代码,首先在调用处停下来:

执行Call 命令之后,RSP=RSP-8, 然后将 call 后面的下一条指令地址存放在 [RSP ]... > Read More

最近根据【参考1】研究了一下通过 WinDBG 查看 ACPI Table 的方法,需要特别注意的是,必须按照顺序执行才能取得需要查看的信息。

1.运行!rsdt命令,感觉是让 WinDBG 进行查找的动作

||0:6: kd> !rsdt
Sorry: Unable to get ACPI!AcpiInformation.
Searching for RSDP.*************************************************************************
***                                 ...								 > Read More
			

前面对于 RU.EFI 的研究告诉我们对于 X86 来说,访问硬件信息需要的基本操作有:

1. PCI 信息的访问

2. 访问IO Port 直接访问

3. IO Port Index/Data 方式的访问

4. Memory 的访问

5. Memory Index/Data 方式的访问

6. MSR 的访问

掌握了上述的访问方法就可以访问到 X86 上的全部空间和寄存器。下面逐项介绍在 WinDBG 中的访问方法。因为大多数情况下,WinDBG 是用于调试 Windows 软件本身而不是硬件,因此很多操作都是来自个人总结如果有错误或者遗漏,恳请及时指出。

1.PCI的访问

a. ... > Read More

Subst 命令是一个很老的 DOS命令,通过它可以将一个目录映射为一个盘符。

例如,我本机当前只有一个盘符c:

通过 subst d: 201903, 即可将 buildbs\201903 这个目录映射为 D:

再次查看会多出一个 d: 盘符