3.3.4. 测试设计
测试是驱动开发的重要环节,主要包括扩展性测试、健壮性测试和稳定性测试。针对如下USB测试,我们主要设计了枚举、中断传输、批量传输、8*PackSize[64]数据传输、17/2*PackSize[64]数据传输和24小时压力测试等几个方面,从这几个方面完全涵盖扩展性测试、健壮性测试和稳定性测试,详细介绍如下。
3.3.4.1. 下位机程序配合简要
该驱动准备通过LPC2400 系列ARM USB设备控制器的逻辑端点2收发大量数据,但其最大信息包只能为64字节,如果调用LPC2400_USB.DLL中的API函数每次只能发送64字节,那么完成4094个字节需要64次,这将大大减慢USB的传输效率,但如果能一次性发送4096字节,那么将大大的提高传输速度。这样需要下位机程序配合,可以用下面方法实现。
a) PC先通过端点1,发送2个字节(用于保存4096这个值),告诉LPC2400“PC机将发送4096字节”。
b) LPC2400接收这两个字节后,通过逻辑端点1返回一个字节0x01作为应答信号,告诉PC机“已经接收到两个字节,并准备接收4096个字节”。
c) PC用端点2,发送4096字节。
d) LPC2400 USB设备控制器接收完4096个字节后,利用逻辑端点2将这个4096字节发送回PC。
下位机处理的时候,利用到了逻辑1号端点和逻辑2号端点,其中涉及到中断传输和批量传输,故上位机USB驱动需要支持中断和批量传输。
3.3.4.2. 枚举
枚举测试主要用于查看USB相关描述符信息,其中包括设备、接口和端点描述符号。该测试主要操作是通过I/O码IOCTL_LPC2478_USB_GET_CONFIG_DESCRIPTOR获取相关信息,查看获取的信息是否和下位机配置的信息是否一致。CMD中的枚举信息显示格式如下;
a) USB_CONFIGURATION_DESCRIPTOR
USB_CONFIGURATION_DESCRIPTOR bLength = 0x9, decimal 9 bDescriptorType = 0x2 ( USB_CONFIGURATION_DESCRIPTOR_TYPE ) wTotalLength = 0x2e, decimal 46 bNumInterfaces = 0x1, decimal 1 bConfigurationValue = 0x1, decimal 1 iConfiguration = 0x0, decimal 0 bmAttributes = 0x60 ( USB_CONFIG_SELF_POWERED ) MaxPower = 0x32, decimal 50 |
b) USB_CONFIGURATION_DESCRIPTOR
USB_INTERFACE_DESCRIPTOR #0 bLength = 0x9 bDescriptorType = 0x4 ( USB_INTERFACE_DESCRIPTOR_TYPE ) bInterfaceNumber = 0x0 bAlternateSetting = 0x0 bNumEndpoints = 0x4 bInterfaceClass = 0xdc bInterfaceSubClass = 0xa0 bInterfaceProtocol = 0xb0 bInterface = 0x0 |
c) USB_CONFIGURATION_DESCRIPTOR
USB_ENDPOINT_DESCRIPTOR for Pipe00 bLength = 0x7 bDescriptorType = 0x5 ( USB_ENDPOINT_DESCRIPTOR_TYPE ) bEndpointAddress= 0x81 ( INPUT ) bmAttributes= 0x3 ( USB_ENDPOINT_TYPE_INTERRUPT ) wMaxPacketSize= 0x10, decimal 16 bInterval = 0x1, decimal 1 |
这些信息规格化成上位机测试软件显示方法是通过List控件进行统一显示,这样可以很好的显示多接口、多端点显示的问题,如图3-3-4-0。
根据获取的设备描述、接口描述和端点描述信息,我们抽象出四个类,用于获取和显示这些信息。
n USB_CONFIGURATION_DESCRIPTOR_INFO:字符化设备描述信息。
n USB_INTERFACE_DESCRIPTOR_INFO:字符化接口描述信息。
n USB_ENDPOINT_DESCRIPTOR_INFO:字符化端点描述信息。
n UsbDesc:存储字符化后的设备描述、接口描述和端口描述信息,并规格化显示,如图3-3-4-0。
3.3.4.3. 中断/批量传输
该功能测试的方法是向LPC2400 USB控制器发送4096字节,发送的数据和接收的数据进行自能比较,如果一致不仅可以说明批量传输成功也可以检测USB中断传输正常,反之亦然。该功能界面如图3-3-4-1;
3.3.4. 4. 8*PackSize[64] 数据传输
该功能测试的方法是向LPC2400 USB控制器发送512字节,发送的数据和接收的数据进行自能比较,如果一致说明8*PackSize[64]数据传输成功,反之亦然。该功能界面如图3-3-4-2;
3.3.4. 5. 传输速度测试
该功能主要用于测试Windows下USB驱动的传输速度,其中检测编写的USB驱动程序是否能达到要求,该功能界面如图3-3-4-3;
3.3.4. 6. 17/2*PackSize[64] 数据传输
该功能测试的方法是向LPC2400 USB控制器发送544字节,发送的数据和接收的数据进行自能比较,如果一致说明17/2*PackSize[64]数据传输成功,反之亦然。该功能界面如图3-3-4-4;
3.3.4. 7. 24 小时压力测试
该功能测试的方法是持续24小时每个隔0.5向LPC2400 USB控制器发送32字节一次,每次发送的数据和接收的数据进行自能比较并记录结果,如果24小时后,如果每次传输的结果都正确,说明USB驱动比较稳定,反之亦然。该功能界面如图3-3-4-5;
3.3.4. 8. 测试结果记录
3.3.4.9. 图解
经过两个多星期的设计、代码编写和调试,驱动以及调试软件基本完成。测试接近尾声,驱动运行稳定,如下图解测试结果;
3.3.4.10. Windows USB驱动速度测试体验
USB驱动传输速度受很多方面因素影响,其中主要包括Windows USB驱动和下位机USB固件程序,如下是我近期测试USB驱动传输速度的过程简要描述。
在Windows USB驱动中,USB驱动传输速度主要受设置的端点一次性最大传输量和一次向USB总线提交的最大数据量影响。
配合Windows USB驱动传输速度测试,在下位机固件程序当中,传输速度主要受设置一次向上位机发送的最大数据量影响。在测试的时候,我将Windows USB驱动一次向USB总线提交的最大数据量和固件程序一次向上位机发送的最大数据量设置一致。
表1.1. 测试数据的设置记录
中断传输端点一次性最大传输量 | 批量传输端点一次性最大传输量 | Windows USB驱动一次向USB总线提交的最大数据量 | 固件程序一次向上位机发送的最大数据量 | 测试获得的传输速度 |
PAGE_SIZE | PAGE_SIZE | 256 | 4096 | 89kb/s±10 |
PAGE_SIZE | PAGE_SIZE | 1024 | 4096 | 200kb/s±10 |
PAGE_SIZE | PAGE_SIZE | 4096 | 4096 | 390kb/s±10 |
PAGE_SIZE | PAGE_SIZE | 4096*4 | 4096*4 | 630kb/s±10 |
PAGE_SIZE | PAGE_SIZE | 4096*6 | 4096*6 | 585kb/s±10 |
PAGE_SIZE | PAGE_SIZE | 4096*8 | 4096*8 | 290kb/s±10 |
16 | 64 | 4096 | 4096 | 630kb/s±10 |
16 | 64 | 4096*4 | 4096*4 | 820kb/s±10 |
16 | 64 | 4096*6 | 4096*6 | 570kb/s±10 |
16 | 64 | 4096*8 | 4096*8 | 230kb/s±10 |
如表1.1所示,就是我测试数据的全部记录,测试获得的传输速度未必很精确,只凭回忆写下,最后测试的最大速度值是812.59kb/s。