Linux各种联网的方式
参考:Linux学习笔记(树莓派/嵌入式) - JeasonBoy - 博客园 101.Linux RNDIS 设置,嵌入式设备通过usb连接pc上网
CDC ECM NCM RNDIS之间的关系

总而言之,CDC是一个抽象规范,ECM,NCM是具体实现,RNDIS是CDC的变种的具体实现
#驱动编译
##USB WIFI
MT7601U
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> MediaTek devices (WLAN_VENDOR_MEDIATEK [=y])
-> MediaTek MT7601U (USB) support (MT7601U [=m])
RTL8188EU
-> Device Drivers
-> Network device support (NETDEVICES [=y])
> Wireless LAN (WLAN [=y])
-> Realtek devices (WLAN_VENDOR_REALTEK [=n])
-> Realtek 802.11n USB wireless chips support (RTL8XXXU [=n])
##SDIO WIFI
RTL8723BS一般会默认安装,不用配置
##CDC
##OTG_RNDIS:与 ECM 类似,RNDIS 也是一种通过 USB 在设备与主机之间共享网络连接的方式,但 RNDIS 更为复杂,通常用于 Windows 系统上的网络适配器
-> Device Drivers
-> USB support (USB_SUPPORT [=y])
-> USB Gadget Support (USB_GADGET [=y])
-> USB Gadget functions configurable through configfs (USB_CONFIGFS [=m])
[*] RNDIS
##USB网口(SR9900):SR9900 USB 转以太网芯片采用 CDC(Communication Device Class) 协议,并主要通过 ECM(Ethernet Control Model)实现网络功能
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> USB Network Adapters (USB_NET_DRIVERS [=m])
-> Multi-purpose USB Networking Framework (USB_USBNET [=m])
-> CDC EEM support (USB_NET_CDC_EEM [=m])
Wifi模块相关
1记得选编译成模块的方式,即<m>。而不是编译到内核<*>,编译到内核好像加载失败,原理未知。
2.将内核拷贝到boot后,同时也要把驱动模块安装到根目录: sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/media/jeason/rootfs/ modules_install
3.因为wifi模块一般没有eeporm,也就是说它自身没有地方存程序,因此我们要从wifi的官方获取wifi的固件,然后通过驱动,动态的发送给wifi,
linux默认固件存放在/lib/firmware/目录下,驱动运行的时候会自动读取该文件,例如mt7601u.bin,并发送给wifi模块。想简单处理,可以下载树莓派的系统,
然后去树莓派的/lib/firmware下面拷贝过来,树莓派系统默认带了很多设备的固件
#根文件系统安装相应的软件
## wireless tools
→ Target packages → Networking applications -> [*] wireless tools -> [*] Install shared library
## wpa_supplicant
→ Target packages → Networking applications -> [*] wpa_supplicant (不确定后面那些选项用不用打开) ---> Enable nl80211 support | Enable AP mode | Enable Wi-Fi Display | Enable wired support | Enable WPS
## dhcp
→ Target packages → Networking applications -> [*] dhcpcd
## udev
→ System configuration -> /dev management (Dynamic using devtmpfs + eudev)
#进入系统加载网络驱动
# USB WIFI
如果有在根文件系统安装udev(自动检测设备接入的软件),则会自动识别设备并且加载相应的usb wiif驱动,这一步不需要手动
# SDIO WIFI
sdio的设备,貌似没有自动检测接入的功能?(待测试),可以手动加载模块,insmod r8723bs.ko 或者 modprobe r8723bs
如果是insmod的方式,是不会自动加载依赖的,确保下这些依赖的驱动也被加载了。modprobe会自动加载依赖,但确保驱动ko文件放在/lib/modules下面
insmod libarc4.ko
insmod cfg80211.ko
insmod mac80211.ko
insmod r8723bs.ko
#网络连接方式
##网线
#W5100/W5500
#USB网口(SR9900)
#芯片自带网络模块,直接网络连接
只要装好eth的驱动,插上网线就能自动识别了,注意网口的设备名一般是eth0之类的
##USB RNDIS
1.USB设备连上后,ifconfig 看看有没有多出来一个新的网络设备(一般是usb0开头,也有可能不是)
2.进入nmtui->Edit connnect->在有线连接里找到刚刚的那个网络适配器->把IPv4的模式改为Shared(共享网络给其他设备),IP改为192.168.137.1/24(或其他自己喜欢的,后面的24代表子网掩码255)
3.启用链接(如果没启用的话),进入nmtui->Activate a connection->选中那个适配器,按右边的启用
4.echo 1 > /proc/sys/net/ipv4/ip_forward,开启转发,不然网络没办法共享出去。
5.切记,PC要把防火墙关闭,不然设备只能ping通路由器(PC),但是访问不了外网,linux上关闭防火墙:sudo ufw disable
##WIFI
###使用wpa_supplicant的方式
1.设置wifi密码
# vi /etc/wpa_supplicant/wpa_supplicant.conf 或 vi /etc/wpa_supplicant.conf
加入:
network={
ssid="YourWiFiSSID"
psk="YourWiFiPassword"
}
2.使用配置连上WIFI:wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
#设置IP地址连上网络
确保网络设备被成功驱动起来,lsmod或dmesg看有没有相应的驱动加载过程,然后ip a看看有没有多出来新的网络设备,如果是rndis就是usb0之类的,wifi就是wlan0之类的
##下面是动态IP的方式:
1.打开网络设备(eth0 usb0 wlan0等):ifconfig wlan0 up (或 ip link set wlan0 up)
2.开启dhcp自动获取ip跟dns:dhcpcd wlan0 (或 dhclient wlan0)
##下面是静态IP的方式:
1.ifconfig 网络设备 想要的静态ip netmask 255.255.255.0 up
例如:ifconfig wlan0 172.20.10.3 netmask 255.255.255.0 up (或 ip addr add 172.20.10.3/24 dev wlan0)
注意:这里用苹果手机开热点,不知为何不能把静态ip设置太大,例如172.20.10.30就失败了,172.20.10.4就可以
2.route add default gw 网关
例如:route add default gw 172.20.10.1(或 ip route add default via 172.20.10.1)
设置完默认网关后,就能看到:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.20.10.1 0.0.0.0 UG 0 0 0 wlan0
172.20.10.0 * 255.255.255.0 U 0 0 0 wlan0
##设置DNS:这时候ping百度是失败的,因为还没有dns解析,设置dns解析服务器
echo "nameserver 114.114.114.114" | sudo tee /etc/resolv.conf
新增 W5500 SPI 以太网模块
参考:RPi-w5500/RPi4-w5500/Getting Start Ethernet Driver.md at main · Wiznet-OpenHardware/RPi-w5500
最新的树莓派系统已经有W5500的驱动以及设备树,放在:/boot/firmware/overlays/w5500.dtbo,手动启用下即可。
设备树源码在:~/raspberry-linux/arch/arm/boot/dts/overlays/w5500-overlay.dts,可以在里面看到硬件接口的定义方式,可以看到默认是用spi0
Linux的主线内核里也有W5500的源码,它跟W5100的驱动放在一起:
root@Raspberry ~/l/d/n/e/wiznet (master)# pwd /root/linux/drivers/net/ethernet/wiznet root@Raspberry ~/l/d/n/e/wiznet (master)# ls Kconfig Makefile w5100.c w5100.h w5100-spi.c w5300.c root@Raspberry ~/l/d/n/e/wiznet (master)# grep -r "5500" ./ ./w5100-spi.c: * Ethernet driver for the WIZnet W5100/W5200/W5500 chip. ./w5100-spi.c: * http://wizwiki.net/wiki/lib/exe/fetch.php?media=products:w5500:w5500_ds_v106e_141230.pdf ./w5100-spi.c:#define W5500_SPI_BLOCK_SELECT(addr) (((addr) >> 16) & 0x1f)
硬件连接方式:

启用设备树:
sudo nano /boot/firmware/config.txt
添加:dtoverlay=w5500
注:上面链接的教程里的名字是 dtoverlay=w5500-driver,但新版的树莓派自带的那个dtbo名字是 w5500
或者可以指定中断引脚,spi频率跟 cs引脚
# AI 从上面的dts文件里推断出的可以动态修改的参数,我没实际体验过 dtoverlay=w5500 cs=1 int_pin=23 speed=15000000 # 改用 GPIO24 作为中断,SPI 频率 15MHz
这时候重启系统,ifconfig 会发现识别到 eth1 网卡了 (如果是树莓派A+这种本身没网口的,估计就是 eth0)
pi@raspberrypi ~> sudo ifconfig eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether dc:a6:32:95:b6:9f txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether ea:37:ab:b6:4f:e2 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1352 bytes 231768 (226.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
会发现并没有 ip 地址,树莓派好像只给自带的 eth0 增加了 dhcp,我们新增的 eth1 需要手动增加 dhcp,让它自动获取 ip
sudo nano /etc/dhcpcd.conf
增加
interface eth1
dhcp
重启后,会发现 eth1 已经有 ip 地址了,这时候就可以正常上网了。
但速度并不快,测速结果:
w5500 Download: 4.66 Mbit/s Upload: 11.34 Mbit/s 网口 Download: 50.80 Mbit/s Upload: 11.23 Mbit/s

浙公网安备 33010602011771号