X4412开发板移植---重启USB不识别

本文介绍了X4412开发板在移植linux-4.16.0内核和ubuntu-18.04文件系统后,遇到重启USB设备无法枚举的问题。通过分析硬件原理图和内核驱动代码,发现usb3503驱动未正确处理重启情况。解决方法包括在设备树中添加usb3503节点,并修改驱动代码,禁用不可用功能。经过这些调整,重启后USB设备恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:git clone https://github.com/chasinglulu/linux.git -b X4412-Kernel


问题描述

开发板移植linux-4.16.0内核和ubuntu-18.04文件系统,几乎所有的基本功能都能正常使用,但是在重启后,所有的USB设备不能被枚举,也就是驱动不能正常probe

问题分析

从硬件原理图上可以看到开发板使用了一个usb3503器件,这是一个usb hub。
这里写图片描述
在编译内核时,已经把usb3503的驱动编译进内核映像中,查看源代码,发现驱动会解析设备树中关于usb3503的配置节点,然而实际上,这个设备的I2C、INTN、connect引脚都是直接连到VDD或GND,只有RESET引脚连接到GPC0_0引脚上,也就是这个设备只能使用默认功能,其他可控制的功能不可能被使用,然后分析内核驱动代码,发现每次重启没有重新重设这个设备。

解决办法

设备树添加usb3503设备的节点

   usb-hub {
        compatible = "smsc,usb3503";
        reset-gpios = <&gpc0 0 GPIO_ACTIVE_LOW>;
        initial-mode = <2>;
    };

修改驱动文件,有些功能不可能使用,所以修改部分代码,patch如下:

--- a/drivers/usb/misc/usb3503.c    2018-07-04 22:00:22.000000000 +0800
+++ b/drivers/usb/misc/usb3503.c    2018-07-05 19:49:00.760564394 +0800
@@ -43,97 +43,28 @@

 struct usb3503 {
    enum usb3503_mode   mode;
-   struct regmap       *regmap;
    struct device       *dev;
-   struct clk      *clk;
-   u8  port_off_mask;
-   int gpio_intn;
    int gpio_reset;
-   int gpio_connect;
-   bool    secondary_ref_clk;
 };

 static int usb3503_reset(struct usb3503 *hub, int state)
 {
-   if (!state && gpio_is_valid(hub->gpio_connect))
-       gpio_set_value_cansleep(hub->gpio_connect, 0);
-
    if (gpio_is_valid(hub->gpio_reset))
        gpio_set_value_cansleep(hub->gpio_reset, state);

    /* Wait T_HUBINIT == 4ms for hub logic to stabilize */
-   if (state)
+   if (!state)
        usleep_range(4000, 10000);

    return 0;
 }

-static int usb3503_connect(struct usb3503 *hub)
-{
-   struct device *dev = hub->dev;
-   int err;
-
-   usb3503_reset(hub, 1);
-
-   if (hub->regmap) {
-       /* SP_ILOCK: set connect_n, config_n for config */
-       err = regmap_write(hub->regmap, USB3503_SP_ILOCK,
-              (USB3503_SPILOCK_CONNECT
-                | USB3503_SPILOCK_CONFIG));
-       if (err < 0) {
-           dev_err(dev, "SP_ILOCK failed (%d)\n", err);
-           return err;
-       }
-
-       /* PDS : Set the ports which are disabled in self-powered mode. */
-       if (hub->port_off_mask) {
-           err = regmap_update_bits(hub->regmap, USB3503_PDS,
-                   hub->port_off_mask,
-                   hub->port_off_mask);
-           if (err < 0) {
-               dev_err(dev, "PDS failed (%d)\n", err);
-               
<think>我们正在讨论Nucleo-H753ZI开发板,用户想知道如何在这块板上烧录程序。根据之前的引用,特别是引用[1]提到MicroPython的移植主要支持芯片型号,如果板子芯片是支持的型号,可以刷MicroPython固件,但需要重新编译和更改IO口。引用[4]和[5]则提到了ST官方的NUCLEO-F429ZI开发板的一些信息,包括使用STM32CubeMX生成代码和烧录方法。 由于Nucleo-H753ZI开发板使用的是STM32H753ZI芯片,我们可以参考类似的方法。ST官方为Nucleo系列开发板提供了多种烧录程序的方法,包括通过ST-LINK(板载调试器)进行烧录。 主要步骤: 1. 准备开发环境:安装STM32CubeIDE(集成了STM32CubeMX和开发调试环境)或者使用Keil、IAR等第三方IDE。 2. 编写或获取程序:可以自己编写程序,或者使用STM32CubeMX生成初始化代码,也可以从官方例程中获取。 3. 连接开发板:通过USB线将开发板连接到电脑(使用ST-LINK USB端口)。 4. 编译程序:在IDE中编译程序。 5. 烧录程序:通过IDE的烧录功能将程序下载到开发板。 另外,如果用户想使用MicroPython,那么需要先为STM32H753ZI芯片编译MicroPython固件,然后通过DFU模式或者ST-LINK烧录。 详细步骤: 方法一:使用STM32CubeIDE(推荐) 1. 下载并安装STM32CubeIDE(从ST官网)。 2. 启动STM32CubeIDE,创建一个新工程,选择开发板型号:NUCLEO-H753ZI。 3. 使用STM32CubeMX配置外设(如时钟、GPIO等),生成代码。 4. 编写用户代码(例如在main函数中添加应用程序)。 5. 编译工程。 6. 连接开发板(使用USB线连接CN1口,即ST-LINK端口)。 7. 点击烧录按钮(通常是一个绿色的播放按钮),程序将烧录到开发板中。 方法二:使用MicroPython 1. 从MicroPython的GitHub仓库(https://github.com/micropython/micropython)获取源代码。 2. 根据文档为STM32H7系列编译固件(需要Linux环境或Docker)。 3. 编译完成后,会得到一个.elf或.bin文件。 4. 将开发板置于DFU模式:按住开发板上的BOOT按钮,然后按一下RESET按钮,再释放BOOT按钮。此时电脑会识别到一个DFU设备。 5. 使用DFU工具(如dfu-util)将固件烧录到开发板- 或者使用ST-LINK Utility工具通过ST-LINK烧录(需要将编译好的固件转换为.hex或.bin格式)。 方法三:使用Arduino IDE(如果支持) 虽然Arduino IDE通常用于AVR,但通过添加STM32支持包,也可以支持STM32开发板。但是,Nucleo-H753ZI是高性能的H7系列,可能官方支持包尚未支持,需要查看社区是否有支持。 根据引用[2],Arduino Uno使用的是ATmega328,而STM32H753ZI是ARM Cortex-M7内核,所以需要同的支持包。目前,Arduino IDE对STM32的支持主要集中在F1、F4等系列,H7系列可能还支持,因此推荐此方法。 注意事项: - 烧录前确保开发板供电正常(USB连接即可)。 - 如果使用ST-LINK烧录,确保安装了最新的ST-LINK驱动(通常安装STM32CubeIDE时会自动安装)。 相关问题: 1. 如何为Nucleo-H753ZI开发板配置STM32CubeMX? 2. 如何编译MicroPython固件并烧录到STM32H7开发板? 3. STM32H7系列开发板有哪些特点和应用场景?</think>### 如何在Nucleo-H753ZI开发板上烧录程序 Nucleo-H753ZI开发板板载ST-LINK调试器,支持多种烧录方式。以下是详细步骤: #### **一、基础烧录方法** 1. **硬件连接** - 使用USB线连接开发板的**CN1接口(ST-LINK端口)**到电脑 - 开发板自动进入烧录模式(无需跳线帽操作)[^4] 2. **软件工具选择** - **推荐方案**:STM32CubeIDE(免费官方工具) - 替代方案:Keil MDK/IAR(需额外授权)或ST-LINK Utility 3. **STM32CubeIDE烧录步骤**: ```mermaid graph TB A[安装STM32CubeIDE] --> B[创建新工程] B --> C[选择开发板型号 NUCLEO-H753ZI] C --> D[配置外设和时钟] D --> E[生成代码] E --> F[点击绿色箭头烧录] ``` - 烧录完成后自动运行程序,板载LD1(绿色LED)开始闪烁表示成功[^5] --- #### **二、MicroPython固件烧录(可选)** 若需运行Python程序: 1. **获取固件**: - 从MicroPython官网下载**预编译固件**(搜索`STM32H7`系列) - 或自行编译(需Linux环境): ```bash git clone https://github.com/micropython/micropython cd micropython/ports/stm32 make BOARD=NUCLEO_H753ZI ``` 生成`firmware.bin`在`build`目录[^1] 2. **DFU模式烧录**: - 按住开发板`BOOT`按钮 → 按`RESET` → 释放`BOOT` - 电脑识别为U盘,将`firmware.bin`拖入 - 按`RESET`重启运行 --- #### **三、常见问题解决** 1. **烧录失败**: - 检查USB驱动:安装[ST-LINK驱动](https://www.st.com/en/development-tools/stsw-link009.html) - 确保选择正确芯片型号:`STM32H753ZITx` 2. **串口乱码**: - 确认时钟配置:H7系列需设置`CSI时钟`作为默认时钟源 - 检查串口波特率(通常为115200)[^4][^5] 3. **固件兼容性**: - MicroPython需确认支持H7系列 - C程序注意区分`HAL库`版本(H7使用`HAL V2`) > 提示:开发板引脚图见[ST官网](https://www.st.com/stm32nucleo),搜索"NUCLEO-H753ZI"获取原理图[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值