Wince 5.0 USB 驱动中address管理的实现
USB驱动中,共包含128个address。其中,给设备用的有127(0 - 127)个。第0个address是保留给root hub用的。
这128个address是通过一个包含四个成员的DWORD数组来实现管理的。
DWORD m_dwFreeAddressArray[4];
一个DWORD包含32个bit,4个DWORD刚好128个bit,每个bit代表一个address。通过判断相应bit的0/1,就可以知道该address是否已经被使用。
每个设备的address必须是唯一的。所以,在为一个设备分配address时,就需要寻找未被使用的address。当一个设备拔出以后,也需要释放相应的address。如何根据address找到对应的bit?
每个DWORD包含32个bit,用5个bit可以实现0-31的计数。128 / 32 = 4。两个bit可以实现0-3的计数。所以,用低位的5个bit表示0-31,也就是一个DWORD中的第几个bit。接下来的两个字节来表示是第几个DWORD,这样就实现了address到bit的定位。
也即xxyyyyyb,其中xxb表示是第几个DWORD,yyyyyb表示是相应DWORD中的第几个bit。
比如address 68,其二进制表示为1000100b,10b表示所在的DWORD为m_dwFreeAddressArray[2]。00100b表示是该DWORD中的第4个bit。
驱动中,寻找未被使用的address时的代码如下:
const UCHAR index = (address >> 5); // 5 == log base 2 of 32
const UCHAR bit = address & (32 - 1); // 32 == # of bits in DWORD
if ( (m_dwFreeAddressArray[ index ] & (1 << bit)) == 0 ) {