RK3568 USB 以太网(RNDIS)如何启用

RK3568 USB 以太网(RNDIS)加载模块后不生效(找不到usb0)
EC-A3568J 主机,核心板是 AIO-3568J

首先按照wiki上的文档,进行内核设置:
https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/demo_usb_ethernet.html

设置完成后,能正常编译,烧写。烧写完成后,能够按照顺序 insmod 模块。

lsmod 也显示正常,但是找不到usb0,demsg里面也没有检测到接入。

内核打开配置CONFIG_USB_CONFIGFS_RNDIS就行,不用模块,build-in就行
板子是Ubuntu系统的话在/etc/init.d/adbd.sh里面,200多行,function_init函数末尾添加:

@@ -239,7 +239,13 @@ function_init()

         ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6 ${USB_CONFIGS_DIR}/uvc.gs6
     fi
-
+    if [ $RNDIS_EN = on ];then
+        if [ ! -e "${USB_FUNCTIONS_DIR}/rndis.gs0" ] ;
+        then
+            mkdir -p ${USB_FUNCTIONS_DIR}/rndis.gs0
+            ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/rndis.gs0
+        fi
+    fi
 }

然后把/etc/init.d/..usb_config的内容改为usb_rndis_en
重启

本帖最后由 wx__lQd79k 于 2022-9-17 15:06 编辑

Liuth 发表于 2022-9-16 15:38
内核打开配置CONFIG_USB_CONFIGFS_RNDIS就行,不用模块,build-in就行
板子是Ubuntu系统的话在/etc/init.d …

/etc/init.d 下找不到 adbd.sh 这个文件

请问使用 ubuntu-base 的话,有哪些脚本文件是需要移植的?

Liuth 发表于 2022-9-16 15:38
内核打开配置CONFIG_USB_CONFIGFS_RNDIS就行,不用模块,build-in就行
板子是Ubuntu系统的话在/etc/init.d …

加载模块后会显示
[335.039932] udc-core: couldn’t find an available UDC - added [g_ether] to list of pending drivers

你是什么系统 ? Buildroot 吗?

Liuth 发表于 2022-9-17 14:54
你是什么系统 ? Buildroot 吗?

ubuntu-base 20.04.5

本帖最后由 wx__lQd79k 于 2022-9-17 15:43 编辑

Liuth 发表于 2022-9-17 14:54
你是什么系统 ? Buildroot 吗?

我尝试使用下载firefly官方的文件系统,版本号为Ubuntu20.04-Minimal_RK3568_v2.11-55_20220427

结果ifconfig -a 下还是找不到 usb,说明。

判断脚本已经执行了 ln 的操作,因为软链已经生成了:

root@firefly:/sys/kernel/config/usb_gadget/rockchip/configs/b.1# ll
total 0
drwxrwx--- 3 root root    0 Sep 17 07:40 ./
drwxr-xr-x 3 root root    0 Sep 17 07:37 ../
-rw-r--r-- 1 root root 4096 Sep 17 07:37 MaxPower
-rw-r--r-- 1 root root 4096 Sep 17 07:40 bmAttributes
lrwxrwxrwx 1 root root    0 Sep 17 07:37 rndis.gs0 -> ../../../../usb_gadget/rockchip/functions/rndis.gs0/
drwxr-xr-x 3 root root    0 Sep 17 07:37 strings/

但是 usb0 仍然没有显示在 ifconfig -a 下。

我的操作如下:

修改 /etc/inid.d/.usb_config:

root@firefly:/etc/init.d# cat .usb_config
usb_rndis_en

修改 /etc/init.d/adbd.sh:

[code]root@firefly:/etc/init.d# cat adbd.sh
#!/bin/bash -e
### BEGIN INIT INFO
# Provides: adbd
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
# Short-Description:
# Description: Linux ADB
### END INIT INFO

# setup configfs for adbd, usb mass storage and MTP…

UMS_EN=off
ADB_EN=off
MTP_EN=off
NTB_EN=off
ACM_EN=off
UAC1_EN=off
UAC2_EN=off
UVC_EN=off
RNDIS_EN=on

USB_ATTRIBUTE=0x409
USB_GROUP=rockchip
USB_SKELETON=b.1

CONFIGFS_DIR=/sys/kernel/config
USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP}
USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE}
USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions
USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON}

make_config_string()
{
tmp=$CONFIG_STRING
if [ -n “$CONFIG_STRING” ]; then
CONFIG_STRING=${tmp}_${1}
else
CONFIG_STRING=$1
fi
}

parameter_init()
{
while read line
do
case “$line” in
usb_mtp_en)
MTP_EN=on
make_config_string mtp
;;
usb_adb_en)
ADB_EN=on
make_config_string adb
;;
usb_ums_en)
UMS_EN=on
make_config_string ums
;;
usb_ntb_en)
NTB_EN=on
make_config_string ntb
;;
usb_acm_en)
ACM_EN=on
make_config_string acm
;;
usb_uac1_en)
UAC1_EN=on
make_config_string uac1
;;
usb_uac2_en)
UAC2_EN=on
make_config_string uac2
;;
usb_uvc_en)
UVC_EN=on
make_config_string uvc
;;
usb_rndis_en)
RNDIS_EN=on
make_config_string rndis
;;

            esac
    done < $DIR/.usb_config

    case "$CONFIG_STRING" in
            ums)
                    PID=0x0000
                    ;;
            mtp)
                    PID=0x0001
                    ;;
            adb)
                    PID=0x0006
                    ;;
            mtp_adb | adb_mtp)
                    PID=0x0011
                    ;;
            ums_adb | adb_ums)
                    PID=0x0018
                    ;;
            acm)
                    PID=0x1005
                    ;;
            *)
                    PID=0x0019
    esac

}

configfs_init()
{
mkdir -p ${USB_CONFIGFS_DIR} -m 0770
echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor
echo $PID > ${USB_CONFIGFS_DIR}/idProduct
mkdir -p ${USB_STRINGS_DIR} -m 0770

    SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'`
    if [ -z $SERIAL ];then
            SERIAL=0123456789ABCDEF
    fi
    echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber
    echo "rockchip"  > ${USB_STRINGS_DIR}/manufacturer
    echo "rk3xxx"  > ${USB_STRINGS_DIR}/product
    mkdir -p ${USB_CONFIGS_DIR}  -m 0770
    mkdir -p ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}  -m 0770
    echo 500 > ${USB_CONFIGS_DIR}/MaxPower
    echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration

}

configure_uvc_resolution()
{
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H
echo $UVC_DISPLAY_W > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wWidth
echo $UVC_DISPLAY_H > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wHeight
echo 666666 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwDefaultFrameInterval
echo $((UVC_DISPLAY_WUVC_DISPLAY_H80)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMinBitRate
echo $((UVC_DISPLAY_WUVC_DISPLAY_H160)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxBitRate
echo $((UVC_DISPLAY_WUVC_DISPLAY_H2)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxVideoFrameBufferSize
echo -e “666666\n1000000\n2000000” > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwFrameInterval
}

function_init()
{
# UAC must be first setup when multi function composite.
if [ $UAC1_EN = on ];then
if [ ! -e “${USB_FUNCTIONS_DIR}/uac1.gs0” ] ;
then
mkdir ${USB_FUNCTIONS_DIR}/uac1.gs0
ln -s ${USB_FUNCTIONS_DIR}/uac1.gs0 ${USB_CONFIGS_DIR}/uac1.gs0
fi
fi

    if [ $UAC2_EN = on ];then
            if [ ! -e "${USB_FUNCTIONS_DIR}/uac2.gs0" ] ;
            then
                    mkdir ${USB_FUNCTIONS_DIR}/uac2.gs0
                    ln -s ${USB_FUNCTIONS_DIR}/uac2.gs0 ${USB_CONFIGS_DIR}/uac2.gs0
            fi
    fi

    if [ $UMS_EN = on ];then
            if [ ! -e "${USB_FUNCTIONS_DIR}/mass_storage.0" ] ;
            then
                    mkdir -p ${USB_FUNCTIONS_DIR}/mass_storage.0
                    echo /dev/disk/by-partlabel/userdata > ${USB_FUNCTIONS_DIR}/mass_storage.0/lun.0/file
                    ln -s ${USB_FUNCTIONS_DIR}/mass_storage.0 ${USB_CONFIGS_DIR}/mass_storage.0
            fi
    f

哦还要在dts里面开启otg功能。把下面这段删掉,重新编译内核并烧录

--- a/arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-firefly-aioj.dtsi
@@ -240,10 +240,6 @@
     status = "okay";
 };

-&usbdrd_dwc3 {
-    dr_mode = "host";
-};
-

我这把试过可以了的,总结:
1。内核 config 开启 CONFIG_USB_CONFIGFS_RNDIS,y就行不用设置成模块
2。dts 去掉上面那一段
3。文件系统内修改 adb.sh
4。文件系统内修改 .usb_config

本帖最后由 沃漠 于 2022-12-5 15:48 编辑

Liuth 发表于 2022-9-19 10:11
哦还要在dts里面开启otg功能。把下面这段删掉,重新编译内核并烧录

您好,我按照您的步骤执行过后开发板显示usb0网口,但是连接电脑lsusb没有显示网卡设备,我的板子是roc-rk3588s-pc,ubuntu系统是20.04

沃漠 发表于 2022-12-5 15:47
您好,我按照您的步骤执行过后开发板显示usb0网口,但是连接电脑lsusb没有显示网卡设备,我的板子是roc …

3588的rndis好像是有问题,等下次更新看能不能解决吧

沃漠 发表于 2022-12-5 15:47
您好,我按照您的步骤执行过后开发板显示usb0网口,但是连接电脑lsusb没有显示网卡设备,我的板子是roc …

还需要再修改/lib/systemd/system/adbd.service
把Type=forking改成Type=oneshot
然后在这一行下面再添加一行RemainAfterExit=yes
然后重启

本帖最后由 沃漠 于 2023-1-5 17:01 编辑

Liuth 发表于 2022-12-8 15:31
还需要再修改/lib/systemd/system/adbd.service
把Type=forking改成Type=oneshot
然后在这一行下面再添 …

您好,我按照您的过程都试了,现在能在电脑显示Remote NDIS based Internet Sharing Device,但是用数据线连接在电脑上ping不通

您好,请问,etc/init.d 下找不到 adbd.sh 这个文件,需要移植什么嘛

じpc 发表于 2022-12-29 09:22
您好,请问,etc/init.d 下找不到 adbd.sh 这个文件,需要移植什么嘛

应该不用这个,你去官方提供的文件系统中翻翻,有几个脚本放过去就行

我的也是rndis 用不了哦

我也遇到了同样的问题,呜呜呜

Liuth 发表于 2022-12-6 18:02
3588的rndis好像是有问题,等下次更新看能不能解决吧

请问解决了吗,遇到了同样问题,本地显示了usb0,主机端不显示网卡设备 3588s

沃漠 发表于 2022-12-5 15:47
您好,我按照您的步骤执行过后开发板显示usb0网口,但是连接电脑lsusb没有显示网卡设备,我的板子是roc …

请问解决了吗 ,同样问题