硬汉嵌入式论坛

 找回密码
 立即注册
查看: 974|回复: 10
收起左侧

[ThreadX全家桶] 关于USBX枚举过程的疑惑

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
发表于 2024-10-21 14:52:32 | 显示全部楼层 |阅读模式
最近在做用STM32 HOST USB连接4G模块的东西,看源码发现USBX在枚举的时候把4G模块中bAlternateSetting=0X00的所有接口(interfaces)都给他的端点分配了PIPE(或者叫channel?又或者把这个过程叫把端点实例化),导致STM32的PIPE(USB_OTG_FS 只有8个)不够用了,然后就报错,我的理解是,不应该是用户打算用哪个接口才给这个接口的端点分配PIPE嘛,全部分配了有点难绷。

下面是我调试时候查看的函数例程(写的全部是函数名):
_ux_host_stack_new_device_create -->
_ux_host_stack_class_interface_scan -->
_ux_host_stack_configuration_interface_scan -->
_ux_host_stack_device_configuration_select -->
_ux_host_stack_configuration_instance_create  -->
_ux_host_stack_interface_instance_create -->
_ux_host_stack_endpoint_instance_create
只要发现了主机有合适的驱动,USBX就会调用_ux_host_stack_device_configuration_select这个函数去配置整个设备(所有bAlternateSetting=0X00的接口),这些接口的选择在_ux_host_stack_configuration_instance_create 里体现:
[C] 纯文本查看 复制代码
/* Check if we are dealing with the first alternate setting.  */
        if (interface -> ux_interface_descriptor.bAlternateSetting == 0)
        {
            /* Create the interface. */
            status = _ux_host_stack_interface_instance_create(interface);

            /* Check status, the controller may have refused the endpoint creation.  */
            if (status != UX_SUCCESS)
            
                /* An error occurred.  The interface cannot be mounted.  */
                return(status);
            
        }


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-10-21 15:07:54 | 显示全部楼层
现在用的USB CDC ACM还是ECM
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2024-10-21 15:41:41 | 显示全部楼层
eric2013 发表于 2024-10-21 15:07
现在用的USB CDC ACM还是ECM

用的是ACM,
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2024-10-21 15:44:37 | 显示全部楼层
补充一个,所有接口还包括了主机没有驱动的接口
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-10-22 10:01:22 | 显示全部楼层
分享基于安富莱ThreadX全家桶2.0版本实现的USBX CDC ACM+PPP连接服务器
https://www.armbbs.cn/forum.php? ... 3737&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2024-10-26 09:41:06 | 显示全部楼层
eric2013 发表于 2024-10-22 10:01
分享基于安富莱ThreadX全家桶2.0版本实现的USBX CDC ACM+PPP连接服务器
https://www.armbbs.cn/forum.php? ...

学到了,谢谢硬汉哥
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2025-3-27 17:17:59 | 显示全部楼层
本帖最后由 askyper 于 2025-3-29 17:08 编辑

重新回顾了一下这个问题,并咨询了deepseek。答案是确实是会枚举全部的包括无驱动的类。


chrome_2VV4dwG5cd.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-3-28 09:57:19 | 显示全部楼层
askyper 发表于 2025-3-27 17:17
重新回顾了一下这个问题,并咨询了deepseek
官方文档与设计解析
​USBX枚举流程:

这个问题,这种修改后,解决了没
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2025-3-29 17:01:27 | 显示全部楼层
eric2013 发表于 2025-3-28 09:57
这个问题,这种修改后,解决了没

是的,已经解决了,本来只是想要确认USBX是不是真的会枚举全部接口,因为我本身对USB的理解不深。我是在修改了这个枚举的函数,红色部分是我增加的地方,这个函数意味着,这个被枚举的接口,如果检测到没有主机驱动,那就把他所占用的资源释放掉。
我只是测试了能够枚举成功,并没有做进一步测试。因为之前甚至连枚举都无法成功,因为PIPE超出了。
[C] 纯文本查看 复制代码
UINT  _ux_host_stack_configuration_instance_create(UX_CONFIGURATION *configuration)
{

UX_INTERFACE    *interface;
UINT            status;
    
    /* If trace is enabled, insert this event into the trace buffer.  */
    UX_TRACE_IN_LINE_INSERT(UX_TRACE_HOST_STACK_CONFIGURATION_INSTANCE_CREATE, configuration, 0, 0, 0, UX_TRACE_HOST_STACK_EVENTS, 0, 0)

    /* Obtain the first interface for this configuration.  */
    interface =  configuration -> ux_configuration_first_interface;

    /* Each selected alternate setting 0 for each interface must be created.  */
    while (interface != UX_NULL)
    {

        /* Check if we are dealing with the first alternate setting.  */
        if (interface -> ux_interface_descriptor.bAlternateSetting == 0)
        {
            /* Create the interface. */
            status = _ux_host_stack_interface_instance_create(interface);
          [color=Red]  if(interface->ux_interface_class == NULL)
            {
              _ux_host_stack_interface_instance_delete(interface);
            }[/color]
            /* Check status, the controller may have refused the endpoint creation.  */
            if (status != UX_SUCCESS)
            
                /* An error occurred.  The interface cannot be mounted.  */
                return(status);
            
        }

        /* Next interface.  */
        interface =  interface -> ux_interface_next_interface;
    }

    /* Return successful completion.  */
    return(UX_SUCCESS); 
}
回复

使用道具 举报

8

主题

31

回帖

55

积分

初级会员

积分
55
发表于 2025-3-31 09:36:57 | 显示全部楼层
#define UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_ALL     0 /* Default: all things created.  */
#define UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_OWNED   1 /* Owned: class owned things created.  */
#ifndef UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL
#define UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_ALL
#endif

较新的库,已经有宏可以配置了,无效class是不会创建instance的
企业微信截图_17433848221650.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
QQ
 楼主| 发表于 2025-4-5 21:24:24 | 显示全部楼层
jacksimcom 发表于 2025-3-31 09:36
#define UX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_ALL     0 /* Default: all things created.  */
# ...

好的,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 21:49 , Processed in 0.299416 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表