提示:Linux驱动-网络设备-移植 RTL8723DU(wifi)驱动
文章目录
- 前言
- 一、参考资料
- 二、编译WIFI驱动
- WIFI驱动包
- 三、配置wifi驱动
- 修改 Makefile 文件
- make 命令进行编译
- 编译指令
- make
- ARCH=arm64
- CROSS_COMPILE=/home/topeet/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
- -C /home/topeet/rk356x_linux/kernel
- M=/home/topeet/rk356x_linux/kernel/drivers/net/wireless/rtl8723DU_WiFi_linux_v5.13.4.2-4
- modules
- 四、验证移植驱动是否成功-检查网卡
- 总结
前言
Linux驱动-网络设备-移植 RTL8723DU(wifi)驱动
这里举例如何移植WIFI驱动。 思路:
- 对于绝大多数 WIFI驱动和RJ485 网线驱动一样,要么原厂BSP工程师 已经写好了、要么第三方公司WIFI芯片芯片公司已经写好了,你只需要移植到系统里面去就可以了。
- 对于硬件连接:这个偏向于硬件工程师的工作,就是芯片如何焊接到主板上偏向于硬件工程师的工作,需要了解下
- 那么如何移植,基本操作要会,不管哪一款WIFI芯片,移植工作大同小异。
一、参考资料
从零到一:在RK3588 Android12上实战RTL8723DU WiFi蓝牙双模驱动移植
linux 移植rtl8723du蓝牙驱动
二、编译WIFI驱动
WIFI驱动包
如如下这样,wifi 芯片供应商会提供类似的驱动包
将 wifi 厂家提供的驱动资料包拷贝到 Linux 源码的 kernel/drivers/net/wireless 目录下, 然后解压缩,
三、配置wifi驱动
修改 Makefile 文件
CONFIG_MULTIDRV=nCONFIG_RTL8188E=nCONFIG_RTL8812A=nCONFIG_RTL8821A=nCONFIG_RTL8192E=nCONFIG_RTL8723B=nCONFIG_RTL8814A=nCONFIG_RTL8723C=nCONFIG_RTL8188F=nCONFIG_RTL8188GTV=nCONFIG_RTL8822B=nCONFIG_RTL8723D=y//因为适配的模块是 RTL8723du, 所以此选项为 yCONFIG_RTL8821C=nCONFIG_RTL8710B=nCONFIG_RTL8192F=nCONFIG_RTL8822C=nCONFIG_RTL8814B=nCONFIG_RTL8723F=n #########################Interface###########################CONFIG_USB_HCI=y//模块为 usb 接口 设置为 yCONFIG_PCI_HCI=nCONFIG_SDIO_HCI=nCONFIG_GSPI_HCI=nCONFIG_PLATFORM_I386_PC=n//此选项修改为 nCONFIG_PLATFORM_ANDROID_X86=nCONFIG_PLATFORM_ANDROID_INTEL_X86=nCONFIG_PLATFORM_JB_X86=nCONFIG_PLATFORM_ARM_S3C2K4=nCONFIG_PLATFORM_ARM_PXA2XX=nCONFIG_PLATFORM_ARM_S3C6K4=nCONFIG_PLATFORM_MIPS_RMI=nCONFIG_PLATFORM_RTD2880B=nCONFIG_PLATFORM_MIPS_AR9132=nCONFIG_PLATFORM_RTK_DMP=nCONFIG_PLATFORM_MIPS_PLM=nCONFIG_PLATFORM_MSTAR389=nCONFIG_PLATFORM_MT53XX=nCONFIG_PLATFORM_ARM_MX58_241H=nCONFIG_PLATFORM_FS_MX61=nCONFIG_PLATFORM_ACTIONS_ATJ227X=nCONFIG_PLATFORM_TEGRA3_CARDHU=nCONFIG_PLATFORM_TEGRA4_DALMORE=nCONFIG_PLATFORM_ARM_TCC8900=nCONFIG_PLATFORM_ARM_TCC8920=nCONFIG_PLATFORM_ARM_TCC8920_JB42=nCONFIG_PLATFORM_ARM_TCC8930_JB42=nCONFIG_PLATFORM_ARM_RK2818=nCONFIG_PLATFORM_ARM_RK3066=nCONFIG_PLATFORM_ARM_RK3568=y//新增此选项设置为 y//将下面的 3188 改成 3568CONFIG_PLATFORM_ARM_RK3188=nifeq($(CONFIG_PLATFORM_ARM_RK3568),y)EXTRA_CFLAGS+=-DCONFIG_LITTLE_ENDIAN-DCONFIG_PLATFORM_ANDROID-DCONFIG_PLATFORM_ROCKCHIPS#defaultsettingforAndroid4.1,4.2,4.3,4.4EXTRA_CFLAGS+=-DCONFIG_IOCTL_CFG80211-DRTW_USE_CFG80211_STA_EVENTEXTRA_CFLAGS+=-DCONFIG_CONCURRENT_MODE#defaultsettingforPowercontrol #EXTRA_CFLAGS+=-DRTW_ENABLE_WIFI_CONTROL_FUNCifeq($(CONFIG_SDIO_HCI),y)EXTRA_CFLAGS+=-DRTW_SUPPORT_PLATFORM_SHUTDOWNendif #defaultsettingforSpecialfunctionARCH:=arm64//修改为 arm64CROSS_COMPILE:=/home/topeet/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linuxgnu/bin/aarch64-linux-gnuKSRC:=/home/topeet/rk356x_linux/kernelMODULE_NAME:=wlan//模块名称endifmake 命令进行编译
编译指令
makeARCH=arm64 \CROSS_COMPILE=/home/topeet/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-\-C/home/topeet/rk356x_linux/kernel \M=/home/topeet/rk356x_linux/kernel/drivers/net/wireless/rtl8723DU_WiFi_linux_v5.13.4.2-4\ modulesmake
调用编译构建工具。
ARCH=arm64
- 作用:指定目标 CPU 架构为 ARM64。
- 为什么需要:因为您的 Ubuntu 是 x86_64,而 RK356x 开发板是 ARM64,编译驱动必须告诉系统目标架构,才能加载正确的内核头文件和编译规则。
CROSS_COMPILE=/home/topeet/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
- 作用:指定交叉编译工具链的前缀。
- 为什么需要:编译 ARM64 代码不能用 Ubuntu 自带的 gcc(那是给 x86 用的),必须用专门的交叉编译器。这个路径指向了工具链的 bin 目录,前缀是 aarch64-linux-gnu-,Makefile 会自动拼接成 aarch64-linux-gnu-gcc、aarch64-linux-gnu-ld 等。
-C /home/topeet/rk356x_linux/kernel
- 作用:告诉 make 先切换到 /home/topeet/rk356x_linux/kernel 这个目录。
- 为什么需要:驱动编译需要依赖内核的顶层 Makefile、.config 配置和头文件,所以必须进入内核源码目录去读取这些信息。
M=/home/topeet/rk356x_linux/kernel/drivers/net/wireless/rtl8723DU_WiFi_linux_v5.13.4.2-4
- 作用:指定外部模块(驱动源码)的路径。
- 为什么需要:M= 是 Linux 内核编译外部模块的标准写法,告诉内核构建系统:“我要编译的驱动代码不在内核源码树里,而是在 M= 指向的这个目录下”。
modules
- 作用:指定编译目标为 内核模块。
- 结果:编译完成后,会在驱动目录下生成 .ko 文件(例如 8723du.ko),这就是可以 insmod 加载到开发板内核里的驱动模块。
编译完成之后生成 wlan.ko 驱动模块
四、验证移植驱动是否成功-检查网卡
将编译好的 wlan.ko 拷贝到开发板上, 加载 wlan.ko
加载完成之后, 生成 wlan 的 wifi 网卡
至此, 移植 RTL8723DU(wifi 驱动) 实验完成!
总结
- 这里讲解了 移植WIFI驱动 基础必备知识,遇到实际问题可以参考
- 细节也蛮多的,但是基础知识务必掌握
- 实际工作中,如何编译到内核可以查阅资料,这里知识编译成
.ko文件 然后验证移植是否成功而已。