USB相关驱动的移植

USB转串口驱动,USB转WiFi驱动等的移植

Posted by Jerry Chen on August 25, 2019

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. 解压

    1
    
    tar -xvf DPB_RT2870_Linux_STA_x.x.x.x.tgz
    
  2. 修改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-
    
  3. 配置支持wpa_supplicant

    路径:os/linux/config.mk

    1
    2
    
    HAS_WPA_SUPPLICANT=y
    HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
    
  4. 修改源码id_table

    查找源码关键字:grep -rn "USB_DEVICE(" *,结果如下:

    修改vim common/rtusb_dev_id.c,在rtusb_dev_id[]中添加一行,写入自己设备的id:{USB_DEVICE(0x2955,0x1001)},

  5. [可选]控制台上 RtmpUSBNullFrameKickOut - Send NULL Frame @ Mbps…的重复打印,影响命令输入。在usb驱动源码中注释如下文件中的行:

  6. [可选]更改网络节点名称。位置:include/rtmp_def.h

  7. make

    生成ko模块地址:os/linux/mt7601Usta.ko

    如果报错,才需要打补丁patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c

  8. 拷贝配置

    将源码中配置拷贝到开发板如下位置

    1
    
    cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
    
  9. 加载启动方法

    加载模块:insmod mt7601Usta.ko

    插入网卡后启动方法:ifconfig wlan0 inet YOUR_IP up

  10. 卸载方法

首先停止: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

  1. 拷贝压缩文件和补丁到Ubuntu12.04

  2. 解压源文件和打补丁

    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
    
  3. 修改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
    
  4. 编译

    1
    
    make CROSS_COMPILE=arm-none-linux-gnueabi-
    

    编译后生成:

    程序包:ifrename,iwconfig,iwevent,iwgetid,iwlist,iwpriv和iwspy

    库文件:libiw.so(如果静态编译就不会生成)

  5. 将程序包拷贝到开发板bin目录,库文件拷贝到开发板lib目录(如果静态编译就不需要拷贝lib)。

简单使用:ifconfig wlan0 up启用ra0网络设备后,输入iwlist wlan0 scan扫描热点: