imx6ull如何使用configfs使能usb gadget中的usbnet功能
要在 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网络设备与主机通信,实现网络数据传输。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/18418164