imx6ull如何使用configfs使能usb gadget中的usbnet功能

闹闹爸爸發表於2024-09-18

要在 i.MX6ULL 平臺上使用 configfs 使能 USB Gadget 中的 usbnet 功能,可以按照以下步驟進行配置。以下步驟假設您已經在裝置上執行了嵌入式Linux系統,並且具有root許可權。

1. 確認核心配置

在編譯核心時,需要確保以下配置項被啟用:

CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_CONFIGFS=y
CONFIG_USB_GADGET_CONFIGFS_NCM=y         # 如果需要NCM功能
CONFIG_USB_GADGET_CONFIGFS_RNDIS=y       # 如果需要RNDIS功能
CONFIG_USB_GADGET_CONFIGFS_ECM=y         # 如果需要ECM功能
CONFIG_USB_GADGET_CONFIGFS_ECM_SUBSET=y  # 如果需要ECM子集功能
CONFIG_USB_GADGET_CONFIGFS_EEM=y         # 如果需要EEM功能
CONFIG_USB_G_NCM=y                       # 對應NCM裝置
CONFIG_USB_G_MULTI=y                     # 多功能Gadget(可選)

根據您的實際需求,啟用相應的USB網路功能。

2. 載入必要的核心模組

如果這些功能被編譯為模組(m),則需要載入它們:

modprobe libcomposite

3. 掛載configfs檔案系統

mkdir -p /sys/kernel/config
mount -t configfs none /sys/kernel/config

4. 建立USB Gadget目錄

cd /sys/kernel/config/usb_gadget
mkdir g1
cd g1

5. 設定USB裝置描述符

echo 0x1d6b > idVendor      # Linux Foundation的VID,可以根據需要更改
echo 0x0104 > idProduct     # 自定義的PID

6. 建立字串描述符

mkdir -p strings/0x409
echo "1234567890" > strings/0x409/serialnumber
echo "Your Company" > strings/0x409/manufacturer
echo "USB Net Device" > strings/0x409/product

7. 建立USB配置

mkdir -p configs/c.1
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

8. 建立USB網路功能

以 ECM(乙太網控制模型) 為例:

mkdir functions/ecm.usb0

如果需要 RNDIS(遠端網路驅動介面規範) 功能:

mkdir functions/rndis.usb0

根據需要,可以建立其他型別的usbnet功能。

9. 繫結功能到配置

以ECM為例:

ln -s functions/ecm.usb0 configs/c.1/

10. 繫結USB控制器

首先,檢視可用的UDC(USB Device Controller):

ls /sys/class/udc

假設輸出為 ci_hdrc.0,則繫結UDC:

echo ci_hdrc.0 > UDC

11. 配置網路介面

當USB Gadget成功啟動後,系統中會出現對應的網路介面(如usb0)。可以使用ifconfigip命令配置該介面。

例如,設定IP地址:

ifconfig usb0 192.168.7.2 netmask 255.255.255.0 up

12. 主機端配置

在將裝置透過USB連線到主機(如PC)後,主機通常會識別出一個新的USB網路裝置。根據主機作業系統,可能需要安裝相應的驅動程式:

  • Linux主機:一般會自動載入usbnet驅動。
  • Windows主機:對於ECM,需要安裝WinUSB驅動;對於RNDIS,Windows通常會自動安裝驅動。

在主機上為對應的網路介面配置IP地址,使其與裝置端在同一子網內。

注意事項:

  • 許可權問題:上述操作需要root許可權。
  • USB連線:確保USB OTG埠正確連線,並使用適當的USB線纜。
  • 除錯:如果遇到問題,可以檢視核心日誌(使用dmesg)獲取詳細資訊。

示例指令碼:

以下是一個完整的示例指令碼,可以儲存為scripts/usbnet_setup.sh,並賦予執行許可權。

#!/bin/bash

# 載入模組
modprobe libcomposite

# 掛載configfs
mount -t configfs none /sys/kernel/config

# 進入USB Gadget目錄
cd /sys/kernel/config/usb_gadget/
mkdir -p g1
cd g1

# 設定USB描述符
echo 0x1d6b > idVendor
echo 0x0104 > idProduct

# 建立字串描述符
mkdir -p strings/0x409
echo "1234567890" > strings/0x409/serialnumber
echo "Your Company" > strings/0x409/manufacturer
echo "USB Net Device" > strings/0x409/product

# 建立配置
mkdir -p configs/c.1/strings/0x409
echo "USB Net Config" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

# 建立ECM功能
mkdir functions/ecm.usb0
# 設定ECM功能的主機和裝置MAC地址(可選)
echo "02:00:00:00:00:00" > functions/ecm.usb0/dev_addr
echo "02:00:00:00:00:01" > functions/ecm.usb0/host_addr

# 將功能繫結到配置
ln -s functions/ecm.usb0 configs/c.1/

# 繫結UDC
ls /sys/class/udc > UDC

# 配置網路介面
ifconfig usb0 192.168.7.2 netmask 255.255.255.0 up

執行指令碼:

chmod +x usbnet_setup.sh
./usbnet_setup.sh

結論

透過以上步驟,您已經在i.MX6ULL平臺上使用configfs成功使能了USB Gadget中的usbnet功能。裝置現在可以作為USB網路裝置與主機通訊,實現網路資料傳輸。

相關文章