USB HUB
内核自带usb hub驱动,插入usb3.0的4口集线器会有如下信息打印。
USB转串口
PL2303和CP210X驱动
内核可配置编译PL2303和CP210X驱动。
路径如下:
Device Drivers —> [*] USB support —> <*> USB Serial Converter support —> <*> USB
Prolific 2303 Single Port Serial Driver
Device Drivers —> [*] USB support —> <*> USB Serial Converter support —> <*> USB
CP210x family of UART Bridge Controllers
CH340驱动
其中内核配置的上述同一路径下还可以选择配置编译CH341驱动,但是据了解这个可能不支持CH340(没尝试过)。所以CH340驱动使用源码编译为模块的方法加载进内核进行使用。
源码:点这里下载
即使没有正确驱动程序,在Linux中插入USB设备后也会在控制台中显示出当前设备的idVendor和idProduct,这就是关键的匹配信息。所以保证源码中用于匹配的id_table中存在相应的厂商和设备id,如果确认驱动是正确的,但没有id,可以新增一行,写入这些信息。
补充匹配id后,编写Makefile,编译为模块,insmod后插入ch340设备就会提示出现ttyUSB0设备,这就是usb串口,使用方法和普通串口一样。
USB转WiFi
找到WiFi芯片厂商提供的linux驱动源码包,如无id就加入到匹配表。
我们使用的小度WiFi使用了联发科MT7601,插入后只打印了设备中存在的基本信息(id默认16进制),而没有出现注册为wlan0这样的注册信息,说明没有正确的驱动。
查看网络节点的命令:ls -l /sys/class/net
,其中eth?的是网卡、wlan?的是无线网卡、lo是回环设备。
移植方法
移植wpa_supplicant / hostapd 2.7
常见WiFi支持wpa/wap2加密,wpa_supplicant是wpa/wap2的完整实现。
hostapd:IEEE 802.11 AP,支持IEEE 802.1X / WPA / WPA2 / EAP / RADIUS的身份验证器,一般和wpa_supplicant一起移植。
资源 | 描述 | 下载 |
---|---|---|
openssl-1.1.0h | 加密库和协议工具包 | 官网 直接下载 |
libnl-3.4.0 | 基于通用netlink协议的接口库 | 官网 直接下载 |
libnl-1.1.4 | wpa_supplicant可选使用lnl-1.x或者lnl-3.x | 官网 直接下载 |
wpa_supplicant-2.7 | 用以支持WPA和WPA2 | 官网 直接下载 |
hostapd-2.7 | 接入点管理工具,支持WPA和WPA2客户端 | 官网 直接下载 |
libnl-3.x编译
进入libnl-3.4.0解压目录,执行下列命令生成Makefile:
1
./configure --host=arm-none-linux-gnueabi --enable-static --enable-shared LIBS=-lpthread --prefix=$(pwd)/__install
编译并安装到上一步配置的__install目录下:
1
2
make
make install
执行完成后会发现__install目录下已经出现目标资源。
libnl-1.1.4编译
进入libnl-1.1.4解压目录,执行下列命令生成Makefile:
1
./configure --prefix=$(pwd)/__install
编译并安装到上一步配置的__install目录下:
1
2
make CC=arm-none-linux-gnueabi-gcc
make install
执行完成后会发现__install目录下已经出现目标资源。
openssl编译
进入openssl-1.1.0h目录,执行下列命令生成Makefile:
1
./Configure linux-armv4 --cross-compile-prefix=arm-none-linux-gnueabi- no-asm shared no-async --prefix=$(pwd)/__install
编译并安装到上一步配置的__install目录下:
1
2
make
make install
执行完成后会发现__install目录下已经出现目标资源。
wpa_supplicant-2.7
注意:实测2.7后的版本按下面方法编译会有一个错误,故这里移植2.7。
移植前确保:openssl移植ok,libnl-3.x和libnl-1.x选一个移植,wpa_supplicant可配置使用哪一个。
进入解压目录下的wpa_supplicant目录下:
1
2
cp defconfig .config
vim .config
在.config配置文件前面加入:
这里选择的libnl-3.2的配置,所以可以把和libnl-1相关的删掉。如果不选择2.0或者3.2,默认选择libnl-1的库。
1
2
3
4
5
6
7
8
9
10
11
12
13
# <--- openssl --->
CFLAGS += -I/usr/local/arm/openssl-1.1.0h/__install/include/
LIBS += -L/usr/local/arm/openssl-1.1.0h/__install/lib
LIBS_p += -L/usr/local/arm/openssl-1.1.0h/__install/lib
# <--- libnl-1 --->
# CFLAGS += -I/usr/local/arm/libnl-1.1.4/__install/include/
# LIBS += -L/usr/local/arm/libnl-1.1.4/__install/lib/
# <--- libnl-3 --->
CFLAGS += -I/usr/local/arm/libnl-3.4.0/__install/include/libnl3/
LIBS += -L/usr/local/arm/libnl-3.4.0/__install/lib/
# 如果使用libnl-1,就注释CONFIG_LIBNL20=y以及CONFIG_LIBNL32=y
CONFIG_LIBNL32=y
然后编译,如果选择libnl-3.2每条编译都会有警告:No package ‘libnl-3.0’ found,实际不影响。
1
make CC=arm-none-linux-gnueabi-gcc
移植ok会有如下结果:
将生成的wpa_supplicant、wpa_cli、wpa_passphrase 工具添加到开发板文件系统/bin目录下。并将lib库拷贝到开发板。
wpa_supplicant的示例配置: 按照该文件examples/wpa-psk-tkip.conf写就ok了。
[注意]拷贝libnl和openssl库到开发板,wpa_supplicant不好静态编译。
hostapd-2.7
进入解压目录下的hostapd目录下:
1
2
cp defconfig .config
vim .config
在.config配置文件前面加入:
这里选择的libnl-3.2的配置,所以可以把和libnl-1相关的删掉。如果不选择2.0或者3.2,默认选择libnl-1的库。
1
2
3
4
5
6
7
8
9
10
11
12
# <--- openssl --->
CFLAGS += -I/usr/local/arm/openssl-1.1.0h/__install/include/
LIBS += -L/usr/local/arm/openssl-1.1.0h/__install/lib
# <--- libnl-1 --->
# CFLAGS += -I/usr/local/arm/libnl-1.1.4/__install/include/
# LIBS += -L/usr/local/arm/libnl-1.1.4/__install/lib/
# <--- libnl-3 --->
CFLAGS += -I/usr/local/arm/libnl-3.4.0/__install/include/libnl3/
LIBS += -L/usr/local/arm/libnl-3.4.0/__install/lib/
# 如果使用libnl-1,就注释CONFIG_LIBNL20=y以及CONFIG_LIBNL32=y
CONFIG_LIBNL32=y
然后编译,如果选择libnl-3.2每条编译都会有警告:No package ‘libnl-3.0’ found,实际不影响。
1
make CC=arm-none-linux-gnueabi-gcc
移植ok后,文件夹下会出现两个可执行文件,拷贝到开发板bin目录下:
[注意]拷贝libnl和openssl库到开发板,hostapd不好静态编译。
移植USB驱动
前往官网下载MT7601的Linux驱动源码(只有MT7601U提供了Linux驱动源码,兼容MT7601)
直接下载: 点这 官网: MT7601U驱动源码(Linux平台)
在源码包里有README文件(README_STA_usb),列出了详细的移植步骤:
-
解压
1
tar -xvf DPB_RT2870_Linux_STA_x.x.x.x.tgz
-
修改Makefile
(1)平台换成:三星
(2)内核源码树路径设置
(3)交叉工具链路径设置
1 2 3 4 5
MODE = STA TARGET = LINUX PLATFORM = SMDK LINUX_SRC = /home/jerry/Projects/iTop4412_Kernel_3.0 CROSS_COMPILE = arm-none-linux-gnueabi-
-
配置支持wpa_supplicant
路径:os/linux/config.mk
1 2
HAS_WPA_SUPPLICANT=y HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
-
修改源码id_table
查找源码关键字:
grep -rn "USB_DEVICE(" *
,结果如下:修改
vim common/rtusb_dev_id.c
,在rtusb_dev_id[]中添加一行,写入自己设备的id:{USB_DEVICE(0x2955,0x1001)},
-
[可选]控制台上 RtmpUSBNullFrameKickOut - Send NULL Frame @ Mbps…的重复打印,影响命令输入。在usb驱动源码中注释如下文件中的行:
-
[可选]更改网络节点名称。位置:include/rtmp_def.h
-
make
生成ko模块地址:os/linux/mt7601Usta.ko
如果报错,才需要打补丁
patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c
-
拷贝配置
将源码中配置拷贝到开发板如下位置
1
cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
-
加载启动方法
加载模块:
insmod mt7601Usta.ko
插入网卡后启动方法:
ifconfig wlan0 inet YOUR_IP up
-
卸载方法
首先停止:ifconfig wlan0 down
卸载模块:rmmod mt7601Usta.ko
实际使用
首先把openssl和libnl的__install目录下lib库内容需要拷贝到开发板lib目录下,这里我做了个集合下载。
首先配置内核(80211支持;route、udhcpc程序等):
1
2
3
4
5
6
7
8
[*] Networking support ---> [CONFIG_NET]
[*] Wireless ---> [CONFIG_WIRELESS]
<*/M> cfg80211 - wireless configuration API [CONFIG_CFG80211]
[*] cfg80211 wireless extensions compatibility [CONFIG_CFG80211_WEXT]
<*/M> Generic IEEE 802.11 Networking Stack (mac80211) [CONFIG_MAC80211]
Device Drivers --->
[*] Network device support ---> [CONFIG_NETDEVICES]
[*] Wireless LAN ---> [CONFIG_WLAN]
加载mt7601Usta.ko模块并插入设备后,可以看到网络节点多了wlan0
会发现ifconfig
下没有wlan0,但ifconfig -a
下有wlan0,这时需要使用下面命令开启该网络:
1
ifconfig wlan0 up
[可选操作]开启后ifconfig
下只有ipv6地址,需要配置下ipv4地址(动态方法,重启失效):
1
2
3
4
IP和掩码配置
ifconfig ra0 192.168.2.66 netmask 255.255.255.0
设置网关,不成功也没关系
route add default gw 192.168.2.1
编辑mi8.conf文件,我放在/etc/mi8.conf
1
2
3
4
network={
ssid="mi8"
psk="vv123456"
}
连接命令(因为占用终端打印信息不退出,故放在了后台):
1
wpa_supplicant -D wext -i wlan0 -c /etc/mi8.conf &
[可选]控制台上 RtmpUSBNullFrameKickOut - Send NULL Frame @ Mbps…的重复打印,影响命令输入。在usb驱动源码中注释如下文件中的行:
使用udhcpc -i wlan0
分配一个ip,如果要把该ip写到网卡需要一个脚本:
将busybox\examples\udhcp\simple.script拷贝到开发板/usr/share/udhcpc/default.script
并添加可执行权限chmod 755 /usr/share/udhcpc/default.script
这样执行udhcpc -i wlan0
就会动态重设一个ip
尝试着ping 192.168.43.1
,成功ping通
尝试ping qq.com
成功ping通
实测上述连接手机热点成功。
连接K2P路由器ping不通,应该是和有线网口网段冲突,需要先ifconfig eth0 down
。再次按照上面步骤操作后已经可以正常挂载nfs。
额外的内容
Wireless Tools-29移植
直接下载: 点这 补丁浏览 官网: linuxfromscratch
-
拷贝压缩文件和补丁到Ubuntu12.04
-
解压源文件和打补丁
1 2 3
tar -vxf wireless_tools.29.tar.gz cd wireless_tools.29/ patch -Np1 -i ../wireless_tools-29-fix_iwlist_scanning-1.patch
-
修改Makefile
1 2 3 4 5 6 7 8 9 10
ifndef CROSS_COMPILE CROSS_COMPILE = endif CC = $(CROSS_COMPILE)gcc AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib 强烈建议静态编译 BUILD_STATIC = y
-
编译
1
make CROSS_COMPILE=arm-none-linux-gnueabi-
编译后生成:
程序包:ifrename,iwconfig,iwevent,iwgetid,iwlist,iwpriv和iwspy
库文件:libiw.so(如果静态编译就不会生成)
-
将程序包拷贝到开发板bin目录,库文件拷贝到开发板lib目录(如果静态编译就不需要拷贝lib)。
简单使用:ifconfig wlan0 up
启用ra0网络设备后,输入iwlist wlan0 scan
扫描热点: