當(dāng)前位置:首頁(yè) > 學(xué)習(xí)資源 > 講師博文 > 基于3.14內(nèi)核rtl8188eu驅(qū)動(dòng)移植
基于3.14內(nèi)核rtl8188eu驅(qū)動(dòng)移植
時(shí)間:2018-10-28 來(lái)源:華清遠(yuǎn)見(jiàn)
近的項(xiàng)目上要用到3.14的內(nèi)核,我們需要一個(gè)可以使用wifi連接外網(wǎng)的文件系統(tǒng),我們的wifi模塊使用的是rtl8188eus,所以需要移植一個(gè)rtl8188eu的驅(qū)動(dòng)。
首先去網(wǎng)上找相關(guān)8188eu的驅(qū)動(dòng)源碼,我這里使用的是rtl8188EUS_rtl8189ES_linux_v4.1.1_4235.20120606。
還需要使用到linux-3.14內(nèi)核的源碼,這兩樣準(zhǔn)備完畢后,源碼就齊了。
將rtl8188的驅(qū)動(dòng)解壓后,需要添加一個(gè)適合于我們平臺(tái)的編譯選項(xiàng),操作如下:
vi Makefile

將原Makefile中關(guān)于CONFIG_PLATFORM_I386_PC = y改成 n
根據(jù)其他arm平臺(tái)添加一個(gè) CONFIG_PLATFORM_ARM_SMDK4x12 = y
然后在適當(dāng)位置添加如下(356-362行內(nèi)容):

退出保存后,執(zhí)行make

在linux/osdep_service.h下,注釋掉1360行對(duì)應(yīng)的daemonize(“%s”,”RTKTHREAD);

繼續(xù)編譯,錯(cuò)誤如下:

這個(gè)錯(cuò)誤的原因是3.14內(nèi)核不支持這些函數(shù),這些函數(shù)的名稱(chēng)被換成了其他名稱(chēng)的函數(shù),這里的主要功能是實(shí)現(xiàn)proc文件系統(tǒng),這里我們選擇注釋掉。
vi os_dep/linux/os_intfs.c
注釋掉rtw_proc_init_one()函數(shù)內(nèi)部所有代碼
注釋掉rtw_proc_remove_one()函數(shù)內(nèi)部所有代碼



注釋完成后,繼續(xù)編譯
如果編譯時(shí)出現(xiàn)這種錯(cuò)誤,是因?yàn)樵谂渲肕akefile時(shí),我們指定的內(nèi)核在配置時(shí)不支持802.11的無(wú)線(xiàn)設(shè)備驅(qū)動(dòng)。
../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,編譯即可
繼續(xù)編譯
如果有以下的錯(cuò)誤:
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加上如下

繼續(xù)編譯:

編譯到后出現(xiàn)了undefined的情況,是因?yàn)楝F(xiàn)在版本的內(nèi)核kernel_thread函數(shù)并沒(méi)有定義它的符號(hào),我們把這個(gè)函數(shù)換成856行的kthread_run(),如下圖:

這個(gè)函數(shù)需要一個(gè)頭文件,這個(gè)頭文件時(shí)kthread.h,他可以從3.14內(nèi)核源碼中拷貝,位置是include/linux/kthrea.h。
拷貝到os_dep/linux/下以后,在os_dep/linux/os_intfs.c中添加如下代碼

之后就可以編譯成功了,如下圖

課程分享:華清遠(yuǎn)見(jiàn)聯(lián)合NXP推出i.MX8M Plus開(kāi)發(fā)與實(shí)踐
課程分享:鴻蒙HarmonyOS系統(tǒng)及物聯(lián)網(wǎng)開(kāi)發(fā)實(shí)戰(zhàn)課程(
課程分享:HaaS EDU K1開(kāi)發(fā)教程(附課程視頻及源碼下
新版C語(yǔ)言編程之控制語(yǔ)句視頻教程重磅贈(zèng)送(嵌入式入
價(jià)值2000元的嵌入式精裝教程大禮包免費(fèi)送�。ǜ愣度�
價(jià)值1000元的最新ARM系列視頻完整版教程新鮮出爐(免
【最新】ARM課程課堂實(shí)錄精華版視頻免費(fèi)領(lǐng)�。▋�(nèi)含源
如何利用機(jī)器學(xué)習(xí)構(gòu)建個(gè)性化推薦系統(tǒng)
嵌入式系統(tǒng)從上電到操作系統(tǒng)運(yùn)行的完整啟動(dòng)流程
如何在不同工作場(chǎng)景下優(yōu)化嵌入式系統(tǒng)的電源消耗
硬件抽象層(HAL)的設(shè)計(jì)如何提高代碼的可移植性
批量歸一化在深度學(xué)習(xí)訓(xùn)練中的作用和實(shí)現(xiàn)方法
物聯(lián)網(wǎng)項(xiàng)目中設(shè)計(jì)嵌入式系統(tǒng)時(shí)的關(guān)鍵技術(shù)和考慮因素
通過(guò)自然語(yǔ)言處理技術(shù)理解文本的深層含義
如何基于RISC-V架構(gòu)設(shè)計(jì)高效能的嵌入式系統(tǒng)
LSTM和GRU在時(shí)間序列預(yù)測(cè)中的應(yīng)用
JTAG和SWD的調(diào)試技術(shù)及應(yīng)用