本文共 6426 字,大约阅读时间需要 21 分钟。
小米随身wifi及360随身wifi 使用的都是mt7601u芯片, 是ralink的产品线迭代产品。
2011年被联发科收购后, ralink作为mtk的无线技术事业群。
官网驱动可于下载
如果你使用的是Linux v4.2以后的内核, 主线分支里就含有mt7601u的驱动了。
代码路径:
kernel-4.14/drivers/net/wireless/mediatek/mt7601u
mt7601u usb wifi适配器芯片支持两种模式
1). sta, 即station 基站模式, 类似终端设备一样, 可接入无线路由器, 共享热点等。
2). ap, 即access point 无线接入点模式, 跟共享热点类似, 可供其他设备接入, 共享网络。
以下主要介绍下mt7601u sta模式, 在linux平台下的配置过程。
1. 内核编译,
make menuconfig
配置使能mt7601u驱动, 建议编译成内核模块, 利用usb热插拔按需加载。
其他相关依赖如:
mac80211, usb, wlan, netdevices等内核模块也需要使能。
* 注, 由于wifi usb dongle大部分设计的都没有eeprom/flash等存储介质, 所以都是以固件加载的形式运行。
即linux端 将固件利用usb传输给mt7601u端, mt7601u运行该固件。
2. 固件加载
Linux 固件方面有一套框架代码, 可利用request_firmware等函数请求固件。 网上可以找到相关实现原理描述等。
这里简要介绍下:
1). 固件也可采用buildin模式, 或者存放在文件系统中。通常为了避免内核体积过大, 一般不采用buildin模式。2). 固件存放在/lib/firmware/目录下, 如mt7601u.bin
3). 故固件的加载需要借助用户态的帮助,
4). 此处需要借助uevent, udev来帮忙, 即内核态发出request_firmware请求, 想上发相应的uevent, udev进程处理该请求, 读取默认/指定固件地址, 将firmware加载到内存中, 内核将内存中的固件数据, 通过相应总线发给设备端。 设备端最终加载并运行固件。
由于我这里使用busybox来作为根文件系统。相关的配置如下:
* 使用mdev, 即mini udev来做为用户态udev进程。
mdev需要在启动过程中即执行, 可在inittab或rcS等启动脚本中加入:
[0] mount -t proc proc /proc
[1] mount -t sysfs sysfs /sys [2] echo /sbin/mdev > /proc/sys/kernel/hotplug [3] mdev -s* 内核配置需要开启以下选项:
ONFIG_FW_LOADER=y
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH="/sbin/mdev" (可选, 用户态也可以配置)
COFNIG_FW_LOADER_USER_HELPER (这一项好像不需要, 我没开也加载固件成功了)
3. 内核驱动加载
ok, 正式运行,
/lib/modules/4.14.74-g1cf858c-dirty/kernel/drivers/net/wireless/mediatek/mt7601u # modprobe mt7601u[ 389.833837] usb 1-1: reset high-speed USB device number 2 using xhci-hcd[ 390.007620] mt7601u 1-1:1.0: ASIC revision: 76010001 MAC revision: 76010500[ 390.027804] mt7601u 1-1:1.0: mcu init succeed[ 390.083861] mt7601u 1-1:1.0: dma init succeed[ 390.182331] random: fast init done[ 390.297695] mt7601u 1-1:1.0: Warning: unsupported EEPROM version 0d[ 390.305794] mt7601u 1-1:1.0: EEPROM ver:0d fae:00[ 390.316809] mt7601u 1-1:1.0: EEPROM country region 01 (channels 1-13)[ 390.895839] mt7601u 1-1:1.0: init hardare succeed[ 391.097014] mt7601u 1-1:1.0: register device succeed[ 391.227927] usbcore: registered new interface driver mt7601u
4. 查看网卡
/lib/modules/4.14.74-g1cf858c-dirty/kernel/drivers/net/wireless/mediatek/mt7601u # ifconfig -a******wlan0 Link encap:Ethernet HWaddr FC:3D:93:B5:AE:36 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 出现, 后续就是相应的网络配置了。
5. iw命令
busybox 自带的网络工具缺少无线部分,
可选择iw命令, linux git上能找到,
依赖libnl库, 是一个netlink的用户态库, 可在以下网址找到
ok, 交叉编译一下。
6. 静态配置
iw命令不支持wpa/wpa2加密模式, 所以我使用自己手机开了个无密码的热点进行测试。
不使用dhcp, dns一类的, 直接静态配置, 流程如下:
/ # iw wlan0 scancommand failed: Network is down (-100)/ # iw wlan0 linkNot connected./ # ifconfig wlan0 up # 开启网口wlan0/ # iw wlan0 scan # 扫描无线接入点BSS 5c:c3:07:73:24:4c(on wlan0) TSF: 47616435 usec (0d, 00:00:47) freq: 2462 beacon interval: 100 TUs capability: ESS ShortSlotTime (0x0401) signal: -67.00 dBm last seen: 376 ms ago SSID: river Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 DS Parameter set: channel 11 TIM: DTIM Count 1 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0 ERP:Extended supported rates: 6.0 9.0 12.0 48.0 HT capabilities:# 比如扫描到我的热点/ # iw wlan0 connect river # 无密码连接/ # [ 1657.853698] wlan0: authenticate with 5c:c3:07:73:24:4c[ 1657.989853] wlan0: send auth to 5c:c3:07:73:24:4c (try 1/3)[ 1658.057608] wlan0: authenticated[ 1658.067687] wlan0: associate with 5c:c3:07:73:24:4c (try 1/3)[ 1658.152893] wlan0: RX AssocResp from 5c:c3:07:73:24:4c (capab=0x401 status=0 aid=1)[ 1658.275488] wlan0: associated
ok, 连接上手机热点,
由于没有启用dhcp服务, 无法自动分配ip地址, 所以我根据热点网关的ip, 手动配置设备
/ # ifconfig wlan0 192.168.43.111 up/ # ifconfigwlan0 Link encap:Ethernet HWaddr FC:3D:93:B5:AE:36 inet addr:192.168.43.111 Bcast:192.168.43.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ # ping 192.168.43.127 # ping网关通PING 192.168.43.127 (192.168.43.127): 56 data bytes64 bytes from 192.168.43.127: seq=0 ttl=64 time=1054.640 ms64 bytes from 192.168.43.127: seq=1 ttl=64 time=50.071 ms64 bytes from 192.168.43.127: seq=2 ttl=64 time=11.817 ms^C/ # ping 8.8.8.8 # ping 公网dns失败PING 8.8.8.8 (8.8.8.8): 56 data bytesping: sendto: Network is unreachable
ok, ping网关就直接通的。
公网的dns失败, 报错网络不可达。
是的, 默认网关没有配置... 路由不到外网...
/ # route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0/ # route add default gw 192.168.43.127/ # route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.43.127 0.0.0.0 UG 0 0 0 wlan0192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0/ # ping 8.8.8.8PING 8.8.8.8 (8.8.8.8): 56 data bytes64 bytes from 8.8.8.8: seq=0 ttl=246 time=124.220 ms64 bytes from 8.8.8.8: seq=1 ttl=246 time=31.024 ms
ok, 静态配置很简单, 就两句话.... 配置ip地址(掩码, 广播地址), 配置默认网关...
/ # ifconfig wlan0 192.168.43.111 up
/ # route add default gw 192.168.43.127
然后
/ # ping www.baidu.comping: bad address 'www.baidu.com'/ # ping 180.101.49.12 # ping baidu的ip地址PING 180.101.49.12 (180.101.49.12): 56 data bytes64 bytes from 180.101.49.12: seq=0 ttl=48 time=353.789 ms64 bytes from 180.101.49.12: seq=1 ttl=48 time=27.912 ms/ # ifconfig lo 127.0.0.1 up/ # ping localhostPING localhost (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=64 time=6.520 ms64 bytes from 127.0.0.1: seq=1 ttl=64 time=4.074 ms
ping baidu不通, ping baidu ip地址能通, ping localhost能通。 是的, 需要有dns域名服务器, 来做域名和ip地址直接的转换。
当然不需要域名服务器, 如果我们知道目标地址, 本地也可以建立域名和ip转换的规则。
是的, 直接修改/etc/hosts即可,
/etc # cat hosts 127.0.0.1 localhost180.101.49.12 www.baidu.com/etc # ping www.baidu.comPING www.baidu.com (180.101.49.12): 56 data bytes64 bytes from 180.101.49.12: seq=0 ttl=48 time=237.635 ms64 bytes from 180.101.49.12: seq=1 ttl=48 time=27.960 ms64 bytes from 180.101.49.12: seq=2 ttl=48 time=32.283 ms
你看localhost为什么认识, 也是在这个文件当中添加了的。
7. dhcp和dns
ok, 动态ip分配以及域名转换服务后续添加。 先写到这里。
转载地址:http://yscrj.baihongyu.com/