USB模拟热拔插

 1、USB插入检测原理

2、分析

USB设备断开之后,主机D+和D-都被内部电阻拉低,插回之后根据设备的上拉电阻确定设备接入。

 所以设备主动将D+和D-两线都拉低就等于设备被拔出了,间隔一定时间释放D+和D-就模拟一个热拔插动作了。

 3、代码

模拟设备拔出

 拉低D+,D- 50ms,

void USB_Reset()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);

    /*Configure GPIO pin : PtPin */
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_Delay(50);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);//释放D+ D-
//    HAL_Delay(100);

}

 初始化之前复位

        GPIO在USB_Reset后会被USB的相关初始化函数设置。

void MX_USB_DEVICE_Init(void)
{
    /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
    USB_Reset();
    /* USER CODE END USB_DEVICE_Init_PreTreatment */

    /* Init Device Library, add supported class and start the library. */
    if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)
    {
        Error_Handler();
    }

。。。。。。

<think>好的,我需要帮助用户解决OpenWRT中USB设备脚本未触发的问题。首先,我需要回顾用户提供的引用内容,看看有没有相关的信息可以应用。 用户提到了几个引用,比如引用[3]和[4]中提到了USB脚本的配置示例和block-mount的必要性。首先,我应该检查用户是否正确安装了block-mount包,因为引用[4]提到如果不安装,对应的目录可能不存在。这可能是一个常见的问题点,导致脚本无法触发。 接下来,脚本的存放位置是否正确?根据引用[1]和[3],USB相关的脚本应该放在/etc/hotplug.d/usb/目录下,并且文件名通常有数字前缀,比如20-rtl8188su。用户可能需要确认他们的脚本是否放在正确的目录,是否有适当的前缀以确保执行顺序。 然后,脚本的权限是否正确?如果脚本没有可执行权限,Procd可能不会执行它。需要提醒用户检查权限,使用chmod +x来添加执行权限。 另外,脚本的语法是否正确?比如是否使用了正确的变量如$PRODUCT和$ACTION,以及条件判断是否正确。引用[3]中的示例使用了if语句来检查产品ID和动作是否为add。如果用户的脚本中有语法错误,比如缺少引号或变量名错误,也可能导致脚本不被执行。 环境变量是否传递正确?有时候可能需要确认系统是否正确设置了PRODUCT和ACTION变量。用户可以通过手动触发事件并记录日志来检查这些变量的值,确保它们匹配脚本中的条件。 还有,内核模块是否加载?如果USB设备所需的驱动没有加载,系统可能无法识别设备,自然也不会触发事件。检查dmesg日志是否有设备识别的信息,或者使用lsusb查看设备是否被正确识别。 用户还可以尝试手动触发脚本进行测试,比如执行ACTION=add PRODUCT=xxx /etc/hotplug.d/usb/脚本,看看是否有预期的行为,这有助于排除脚本本身的问题。 日志检查也很重要,使用logread或dmesg来查看事件是否被触发,是否有相关的错误信息。这可以帮助定位问题出现在哪个环节。 最后,如果所有配置都正确但问题仍然存在,可能需要考虑OpenWRT版本兼容性或者硬件支持的问题,可能需要更新系统或查找特定的驱动支持。 总结一下,解决方案需要逐步检查脚本位置、权限、语法、依赖包、环境变量、内核模块以及日志信息,逐步排除可能的原因。结合用户提供的引用内容,特别是关于目录结构和脚本示例的部分,应该能有效解决USB脚本未触发的问题。</think>### OpenWRT中USB脚本未触发的解决方案 #### 一、检查基础配置 1. **确认block-mount包已安装** 若未安装`block-mount`,则`/etc/hotplug.d/block`目录可能缺失,导致USB存储设备事件无法触发[^4]。 安装命令: ```bash opkg update opkg install block-mount ``` 2. **验证脚本存放路径和命名规则** USB脚本应放置在`/etc/hotplug.d/usb/`目录下,并以**数字前缀**命名(如`20-rtl8188su`),确保执行顺序[^1][^3]。 示例路径: ``` /etc/hotplug.d/usb/20-myusb_script ``` --- #### 二、排查脚本问题 3. **检查脚本权限** 确保脚本有可执行权限: ```bash chmod +x /etc/hotplug.d/usb/20-myusb_script ``` 4. **验证脚本语法与变量** - 使用`PRODUCT`变量匹配设备ID(通过`lsusb`获取),例如`0bda/8171/200`[^3]。 - 使用`ACTION`变量判断设备入(`add`)或移除(`remove`)。 示例脚本片段: ```bash BINARY="/sbin/wifi up" TARGET_PRODID="bda/8171/200" if [ "${PRODUCT}" = "${TARGET_PRODID}" ]; then if [ "${ACTION}" = "add" ]; then ${BINARY} fi fi ``` 5. **手动触发测试** 通过命令模拟事件,验证脚本逻辑: ```bash ACTION=add PRODUCT=bda/8171/200 /etc/hotplug.d/usb/20-myusb_script ``` --- #### 三、检查内核与日志 6. **查看内核是否识别设备** 执行`dmesg | grep usb`或`lsusb -v`,确认设备被正确识别[^3]。 7. **分析系统日志** 通过`logread`查看实时日志,检查事件是否触发: ```bash logread -f | grep hotplug ``` --- #### 四、高级调试 8. **验证Procd服务状态** 重启Procd服务以重新加载配置: ```bash service procd restart ``` 9. **检查USB控制器支持** 某些USB控制器可能需要额外内核模块(如`usb-storage`, `uhci`, `ehci`),通过`lsmod`确认模块已加载。 --- #### 五、常见错误案例 - **错误1**:脚本未匹配`PRODUCT`值 解决方案:通过`lsusb -v`获取精确的`idVendor/idProduct/bcdDevice`组合,格式为`vendor_id/product_id/version`。 - **错误2**:脚本未处理`ACTION`类型 解决方案:添加对`add`和`remove`事件的分支处理[^5]。 --- #### 六、示例完整脚本 ```bash #!/bin/sh DEVICE_PRODID="0bda/8171/200" COMMAND="/usr/sbin/my_custom_tool" if [ "${PRODUCT}" = "${DEVICE_PRODID}" ]; then case "${ACTION}" in add) logger "USB设备入,执行命令" ${COMMAND} start ;; remove) logger "USB设备移除,清理操作" ${COMMAND} stop ;; esac fi ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值