嵌入式开发记录-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命令使用

 

posted @ 2020-08-30 12:03  笑不出花的旦旦  阅读(420)  评论(0)    收藏  举报