博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小米随身wif linux平台配置
阅读量:3559 次
发布时间:2019-05-20

本文共 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/

你可能感兴趣的文章
SpringBoot中访问控制层(controller)得不到Json数据
查看>>
react项目报出警告Warning: Cannot update during an existing state transition (such as within `render`).
查看>>
BFC(Block Formatting Context)
查看>>
什么是作用域,什么是闭包,什么是作用域链
查看>>
惰性求值,面向对象
查看>>
数据结构之列表
查看>>
发布/订阅模式 vs 观察者模式
查看>>
es5中的arguments对象
查看>>
git本地仓库和远程仓库关联,分支重命名
查看>>
js对象的深拷贝,你真的觉得很简单吗?
查看>>
你真的了解map方法吗?手动实现数组map方法。
查看>>
带你手动实现call方法,让你收获满满
查看>>
前端知识体系
查看>>
查找入职员工时间排名倒数第三的员工所有信息
查看>>
使用join查询方式找出没有分类的电影id以及名称
查看>>
Qt教程(2) : Qt元对象系统
查看>>
驱动开发误用指针错误:Unable to handle kernel NULL pointer dereference at virtual address
查看>>
Linux部署DocSystem知识/文件管理系统
查看>>
Centos7开机自启动脚本无法使用备用方案
查看>>
jvm虚拟机内存详解
查看>>