Planck-Pi 开启 Gadget RNDIS 教程

前言

本教程硬件基于稚晖君开源的 Planck-Pi ,开源地址: peng-zhihui / Planck-Pi
本教程系统基于 U-Boot 2018.015.2 Linux内核 、根文件系统由 buildroot-2022.05 构建。

RNDIS介绍

RNDIS 是 Remote Network Driver Interface Specification(远程网络驱动程序接口规范) 的首字母缩写,实际上的作用为 TCP/IP over USB,也即视 USB 设备(如手机)为网卡,是基于USB实现RNDIS实际上就是TCP/IP over USB,从而使 Windows 可以通过 USB 设备连接网络。

简单来说开启RNDIS,Planck-Pi通过usb连接Windows(或Linux)后会被识别为一张虚拟网卡,之后通过配置默认网关和DNS服务器即可实现板卡和电脑共享网络。

配置教程

1、内核配置

首先进入Linux内核文件夹


使用 make menuconfig命令配置内核(教程默认已经配置好编译链,并且将其写入 Makefile 文件)


内核配置目录

  • Networking support
    • Networking options
  • Device Drivers
    • Network device support
    • USB support
      • MUSB Mode Selection
      • USB Physical Layer drivers
      • USB Gadget Support

找到 Networking support 选项,勾选并进入


进入 Networking options 选项


勾选以下选项

  • Packet socket
  • Unix domain sockets
  • TCP/IP networking
  • IP: kernel level autoconfiguration
  • IP: DHCP support
  • IP: BOOTP support
  • DNS Resolver support

如图所示


退回到最开始的菜单

找到 Device Drivers 选项并进入

找到 Device Drivers 选项
找到 Network device support 选项,勾选并进入

勾选以下选项

  • Network core driver support
  • Ethernet driver support
  • USB Network Adapters


退回到 Device Drivers 目录

勾选 USB support 并进入该选项

勾选 USB support
勾选以下选项

  • Support for Host-side USB
  • Enable USB persist by default
  • Dynamic USB minor allocation
  • OTG support
  • EHCI HCD (USB 2.0) support
  • Generic EHCI driver for a platform device
  • OHCI HCD (USB 1.1) support
  • Generic OHCI driver for a platform device
  • USB Mass Storage support
  • Inventra Highspeed Dual Role Controller
  • Allwinner (sunxi)
  • USB Gadget Support

如图所示

进入 MUSB Mode Selection 选项,选择 Dual Role mode


选择 Dual Role mode
进入 USB Physical Layer drivers 选项,勾选 NOP USB Transceiver Driver


进入 USB Gadget Support 选项, 勾选以下选项

  • Serial gadget console support
  • USB Gadget functions configurable through configfs
  • Generic serial bulk in/out
  • Abstract Control Model (CDC ACM)
  • Object Exchange Model (CDC OBEX)
  • Network Control Model (CDC NCM)
  • Ethernet Control Model (CDC ECM)
  • Ethernet Control Model (CDC ECM) subset
  • RNDIS
  • Ethernet Emulation Model (EEM)
  • Function filesystem (FunctionFS)

如图所示


选择 Save 选项保存退出即可,会自动生成 .config 文件。

如果嫌配置太麻烦,可以使用我已经配置好的 .config 文件, 将其放入Linux内核文件夹。
执行make menuconfig后保存退出即可。

配置好 .config 文件之后,执行 make clean && make -j16 命令,此时

./arch/arm/boot/zImage

路径下会生成内核 img 文件,将其放入 sd 卡的第一分区即可。

2、设备树配置

如果你使用的是 4.14 的内核,那么你不用做任何修改,设备树中已经默认配置好USB了。
如果你使用的是 5.2 的内核,那么你需要在设备树中配置好USB。
首先打开 suniv-f1c100s.dtsi 文件

./arch/arm/boot/dts/suniv-f1c100s.dtsi

找到214行附近 uart2: serial@1c25800
在下面添加

usb_otg: usb@1c13000 {
	compatible = "allwinner,suniv-f1c100s-musb";
	reg = <0x01c13000 0x0400>;
	clocks = <&ccu CLK_BUS_OTG>;
	resets = <&ccu RST_BUS_OTG>;
	interrupts = <26>;
	interrupt-names = "mc";
	phys = <&usbphy 0>;
	phy-names = "usb";
	extcon = <&usbphy 0>;
	allwinner,sram = <&otg_sram 1>;
	status = "disabled";
};

usbphy: phy@1c13400 {
	compatible = "allwinner,suniv-f1c100s-usb-phy";
	reg = <0x01c13400 0x10>;
	reg-names = "phy_ctrl";
	clocks = <&ccu CLK_USB_PHY0>;
	clock-names = "usb0_phy";
	resets = <&ccu RST_USB_PHY0>;
	reset-names = "usb0_reset";
	#phy-cells = <1>;
	status = "disabled";
		};

如图所示


打开 suniv-f1c100s-licheepi-nano.dts 文件

./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts

在最下面添加

&otg_sram {
	status = "okay";
};

&usb_otg {
	dr_mode = "otg";
	status = "okay";
};

&usbphy {
	usb0_id_det = <&pio 4 2 GPIO_ACTIVE_HIGH>; /* PE2 */
	status = "okay";
};

如图所示

保存后回到Linux内核目录
执行 make dtbs -j16

./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb

路径下会生成设备树文件,将其放入 sd 卡的第一分区。

3、RNDIS 配置

将sd插入板卡上,正插 Type-C 接口,此时电脑会识别到串口


启动串口调试终端,使用串口进入系统。


可以看到网络启动成功

但此时使用 ip a 还看不到虚拟网卡。我们需要开启 RNDIS 功能。

在终端输入以下命令

mount -t configfs none /sys/kernel/config
cd /sys/kernel/config/usb_gadget/
mkdir gg
cd gg

可以看到以下结果

接着输入以下命令

echo "0x0502" > idVendor
echo "0x3235" > idProduct
mkdir functions/rndis.rn0
mkdir configs/c1.1
ln -s functions/rndis.rn0 configs/c1.1/
echo "musb-hdrc.1.auto" > UDC


此时再执行 ip a 命令就可以看见虚拟网卡了。


但是如果此时我们重启板卡,这些设置就都消失了。
需要将这些配置写入系统的自启动文件中。
输入命令

cd /etc/init.d/


可以看到这些就是系统的自启动文件,我们创建一个文件,让他在 S40network 之前启动

vi S39rndis

输入如下内容

#!/bin/sh -e

mount -t configfs none /sys/kernel/config

cd /sys/kernel/config/usb_gadget/

mkdir gg

cd gg/

echo "0x0502" > idVendor

echo "0x3235" > idProduct

mkdir functions/rndis.rn0

mkdir configs/c1.1

ln -s functions/rndis.rn0 configs/c1.1/

echo "musb-hdrc.1.auto" > UDC

echo "domain Home" >> /etc/resolv.conf
echo "nameserver 192.168.1.1" >> /etc/resolv.conf

保存退出


可以看出此时该文件还没有执行权限
我们输入命令

chmod 777 /etc/init.d/S39rndis


此时该文件便可自启动了
我们重启板卡


可以看到虚拟网卡已经自启动了
但是此时如果用板卡 ping 电脑的 ip 还是 ping 不通的

可以看到虚拟网卡还没有设置 ip
我们先切换到 /etc/network 目录

cd /etc/network

编辑 interfaces 文件

vi interfaces

将文件内容修改为

auto lo
iface lo inet loopback

allow-hotplug usb0
auto usb0
iface usb0 inet static
address 192.168.5.100
netmask 255.255.255.0
gateway 192.168.5.101

保存退出

此时板卡上的配置就已经配置完了。

4、实体机设置

此时我们把板卡上的数据线拔下来,反插到 Type-C 接口上,注意板卡上 OTG 的跳线帽不要插。
因为是反插,此时板卡的串口 0 是连接不上了(可以将串口切换到串口 2 调试,但是比较麻烦,就不演示了)。
系统启动之后,我们在 linux 虚拟机(或实体机)上执行 ip a 就可以看到虚拟出来的网卡。


我们需要给实体机的这块虚拟网卡也配置 ip,我用的是 archlinux ,这里就用 archlinux 举例,其他系统参考本教程或者网上自行找教程。

首先我们打开 /etc/dhcpcd.conf 文件

nvim /etc/dhcpcd.conf

在文件的末尾加上

interface enp6s0f4u2 # 这里写的是虚拟网卡名称,使用 ip a 命令可以查到
static ip_address=192.168.5.101/24 # 这里的地址与前面我们板卡上 /etc/network/interfaces 文件中 gateway 的地址相对应
static domain_name_servers=192.168.5.1 114.114.114.114 # 这里的地址要在同一个网段

保存退出,此时网卡的静态 ip 就修改好了。

重新把插板卡,然后使用 ip a 命令查看

此时我们可以来 ping 一下板卡的 ip 看能不能 ping

已经可以 ping
既然可以 ping 通,那我们就可以使用 ssh 来连接板卡了(要提前在板卡上配置好ssh ,可以在用 buildroot 构建根文件系统时将 openssh 选上)

成功进入系统

但是此时我们通过 sshping 百度还是 ping 不通的,这是因为出于安全考虑,Linux系统默认是禁止数据包转发的。
所谓我们在主机的命令行执行

sudo echo "1" > /proc/sys/net/ipv4/ip_forward
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  #(wlan0 根据实际情况调整)

如果执行不了可以使用 root 用户执行,也可以将其写入开机脚本使其开机自动执行。

此时我们的板卡就实现l和实体机共享网络

5、后记

通过 USB Gadget 不仅能开启 RNDIS ,还可以同时虚拟出一个串口,这就实现了反插 Type-C同时拥有虚拟串口和虚拟网卡的功能,感兴趣的可以自行研究如何开启。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

฿฿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值