USB主机控制器分配设备地址SetAddress
2024-01-29
102
0
我们都知道USB总线负责对USB设备的管理,这里包括分配地址。
但这个地址的分配其实是由USB主机控制器来实现的。这里我们以WINXP的usbehci.sys驱动为例进行分析。
一条USB总线线上最多包括127个设备(包括该USB控制器下的USB根集线器),所以在USB主机控制器的其通过一个数据大小为4,每个为32位的数据来标识的。
ULONG AddressList[4];
32x4=128 总共128位,那一位为1,表示那个地址被分配,为0表示未分配。
由于地址0为保留地址,故在初始化时,将第一个ULONG的的BIT0置1表示已经分配。
// Always start with the default address (0) assigned.
// Address array has one bit for every address 0..127
devExt->Fdo.AddressList[0] = 1;
devExt->Fdo.AddressList[1] =
devExt->Fdo.AddressList[2] =
devExt->Fdo.AddressList[3] = 0;
这样在对USB设备分配地址时,可能使用如下代码来分配新的USB地址:
USHORT
USBPORT_AllocateUsbAddress(
PDEVICE_OBJECT FdoDeviceObject
)
/*++
Return Value:
Valid USB address (1..127) to use for this device,
returns 0 if no device address available.
--*/
{
PDEVICE_EXTENSION devExt;
USHORT address, i, j;
ULONG bit;
address = 0;
for (j=0; j<4; j++)
{
bit = 1;
for (i=0; i<32; i++)
{
if (!(devExt->Fdo.AddressList[j] & bit)) //是否被占用
{
devExt->Fdo.AddressList[j] |= bit;//占坑
address = (USHORT)(j*32+i); //计数地址索引
return address;
}
bit = bit<<1;
}
}
return address;
}
代码看着比较简单。
- 数据为4,每个32bit,标识了总其128个地址。
- 因数组为0的ULONG置为1,故如果分配成功不会存在分配为0的地址。但因初始化address=0,则因全部地址已被占用而分配失败,故返回0表示分配地址失败。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936