嵌入式开发记录-day36 USB-WIFI驱动移植
一、USB-WiFi移植通用步骤:这个属于内核中没有驱动,需要自己找驱动型
1、找源码并编译出.ko文件
1、确定芯片--》根据芯片找驱动源码;找不到换方案,很可能不开放;
2、关注一下源码支持的内核版本和驱动源码版本,以及编译平台;(对号与自己的对应)
3、Makefile的配置:
配置对应的平台(ARM平台、或者X86平台)
编译器和内核源码路径设置:用自己内核对应的编译器编译(一般必须要配置)
对WPA_SUPPLICANT的支持
4、驱动源码中修改两个ID:产品ID、厂商ID
5、编译驱动源码,得到ko文件(保证前面步骤没问题)
6、芯片的配置,芯片寄存器的配置:
找到默认的配置方法和需要的文件:有专门的的配置文件或者生成配置文件的方法;
正常情况下,有pdf或者readme文本格式的指导文件
2、找到默认的配置方法和需要的文件
3、WPA_SUPPLICANT的移植和测试
1、wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持
实现用户通过socket来编程
WPA_SUPPLICANT涉及版本问题,多试试几个,Android中已经有了,Linux最小系统中没有但是有许多种解决方案;
4、配置网络和测试
ifconfig之类的命令,IP配置等,脚本
WIFI运行起来之后,可能有另外的参数配置,一般也是通过各种工具来实 现配置。官方文档中一般会提供方法
二、驱动移植准备工作
1、硬件选型的方案是360wifi二代,芯片是MT7601U
2、准备工作:
1 找到驱动源码
1.1 找到官方开发包 √
https://www.mediatek.com/
https://www.mediatek.com/products/broadbandWifi/mt7601u
源码包:DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
解压压缩包后的README文档:
In Makefile
set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"
define the linux kernel source include file path LINUX_SRC
modify to meet your need.
In os/linux/config.mk
define the GCC and LD of the target machine
define the compiler flags CFLAGS
modify to meet your need.
** Build for being controlled by NetworkManager or wpa_supplicant wext functions
Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.
=> #>cd wpa_supplicant-x.x
=> #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d
load driver, go to "os/linux/" directory.
1.2 关注一下源码支持内核版本和驱动源码版本以及编译平台
源码支持内核版本:?
驱动源码版本:?
编译平台:?
1.3 Makefile的配置--在Makefile文件中找
找到了内核源码目录和对应编译器
对应平台:PLATFORM = SMDK √
编译器配置位置: √
内核源码路径设置: √
对WPA_SUPPLICANT的支持: √
1.4 驱动源码中修改两个ID √
将usb设备插到开发板上
idVendor=148f, idProduct=760b
grep -rn "USB_DEVICE(" *
配置位置:common/rtusb_dev_id.c:39:
2 芯片的配置
找到使用文档和配置脚本 √
或者配置程序和配置脚本 X
cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
3 WPA_SUPPLICANT工具 √
Qt的根文件系统,使用SDIO-WIFI的WPA_SUPPLICANT工具。
大家可以自己移植一个试试。
4 配置网络和测试 √
./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d
wpa_supplicant.conf中放账号和密码
三、开始移植
准备工作,直接使用Qt的根文件系统,跳过WPA_SUPPLICANT的移植
1、确认os/linux/config.mk中的'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'是否配置
2、配置文件复制
cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
3、Makefile修改
#PLATFORM: Target platform,默认=PC肯定不对,找一下!
在49行看到SMDK--这个是三星开发板的意思,问题不大了!这个肯定要配置为SMDK了。
搜索“SMDK”,
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
endif
找到了内核源码目录和对应编译器--搞定
对应平台: SMDK √
编译器配置位置: arm-2009q3 √
内核源码路径设置: 实际的内核目录 √
对WPA_SUPPLICANT的支持: √
操作:
注释掉PLATFORM = PC
取消注释PLATFORM = SMDK
将
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
endif
改为:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/topeet/android4.0/iTop4412_Kernel_3.0
CROSS_COMPILE = arm-none-linux-gnueabi-
endif
4 驱动源码中修改两个ID
idVendor=148f, idProduct=760b
在无驱动的情况下插入usb的wifi,获取两个ID:0x148f,0x760b
源码中搜索“USB_DEVICE(” 使用命令“grep -rn "USB_DEVICE(*" * “添加到源码中
在common/rtusb_dev_id.c:37中添加两个ID
4 编译,生成
编译出的ko文件在os/linux/ko目录中
make -j2
os/linux/mt7601Usta.ko
cp -r os/linux/mt7601Usta.ko /mnt
5 测试命令
//先关闭网卡eth0
ifconfig -a 发现多了一个ra0
ifconfig ra0 up 开启usbwifi
iwlist ra0 scan 可以扫描有哪些无线wifi
vim README_STA_usb在这里面有链接的方法:
./wpa_supplicant -Dwext -i ra0 -c wpa_supplicant.conf -d ??
wpa_supplicant -Dwext -i ra0 -c ID_Passwd.conf -d
wpa_supplicant -B -i ra0 -c ID_Passwd.conf // 使用这个就可以
-B:后台运行,-i:使用哪一个节点,-c:使用哪一个配置文件
wpa_supplicant.conf中写上账号和密码
network{ ssid="xunwei2701" // 无线网名称 根据自己的配置 psk="2015" // 无线网的密码 // 这两个格式固定 }
最后动态获取IP
udhcpc -i ra0
测试:
可以ping下外网:ping www.baidu.com,正常可以ping同;
四、其他:
1、再了解下iwlist命令:
2、wpa_supplicant命令使用
3、udhcpc命令使用