嵌入式 Linux 下 MCP2221 USB 转 UART 芯片的设备树配置与驱动移植

1. 驱动支持确认
  • MCP2221 的 Linux 驱动已集成到内核主线(从 v5.6 开始支持)
  • 检查内核配置选项:
    Device Drivers  --->
        USB support  --->
            USB Serial Converter support  --->
                <*> Microchip MCP2221 USB-I2C/SMbus bridge
    

    若使用旧内核(<5.6),需手动移植驱动(源码路径:drivers/usb/serial/mcp2221.c
2. 设备树配置

由于 MCP2221 是 USB 设备,无需额外设备树节点。USB 子系统会自动枚举设备。但需确保:

  • USB 主机控制器已启用(如 DWC2)
  • 示例 USB 主机控制器配置:
    &usb_otg {
        status = "okay";
        dr_mode = "host";
    };
    
    &usbphy {
        status = "okay";
    };
    

3. 驱动移植步骤(旧内核)
  1. 获取驱动源码
    wget https://raw.githubusercontent.com/torvalds/linux/v5.6/drivers/usb/serial/mcp2221.c
    

  2. 集成到内核
    • 复制到 drivers/usb/serial/
    • 修改 drivers/usb/serial/Kconfig
      config USB_SERIAL_MCP2221
          tristate "Microchip MCP2221 support"
          depends on USB_SERIAL
          help
            Say Y here to support MCP2221 USB-to-UART/I2C/GPIO converter
      

    • 修改 drivers/usb/serial/Makefile
      obj-$(CONFIG_USB_SERIAL_MCP2221) += mcp2221.o
      

  3. 编译与加载
    make menuconfig  # 启用 USB_SERIAL_MCP2221
    make modules
    insmod mcp2221.ko
    

4. 功能验证
  • 连接设备后查看内核日志:
    dmesg | grep mcp2221
    # 输出示例: usb 1-1.2: mcp2221 converter detected
    

  • 确认设备节点:
    ls /dev/ttyACM*  # 通常注册为 /dev/ttyACM0
    

  • 测试串口通信:
    echo "test" > /dev/ttyACM0
    minicom -D /dev/ttyACM0
    

5. 关键注意事项
  1. 权限问题
    sudo chmod 666 /dev/ttyACM0  # 临时方案
    # 永久方案:创建 udev 规则 /etc/udev/rules.d/99-mcp2221.rules:
    SUBSYSTEM=="tty", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00dd", MODE="0666"
    

  2. 波特率限制
    • 最大支持 2 Mbps(需硬件支持)
    • 设置波特率示例:
      struct termios options;
      cfsetispeed(&options, B2000000);  // 2Mbps
      

  3. 电源管理: 在设备树中禁用 USB 自动挂起:
    &usb_otg {
        disable-usb-suspend;
    };
    

6. 故障排查
  • 设备未识别
    lsusb -d 04d8:00dd  # 检查设备ID
    

  • 驱动加载失败
    dmesg | grep "usbserial"  # 检查依赖模块
    modprobe usbserial vendor=0x04d8 product=0x00dd
    

  • 通信异常
    • 检查硬件连接(D+/D- 阻抗匹配)
    • 降低波特率测试(如 115200)

提示:建议使用内核 ≥5.6 以获取完整支持。若需 I²C/GPIO 功能,需额外调用 libmcp2221 用户空间库。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐