编译和使用 SpbTestTool

SpbTestTool 是 Windows WDK Sample 中的一个代码【参考1】,页面上介绍如下

The SpbTestTool sample serves two purposes. First, it demonstrates how to open a handle to the SPB controller, use the SPB interface from a KMDF driver, and employ GPIO passive-level interrupts. Second, it implements a set of commands for communicating with a peripheral device to aid in debugging.

程序本身实际上是两部分:一个是SYS的Demo Code (通过I2C访问设备的驱动)。这个SYS使用了 I2C 的资源以及GPIO;另一个是Application,演示如何通过应用程序调用驱动来完成通讯。

编译环境是 VS2013+WDK (8.1的),这也是MS推荐开发Win8.1 Driver使用的。正常情况下,安装完成之后,直接打开 MS 的Sample就可以直接编译成功,不需要额外的设置。如果无法编译,请检查VS2013和WDK 的安装顺序,需要先装VS再装WDK。具体环境的搭建住在这里就不再赘述了。

测试编译正常之后,就可以打开 SpbTestTool 这个工程文件了。

需要修改SpbTestTool.inx文件,这里面给出了编译后生成的INF文件中的 ACPI ID,需要和你BIOS中的一致。默认值是 SpbTestTool。如果你在ASL中真的使用这个,会发现BIOS的编译都无法通过。

labz1

修改了上面的文件后,每次编译生成的inf文件就是下面这个样子

labz2

同时,你BIOS中的ASL要写成下面的样子

Device(LABZ)
{
	Name(_ADR, 0x0)
	Name(_HID, "LABZ0001")
	Name(_CID, "LABZ0001")
	Name(_UID, 0x1)

	Method(_STA, 0x0, NotSerialized)
		{
			return(0x0f)
		}
			
	Method(_CRS, 0x0, NotSerialized)
		{
			Name(ZBUF,ResourceTemplate () {
					I2CSerialBus(0x50,          //SlaveAddress: bus address
						,                       //SlaveMode: default to ControllerInitiated
						400000,                 //ConnectionSpeed: in Hz
						,						//Addressing Mode: default to 7 bit
						"\\_SB.I2C3",           //ResourceSource: I2C bus controller name
						,                       //Descriptor Name: creates name for offset of resource descriptor
						)  //VendorData
					GpioInt(LEVEL,  ActiveLow, Exclusive, PullDown, 0, "\\_SB.GPO2", ) {6}//SAR INT  (GPIO INT)
				})
			Return (ZBUF)
		}
}// Device LABZ

 

编译时还需要在菜单 Build -> Configuration Manager 下,选择 Win8.1 Release。具体原因后面说。

Untitled3

编译完成后,把所有的东西一股脑 copy 到U盘上。

编译BIOS,之后将生成的BIOS刷新到被测机上。启动进入系统之后,设备管理中应该会出现我们在ASL中设置的这个设备,ID是我们刚才设置的 LABZ0001.

Capture3

下面是安装驱动。因为我们的驱动没有签名,所以要保证已经关闭签名验证之类的设置。

Capture4

安装后的样子

Capture5

Capture6

驱动的编译和安装到此已经结束,接下来就可以进行测试了。

测试需要有硬件对应,我这里选择的是一款I2C接口的EEPROM

eeprom

引脚对应连接到板子上的I2C即可,需要注意的是,可以选择 1.8V或者3.3V 供电都可以,差别在于如果选择前者的话,通讯速度上只能选择100KHz,选择后者之后速度可以选择 400KHz,这个数据来自 AT24C256 的DataSheet【参考 2】。

编译后的可执行文件在下面这个位置

Capture8

因为是VS2013编译的,所以在运行的时候需要对应的DLL库的支持,如果你的Win8.1没有的话,请到网上下载 vcredist_x86.exe

rb2013

如果你看到下面的画面,那么是因为你没有选择 Release Build

capa

运行之后,程序是命令行方式。使用 h 可以看到帮助。

我们的目标是:在EEPROM中,从 0 开始保存 1 2 3 这三个值,

首先,要打开设备,命令是 open

open

然后是写入命令可以写为 write {0 0 1 2 3} (前面 0 0 是一个16位的地址 0x0000. 不要按照MS的说明写,它程序不支持 01 02 这样的写法)

接下来,是读EEPROM的命令 writeread {0 0 } 3 (意思是从 0 0 开始连续读3个)

Captured

因为EEPROM断电不会丢失数据,写入之后,你再关机重启,重新使用这个应用程序用命令读取,仍然能看到你写入的值。

参考:

1. Dev Center - Hardware > Samples > Windows Driver Kit (WDK) 8.1 Samples > SpbTestTool
http://code.msdn.microsoft.com/windowshardware/SpbTestTool-adda6d71
(另外,在完整的 WDK8.1 的Sample Package中,也有 SpbTestTool 这个程序,只是页面单独下载的要比完整Package中的新一些。建议直接下载单独页面提供的。)

备份一个: SpbTestTool

2. AT24C256 的 Datasheet at24c256

《编译和使用 SpbTestTool》有6个想法

  1. 请教下您,是否一般的i2c设备接到PC上,都可以用这个SpbTestTool进行读写和中断测试。 它的KMDF是通用的吗?

    1. 我记得这个是个 UMDF 驱动吧? 只有基于这个框架的,并且有针对这个工具 ICTL 命令的才可以用这个工具测试。

      1. 是的这是个UMDF驱动,您说的“基于这个框架”是指底层KMDF需要支持这个框架?但是这个SpbTestTool和您的博客都没有说明是用怎样的KMDF。

        需要请教的是,如果只需要进行一般i2c读写的话,这个UMDF 驱动工具可以用吗?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注