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 ) {

posted @ 2011-04-06 16:54  andriod2012  阅读(153)  评论(0编辑  收藏  举报