ESC
输入关键词搜索文章标题和内容

嵌入式Linux WiFi/BT调试指南:从硬件到实战的完整手册

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

嵌入式Linux WiFi/BT调试指南:从硬件到实战的完整手册

导读:嵌入式Linux开发中,WiFi和蓝牙调试是绕不过去的坎。SDIO怎么接?驱动怎么配?固件往哪放?本文以RK平台为例,讲原理、画框图、给命令,解决80%常见问题。


一、原理简析

WiFi模块是什么?

WiFi模块本质上是一个自带CPU和RAM的小电脑,它运行固件(Firmware),通过SDIO/USB/PCIe与主控通信。CPU只负责发命令,WiFi模块自己处理802.11协议。

举个例子:你对手机说"帮我连上那个WiFi",手机里的WiFi模块自己去谈判、握手、收发数据,最后告诉你连上了。CPU就像发号施令的老板,WiFi模块就是埋头干活的秘书。

三种接口怎么选?

接口 速度 接线复杂度 适用场景
SDIO 最大208MHz(SDIO3.0)/ 实际常用150MHz 复杂(CMD+DAT0-3) 主流模组首选
USB 480Mbps 简单(4根线) 免驱模组
PCIe 最高 中等 高性能AP模组

⚠️ SDIO降频说明:SDIO 3.0规范定义最大时钟208MHz(SDR104模式),但实际嵌入式模组通常工作在150MHz以下。降频成功往往说明信号完整性不足。

Combo模组是怎么回事?

市面上绝大多数WiFi/BT模组是二合一Combo方案——WiFi和蓝牙共用供电和32K时钟,仅通信接口分离:

共享资源 说明
供电 共用VDDIO(1.8V/3.3V),部分模组支持WiFi和BT独立使能
32K时钟 共用32.768K晶振,WiFi和BT都依赖这个参考时钟
天线 共用射频电路,部分模组支持分集天线

部分模组(如部分Realtek方案)支持WiFi和BT独立REG_ON控制,需要分别配置GPIO。

蓝牙为什么用UART?

蓝牙数据传输量小,UART足够用。更重要的是,HCI(Host Controller Interface)协议天生就是串口协议——简单可靠。

可以这样理解:WiFi要传视频、传文件,数据量大,需要SDIO/USB这种高速通道;蓝牙只是传传控制命令,UART这根"电话线"就够用了。

firmware是什么?

固件就是WiFi/BT模块的"操作系统"。没有它,模块就是一块废铁。主控开机后,把固件下载到模块的RAM里,模块才能工作。

这东西就像BIOS——没有BIOS,电脑就是一堆零件;没有固件,WiFi模组也是一堆零件。


二、硬件框图与架构图:从连线到软件的完整视图

2.1 硬件连接框图

flowchart TB subgraph 主控["主控 SoC"] CPU["CPU<br/>ARM Cortex-A"] MMC["SDIO控制器"] USB["USB控制器"] UART["UART控制器"] end subgraph 接口["通信接口"] SDIO总线["SDIO总线<br/>CLK/CMD/DAT0-3"] USB总线["USB总线<br/>D+/D-"] UART总线["UART总线<br/>TX/RX/RTS/CTS"] end subgraph 模块["WiFi/BT模组(Combo)"] W芯片["WiFi芯片"] B芯片["BT芯片"] 射频["射频电路<br/>天线接口"] end subgraph 电源["电源管理"] VDD["VDDIO 1.8V/3.3V"] W_REGON["WIFI_REG_ON<br/>WiFi使能"] B_REGON["BT_REG_ON<br/>BT使能(可选)"] 32K["32.768K时钟"] end MMC -->|"SDIO"| SDIO总线 -->|"DATA"| W芯片 USB -->|"USB"| USB总线 -->|"DM/DP"| W芯片 CPU -->|"HCI命令"| UART总线 -->|"UART"| B芯片 VDD -->|"供电"| W芯片 VDD -->|"供电"| B芯片 W_REGON -->|"使能"| W芯片 B_REGON -->|"使能"| B芯片 32K -->|"参考时钟"| W芯片 32K -->|"参考时钟"| B芯片 W芯片 -->|"射频"| 射频 B芯片 -->|"射频"| 射频 style 主控 fill:#E3F2FD,stroke:#1976D2 style 接口 fill:#E3F2FD,stroke:#1976D2 style 模块 fill:#E8F5E9,stroke:#388E3C style 电源 fill:#F3E5F5,stroke:#7B1FA2

2.2 软件架构图

flowchart TB subgraph 用户空间["用户空间"] APP["应用层<br/>APP/WEB"] librkwifi["librkwifibt.so<br/>统一封装库"] wpa_cli["wpa_cli<br/>命令行工具"] hciconfig["hciconfig<br/>蓝牙命令"] end subgraph 网络协议["网络协议栈"] wpa_supplicant["wpa_supplicant<br/>WiFi连接管理"] BlueZ["BlueZ<br/>蓝牙协议栈"] hostapd["hostapd<br/>AP热点"] end subgraph 内核空间["内核空间"] cfg80211["cfg80211<br/>无线配置接口"] mac80211["mac80211<br/>802.11协议栈"] HCI["HCI UART驱动"] rfkill["rfkill<br/>电源管理"] end subgraph 驱动层["驱动层"] bcmdhd["bcmdhd.ko<br/>正基/英飞凌"] rtl8xxx["rtl8xxx.ko<br/>Realtek"] sdio总线["SDIO总线驱动"] end APP --> librkwifi librkwifi --> wpa_supplicant librkwifi --> BlueZ wpa_cli --> wpa_supplicant hciconfig --> BlueZ wpa_supplicant --> cfg80211 hostapd --> cfg80211 cfg80211 --> mac80211 mac80211 --> bcmdhd mac80211 --> rtl8xxx BlueZ --> HCI rfkill --> bcmdhd rfkill --> rtl8xxx bcmdhd --> sdio总线 rtl8xxx --> sdio总线 style 用户空间 fill:#E3F2FD,stroke:#1976D2 style 网络协议 fill:#E3F2FD,stroke:#1976D2 style 内核空间 fill:#E8F5E9,stroke:#388E3C style 驱动层 fill:#F3E5F5,stroke:#7B1FA2

2.3 启动流程图

flowchart TB A["开机"] --> B["内核启动"] B --> C{"接口类型?"} C -->|"SDIO"| D["SDIO控制器识别"] C -->|"USB"| E["USB控制器识别"] C -->|"PCIe"| F["PCIe控制器识别"] D --> G["加载WiFi驱动ko"] E --> G F --> G G --> H{"厂商?"} H -->|"Realtek"| I["加载rtl8723ds.ko"] H -->|"正基/英飞凌"| J["加载bcmdhd.ko"] I --> K["下载WiFi固件"] J --> K K --> L["下载NVRAM配置"] L --> M["WiFi就绪"] M --> N["启动蓝牙"] N --> O{"厂商?"} O -->|"Realtek"| P["rtk_hciattach初始化"] O -->|"正基/英飞凌"| Q["brcm_patchram<br/>初始化"] P --> R["BT就绪"] Q --> R style A fill:#E8F5E9,stroke:#388E3C style B fill:#E3F2FD,stroke:#1976D2 style C fill:#FFF8E1,stroke:#F57C00 style D fill:#E3F2FD,stroke:#1976D2 style E fill:#E3F2FD,stroke:#1976D2 style F fill:#E3F2FD,stroke:#1976D2 style G fill:#E3F2FD,stroke:#1976D2 style H fill:#FFF8E1,stroke:#F57C00 style I fill:#E3F2FD,stroke:#1976D2 style J fill:#E3F2FD,stroke:#1976D2 style K fill:#E3F2FD,stroke:#1976D2 style L fill:#E3F2FD,stroke:#1976D2 style M fill:#E8F5E9,stroke:#388E3C style N fill:#E3F2FD,stroke:#1976D2 style O fill:#FFF8E1,stroke:#F57C00 style P fill:#E3F2FD,stroke:#1976D2 style Q fill:#E3F2FD,stroke:#1976D2 style R fill:#E8F5E9,stroke:#388E3C

三、实战步骤:从环境配置到功能验证

3.1 环境配置三板斧

第一步:SDK配置

# 在BoardConfig.mk中指定模组型号
RK_WIFIBT_CHIP="RTL8723DS"  # 或 AP6255 / CYW43438 等

第二步:DTS配置(SDIO为例)

/* 电源控制:由MMC框架统一管理,开机前先拉低复位WiFi模组 */
sdio_pwrseq: sdio-pwrseq {
    compatible = "mmc-pwrseq-simple";
    pinctrl-0 = <&wifi_enable_h>;
    reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>;  /* WiFi模组复位脚,低有效 */
};

/* SDIO控制器 */
&sdio {
    max-frequency = <150000000>;  /* SDIO3.0最大150MHz,降频可解决信号完整性问题 */
    bus-width = <4>;
    cap-sdio-irq;                 /* 启用SDIO中断,支持休眠唤醒 */
    keep-power-in-suspend;        /* 休眠时保持电源 */
    mmc-pwrseq = <&sdio_pwrseq>;
    status = "okay";
};

/* WiFi节点 */
wireless-wlan {
    compatible = "wlan-platdata";
    wifi_chip_type = "rtl8723ds";  /* 必须与SDK配置一致 */
    WIFI,host_wake_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;  /* WiFi唤醒CPU的中断脚 */
    status = "okay";
};

/* 蓝牙节点(UART) */
wireless-bluetooth {
    compatible = "bluetooth-platdata";
    BT,power_gpio = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;  /* BT电源使能脚 */
    uart_rts_gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>;  /* 蓝牙UART流控(可省但建议接) */
    status = "okay";
};

/* UART配置 */
&uart4 {
    pinctrl-0 = <&uart4_xfer &uart4_ctsn>;
    status = "okay";
};

GPIO速查:reset-gpios(复位)、host_wake_irq(唤醒)、uart_rts_gpios(流控)

来自 linuxros.cn · linuxROS

第三步:内核配置

# ===== 必选配置 =====
CONFIG_RFKILL=y              # 无线电源管理框架
CONFIG_RFKILL_RK=y           # RK平台rfkill扩展
CONFIG_MMC=y                 # MMC/SDIO控制器框架
CONFIG_MMC_DW=y             # DesignWare SD/MMC控制器
CONFIG_MMC_DW_ROCKCHIP=y   # RK平台DW控制器特定支持
CONFIG_WIRELESS=y           # 通用无线支持
CONFIG_CFG80211=y            # 无线配置接口
CONFIG_MAC80211=y            # 802.11协议栈
CONFIG_BT=y                  # 蓝牙支持
CONFIG_BT_HCIUART=y         # 蓝牙UART传输层

# ===== 模组专属驱动(按需选一)=====
CONFIG_RTL8723DS=m           # Realtek RTL8723DS
CONFIG_RTL8822CS=m           # Realtek RTL8822CS
CONFIG_BCMDHD=m              # 正基AP模组
CONFIG_CYWDHD=m              # 英飞凌/Cypress模组

# ===== 休眠唤醒(WiFi省电相关)=====
CONFIG_PM=y                   # 电源管理框架
CONFIG_PM_GENERIC_DOMAINS=y  # Generic PM domains
# CONFIG_CFG80211_WOWLAN=y   # WoWLAN支持(连接断开时唤醒,参考下期预告)

⚠️ RK平台注意:CONFIG_MMC_DW_ROCKCHIP=y 是 RK 平台必须项,否则 SDIO 控制器无法正确识别模组

⚠️ insmod vs modprobe vs 编入内核:调试阶段用 insmod 手动加载;量产可写入 /etc/modules/ 开机自启,或直接将驱动编入内核(=y)省去加载步骤

3.2 固件文件放哪里?

⚠️ 路径区分:以下路径为 Android系统(如RK平台) 常见布局;纯嵌入式Linux(Buildroot/Debian)的固件和驱动通常在 /lib/firmware/ 和 /lib/modules/ 下。

# 固件目录结构(Android RK系统,烧录后在板子上查看)
/
├── /system/vendor/lib/modules/     # WiFi驱动ko(Android)
│   ├── bcmdhd.ko                  # 正基模组
│   └── rtl8723ds.ko              # Realtek模组
│
├── /system/vendor/etc/firmware/   # WiFi固件+NVRAM(Android)
│   ├── fw_bcm43455c0_ag.bin      # 正基WiFi固件
│   └── nvram_ap6255.txt          # NVRAM配置(功率/天线参数)
│
├── /lib/firmware/rtlbt/           # 蓝牙固件(Realtek,Linux/Android通用)
│   ├── rtl8723d_fw               # 蓝牙固件
│   └── rtl8723d_config           # 蓝牙配置
│
├── /lib/firmware/rtlbt/           # 蓝牙固件(Realtek USB方案)
│   ├── rtl8821cu_fw
│   └── rtl8821cu_config
│
└── /lib/firmware/brcm/            # 蓝牙固件(正基/英飞凌,.hcd格式)
    └── BCM4345C0.hcd              # Broadcom蓝牙固件

⚠️ 驱动加载方式:调试用 insmod;量产建议将驱动编入内核(CONFIG_xxx=y)或写入 /etc/modules/ 开机自启。

3.3 功能验证命令

WiFi连接三步走:

# ===== 第一步:加载驱动 =====
insmod /system/vendor/lib/modules/bcmdhd.ko
# 或
insmod /system/vendor/lib/modules/rtl8723ds.ko

# ===== 第二步:启动WiFi =====
ifconfig wlan0 up

# ===== 第三步:连接热点 =====
wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_results
wpa_cli -i wlan0 reconnect

# ===== 第四步:获取IP =====
udhcpc -i wlan0
# 或
dhcpcd wlan0

wpa_supplicant.conf配置:

cat > /data/cfg/wpa_supplicant.conf << 'EOF'
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1

network={
    ssid="YourSSID"
    psk="YourPassword"
    key_mgmt=WPA-PSK
}
EOF

⚠️ 语法注意:ctrl_interface 必须写成 DIR=/path GROUP=xxx 格式,缺少 DIR= 会导致 wpa_supplicant 启动失败

进阶配置示例:

# ===== 隐藏SSID连接 =====
network={
    ssid="MyHiddenNetwork"
    scan_ssid=1
    psk="password"
    key_mgmt=WPA-PSK
}

# ===== 多个WiFi优先级(按顺序匹配)=====
network={
    ssid="Office"
    psk="office123"
    key_mgmt=WPA-PSK
    priority=2      # 优先级高,优先连接
}
network={
    ssid="Home"
    psk="home123"
    key_mgmt=WPA-PSK
    priority=1
}

# ===== 静态IP配置 =====
network={
    ssid="StaticIP"
    psk="password"
    key_mgmt=WPA-PSK
    ip_address=192.168.1.100
    gateway=192.168.1.1
    dns=8.8.8.8
}

蓝牙验证:

# ===== Realtek UART蓝牙 =====
echo 0 > /sys/class/rfkill/rfkill0/state
sleep 1
echo 1 > /sys/class/rfkill/rfkill0/state
hciattach -n -s 115200 /dev/ttyS4 rtk_h5 &

# ===== 正基/英飞凌蓝牙 =====
echo 0 > /sys/class/rfkill/rfkill0/state
sleep 1
echo 1 > /sys/class/rfkill/rfkill0/state
brcm_patchram_plus1 --enable_hci --baudrate 1500000 \
    --patchram /system/vendor/etc/firmware/BCM4345C0.hcd /dev/ttyS4 &

# ===== 验证 =====
hciconfig hci0 up
hciconfig -a
hcitool scan

# ===== rfkill说明 =====
# rfkill是无线设备的通用电源管理
# echo 0/1 是软开关(软件层面阻止无线)
# ⚠️ 优先级低于硬件REG_ON引脚:硬件关了,软件开不了
rfkill list
rfkill block wifi
rfkill unblock wifi

热点模式(AP)补充:

# ===== hostapd配置 =====
cat > /data/cfg/hostapd.conf << 'EOF'
interface=wlan0
driver=nl80211
ssid=MyAP
hw_mode=g
channel=6
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
wmm_enabled=1
EOF

# ===== 启动热点 =====
# 先给wlan0配静态IP
ifconfig wlan0 192.168.10.1 up
# 启动hostapd
hostapd /data/cfg/hostapd.conf -B
# 启动DHCP服务(可选)
dnsmasq -i wlan0 --dhcp-range=192.168.10.100,192.168.10.200,12h

⚠️ hostapd关键参数说明:

  • wpa=2 表示 WPA2(wpa=1 是 WPA1)
  • rsn_pairwise=CCMP 是 WPA2 加密(WPA2 不支持 TKIP,wpa_pairwise=TKIP 是 WPA1 的错误参数)
  • auth_algs=1 表示开放认证(1=开放,3=开放+WEP)

3.4 性能测试

# ===== iperf吞吐率测试 =====
# 板子作为Server
iperf -s -i 1

# PC作为Server,测试下行
iperf -c 192.168.x.x -i 1 -w 2M -t 120

# UDP测试
iperf -c 192.168.x.x -u -i 1 -b 100M -t 120

3.5 RF指标测试(模组厂协助)

# ===== 进入测试模式 =====
# 正基/英飞凌模组
wl ver  # 显示WL_TEST表示进入测试模式
wl txchain 1
wl rxchain 1
wl channels  # 查看可用信道

# Realtek模组
rtlpriv wlan0 set_band 0      # 2.4G
rtlpriv wlan0 set_band 1      # 5G
rtlpriv wlan0 mp_txpower 50   # 设置功率
rtlpriv wlan0 mp_channel 6    # 设置信道

四、常见问题速查:十类高频故障定位

调试排查决策树

flowchart TB A["WiFi/BT异常"] --> B{"能识别模组?"} B -->|"否"| C{"dmesg有mmc日志?"} C -->|"否"| C1["检查REG_ON供电<br/>测GPIO电平"] C -->|"是"| C2["检查SDIO时钟频率<br/>降频到50M测试"] C1 --> Z["修复后重新验证"] C2 --> Z B -->|"是"| D{"wlan0存在?"} D -->|"否"| D1["检查固件路径<br/>确认文件名匹配"] D1 --> Z D -->|"是"| E{"能扫描到AP?"} E -->|"否"| E1["检查天线连接<br/>确认晶振频率"] E1 --> Z E -->|"是"| F{"能连接成功?"} F -->|"否"| F1["确认密码/加密方式<br/>检查路由MAC过滤"] F1 --> Z F -->|"是"| G{"连接稳定?"} G -->|"否"| G1["降频测试<br/>检查信号完整性"] G1 --> Z G -->|"是"| H["WiFi正常✅"] A --> I{"BT能初始化?"} I -->|"否"| I1["检查UART配置<br/>确认RTS/CTS接线"] I1 --> Z I -->|"是"| J{"能扫描设备?"} J -->|"否"| J1["检查hciattach波特率<br/>确认固件已下载"] J1 --> Z J -->|"是"| K["BT正常✅"] style A fill:#FFEBEE,stroke:#D32F2F style B fill:#FFF8E1,stroke:#F57C00 style C fill:#FFF8E1,stroke:#F57C00 style D fill:#FFF8E1,stroke:#F57C00 style E fill:#FFF8E1,stroke:#F57C00 style F fill:#FFF8E1,stroke:#F57C00 style G fill:#FFF8E1,stroke:#F57C00 style I fill:#FFF8E1,stroke:#F57C00 style J fill:#FFF8E1,stroke:#F57C00 style H fill:#E8F5E9,stroke:#388E3C style K fill:#E8F5E9,stroke:#388E3C style Z fill:#E3F2FD,stroke:#1976D2 style C1 fill:#E3F2FD,stroke:#1976D2 style C2 fill:#E3F2FD,stroke:#1976D2 style D1 fill:#E3F2FD,stroke:#1976D2 style E1 fill:#E3F2FD,stroke:#1976D2 style F1 fill:#E3F2FD,stroke:#1976D2 style G1 fill:#E3F2FD,stroke:#1976D2 style I1 fill:#E3F2FD,stroke:#1976D2 style J1 fill:#E3F2FD,stroke:#1976D2

问题对照表

现象 根因 解决
SDIO识别不到 WL_REG_ON配置错误/电压不对 测GPIO波形,确认1.8V/3.3V
wlan0没有 固件路径不对/文件名不匹配 检查firmware目录
扫描不到AP 晶振频率不对/天线未接 确认24M晶振,检查天线
连接后断线 RF指标不合格/干扰大 降频测试,换屏蔽环境
蓝牙初始化失败 UART配置错误/RTS/CTS未接 检查DTS UART配置
能扫描WiFi,连接超时 密码错误/加密方式不匹配/路由限制 确认密码,检查路由MAC过滤
能扫描WiFi,认证失败 加密方式(WPA2 vs WPA3)/路由器策略 确认加密方式,尝试WPA2
能搜到蓝牙设备,配对失败 BlueZ权限/波特率不匹配/HCI版本 检查hciattach波特率,确认HCI版本兼容
驱动加载成功,但无wlan0 MAC地址缺失/NVRAM配置错误 检查nvram txt文件是否存在且格式正确
蓝牙能搜到但传输数据失败 SPP/ble profile未加载/服务未启动 sdptool browse hci0 查看支持的服务

调试命令速查

# ===== 看识别log =====
dmesg | grep -E "mmc|wl|sdio|wlan"

# ===== 看固件加载log =====
dmesg | grep -E "firmware|download"

# ===== 看蓝牙log =====
dmesg | grep -E "hci|bt|uart"

# ===== 看中断情况 =====
cat /proc/interrupts | grep -E "mmc|wl|sdio"

# ===== 测GPIO电平 =====
cat /sys/class/gpio/gpioN/value

# ===== 关闭WiFi(重置前常用)=====
ifconfig wlan0 down

# ===== 终止wpa_supplicant(重新配置前)=====
killall wpa_supplicant

# ===== 查看蓝牙适配器状态 =====
hciconfig -a
hciconfig hci0 status

# ===== 查看rfkill状态 =====
rfkill list

降频调试技巧

# ===== SDIO降频(解决初始化失败) =====
&sdio {
    max-frequency = <10000000>;  # 从150M降到10M测试
};

# ===== CPU定频(排除性能问题) =====
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# ===== DDR定频 =====
echo userspace > /sys/devices/platform/dmc/devfreq/dmc/governor
echo 1560000000 > /sys/devices/platform/dmc/devfreq/dmc/min_freq

五、总结与调试心法

核心要点

  1. 硬件连接:WiFi走SDIO/USB/PCIe,蓝牙走UART;SDIO必须接CLK/CMD/DAT0-3四根线
  2. 固件是灵魂:没有固件,模组就是废铁;固件路径和文件名必须与模组型号匹配
  3. 电源是根本:WL_REG_ON、32.768K时钟、IO电压(1.8V/3.3V)缺一不可
  4. 三步验证:识别→驱动加载→固件下载,逐层排查

调试经验总结

调试WiFi/BT问题,我总结了一套排查顺序:

  1. 识别不到先测电 — 电没供上,后面的都白搭。先用万用表量电压,用示波器看GPIO波形
  2. 电压对了查IO域 — 1.8V和3.3V搞混了,模组也起不来
  3. 固件下载看log — dmesg里firmware download失败,十有八九是文件名不对或者路径不对
  4. 连接不稳降频测 — SDIO时钟降下来试试,如果降频就稳定了,说明信号完整性有问题
  5. 性能不行先定频 — CPU降频、DDR降频都会影响吞吐率,先把这些锁死再测
  6. 蓝牙不通查UART — 波特率对不对?RTS/CTS接了没有?这些低级问题最容易被忽略

参考资源

资源 说明
Rockchip FTP ftp\://www.rockchip.com.cn
librkwifibt API 参考厂商提供的编程接口文档
模组支持列表 参考RK平台SDK默认配置
wpa_supplicant 官方 w1.fi/wpa_supplicant
BlueZ 官方 bluez.org
Linux Wireless 文档 wireless.wiki.kernel.org

关注我,嵌入式干货持续输出。有具体项目问题,欢迎评论区交流。

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页