要在 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
)。可以使用ifconfig
或ip
命令配置該介面。
例如,設定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網路裝置與主機通訊,實現網路資料傳輸。