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的编译都无法通过。
修改了上面的文件后,每次编译生成的inf文件就是下面这个样子
同时,你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。具体原因后面说。
编译完成后,把所有的东西一股脑 copy 到U盘上。
编译BIOS,之后将生成的BIOS刷新到被测机上。启动进入系统之后,设备管理中应该会出现我们在ASL中设置的这个设备,ID是我们刚才设置的 LABZ0001.
下面是安装驱动。因为我们的驱动没有签名,所以要保证已经关闭签名验证之类的设置。
安装后的样子
驱动的编译和安装到此已经结束,接下来就可以进行测试了。
测试需要有硬件对应,我这里选择的是一款I2C接口的EEPROM
引脚对应连接到板子上的I2C即可,需要注意的是,可以选择 1.8V或者3.3V 供电都可以,差别在于如果选择前者的话,通讯速度上只能选择100KHz,选择后者之后速度可以选择 400KHz,这个数据来自 AT24C256 的DataSheet【参考 2】。
编译后的可执行文件在下面这个位置
因为是VS2013编译的,所以在运行的时候需要对应的DLL库的支持,如果你的Win8.1没有的话,请到网上下载 vcredist_x86.exe
如果你看到下面的画面,那么是因为你没有选择 Release Build
运行之后,程序是命令行方式。使用 h 可以看到帮助。
我们的目标是:在EEPROM中,从 0 开始保存 1 2 3 这三个值,
首先,要打开设备,命令是 open
然后是写入命令可以写为 write {0 0 1 2 3} (前面 0 0 是一个16位的地址 0x0000. 不要按照MS的说明写,它程序不支持 01 02 这样的写法)
接下来,是读EEPROM的命令 writeread {0 0 } 3 (意思是从 0 0 开始连续读3个)
因为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
请教下您,是否一般的i2c设备接到PC上,都可以用这个SpbTestTool进行读写和中断测试。 它的KMDF是通用的吗?
我记得这个是个 UMDF 驱动吧? 只有基于这个框架的,并且有针对这个工具 ICTL 命令的才可以用这个工具测试。
是的这是个UMDF驱动,您说的“基于这个框架”是指底层KMDF需要支持这个框架?但是这个SpbTestTool和您的博客都没有说明是用怎样的KMDF。
需要请教的是,如果只需要进行一般i2c读写的话,这个UMDF 驱动工具可以用吗?
我指的是这个 UMDF 驱动本身。一般的读写用这个都没有问题。然后文章中实现了 eeprom 的读写。
感谢指点,醍醐灌顶
这方面我也不懂的。