近的項目上要用到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
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中添加如下代碼
之后就可以編譯成功了,如下圖