讲师博文
基于3.14内核rtl8188eu驱动移植 来源 : 未知     2018-09-21

近的项目上要用到3.14的内核,我们需要一个可以使用wifi连接外网的文件系统,我们的wifi模块使用的是rtl8188eus,所以需要移植一个rtl8188eu的驱动。

首先去网上找相关8188eu的驱动源码,我这里使用的是rtl8188EUS_rtl8189ES_linux_v4.1.1_4235.20120606。

还需要使用到linux-3.14内核的源码,这两样准备完毕后,源码就齐了。

将rtl8188的驱动解压后,需要添加一个适合于我们平台的编译选项,操作如下:

vi Makefile

将原Makefile中关于CONFIG_PLATFORM_I386_PC = y改成 n

根据其他arm平台添加一个 CONFIG_PLATFORM_ARM_SMDK4x12 = y

然后在适当位置添加如下(356-362行内容):

退出保存后,执行make

在linux/osdep_service.h下,注释掉1360行对应的daemonize(“%s”,”RTKTHREAD);

继续编译,错误如下:

这个错误的原因是3.14内核不支持这些函数,这些函数的名称被换成了其他名称的函数,这里的主要功能是实现proc文件系统,这里我们选择注释掉。

vi os_dep/linux/os_intfs.c

注释掉rtw_proc_init_one()函数内部所有代码

注释掉rtw_proc_remove_one()函数内部所有代码

注释完成后,继续编译

如果编译时出现这种错误,是因为在配置Makefile时,我们指定的内核在配置时不支持802.11的无线设备驱动。

../os/linux/sta_ioctl.c:2227: error: unknown field 'private' specified in initializer

../os/linux/sta_ioctl.c:2227: warning: initialization from incompatible pointer type

../os/linux/sta_ioctl.c:2228: error: unknown field 'num_private' specified in initializer

../os/linux/sta_ioctl.c:2228: warning: excess elements in struct initializer

../os/linux/sta_ioctl.c:2228: warning: (near initialization for 'rt28xx_iw_handler_def')

../os/linux/sta_ioctl.c:2229: error: unknown field 'private_args' specified in initializer

../os/linux/sta_ioctl.c:2229: warning: excess elements in struct initializer

../os/linux/sta_ioctl.c:2229: warning: (near initialization for 'rt28xx_iw_handler_def')

../os/linux/sta_ioctl.c:2230: error: unknown field 'num_private_args' specified in initializer

../os/linux/sta_ioctl.c:2230: warning: excess elements in struct initializer

../os/linux/sta_ioctl.c:2230: warning: (near initialization for 'rt28xx_iw_handler_def')

解决办法:重新配置编译指定的Linux Kernel,将Device Drivers==>Network deivce support==>Wireless LAN==><*> USB ZD1201 based Wireless device support,编译即可

继续编译

如果有以下的错误:

error: 'struct net_device' has no member named 'wireless_handlers'

//如下是原因,讲到了定义的地方

struct net_device is defined in include/linux/netdevice.h, which includes

this ifdef:

#ifdef CONFIG_WIRELESS_EXT

/* List of functions to handle Wireless Extensions (instead of ioctl).

* See for details. Jean II */

const struct iw_handler_def * wireless_handlers; <======== NOTE

/* Instance data managed by the core of Wireless Extensions. */

struct iw_public_data * wireless_data;

#endif

解决方法:在Makefile加上如下

继续编译:

编译到后出现了undefined的情况,是因为现在版本的内核kernel_thread函数并没有定义它的符号,我们把这个函数换成856行的kthread_run(),如下图:

这个函数需要一个头文件,这个头文件时kthread.h,他可以从3.14内核源码中拷贝,位置是include/linux/kthrea.h。

拷贝到os_dep/linux/下以后,在os_dep/linux/os_intfs.c中添加如下代码

之后就可以编译成功了,如下图

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:Genymotion使用说明

下一篇:怎样在Altium Designer 中创建原理图元件库

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号