rtl8188eus Linux驱动移植

rlt8188eus作为无线USB网卡,可以给我们的Linux设备提供无线上网能力,也能配置为AP,给其它无线设备提供上网能力。在使用较低版本的内核时,内核中不含rtl8188eus驱动,因此尝试自己移植,这里记录移植过程和遇到的问题。

1. 下载源码

直接google搜索rtl8188eus github,能够搜索出来非常多的rtl8188eu相关的仓库。找到startfork数量最多的仓库,下载其源码。

也尝试过其它的仓库
,编译出来的驱动在连接Wi-Fi时会报警告,导致连接不上wifi,日志如下:

RTW: <===  rtw_ips_pwr_up.............. in 780ms
RTW: nolinked power save leave
RTW: ==> ips_leave.....LED(0x00028282)...
RTW: SetHwReg8188E:(HW_VAR_CHECK_TXBUF)TXBUF Empty(1) in 0 ms
RTW: survey done event(33) band:0 for wlan0
RTW: rtw_indicate_scan_done(wlan0)
RTW: ==>rtw_ps_processor .fw_state(8)
RTW: ==>ips_enter cnts:19
RTW: nolinked power save enter
RTW: ===> rtw_ips_pwr_down...................
RTW: ====> rtw_ips_dev_unload...
RTW: usb_read_port_cancel
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_read_port_complete() RX Warning! bDriverStopped(False) OR bSurpriseRemoved(False)
RTW: usb_write_port_cancel
RTW: ==> rtl8188eu_hal_deinit
RTW: bkeepfwalive(0)
RTW: SetHwReg: bMacPwrCtrlOn=0
RTW: <=== rtw_ips_pwr_down..................... in 130ms

后面尝试使用截图内容的仓库,就没有问题了。并且这个仓库是带固件的,在使用无限网卡时,需要用到这个固件。

2. 编译驱动

编译驱动前,需要在内核中配置这个驱动依赖的模块,否则会在编译时报警告,一些符号未定义。其中这些符号就是该驱动依赖的内核模块。在不配置相关依赖的情况下,编译好的驱动在装载时,会报和编译时一样的错误,导致装载失败。因此如果编译时报警告了,根据相关符号找到内核中的模块,勾选上,并重新编译内核。

2.1 内核配置

我这里使用的内核版本是3.4 ,默认配置了两个与该模块相关的驱动。这里将它们勾选为编译进内核中。

配置支持WI-FI设备

模块路径:

 │   Location:                                                                           │     -> Device Drivers                                                                 │       -> Network device support (NETDEVICES [=y])                                     │         -> Wireless LAN (WLAN [=y])

配置如下:

可以看到内核中有 rtl8188cu的驱动,但是没有 rtl8188eus 的。

配置支持IEEE 802.11

模块路径:

│   Location:                                                                            │     -> Networking support (NET [=y])                                                 │       -> Wireless (WIRELESS [=y])

配置如下:

这里也是讲这些勾选为编译进内核中。

解决编译问题

完成上述配置后,编译还是会报一个警告:

  LD [M]  /media/data/library/temp/rtl8188eus/8188eu.oBuilding modules, stage 2.MODPOST 1 modules
WARNING: "__aeabi_unwind_cpp_pr1" [/media/data/library/temp/rtl8188eus/8188eu.ko] undefined!
WARNING: "__aeabi_unwind_cpp_pr0" [/media/data/library/temp/rtl8188eus/8188eu.ko] undefined!CC      /media/data/library/temp/rtl8188eus/8188eu.mod.oLD [M]  /media/data/library/temp/rtl8188eus/8188eu.ko
make[1]: Leaving directory '/media/data/workspace/buildroot-2022.02.8/output/build/linux-3.4.y'

如果不解决这个警告,在insmod模块时,就会因为找到不到这两个符号导致报错。位置在Kernel hacking 下面:

2.2 交叉编译环境配置

由于是要运行在我的Hisi板子上,因此需要交叉编译。我这里使用交叉编译工具链是Buildroot下载生成的,内核使用的时候Hi SDK中的 3.4 内核。

为什么前面要在内核中配置驱动呢?如果完成所有必须驱动的配置,那么编译过程将不会有任何警告。猜测,这里的Makefile其实会去读内核中的配置。

因为要反复的测试编译,我这里写了一个脚本set_env.sh来配置交叉编译环境,主要就是配置环境变量。

#!/bin/bash export USER_EXTRA_CFLAGS=-fno-exceptions
export ARCH=arm
export CROSS_COMPILE=/media/data/workspace/buildroot-2022.02.8/output/host/opt/ext-toolchain/bin/arm-none-linux-gnueabi-
export KVER=3.4.35
export KSRC="/media/data/workspace/buildroot-2022.02.8/output/build/linux-3.4.y"cd $(pwd)sed -i 's\KSRC := /lib/modules/$(KVER)/build\KSRC ?= /lib/modules/$(KVER)/build\g' Makefile

注意这里需要修改Makefile中SRC变量配置,因为有默认配置,自己设置的参数会被覆盖不起作用,因此将Makefile中的都改成?=,防止KSRC参数被覆盖。因为我开始设置了这个参数,在编译时,怎么都不生效,在Makefile中的最后面的位置加入这个参数才生效,后来就发现是被默认配置给覆盖了。

进入到源码目录执行这个脚本,一定要用source 执行,否则全局变量不会生效。

source ../set_env.sh

2.3 编译

执行:

make -j12

编译成功:

make ARCH=arm CROSS_COMPILE=/media/data/workspace/buildroot-2022.02.8/output/host/opt/ext-toolchain/bin/arm-none-linux-gnueabi- -C /media/data/workspace/buildroot-2022.02.8/output/build/linux-3.4.y M=/media/data/library/temp/rtl8188eu  modules
make[1]: Entering directory '/media/data/workspace/buildroot-2022.02.8/output/build/linux-3.4.y'CC [M]  /media/data/library/temp/rtl8188eu/core/rtw_ioctl_set.oCC [M]  /media/data/library/temp/rtl8188eu/core/rtw_iol.oCC [M]  /media/data/library/temp/rtl8188eu/core/rtw_led.oCC [M]  /media/data/library/temp/rtl8188eu/core/rtw_mlme.o.......................CC [M]  /media/data/library/temp/rtl8188eu/os_dep/usb_ops_linux.oCC [M]  /media/data/library/temp/rtl8188eu/os_dep/xmit_linux.oLD [M]  /media/data/library/temp/rtl8188eu/8188eu.oBuilding modules, stage 2.MODPOST 1 modulesCC      /media/data/library/temp/rtl8188eu/8188eu.mod.oLD [M]  /media/data/library/temp/rtl8188eu/8188eu.ko
make[1]: Leaving directory '/media/data/workspace/buildroot-2022.02.8/output/build/linux-3.4.y'

3. 测试

烧录重新编译的内核。将8188eu.kortl8188eufw.bin复制到开发板上。

8188eu.ko存放路径:

/lib/module/$(uname -r)

rtl8188eufw.bin存放路径:

/lib/firmware/rtlwifi

装载驱动:

# modprobe 8188eu
Chip Version Info: CHIP_8188E_Normal_Chip_TSMC_D_CUT_1T1R_RomVer(0)
EEPROM ID = 0x8129
usbcore: registered new interface driver r8188eu
# R8188EU: Firmware Version 11, SubVersion 1, Signature 0x88e1
MAC Address = e0:e1:a9:97:49:90
ioctl[SIOCSIWAP]: Operation not permitted
wlan0: Trying to associate with 80:ea:07:0e:2f:7d (SSID='Duapple_AP' freq=2437 MHz)
wlan0: Association request to the driver failed
R8188EU: INFO assoc success
wlan0: Associated with 80:ea:07:0e:2f:7d
wlan0: WPA: Key negotiation completed with 80:ea:07:0e:2f:7d [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 80:ea:07:0e:2f:7d completed [id=0 id_str=]

出现最前面的4行日志,说明驱动已经加载成功,并且识别到USB无线网卡。后面是我提前配置好了wpa_supplicant,因此,只要wlan0出来了,就能够自动连接上Wi-Fi。

默认是没有dhcp获取IP地址的,这里手动执行dhcp来获取路由器分配的IP:

# udhcpc -i wlan0
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 192.168.0.104, server 192.168.0.1
udhcpc: lease of 192.168.0.104 obtained from 192.168.0.1, lease time 7200
deleting routers
adding dns 192.168.1.1
adding dns 192.168.0.1

配置DNS服务器,并测试网络:

# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# ping baidu.com
PING baidu.com (39.156.66.10): 56 data bytes
64 bytes from 39.156.66.10: seq=0 ttl=51 time=100.215 ms
64 bytes from 39.156.66.10: seq=1 ttl=51 time=111.678 ms
64 bytes from 39.156.66.10: seq=2 ttl=51 time=125.347 ms
64 bytes from 39.156.66.10: seq=3 ttl=51 time=140.730 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 100.215/119.492/140.730 ms

如果网络不通,请检查路由表是否设置wlan0为默认路由。没有设置使用ip route完成配置。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 wlan0
0.0.0.0         0.0.0.0         0.0.0.0         U     1001002 0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1005   0        0 wlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

4. 集成到内核

由于每次烧录根文件系统都要重新加入这个驱动,因此考虑将其集成到内核中,直接将其编译进内核或者和打包到Buildroot中。

我这里使用了Buildroot来构建根文件系统,因此也可以直接将上面的驱动和固件放到output/target目录下,对应的位置。这样也能将驱动和固件直接打包到根文件系统中。

未完…

rtl8188eus Linux驱动移植相关推荐

  1. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  2. Linux驱动移植USB网卡r8156驱动(详细)总结

    目录 一.简介 二.驱动移植 2.1 驱动源码解压 2.2 驱动Kconfig和Makefile配置 2.2.1 驱动上层目录识别驱动文件 2.2.2 驱动目录新建驱动Kconfig和Makefile ...

  3. 正点原子gt9xx系列linux驱动移植

    写这个博客的前景: 正点原子的RGB电容触摸屏触摸芯片系列: 4.3 寸屏  480x272分辨率 使用的触摸芯片是gt9xx系列 4.3寸屏 800x480分辨率 使用的触摸芯片是gt9xx系列 7 ...

  4. rt3070网卡 linux驱动,移植rt3070芯片网卡驱动到dm365全过程---yingru

    #History:2011-05-18 #Author:yingru 新增: 在内核添加对设置雷凌网卡参数的wireless tools的支持: Make menuconfig: Device Dri ...

  5. WK2124 linux 驱动移植

    WK系列 SPI扩展 UART驱动移植参考 1.WK系列SPI扩展UART芯片简介 1.1  WK系列简介 目前WK系列能实现SPI扩展uart的芯片包括 WK2124.WK2204.WK2168.W ...

  6. RTL系列WIFI模组Linux驱动移植

    文章目录 1 驱动源码下载 2 驱动移植 2.1 源码的拷贝 2.2 源代码的修改 2.3 将wifi 驱动添加到内核中 2.3.1 修改 Kconfig 文件 2.3.2 修改Makefile 2. ...

  7. RTL8188 Linux驱动移植

    折腾了好几天,系统的Wifi总算是跑起来了. 总结下来,刚开始应该犯了好多系统性的错误.例如,以为在menuconfig中,将RTL8188对应的选项选中,就可以了,但是后来才知道事实并非如此.主要还 ...

  8. ds3231 linux驱动移植

    一.需求分析:     二.驱动移植     2.1驱动分析:     2.2 修改驱动     三.驱动移植中遇到的问题和解决方法     3.1 发现问题     3.2 问题分析 一.需求分析: ...

  9. S3C2440 Linux驱动移植——SD卡驱动

    开发板:TQ2440 内核:Linux 2.6.32 PC OS:Ubuntu 11.04 本文将对SD卡驱动的移植做简要介绍. 1.  添加板级信息 打开arch/arm/mach-s3c2440/ ...

最新文章

  1. python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画
  2. 开发HTML5的强大9个开发工具
  3. Universal Windows Platform(UWP)应用的窗口特性
  4. 分析解决Java运行时异常
  5. feign直接走熔断_四、Spring Cloud之熔断处理 Hystrix
  6. 操作系统原理之文件系统(第五章)
  7. php实现mysql分表
  8. 论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)
  9. 中国信通院发布《数据库发展研究报告(2021年)》(附报告和解读PPT下载)
  10. Linux学习:第一天,
  11. 从谷歌浏览器复制不带样式_如何更新ETHERSCAN区块链浏览器上的代币信息
  12. AWVS 10.5 配置选项
  13. 如何让必应bing收录我的网站
  14. 混合牛奶(春季每日一题 9)
  15. 英伟达RTX 2080/2080Ti发布及UltraLAB采用最新turing图灵架构深度学习硬件配置推荐
  16. package.json 中的波浪号(~)和插入符号(^)有什么区别?
  17. OTA本质与实现流程分析
  18. 与苹果和谷歌抗争堡垒创造者发动了远征
  19. 四节传送带plc梯形图_基于PLC的四节传送带设计.ppt
  20. 知识付费创业目前怎么样?需要做什么?

热门文章

  1. 已发布的AIR下载链接列表
  2. linux下载测速脚本,Linux下测速python脚本speedtest.py
  3. 电脑故障排除-------外来文章
  4. 生产环境 ios推送证书更换
  5. LocalDate方法使用总结
  6. DDD - CQRS 概念
  7. OpenStack和Docker不能,Kubernetes和Mesos也不能,ServerLess能决定云计算胜负吗?
  8. tomcat闪退原因
  9. dask.distributed搭建分布式计算环境
  10. “说说家乡的互联网”主题有奖征文【已结束】