最近的项目上要用到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中添加如下代码
之后就可以编译成功了,如下图