T113i无线网卡wifi及AP驱动编译

arm linux 的驱动编译一般都会有些配置或少量代码修改,特别是自己研发的主板,下面是本人在T113环境下亲自成功编译wifi及ap驱动的日志记录,主板全自主研发,非核心板架构,可能因环境不同步骤略有差异,请自甄别,仅供参考。

WIFI芯片:BL-R8188 

RTL18188ETV/RTL8188EUS

1. 编译WIFI驱动

1.下载驱动

https://github.com/lwfinger/rtl8188eu

rtl8188eu-5.2.2.4.zip

rtl8188eus-5.2.2.4.zip

2. 将驱动源码拷贝到内核源码目录

drivers/net/wireless/rtl8188eu

linux-5.4/

├── drivers/

│   ├── net/

│   │   ├── wireless/

│   │   │   ├── rtl8188eu/

│   │   │   │   ├── Makefile

│   │   │   │   ├── Kconfig

│   │   │   │   ├── ... (其他源码文件)

3. 修改drivers/net/wireless/Kconfig

在内核的drivers/net/wireless/Kconfig文件中,添加对rtl8188eu驱动的引用。找到类似以下内容的位置:

source "drivers/net/wireless/realtek/Kconfig"

在其后添加:

source "drivers/net/wireless/rtl8188eu/Kconfig"

4. 修改drivers/net/wireless/Makefile

在内核的drivers/net/wireless/Makefile文件中,添加对rtl8188eu驱动的编译支持。找到类似以下内容的位置:

obj-$(CONFIG_RTL_CARDS) += realtek/

在其后添加:

obj-$(CONFIG_RTL8188EU) += rtl8188eu/

5. 检查rtl8188eu目录下的Kconfig文件

确保rtl8188eu目录下的Kconfig文件内容正确。通常内容如下:

kconfig

config RTL8188EU

    tristate "Realtek 8188EU Wireless LAN NIC driver"

    depends on USB && CFG80211

    select WIRELESS_EXT

    select WEXT_PRIV

    help

      This option enables the Realtek 8188EU USB WiFi driver.

tristate:表示该驱动可以编译为模块(M)或内置到内核(Y)。

depends on:指定依赖项(如USB和CFG80211)。

help:提供驱动的描述信息。

6. 检查rtl8188eu目录下的Makefile

确保rtl8188eu目录下的Makefile文件内容正确。通常内容如下:

obj-$(CONFIG_RTL8188EU) += rtl8188eu.o

rtl8188eu-y := core.o usb.o ...

obj-$(CONFIG_RTL8188EU):根据配置选项CONFIG_RTL8188EU决定是否编译该驱动。

rtl8188eu-y:列出需要编译的源文件。

7. 更新内核配置

在内核源码根目录下,运行以下命令更新配置:

make menuconfig

在配置菜单中,导航到以下路径:

Device Drivers  --->

    Network device support  --->

        Wireless LAN  --->

            [*] Realtek 8188EU Wireless LAN NIC driver

如果一切配置正确,你应该能看到Realtek 8188EU Wireless LAN NIC driver选项。

#有看到:

8. 编译驱动

根据需求选择驱动编译方式:

编译为模块:在menuconfig中选择M,然后编译模块:

make modules

生成的模块文件为rtl8188eu.ko,位于drivers/net/wireless/rtl8188eu/目录下。

编译到内核:在menuconfig中选择Y,然后重新编译内核:

make

#t11i 环境下编译:修改配置后直接buil.sh ,

#如果重新编译,需要删除out/kernel/drivers/net/wireless/rtl8188eu目录下面所有文件,重新编译要改一下.config 文件或者wireless下面的kconfig文件

9. 安装驱动

如果编译为模块,将生成的rtl8188eu.ko文件拷贝到目标系统的模块目录中:

cp drivers/net/wireless/rtl8188eu/rtl8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/

#注意rtl8188eu 需要复制bin文件,驱动源码目录下有 /lib/firmware/rtlwifi/rtl8188eufw.bin

depmod -a

modprobe rtl8188eu

10. 验证驱动

检查驱动是否加载:

lsmod | grep rtl8188eu

如果驱动加载成功,可以使用iwconfig或ip命令检查无线网卡是否正常工作。

#modprobe rtl8188eu.ko,出现错误:Invalid argument

#查看日志:dmesg | tail -n 20

[ 25.581331] Bridge firewalling registered

[ 26.073620] Initializing XFRM netlink socket

[ 33.129374] usb0-vbus: disabling

[ 76.999995] 8188eu: module uses symbol (kernel_read) from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.

[ 77.015187] 8188eu: Unknown symbol kernel_read (err -22)

[ 77.077737] 8188eu: module uses symbol (kernel_read) from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.

[ 77.092947] 8188eu: Unknown symbol kernel_read (err -22)

#问题分析:

    错误提示表明模块尝试调用属于 ‌VFS 内部命名空间‌ (VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver) 的符号 kernel_read,但未在模块中显式声明依赖该命名空间‌28。

    ‌内核版本限制‌:Linux 5.4+ 对 VFS 层符号的导出策略更严格,部分文件系统相关函数被限制在特定命名空间内,模块默认无法直接调用‌28。

    ‌符号导出策略变更‌:kernel_read 在高版本内核中归类为文件系统内部接口,非通用驱动 API‌8。

    ‌2. 适配方案‌

    ‌方案一:显式声明命名空间依赖‌

    在模块源码中添加命名空间导入声明:

    MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);

    ‌操作步骤‌:

    在模块源码文件末尾(module_exit 后)添加上述声明。

    确保内核配置启用 CONFIG_MODULE_IMPORT_NS(默认开启)‌28。

   

11. 修改驱动源码

源码目录下usb_intf.c

module_init(rtw_drv_entry);

module_exit(rtw_drv_halt);

#增加下面这行 ,

MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);

#重新编译 modprobe 8188eu  加载驱动成功

12. 只有wlan0,无线网卡能正常通信,但是没有AP 功能


 

总结

通过以上步骤,你可以将rtl8188eu驱动集成到ARM Linux 5.4内核中,并在内核配置菜单中可见和可选。如果遇到问题,可以检查Kconfig和Makefile的配置是否正确,以及驱动源码是否完整。


 

#以下错误这是使用rtl8188eus-5.2.2.4.zip才有此错误,使用https://github.com/lwfinger/rtl8188eu 不会

#错误1 解决

EXTRA_CFLAGS += -I$(src)/include 也有,但是还是 找不到文件:drv_types.h: No such file or directory

方法 1:使用绝对路径

将EXTRA_CFLAGS中的路径改为绝对路径。例如:

//我重新定义src的绝对路径

src = /home/uw/t113i/T113-i_v1.0/kernel/linux-5.4/drivers/net/wireless/rtl8188eu

EXTRA_CFLAGS += -I$(src)/include


 

#错误2 在编译 rtl8188eu 驱动时,出现以下错误:

/drivers/net/wireless/rtl8188eu/os_dep/linux/os_intfs.c:1240:22: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]

  .ndo_select_queue = rtw_select_queue,

这个错误的原因是 ndo_select_queue 的函数签名与 rtw_select_queue 的函数签名不匹配。具体来说,ndo_select_queue 是 Linux 内核网络设备操作结构体 net_device_ops 中的一个成员,它的函数签名在内核版本之间可能发生了变化。

1. 问题分析

在较新的 Linux 内核版本中,ndo_select_queue 的函数签名可能已经更新,而 rtl8188eu 驱动中的 rtw_select_queue 函数可能仍然使用旧的签名,导致类型不匹配。

ndo_select_queue 的函数签名

在较新的内核版本中,ndo_select_queue 的函数签名通常如下:

u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev);

rtw_select_queue 的函数签名

在 rtl8188eu 驱动中,rtw_select_queue 的函数签名可能是:

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb);

由于函数签名不匹配,编译器会报错。

2. 解决方法

根据内核版本的不同,有以下几种解决方法:

方法 1:修改 rtw_select_queue 的函数签名

将 rtw_select_queue 的函数签名修改为与 ndo_select_queue 一致。例如:

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev)

{

    // 忽略 sb_dev 参数(如果需要)

    return rtw_select_queue_original(dev, skb);

}

然后更新 net_device_ops 结构体中的初始化:


 

.ndo_select_queue = rtw_select_queue,

方法 2:使用条件编译适配不同内核版本

在内核驱动中,通常使用条件编译来适配不同版本的内核。可以通过检查内核版本来选择正确的函数签名。例如:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev)

{

    // 新内核版本的实现

    return rtw_select_queue_original(dev, skb);

}

#else

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb)

{

    // 旧内核版本的实现

    return rtw_select_queue_original(dev, skb);

}

#endif

方法 3:忽略 sb_dev 参数

如果 sb_dev 参数在驱动中不需要使用,可以直接忽略它。例如:

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev)

{

    // 忽略 sb_dev 参数

    return rtw_select_queue_original(dev, skb);

}

3. 修改 os_intfs.c 文件

在 os_intfs.c 文件中,找到 rtw_select_queue 函数的定义,并根据上述方法修改其签名。然后更新 net_device_ops 结构体中的初始化。

例如:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev)

{

    // 新内核版本的实现

    return rtw_select_queue_original(dev, skb);

}

#else

u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb)

{

    // 旧内核版本的实现

    return rtw_select_queue_original(dev, skb);

}

#endif

static const struct net_device_ops rtw_netdev_ops = {

    .ndo_select_queue = rtw_select_queue,

    // 其他成员

};

4. 重新编译驱动

修改完成后,重新编译驱动:

#我的解决方案 ,操其他驱动对应地方修改

static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)

    #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)

    , struct net_device *sb_dev

    #else

    , void *accel_priv

    #endif

    #if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)))

    , select_queue_fallback_t fallback

    #endif

#endif

)

/*

#if (LINUX_VERSION_CODE>=KERNEL_VERSION(4,19,0))

static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb,

        struct net_device *sb_dev,

        select_queue_fallback_t fallback)

#else

static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)

    , void *accel_priv

    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)

    , select_queue_fallback_t fallback

    #endif

#endif

)

#endif

*/

 2. 实现STA+AP双模式

#注意,网上多数文章实现双模式都是有这样那样的问题,下面方法是我自己分析修改代码后成功实现STA+AP双模式:(基于前面成功但只有wlan0的改过的源码驱动)

1. 源码:https://github.com/lwfinger/rtl8188eu

rtl8188eu-5.2.2.4.zip

   

2. 修改内核Makefile,下面我修改的实际文件 ,其他地方不用修改

    EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS)

    EXTRA_CFLAGS += -O1 -g

    EXTRA_CFLAGS += -Wno-unused-variable

    EXTRA_CFLAGS += -Wno-unused-value

    EXTRA_CFLAGS += -Wno-unused-label

    EXTRA_CFLAGS += -Wno-unused-parameter

    EXTRA_CFLAGS += -Wno-unused-function

    EXTRA_CFLAGS += -Wno-unused

    EXTRA_CFLAGS += -Wno-uninitialized

    EXTRA_CFLAGS += -Wno-missing-prototypes

    EXTRA_CFLAGS += -Wno-missing-declarations

    #gaobaowei add

    #EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DLINUX_KERNEL_5_4

    GCC_VER_49 := $(shell echo `$(CC) -dumpversion | cut -f1-2 -d.` \>= 4.9 | bc )

    ifeq ($(GCC_VER_49),1)

    EXTRA_CFLAGS += -Wno-date-time  # Fix compile error && warning on gcc 4.9 and later

    endif

    EXTRA_CFLAGS += -I$(src)

    CONFIG_AUTOCFG_CP = n

    #gaobaowei add

    # 强制启用AP+STA双模(替代CONFIG_AP_MODE/CONFIG_CONCURRENT_MODE)

    EXTRA_CFLAGS += -DCONFIG_AP_MODE -DCONFIG_CONCURRENT_MODE  

    EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT

    CONFIG_CONCURRENT_MODE = y

    CONFIG_IOCTL_CFG80211 = y

    CONFIG_BT_COEXIST = n

    ########################## Features ###########################

    CONFIG_MP_INCLUDED = y

    #CONFIG_POWER_SAVING = y

    #gaoboawei add

    CONFIG_POWER_SAVING = n

    CONFIG_EFUSE_CONFIG_FILE = y

    CONFIG_TRAFFIC_PROTECT = y

    CONFIG_LOAD_PHY_PARA_FROM_FILE = y

    CONFIG_RTW_ADAPTIVITY_EN = disable

    CONFIG_RTW_ADAPTIVITY_MODE = normal

    CONFIG_BR_EXT = y

    CONFIG_RTW_NAPI = y

    CONFIG_RTW_GRO = y

    ########################## Debug ###########################

    CONFIG_RTW_DEBUG = y

    # please refer to "How_to_set_driver_debug_log_level.doc" to set the available level.

    CONFIG_RTW_LOG_LEVEL = 2

    ######################## Wake On Lan ##########################

    CONFIG_WAKEUP_GPIO_IDX = default

    ######### Notify SDIO Host Keep Power During Syspend ##########

    CONFIG_RTW_SDIO_PM_KEEP_POWER = y

    ###################### Platform Related #######################

    CONFIG_PLATFORM_I386_PC = n

    ###############################################################

   

3. Kconfig

   内核目录:Kconfig

   config RTL8188EU

    tristate "Realtek 8188EU USB WiFi"

    depends on WLAN && USB

    ---help---

      Help message of RTL8188EU

   上级目录:Wireless\Kconfig

   添加:

   source "drivers/net/wireless/bcmdhd/Kconfig"

   source "drivers/net/wireless/aic8800/Kconfig"

   #添加下面

   source "drivers/net/wireless/rtl8188eu/Kconfig"

4. 修改内核配置:

   和前面一样:

   

5. build.sh

   build.sh pack

   烧系统

   modprobe 8188EU

   ifconfig -a 可以看到wlan0 wlan1(注意,这里我没有拷贝bin文件,就可以了)

   

     

<think>嗯,用户问的是T113i芯片连接MIPI屏幕是否需要额外的驱动板。首先,我需要回忆一下MIPI接口的相关知识。MIPI通常包括DSI(Display SerialInterface),用于显示屏的数据传输。T113i芯片是否原生支持MIPIDSI输出呢?如果芯片本身有MIPI DSI控制器,那么可能不需要额外的驱动板,直接连接兼容的屏幕即可。但用户提到的驱动板可能是指转接板或电平转换器。比如,如果屏幕的接口电平与T113i不匹配,或者需要转换信号类型(比如从MIPI转LVDS),这时候就需要驱动板了。另外,有些屏幕可能需要特定的初始化序列或配置,这部分通常由驱动IC处理,如果芯片的驱动支持这些配置,可能不需要额外硬件。还要考虑屏幕的分辨率和刷新率。例如,引用中提到800x600分辨率需要较高的刷新率,如果T113i的MIPI控制器无法直接支持屏幕的参数,可能需要中间板进行处理。此外,硬件设计中的布线问题,比如信号完整性,也可能需要驱动板来增强信号。 总结下来,是否需要驱动板取决于芯片的接口支持情况、屏幕的兼容性以及具体硬件设计。可能需要查阅T113i的数据手册,确认其MIPI控制器的能力,并查看屏幕的规格书,判断接口是否匹配。如果两者直接兼容,可能不需要;否则可能需要驱动板做信号转换或增强。</think>根据T113i芯片和MIPI屏幕的硬件特性分析,是否需要驱动板主要取决于以下因素: ### 一、芯片原生支持 1. **MIPI DSI控制器** T113i芯片内置MIPI DSI控制器时,可通过$V_{dd}$=1.8V电平直接驱动MIPI屏幕[^1]。此时仅需满足: $$ \frac{R_{term}}{Z_0} = 0.8 \sim 1.2 \quad (阻抗匹配条件) $$ 2. **时钟频率适配** 若屏幕要求的像素时钟$f_{pclk}$≤150MHz(如800x600@60Hz需约40MHz),芯片可直接输出时序信号[^1] ### 二、需要驱动板的场景 | 场景 | 解决方案 | 硬件示例 | |------|----------|----------| | 电平不匹配 | 添加电平转换芯片 | TXS0108E | | 协议转换 | MIPI转LVDS桥接板 | LT8912B | | 高分辨率驱动 | 带帧缓冲的驱动板 | SSD2828 | ### 三、硬件设计建议 1. **信号完整性验证** 使用示波器测量MIPI差分信号眼图,确保满足: $$ V_{pp} \geq 200mV,\quad Jitter \leq 0.3UI $$ 2. **屏幕初始化配置** 若屏幕需要加载初始化序列(如ILI9806E),需通过设备树配置: ```c dsi_init_sequence = [ 0x29 0x04 0xFF 0x98 0x06 0x04, 0x15 0x02 0x08 0x10 ]; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值