WindowsXP下USB控制器ECHCI驱动分析
+ -

USB主机控制器分配设备地址SetAddress

2024-01-29 20 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   

0 篇笔记 写笔记

USB2.0设备枚举-主机设置设备地址事务
USB主机在首次获取设备描述符后,知道了设备的默认端点大小。后续一个重要的操作是对设备分配地址。对USB设备分配地址是通过标准请求SetAddress来完成后。其具体的过程如下图所示:SetAddress包括2个事务。第一个事务是对主机设置地址,第二个事务是主机对设备返加一个0字节的数据包,用于确......
USB 设置请求地址SetAddress
ID请求码说明5SET_ADDRESS用来给设备分配地址SetAddress 用于枚举(enumeration)阶段为设备分配一个唯一的地址,地址在 wValue 字段中且最大值为 127。该请求特别的地方在于,直到状态阶段完成,设备才完成地址设置。其他所有请求必须在......
USB设备SetAddress失败
有的时候插拔USB设备,会出现各种各样的情况。我们其实见到的最多的是获取设备描述符失败。详见https://www.usbzh.com/article/detail-395.html另一种情况就是Set Address Failed。这种情况在系统中表现为:第一次获取设备描述符成功后,主机向设备分配......
USB主机控制器分配设备地址SetAddress
我们都知道USB总线负责对USB设备的管理,这里包括分配地址。但这个地址的分配其实是由USB主机控制器来实现的。这里我们以WINXP的usbehci.sys驱动为例进行分析。一条USB总线线上最多包括127个设备(包括该USB控制器下的USB根集线器),所以在USB主机控制器的其通过一个数据大小为......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!