WiFi如今已深度融入各类设备,像手机、平板、汽车等都离不开它。相较于有线网络,WiFi无需复杂布线,能轻松解决布线难题,因此在众多场景中成为首选。
I.MX6U-ALPHA开发板,支持USB和SDIO两种接口的WiFi模块,本章就带大家掌握这两种接口在该开发板上的使用方法。
WiFi驱动添加与编译
I.MX6U-ALPHA开发板目前适配两种WiFi芯片:
- USB接口:采用RTL8188EUS或RTL8188CUS芯片
- SDIO接口:采用RTL8189FS(也被称为RTL8189FTV)芯片
这两款芯片均出自Realtek公司,驱动源码由厂商直接提供,我们无需自行编写,只需把源码整合进Linux内核,再借助图形化配置界面,选择将其编译为模块就行。
开发板默认会赠送一个RTL8188EUS/CUS USB WiFi模块,同时,还可选配RTL8189FTV SDIO WiFi模块。
向Linux内核添加WiFi驱动
1. RTL81xx驱动文件结构
驱动源码存放在资料包的“1、例程源码→5、模块驱动源码→1、RTL8XXX WIFI驱动源码→Realtek/”路径下。
其目录结构清晰,包含:
- rtl8188EUS/文件夹,存放RTL8188EUS驱动;
- rtl8189FS/文件夹,存放RTL8189FS/FTV驱动;
- rtl8192CU/文件夹,存放兼容RTL8188CUS和RTL8192CU的驱动。
目录里有两个关键文件,Kconfig用于在内核配置界面添加选项,Makefile负责控制驱动的编译方式。
Kconfig文件里,通过menuconfig定义Realtek WiFi配置选项,再以choice语句让用户选择WiFi类型,默认选中RTL8189FS,分别对RTL8189FS、RTL8188EUS、RTL8192CU这三种驱动进行配置。Makefile文件则根据内核配置,决定将对应驱动目录加入编译。
2. 删除内核自带的RTL8192CU驱动
Linux内核(比如4.1.15版本)自带rtl8192cu驱动,但实测稳定性欠佳,建议使用资料包里提供的新版驱动。
具体操作分两步:
先打开drivers/net/wireless/rtlwifi/Kconfig文件,删除关于RTL8192CU的配置内容,包括配置选项、依赖关系以及帮助信息;再打开drivers/net/wireless/rtlwifi/Makefile文件,注释或删除与RTL8192CU相关的编译行。
3. 将Realtek驱动添加到内核
第一步,把整个realtek/目录复制到内核源码的drivers/net/wireless/目录下;
第二步,修改drivers/net/wireless/Kconfig文件,在末尾添加一行“source "drivers/net/wireless/realtek/Kconfig"”,一般加在wlan菜单结束前;
第三步,修改drivers/net/wireless/Makefile文件,添加一行“obj-y += realtek/”。
完成这些操作,驱动集成工作就全部搞定。
配置Linux内核
编译驱动前,得先确保内核开启了相关功能:
- 启用USB支持:进入“Device Drivers→[] USB support”,勾选“Support for Host-side USB”,并开启EHCI HCD(USB 2.0)、OHCI HCD(USB 1.1)支持,同时进入“ChipIdea Highspeed Dual Role Controller”,勾选“ChipIdea device controller”和“ChipIdea host controller”。
- 启用无线网络支持:路径为“Device Drivers→[] Network device support→[] Wireless LAN→IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)”,勾选“Support downloading firmware images with Host AP driver”和“Support for non-volatile firmware download”。
- 启用IEEE 802.11协议栈:进入“Networking support→[] Wireless”,勾选“cfg80211 wireless extensions compatibility”,并选择“Generic IEEE 802.11 Networking Stack (mac80211)”。
配置好后保存.config文件,重新编译内核,生成新的zImage。
编译WiFi驱动
执行make menuconfig,依次进入“Device Drivers→Network device support→Wireless LAN→Realtek wifi”,按需选择将三种驱动都设为模块([M])模式。
保存配置后,执行“make modules -j12”进行编译。编译成功后,各子目录会生成对应的.ko文件,分别是rtl8188EUS目录下的8188eu.ko、rtl8189FS目录下的8189fs.ko、rtl8192CU目录下的8192cu.ko。
接着把这些模块文件复制到目标根文件系统的模块目录,同时将新编译的zImage复制到TFTP目录,重启开发板。
驱动加载测试
1. RTL8188 USB WiFi测试
插入USB WiFi模块,执行“modprobe 8188eu.ko”。若驱动加载成功,会出现类似“RTL871X: module init start……usbcore: registered newinterfacedriver rtl8188eu……RTL871X: module init ret=0”的日志。
用“ifconfig-a”查看网卡,能看到wlan0网卡信息。
2. RTL8189 SDIO WiFi测试
要注意,SDIO WiFi和TF卡共用SDIO接口,测试时必须拔出TF卡。
将RTL8189模块插入SDIO插座,首次加载前先执行“depmod”,再执行“modprobe 8189fs.ko”。
驱动加载成功,会输出类似“RTL871X: module init start……RTL871X: rtl8189fs v4.3.24.8……RTL871X: module init ret=0”的日志,用“ifconfig -a”也能看到wlan0网卡。
到这里,驱动加载就顺利完成,但仅加载驱动还无法联网,后续还需移植WiFi用户空间工具,像wpa_supplicant、wireless-tools等,才能连接路由器,相关内容后续会详细介绍。